supertrend_v2

Author: Copyright 2011, FxGeek
Indicators Used
Indicator of the average true range
0 Views
0 Downloads
0 Favorites
supertrend_v2
ÿþ//+------------------------------------------------------------------+

//|                                                   SuperTrend.mq5 |

//|                                           Copyright 2011, FxGeek |

//|                                              http://www.mql5.com |

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

#property copyright "Copyright 2011, FxGeek"

#property link      " http://www.mql5.com"

#property version   "1.00"

#property indicator_chart_window

#property indicator_buffers 11

#property indicator_plots 3

//---

#property indicator_label1  "Buy_Arrow"

#property indicator_type1   DRAW_ARROW

#property indicator_color1  clrGreen

#property indicator_width1  2

//---

#property indicator_label2  "Sell_Arrow"

#property indicator_type2  DRAW_ARROW

#property indicator_color2  clrRed

#property indicator_width2  2

//---

#property indicator_label3  "SuperTrend"

#property indicator_type3   DRAW_COLOR_LINE

#property indicator_color3  clrGreen, clrRed

#property indicator_width3  2

//---

input int    Periode=10;

input double Multiplier=3;

input bool   Show_Filling=false; // Show as DRAW_FILLING

//---

double buyPB[];

double sellPB[];

//---

double SuperTrend[];

double ColorBuffer[];

//---

double Atr[];

double Up[];

double Down[];

double Middle[];

double trend[];

//---

int atrHandle;

int changeOfTrend;

int flag;

int flagh;

//---

ushort   codeUp=233;

ushort   codeDown=234;

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

//| Custom indicator initialization function                         |

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

int OnInit()

  {

//--- indicator buffers mapping

   SetIndexBuffer(0,buyPB,INDICATOR_DATA);

   SetIndexBuffer(1,sellPB,INDICATOR_DATA);

   SetIndexBuffer(2,SuperTrend,INDICATOR_DATA);

   SetIndexBuffer(3,ColorBuffer,INDICATOR_COLOR_INDEX);

//---

   PlotIndexSetInteger(0,PLOT_ARROW,codeUp);

   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,20);

   PlotIndexSetInteger(1,PLOT_ARROW,codeDown);

   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-20);

//---

   SetIndexBuffer(4,Atr,INDICATOR_CALCULATIONS);

   SetIndexBuffer(5,Up,INDICATOR_CALCULATIONS);

   SetIndexBuffer(6,Down,INDICATOR_CALCULATIONS);

   SetIndexBuffer(7,Middle,INDICATOR_CALCULATIONS);

   SetIndexBuffer(8,trend,INDICATOR_CALCULATIONS);

//---

   atrHandle=iATR(_Symbol,_Period,Periode);

//---

   return(0);

  }

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

//| Custom indicator iteration function                              |

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

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const datetime &time[],

                const double &open[],

                const double &high[],

                const double &low[],

                const double &close[],

                const long &tick_volume[],

                const long &volume[],

                const int &spread[])

  {

//---

   int to_copy;

   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;

   else

     {

      to_copy=rates_total-prev_calculated;

      if(prev_calculated>0) to_copy++;

     }

//---

   if(IsStopped()) return(0); //Checking for stop flag

   if(CopyBuffer(atrHandle,0,0,to_copy,Atr)<=0)

     {

      Print("Getting Atr is failed! Error",GetLastError());

      return(0);

     }

//---

   int first;

   if(prev_calculated>rates_total || prev_calculated<=0) // checking for the first start of calculation of an indicator 

     {

      first=Periode; // starting index for calculation of all bars

     }

   else

     {

      first=prev_calculated-1; // starting number for calculation of new bars

     }

   for(int i=first; i<rates_total && !IsStopped(); i++)

     {

      Middle[i]=(high[i]+low[i])/2;

      Up[i]  = Middle[i] +(Multiplier*Atr[i]);

      Down[i]= Middle[i] -(Multiplier*Atr[i]);

      //---

      if(close[i]>Up[i-1])

        {

         trend[i]=1;

         if(trend[i-1]==-1) changeOfTrend=1;

        }

      else if(close[i]<Down[i-1])

        {

         trend[i]=-1;

         if(trend[i-1]==1) changeOfTrend=1;

        }

      else if(trend[i-1]==1)

        {

         trend[i]=1;

         changeOfTrend=0;

        }

      else if(trend[i-1]==-1)

        {

         trend[i]=-1;

         changeOfTrend=0;

        }



      if(trend[i]<0 && trend[i-1]>0)

        {

         flag=1;

        }

      else

        {

         flag=0;

        }



      if(trend[i]>0 && trend[i-1]<0)

        {

         flagh=1;

        }

      else

        {

         flagh=0;

        }



      if(trend[i]>0 && Down[i]<Down[i-1])

         Down[i]=Down[i-1];



      if(trend[i]<0 && Up[i]>Up[i-1])

         Up[i]=Up[i-1];



      if(flag==1)

         Up[i]=Middle[i]+(Multiplier*Atr[i]);



      if(flagh==1)

         Down[i]=Middle[i]-(Multiplier*Atr[i]);



      //-- draw the indicator

      if(trend[i]==1)

        {

         SuperTrend[i]=Down[i];

         if(changeOfTrend==1)

           {

            SuperTrend[i-1]=SuperTrend[i-2];

            changeOfTrend=0;

           }

         ColorBuffer[i]=0.0;

        }

      else if(trend[i]==-1)

        {

         SuperTrend[i]=Up[i];

         if(changeOfTrend==1)

           {

            SuperTrend[i-1]=SuperTrend[i-2];

            changeOfTrend=0;

           }

         ColorBuffer[i]=1.0;

        }

      //---

      double Support1= 0;

      double Resist1 = 0;

      //---

      Support1 = SuperTrend[i];

      Resist1  = SuperTrend[i];

      //---

      bool UpTrend=Support1<close[i];

      //---

      sellPB[i]=0;

      buyPB[i]=0;

      //---      

      if(UpTrend)

        {

         if(low[i]<Support1 && close[i]>Support1)

           {

            buyPB[i]=low[i];

           }

        }

      else

        {

         if(high[i]>Resist1 && close[i]<Resist1)

           {

            sellPB[i]=high[i];

           }

        }

     }

//--- return value of prev_calculated for next call

   return(rates_total);

  }

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

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---