//+------------------------------------------------------------------+ //| MultiMaRsiSignal.mq5 | //| Copyright © 2012, Nikolay Kositsin | //| Khabarovsk, farria@mail.redcom.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2012, Nikolay Kositsin" #property link "farria@mail.redcom.ru" #property description "" //---- indicator version number #property version "1.00" //---- drawing indicator in a separate window #property indicator_separate_window //---- indicator subwindow fixed height in pixels #property indicator_height 60 //---- The lower and upper limits of the scale separate of indicator window #property indicator_maximum +5.9 #property indicator_minimum +0.4 //+-----------------------------------+ //| Declaration of constants | //+-----------------------------------+ #define RESET 0 // the constant for getting the command for the indicator recalculation back to the terminal #define INDTOTAL 5// The constant for the number of displayed indicators //+-----------------------------------+ //---- number of indicator buffers #property indicator_buffers 20 // INDTOTAL*4 //---- total number of used graphical plots #property indicator_plots 10 // INDTOTAL*2 //+-----------------------------------+ //| Indicator 1 drawing parameters | //+-----------------------------------+ //---- drawing indicator 1 as a line #property indicator_type1 DRAW_COLOR_LINE //---- the following colors are used for the indicator line #property indicator_color1 clrMagenta,clrGray,clrLime //---- indicator line is a solid one #property indicator_style1 STYLE_SOLID //---- the width of indicator line is 3 #property indicator_width1 3 //---- displaying the indicator label #property indicator_label1 "Signal line 1"; //+-----------------------------------+ //| Indicator 1 drawing parameters | //+-----------------------------------+ //---- drawing the indicator 1 as a label #property indicator_type2 DRAW_COLOR_ARROW //---- color which used for the label #property indicator_color2 clrRed,clrDarkGray,clrTeal //---- indicator line width is equal to 5 #property indicator_width2 5 //---- displaying the indicator label #property indicator_label2 "Trend 1"; //+-----------------------------------+ //| Indicator 2 drawing parameters | //+-----------------------------------+ //---- dawing the indicator 2 as a line #property indicator_type3 DRAW_COLOR_LINE //---- the following colors are used for the indicator line #property indicator_color3 clrMagenta,clrGray,clrLime //---- indicator line is a solid one #property indicator_style3 STYLE_SOLID //---- the width of indicator line is 3 #property indicator_width3 3 //---- displaying the indicator label #property indicator_label3 "Signal line 2"; //+-----------------------------------+ //| Indicator 2 drawing parameters | //+-----------------------------------+ //---- drawing the indicator 2 as a label #property indicator_type4 DRAW_COLOR_ARROW //---- color which used for the label #property indicator_color4 clrRed,clrDarkGray,clrTeal //---- indicator line width is equal to 5 #property indicator_width4 5 //---- displaying the indicator label #property indicator_label4 "Trend 2"; //+-----------------------------------+ //| Indicator 3 drawing parameters | //+-----------------------------------+ //---- drawing indicator 3 as line #property indicator_type5 DRAW_COLOR_LINE //---- the following colors are used for the indicator line #property indicator_color5 clrMagenta,clrGray,clrLime //---- indicator line is a solid one #property indicator_style5 STYLE_SOLID //---- the width of indicator line is 3 #property indicator_width5 3 //---- displaying the indicator label #property indicator_label5 "Signal line 3"; //+-----------------------------------+ //| Indicator 3 drawing parameters | //+-----------------------------------+ //---- drawing the indicator 3 as a label #property indicator_type6 DRAW_COLOR_ARROW //---- color which used for the label #property indicator_color6 clrRed,clrDarkGray,clrTeal //---- indicator line width is equal to 5 #property indicator_width6 5 //---- displaying the indicator label #property indicator_label6 "Trend 3"; //+-----------------------------------+ //| Indicator 4 drawing parameters | //+-----------------------------------+ //---- drawing indicator 4 as line #property indicator_type7 DRAW_COLOR_LINE //---- the following colors are used for the indicator line #property indicator_color7 clrMagenta,clrGray,clrLime //---- indicator line is a solid one #property indicator_style7 STYLE_SOLID //---- the width of indicator line is 3 #property indicator_width7 3 //---- displaying the indicator label #property indicator_label7 "Signal line 4"; //+-----------------------------------+ //| Indicator 4 drawing parameters | //+-----------------------------------+ //---- drawing the indicator 4 as a label #property indicator_type8 DRAW_COLOR_ARROW //---- color which used for the label #property indicator_color8 clrRed,clrDarkGray,clrTeal //---- indicator line width is equal to 5 #property indicator_width8 5 //---- displaying the indicator label #property indicator_label8 "Trend 4"; //+-----------------------------------+ //| Indicator 5 drawing parameters | //+-----------------------------------+ //---- drawing the indicator 5 as a line #property indicator_type9 DRAW_COLOR_LINE //---- the following colors are used for the indicator line #property indicator_color9 clrMagenta,clrGray,clrLime //---- indicator line is a solid one #property indicator_style9 STYLE_SOLID //---- the width of indicator line is 3 #property indicator_width9 3 //---- displaying the indicator label #property indicator_label9 "Signal line 5"; //+-----------------------------------+ //| Indicator 5 drawing parameters | //+-----------------------------------+ //---- drawing the indicator 5 as a label #property indicator_type10 DRAW_COLOR_ARROW //---- color which used for the label #property indicator_color10 clrRed,clrDarkGray,clrTeal //---- indicator line width is equal to 5 #property indicator_width10 5 //---- displaying the indicator label #property indicator_label10 "Trend 5"; //+-----------------------------------+ //| Input parameters of the indicator| //+-----------------------------------+ input ENUM_TIMEFRAMES TimeFrame0=PERIOD_H12; //1 Chart period input ENUM_TIMEFRAMES TimeFrame1=PERIOD_H8; //2 Chart period input ENUM_TIMEFRAMES TimeFrame2=PERIOD_H4; //3 Chart period input ENUM_TIMEFRAMES TimeFrame3=PERIOD_H2; //4 Chart period input ENUM_TIMEFRAMES TimeFrame4=PERIOD_H1; //5 Chart period //+-----------------------------------+ //| Input parameters of the indicator| //+-----------------------------------+ input uint nPeriodRsi=3; input ENUM_APPLIED_PRICE nRSIPrice=PRICE_WEIGHTED; input uint nPeriodRsiLong=13; input ENUM_APPLIED_PRICE nRSIPriceLong=PRICE_MEDIAN; input uint nPeriodMa=5; input ENUM_MA_METHOD nMAType=MODE_EMA; input ENUM_APPLIED_PRICE nMAPrice=PRICE_CLOSE; input uint nPeriodMaLong=10; input ENUM_MA_METHOD nMATypeLong=MODE_EMA; input ENUM_APPLIED_PRICE nMAPriceLong=PRICE_CLOSE; //+-----------------------------------+ //---- Declaration of a variable for storing the indicator initialization result bool Init; //---- declaration of the integer variables for the start of data calculation int min_rates_total; //+------------------------------------------------------------------+ //| Getting string timeframe | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- } //+------------------------------------------------------------------+ //| Class of indicator buffers | //+------------------------------------------------------------------+ class CIndBuffers { //---- public: double m_ArrayBuffer[]; double m_ColorArrayBuffer[]; double m_LineBuffer[]; double m_ColorLineBuffer[]; int m_Handle[4]; ENUM_TIMEFRAMES m_TimeFrame; //---- }; //---- declaration of dynamic arrays that further //---- will be used as indicator buffers CIndBuffers Ind[INDTOTAL]; //+------------------------------------------------------------------+ //| MaRsi indicator initialization function | //+------------------------------------------------------------------+ bool IndInit(uint Number) { //---- checking correctness of the chart periods if(Ind[Number].m_TimeFrameRates_Total || Prev_Calculated<=0)// checking for the first start of calculation of an indicator { LastCountBar[Number]=Rates_Total; limit_=Limit; } else limit_=int(LastCountBar[Number])+Limit; // starting index for calculation of new bars //---- Main cycle of calculation of the indicator for(int bar=int(limit_); bar>=0 && !IsStopped(); bar--) { //---- zero out the contents of the indicator buffers for calculation Ind[Number].m_ArrayBuffer[bar]=EMPTY_VALUE; Ind[Number].m_LineBuffer[bar]=Number+1; Ind[Number].m_ColorArrayBuffer[bar]=EMPTY_VALUE; Ind[Number].m_ColorLineBuffer[bar]=0; Time0=Time[bar]; //--- copy newly appeared data in the array if(CopyTime(Symbol(),Ind[Number].m_TimeFrame,Time0,1,Time_)<=0) return(RESET); if(Time0>=Time_[0] && Time[bar+1] MA1[0]) res = +1; if(MA0[0] < MA1[0]) res = -1; if(RSI0[0] > RSI1[0]) res += 1; if(RSI0[0] < RSI1[0]) res -= 1; res=MathMax(MathMin(1,res),-1)+1; int numb=int(Number+1); Ind[Number].m_ArrayBuffer[bar]=numb; Ind[Number].m_LineBuffer[bar]=numb; Ind[Number].m_ColorArrayBuffer[bar]=res; Ind[Number].m_ColorLineBuffer[bar]=res; } if(Ind[Number].m_ArrayBuffer[bar]==EMPTY_VALUE) Ind[Number].m_ColorLineBuffer[bar]=Ind[Number].m_ColorLineBuffer[bar+1]; } //---- end of one indicator calculation return(true); } //+------------------------------------------------------------------+ //| MaRsi indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //---- Initialization of variables of the start of data calculation min_rates_total=3; Init=true; //---- Initialization of variables Ind[0].m_TimeFrame=TimeFrame0; Ind[1].m_TimeFrame=TimeFrame1; Ind[2].m_TimeFrame=TimeFrame2; Ind[3].m_TimeFrame=TimeFrame3; Ind[4].m_TimeFrame=TimeFrame4; //---- initialize buffers of indicators for(int count=0; countrates_total || prev_calculated<=0)// checking for the first start of calculation of an indicator 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 //---- indexing elements in arrays as timeseries ArraySetAsSeries(time,true); for(int count=0; count