Support_and_Resistance_v1

Author: Andrei Solonevich
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
Support_and_Resistance_v1
ÿþ//+------------------------------------------------------------------+

//|                                                Andrei Solonevich |                                                                 |

//|                       https://www.mql5.com/ru/users/dangodja/news |

//+------------------------------------------------------------------+

#property copyright "Andrei Solonevich"

#property link      "https://www.mql5.com/ru/users/dangodja/news"

#property indicator_chart_window

#property indicator_buffers 8

#property strict

//#property indicator_color1 Yellow

//#property indicator_color2 Yellow

//#property indicator_color3 LimeGreen

//#property indicator_color4 LimeGreen

//#property indicator_color5 Blue

//#property indicator_color6 Blue

//#property indicator_color7 Red

//#property indicator_color8 Red

//---- enum parameters

enum calcPRC { HighLow, OpenClose };

//---- input parameters

extern calcPRC       CalcPrices  =  HighLow;

extern ENUM_TIMEFRAMES  Period1  =  PERIOD_M15,

                        Period2  =  PERIOD_H1,

                        Period3  =  PERIOD_H4,

                        Period4  =  PERIOD_D1;

extern calcPRC       DrawPrices  =  HighLow;

extern color             color1  =  clrYellow,

                         color2  =  clrLimeGreen,

                         color3  =  clrDeepSkyBlue,  //DodgerBlue,

                         color4  =  clrMagenta;

extern int              SRcode1  =  158,

                        SRcode2  =  167,

                        SRcode3  =  115,

                        SRcode4  =  171,

                        SRsize1  =  2,

                        SRsize2  =  2,

                        SRsize3  =  3,

                        SRsize4  =  3;

//---- buffers

double Ress1[], Supp1[];

double Ress2[], Supp2[];

double Ress3[], Supp3[];

