Critical_PointsV2_v1

Download script
Author: emsjoflo
Critical_PointsV2_v1

This script functions as a dynamic visual aid for traders, designed to automatically project a series of horizontal price levels on your trading chart based on moving average calculations and Fibonacci-inspired distances.

Core Logic Overview

The primary objective of this tool is to identify "Critical Points" by calculating a central baseline and then projecting multiple levels above and below that line. This helps in identifying potential support and resistance zones automatically.

1. The Baseline Calculation

The script begins by calculating a Moving Average (MA). It allows for various types of averages—such as Simple (SMA), Exponential (EMA), Smoothly Weighted (SMMA), Linear Weighted (LWMA), or Least Squares (LSMA). This moving average acts as the "anchor" or center point for all other calculations.

2. The Projection System

Once the central moving average value is determined, the script applies a set of specific mathematical offsets. It uses eight distinct distance values (derived from Fibonacci sequences) to project lines in two directions:

  • Upper Levels: These are calculated by adding the offset values to the current moving average price.
  • Lower Levels: These are calculated by subtracting the offset values from the moving average price.

3. Visual Implementation

Instead of just drawing a single line, the script generates a comprehensive grid:

  • Automatic Plotting: It creates 16 separate horizontal lines (8 above and 8 below the center).
  • Dynamic Movement: As the price moves and the moving average updates, these horizontal lines move in real-time to stay perfectly synchronized with the current calculations.
  • Customization: Each of the 16 lines can be assigned a unique color, allowing traders to distinguish between different levels of significance at a glance.

4. User Experience Features

  • Clean Interface: The script is designed to automatically manage its own objects. When you remove the indicator from the chart, it cleans up all the generated horizontal lines so that your chart remains tidy.
  • Style Consistency: All levels are drawn using a "Dash-Dot" style, ensuring they appear as informative guide levels rather than solid price barriers, making it easier to read the underlying market movement.
Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
17 Views
0 Downloads
0 Favorites
Critical_PointsV2_v1
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                              Critical Points.mq4 |
//|                                                         emsjoflo |
//|                                  automaticforex.invisionzone.com |
//+------------------------------------------------------------------+
#property copyright "emsjoflo"
#property link      "automaticforex.invisionzone.com"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- input parameters
extern int       MAPeriod=157;
extern int       MAType = 0;
extern int       Fib1=21;
extern int       Fib2=34;
extern int       Fib3=55;
extern int       Fib4=89;
extern int       Fib5=144;
extern int       Fib6=233;
extern int       Fib7=377;
extern int       Fib8=610;
extern color     Color1=Khaki;
extern color     Color2=LightGreen;
extern color     Color3=LightSkyBlue;
extern color     Color4=Plum;
extern color     Color5=LightSalmon;
extern color     Color6=Tomato;
extern color     Color7=Magenta;
extern color     Color8=Aqua;
double Line1,Line_1,Line2,Line_2,Line3,Line_3,Line4,Line_4,Line5,Line_5,Line6,Line_6,Line7,Line_7,Line8,Line_8,MAVal,MAValOld;

//---- buffers
double ExtMapBuffer1[];
//---- variables
int    MAMode;
string strMAType;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
//----
switch (MAType)
   {
      case 1: strMAType="EMA"; MAMode=MODE_EMA; break;
      case 2: strMAType="SMMA"; MAMode=MODE_SMMA; break;
      case 3: strMAType="LWMA"; MAMode=MODE_LWMA; break;
      case 4: strMAType="LSMA"; break;
      default: strMAType="SMA"; MAMode=MODE_SMA; break;
   }
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
ObjectDelete("cp1");
ObjectDelete("cp2");
ObjectDelete("cp3");
ObjectDelete("cp4");
ObjectDelete("cp5");
ObjectDelete("cp6");
ObjectDelete("cp7");
ObjectDelete("cp8");
ObjectDelete("cp_1");
ObjectDelete("cp_2");
ObjectDelete("cp_3");
ObjectDelete("cp_4");
ObjectDelete("cp_5");
ObjectDelete("cp_6");
ObjectDelete("cp_7");
ObjectDelete("cp_8");


//----
   return(0);
  }

