trendmanageropen

Author: Copyright � 2007, Matt Kennel
0 Views
0 Downloads
0 Favorites
trendmanageropen
//+------------------------------------------------------------------+ 
//|                                             TrendManagerOpen.mq5 | 
//|                                    Copyright © 2007, Matt Kennel | 
//|                                               mbkennel@gmail.com | 
//+------------------------------------------------------------------+ 
#property copyright "Copyright © 2007, Matt Kennel"
#property link "mbkennel@gmail.com"
//--- Indicator version
#property version   "1.00"
//--- drawing the indicator in a separate window
#property indicator_separate_window
//---- number of indicator buffers 4
#property indicator_buffers 4 
//---- three plots are used
#property indicator_plots   3
//+-----------------------------------+
//|  Indicator 1 drawing parameters   |
//+-----------------------------------+
//---- drawing the indicator as a colored cloud
#property indicator_type1   DRAW_FILLING
//---- the following colors are used as the indicator colors
#property indicator_color1  clrPaleGreen,clrMagenta
//--- displaying the indicator label
#property indicator_label1  "TrendManagerOpen"
//+----------------------------------------------+
//|  Indicator 2 drawing parameters              |
//+----------------------------------------------+
//--- drawing indicator 2 as a line
#property indicator_type2   DRAW_LINE
//--- MediumBlue color is used as the color of the indicator line
#property indicator_color2  clrMediumBlue
//--- indicator 2 line width is equal to 1
#property indicator_width2  1
//---- indicator bullish label display
#property indicator_label2  "TrendManagerOpen Line1"
//+----------------------------------------------+
//|  Indicator 3 drawing parameters              |
//+----------------------------------------------+
//---- drawing the indicator 3 as a symbol
#property indicator_type3   DRAW_LINE
//--- MediumBlue color is used as the color of the indicator line
#property indicator_color3  clrMediumBlue
//--- indicator 3 line width is equal to 1
#property indicator_width3  1
//---- bearish indicator label display
#property indicator_label3 "TrendManagerOpen Line2"
//+-----------------------------------+
//|  Indicator input parameters       |
//+-----------------------------------+
input int TM_Period_1=7;
input int TM_Shift_1=2;
input int TM_Period_2=13;
input int TM_Shift_2=1;
input int Shift=0;        // Horizontal shift of the indicator in bars
//+-----------------------------------+
//--- declaration of integer variables for the start of data calculation
int  min_rates_total;
//--- declaration of dynamic arrays which will be used as indicator buffers
double UpBuffer1[];
double DnBuffer1[];
double UpBuffer2[];
double DnBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- initialization of variables of the start of data calculation
   min_rates_total=MathMax(TM_Period_1+TM_Shift_1,TM_Period_2+TM_Shift_2);
//--- set dynamic array as an indicator buffer
   SetIndexBuffer(0,UpBuffer1,INDICATOR_DATA);
//--- indexing elements in the buffer as in timeseries
   ArraySetAsSeries(UpBuffer1,true);
//--- set dynamic array as an indicator buffer
   SetIndexBuffer(1,DnBuffer1,INDICATOR_DATA);
//--- indexing elements in the buffer as in timeseries
   ArraySetAsSeries(DnBuffer1,true);
//--- set dynamic array as an indicator buffer
   SetIndexBuffer(2,UpBuffer2,INDICATOR_DATA);
//--- indexing elements in the buffer as in timeseries
   ArraySetAsSeries(UpBuffer2,true);
//--- set dynamic array as an indicator buffer
   SetIndexBuffer(3,DnBuffer2,INDICATOR_DATA);
//--- indexing elements in the buffer as in timeseries
   ArraySetAsSeries(DnBuffer2,true);
//--- shifting the start of drawing of the indicator
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//--- setting the indicator values that won't be visible on a chart
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//--- shifting the indicator horizontally by InpKijun
   PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//--- shifting the start of drawing of the indicator
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
//--- setting the indicator values that won't be visible on a chart
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//--- shifting the indicator horizontally by -InpKijun
   PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//--- creation of the name to be displayed in a separate sub-window and in a pop up help
   IndicatorSetString(INDICATOR_SHORTNAME,"TrendManagerOpen");
//--- determining the accuracy of the indicator values
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//--- initialization end
  }
//+------------------------------------------------------------------+  
//| Custom indicator iteration function                              | 
//+------------------------------------------------------------------+  
int OnCalculate(const int rates_total,    // number of bars in history at the current tick
                const int prev_calculated,// amount of history in bars at the previous tick
                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[])
  {
//--- checking if the number of bars is enough for the calculation
   if(rates_total<min_rates_total) return(0);
//--- declaration of variables with a floating point  
   double M1,M1b,M2,M2b,diff1,diff2;
//--- declaration of integer variables
   int limit;
//--- calculation of the 'limit' starting index for the bars recalculation loop
   if(prev_calculated>rates_total || prev_calculated<=0)// Checking for the first start of the indicator calculation
      limit=rates_total-min_rates_total-1;  // starting index for calculation of all bars
   else limit=rates_total-prev_calculated;  // starting index for calculation of new bars only
//--- indexing elements in arrays as in timeseries  
   ArraySetAsSeries(High,true);
   ArraySetAsSeries(Low,true);
//--- main indicator calculation loop
   for(int bar=limit; bar>=0 && !IsStopped(); bar--)
     {
      M1=Get_MiddlePrice(TM_Period_1,bar,High,Low);
      M1b=Get_MiddlePrice(TM_Period_1,bar+TM_Shift_1,High,Low);
      M2=Get_MiddlePrice(TM_Period_2,bar,High,Low);
      M2b=Get_MiddlePrice(TM_Period_2,bar+TM_Shift_2,High,Low);
      //---
      diff1=(M1-M1b); // up or down on short term;
      diff2=(M2-M2b); // up or down on longer term.
      //--- each has three choices, hence six possibilities.
      if(diff1*diff2<=0.0)
        {
         //--- opposite signs
         UpBuffer1[bar]=(M1+M2)*0.5;
         UpBuffer2[bar]=UpBuffer1[bar];
         DnBuffer1[bar]=UpBuffer1[bar]; //Blue bars
         DnBuffer2[bar]=DnBuffer1[bar];
        }
      else
        {
         UpBuffer1[bar]=(M1+M2)*0.5;
         UpBuffer2[bar]=UpBuffer1[bar];
         DnBuffer1[bar]=(M1b+M2b)*0.5;
         DnBuffer2[bar]=DnBuffer1[bar];
        }
     }
//---    
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
double Get_MiddlePrice(uint period,int shift,const double &high[],const double &low[])
  {
//---
   double HH=high[ArrayMaximum(high,shift,period)];
   double LL=low[ArrayMinimum(low,shift,period)];
//---
   return((HH+LL)/2.0);
  }
//+------------------------------------------------------------------+

Comments