double Ress4[], Supp4[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int init()

  {

   Period1 = fmax(Period1,_Period);

   Period2 = fmax(Period2,_Period);

   Period3 = fmax(Period3,_Period);

   Period4 = fmax(Period4,_Period);

//---- indicators

   IndicatorBuffers(8);

   IndicatorDigits(Digits);  //(Digits-Digits%2);   //if (Digits%2==1) IndicatorDigits(Digits-1);

//---

   SetIndexBuffer(0,Ress1);

   SetIndexStyle(0,DRAW_ARROW,EMPTY,SRsize1,color1);

   SetIndexArrow(0, SRcode1);

   SetIndexDrawBegin(0,Period1);

   SetIndexLabel(0,stringMTF(Period1)+": Resistance1");  //"Resistance M15");

//---

   SetIndexBuffer(1,Supp1);

   SetIndexStyle(1,DRAW_ARROW,EMPTY,SRsize1,color1);

   SetIndexArrow(1, SRcode1);

   SetIndexDrawBegin(1,Period1);

   SetIndexLabel(1,stringMTF(Period1)+": Support1");  //"Support M15");

//---

   SetIndexBuffer(2,Ress2);

   SetIndexStyle(2,DRAW_ARROW,EMPTY,SRsize2,color2);

   SetIndexArrow(2, SRcode2);

   SetIndexDrawBegin(2,Period1);

   SetIndexLabel(2,stringMTF(Period2)+": Resistance2");  //"Resistance H1");

//---

   SetIndexBuffer(3,Supp2);

   SetIndexStyle(3,DRAW_ARROW,EMPTY,SRsize2,color2);

   SetIndexArrow(3, SRcode2);

   SetIndexDrawBegin(3,Period1);

   SetIndexLabel(3,stringMTF(Period2)+": Support2");  //"Support H1");

//---

   SetIndexBuffer(4,Ress3);

   SetIndexStyle(4,DRAW_ARROW,EMPTY,SRsize3,color3);

   SetIndexArrow(4, SRcode3);

   SetIndexDrawBegin(4,Period1);

   SetIndexLabel(4,stringMTF(Period3)+": Resistance3");  //"Resistance H4");

//---

   SetIndexBuffer(5,Supp3);

   SetIndexStyle(5,DRAW_ARROW,EMPTY,SRsize3,color3);

   SetIndexArrow(5, SRcode3);

   SetIndexDrawBegin(5,Period1);

   SetIndexLabel(5,stringMTF(Period3)+": Support3");  //"Support H4");

//---

   SetIndexBuffer(6,Ress4);

   SetIndexStyle(6,DRAW_ARROW,EMPTY,SRsize4,color4);

   SetIndexArrow(6, SRcode4);

   SetIndexDrawBegin(6,Period1);

   SetIndexLabel(6,stringMTF(Period4)+": Resistance4");  //Resistance D1");

//---

   SetIndexBuffer(7,Supp4);

   SetIndexStyle(7,DRAW_ARROW,EMPTY,SRsize4,color4);

   SetIndexArrow(7, SRcode4);

   SetIndexDrawBegin(7,Period1);

   SetIndexLabel(7,stringMTF(Period4)+": Support4");  //"Support D1");

//---

   IndicatorShortName(WindowExpertName() +": "+ stringMTF(Period1)+" > "+stringMTF(Period2)+" > "+stringMTF(Period3)+" > "+stringMTF(Period4));

//---//---//

   return(0);

  }

//+------------------------------------------------------------------+

//| Custor indicator deinitialization function                       |

//+------------------------------------------------------------------+

int deinit()  {  Comment("");  return(0);  }

//+------------------------------------------------------------------+

//| Custom indicator Fractal function                                |

//+------------------------------------------------------------------+

bool Fractal(string M, int P, int shift)

  {

   if(_Period>P)

      return(false);

   P=P/_Period*2+MathCeil(P/_Period/2);

//---

   if(shift<P)

      return(false);

   if(shift>Bars-P)

      return(false);

//---

   for(int i=1; i<=P; i++)    //enum calcPRC { HighLow, OpenClose };

     {

      if(M=="U")

        {

         if(CalcPrices==0)

           {

            if(High[shift+i] > High[shift])

               return(false);

            if(High[shift-i] >= High[shift])

               return(false);

           }

         //---

         if(CalcPrices==1)

           {

            if(fmax(Open[shift+i],Close[shift+i]) > fmax(Open[shift],Close[shift]))

               return(false);

            if(fmax(Open[shift-i],Close[shift-i]) >= fmax(Open[shift],Close[shift]))

               return(false);

           }

        }

      //---

      if(M=="L")

        {

         if(CalcPrices==0)

           {

            if(Low[shift+i] < Low[shift])

               return(false);

            if(Low[shift-i] <= Low[shift])

               return(false);

           }

         //---

         if(CalcPrices==1)

           {

            if(fmin(Open[shift+i],Close[shift+i]) < fmin(Open[shift],Close[shift]))

               return(false);

            if(fmin(Open[shift-i],Close[shift-i]) <= fmin(Open[shift],Close[shift]))

               return(false);

           }

        }

     }

   return(true);

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int start()

  {

   int M15=Period1, H1=Period2, H4=Period3, D1=Period4;

//---

   int i=Bars-2;

//---

   while(i>=0)

     {

      if(Fractal("U",M15,i))

         Ress1[i] = DrawPrices==0 ? High[i] : fmax(Open[i],Close[i]);

      else

         Ress1[i] = Ress1[i+1];

      //---

      if(Fractal("L",M15,i))

         Supp1[i] = DrawPrices==0 ? Low[i] : fmin(Open[i],Close[i]);

      else

         Supp1[i] = Supp1[i+1];

      //---

      if(Period2>Period1)

        {

         if(Fractal("U",H1,i))

            Ress2[i] = DrawPrices==0 ? High[i] : fmax(Open[i],Close[i]);

         else

            Ress2[i] = Ress2[i+1];

         //---

         if(Fractal("L",H1,i))

            Supp2[i] = DrawPrices==0 ? Low[i] : fmin(Open[i],Close[i]);

         else

            Supp2[i] = Supp2[i+1];

        }

      //---

      if(Period3>Period1 && Period3!=Period2)

        {

         if(Fractal("U",H4,i))

            Ress3[i] = DrawPrices==0 ? High[i] : fmax(Open[i],Close[i]);

         else

            Ress3[i] = Ress3[i+1];

         //---

         if(Fractal("L",H4,i))

            Supp3[i] = DrawPrices==0 ? Low[i] : fmin(Open[i],Close[i]);

         else

            Supp3[i] = Supp3[i+1];

        }

      //---

      if(Period4>Period1 && Period4!=Period3 && Period4!=Period2)

        {

         if(Fractal("U",D1,i))

            Ress4[i] = DrawPrices==0 ? High[i] : fmax(Open[i],Close[i]);

         else

            Ress4[i] = Ress4[i+1];

         //---

         if(Fractal("L",D1,i))

            Supp4[i] = DrawPrices==0 ? Low[i] : fmin(Open[i],Close[i]);

         else

            Supp4[i] = Supp4[i+1];

        }

      //---

      i--;

     }

//---//---//

   return(0);

  }

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

string stringMTF(int perMTF)

  {

   if(perMTF==0)

      perMTF=_Period;

   if(perMTF==1)

      return("M1");

   if(perMTF==5)

      return("M5");

   if(perMTF==15)

      return("M15");

   if(perMTF==30)

      return("M30");

   if(perMTF==60)

      return("H1");

   if(perMTF==240)

      return("H4");

   if(perMTF==1440)

      return("D1");

   if(perMTF==10080)

      return("W1");

   if(perMTF==43200)

      return("MN1");

   if(perMTF== 2 || 3  || 4  || 6  || 7  || 8  || 9 ||

      10 || 11 || 12 || 13 || 14 || 16 || 17 || 18)

      return("M"+(string)_Period);

//------

   return("Period error!");

  }

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

Comments