double LSMA(int Rperiod, int shift)
{
   int i;
   double sum;
   int length;
   double lengthvar;
   double tmp;
   double wt;

   length = Rperiod;
 
   sum = 0;
   for(i = length; i >= 1  ; i--)
   {
     lengthvar = length + 1;
     lengthvar /= 3;
     tmp = 0;
     tmp = ( i - lengthvar)*Close[length-i+shift];
     sum+=tmp;
    }
    wt = sum*6/(length*(length+1));
    
    return(wt);
}


//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars = IndicatorCounted();
   //---- check for possible errors
   if (counted_bars<0) return(-1);
   //---- last counted bar will be recounted
   if (counted_bars>0) counted_bars--;
   limit = Bars - counted_bars;

   for(int i=limit; i>=0; i--)
   {
      if (MAType == 4)
      {
        MAVal = LSMA(MAPeriod,i);
      }
      else
      {
      
        MAVal=iMA(NULL,0,MAPeriod,0,MAMode,PRICE_CLOSE,i);
      }
      ExtMapBuffer1[i] = MAVal;
   }
   Line1=MAVal+Fib1*Point;
   Line2=MAVal+Fib2*Point;
   Line3=MAVal+Fib3*Point;
   Line4=MAVal+Fib4*Point;
   Line5=MAVal+Fib5*Point;
   Line6=MAVal+Fib6*Point;
   Line7=MAVal+Fib7*Point;
   Line8=MAVal+Fib8*Point;
   Line_1=MAVal-Fib1*Point;
   Line_2=MAVal-Fib2*Point;
   Line_3=MAVal-Fib3*Point;
   Line_4=MAVal-Fib4*Point;
   Line_5=MAVal-Fib5*Point;   
   Line_6=MAVal-Fib6*Point;
   Line_7=MAVal-Fib7*Point;
   Line_8=MAVal-Fib8*Point;   
   
   if(ObjectFind("cp1") != 0)
      {
      ObjectCreate("cp1", OBJ_HLINE, 0, Time[20], Line1);
      ObjectSet("cp1", OBJPROP_STYLE, STYLE_DASHDOTDOT);
      ObjectSet("cp1", OBJPROP_COLOR, Color1);
      }
      else
      {
      ObjectMove("cp1", 0, Time[20], Line1);
      }
      
   if(ObjectFind("cp2") != 0)
      {
      ObjectCreate("cp2", OBJ_HLINE, 0, Time[20], Line2);
      ObjectSet("cp2", OBJPROP_STYLE, STYLE_DASHDOTDOT);
      ObjectSet("cp2", OBJPROP_COLOR, Color2);
      }
      else
      {
      ObjectMove("cp2", 0, Time[20], Line2);
      }
      
    if(ObjectFind("cp3") != 0)
      {
      ObjectCreate("cp3", OBJ_HLINE, 0, Time[20], Line3);
      ObjectSet("cp3", OBJPROP_STYLE, STYLE_DASHDOTDOT);
      ObjectSet("cp3", OBJPROP_COLOR, Color3);
      }
      else
      {
      ObjectMove("cp3", 0, Time[20], Line3);
      }
      
   if(ObjectFind("cp4") != 0)
      {
      ObjectCreate("cp4", OBJ_HLINE, 0, Time[20], Line4);
      ObjectSet("cp4", OBJPROP_STYLE, STYLE_DASHDOTDOT);
      ObjectSet("cp4", OBJPROP_COLOR, Color4);
      }
      else
      {
      ObjectMove("cp4", 0, Time[20], Line4);
      }
         
 
   if(ObjectFind("cp5") != 0)
      {
      ObjectCreate("cp5", OBJ_HLINE, 0, Time[20], Line5);
      ObjectSet("cp5", OBJPROP_STYLE, STYLE_DASHDOTDOT);
      ObjectSet("cp5", OBJPROP_COLOR, Color5);
      }
      else
      {
      ObjectMove("cp5", 0, Time[20], Line5);
      }
  
   if(ObjectFind("cp6") != 0)
      {
      ObjectCreate("cp6", OBJ_HLINE, 0, Time[20], Line6);
      ObjectSet("cp6", OBJPROP_STYLE, STYLE_DASHDOTDOT);
      ObjectSet("cp6", OBJPROP_COLOR, Color6);
      }
      else
      {
      ObjectMove("cp6", 0, Time[20], Line6);
      }
  
   if(ObjectFind("cp7") != 0)
      {
      ObjectCreate("cp7", OBJ_HLINE, 0, Time[20], Line7);
      ObjectSet("cp7", OBJPROP_STYLE, STYLE_DASHDOTDOT);
      ObjectSet("cp7", OBJPROP_COLOR, Color7);
      }
      else
      {
      ObjectMove("cp7", 0, Time[20], Line7);
      }

   if(ObjectFind("cp8") != 0)
      {
      ObjectCreate("cp8", OBJ_HLINE, 0, Time[20], Line8);
      ObjectSet("cp8", OBJPROP_STYLE, STYLE_DASHDOTDOT);
      ObjectSet("cp8", OBJPROP_COLOR, Color8);
      }
      else
      {
      ObjectMove("cp8", 0, Time[20], Line8);
      }
      
  if(ObjectFind("cp_1") != 0)
      {
      ObjectCreate("cp_1", OBJ_HLINE, 0, Time[20], Line_1);
      ObjectSet("cp_1", OBJPROP_STYLE, STYLE_DASHDOTDOT);
      ObjectSet("cp_1", OBJPROP_COLOR, Color1);
      }
      else
      {
      ObjectMove("cp_1", 0, Time[20], Line_1);
      }
      
   if(ObjectFind("cp_2") != 0)
      {
      ObjectCreate("cp_2", OBJ_HLINE, 0, Time[20], Line_2);
      ObjectSet("cp_2", OBJPROP_STYLE, STYLE_DASHDOTDOT);
      ObjectSet("cp_2", OBJPROP_COLOR, Color2);
      }
      else
      {
      ObjectMove("cp_2", 0, Time[20], Line_2);
      }
      
    if(ObjectFind("cp_3") != 0)
      {
      ObjectCreate("cp_3", OBJ_HLINE, 0, Time[20], Line_3);
      ObjectSet("cp_3", OBJPROP_STYLE, STYLE_DASHDOTDOT);
      ObjectSet("cp_3", OBJPROP_COLOR, Color3);
      }
      else ObjectMove("cp_3", 0, Time[20], Line_3);
      
      
   if(ObjectFind("cp_4") != 0)
      {
      ObjectCreate("cp_4", OBJ_HLINE, 0, Time[20], Line_4);
      ObjectSet("cp_4", OBJPROP_STYLE, STYLE_DASHDOTDOT);
      ObjectSet("cp_4", OBJPROP_COLOR, Color4);
      }
      else ObjectMove("cp_4", 0, Time[20], Line_4);
     
         
  
   if(ObjectFind("cp_5") != 0)
      {
      ObjectCreate("cp_5", OBJ_HLINE, 0, Time[20], Line_5);
      ObjectSet("cp_5", OBJPROP_STYLE, STYLE_DASHDOTDOT);
      ObjectSet("cp_5", OBJPROP_COLOR, Color5);
      }
      else
      {
      ObjectMove("cp_5", 0, Time[20], Line_5);
      }
   if(ObjectFind("cp_6") != 0)
      {
      ObjectCreate("cp_6", OBJ_HLINE, 0, Time[20], Line_6);
      ObjectSet("cp_6", OBJPROP_STYLE, STYLE_DASHDOTDOT);
      ObjectSet("cp_6", OBJPROP_COLOR, Color6);
      }
      else
      {
      ObjectMove("cp_6", 0, Time[20], Line_6);
      }
  
   if(ObjectFind("cp_7") != 0)
      {
      ObjectCreate("cp_7", OBJ_HLINE, 0, Time[20], Line_7);
      ObjectSet("cp_7", OBJPROP_STYLE, STYLE_DASHDOTDOT);
      ObjectSet("cp_7", OBJPROP_COLOR, Color7);
      }
      else
      {
      ObjectMove("cp_7", 0, Time[20], Line_7);
      }

   if(ObjectFind("cp_8") != 0)
      {
      ObjectCreate("cp_8", OBJ_HLINE, 0, Time[20], Line_8);
      ObjectSet("cp_8", OBJPROP_STYLE, STYLE_DASHDOTDOT);
      ObjectSet("cp_8", OBJPROP_COLOR, Color8);
      }
      else
      {
      ObjectMove("cp_8", 0, Time[20], Line_8);
      }
  
      
//----
   return(0);
  }
  
//+------------------------------------------------------------------+

Comments