//+------------------------------------------------------------------+ //| Two iMA Crossing Arrow.mq5 | //| Copyright © 2020, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2020, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.000" #property indicator_chart_window #property indicator_buffers 4 #property indicator_plots 1 //--- plot Crossing #property indicator_label1 "Crossing" #property indicator_type1 DRAW_COLOR_ARROW #property indicator_color1 clrRoyalBlue,clrOrangeRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- input parameters input uchar InpCode = 74; // Arrow code for style DRAW_ARROW (font Wingdings) input int InpBar = 1; // Bar Crossing //--- MA "Fast" input int Inp_MA_Fast_ma_period = 5; // MA Fast: averaging period input int Inp_MA_Fast_ma_shift = 0; // MA Fast: horizontal shift input ENUM_MA_METHOD Inp_MA_Fast_ma_method = MODE_SMA; // MA Fast: smoothing type input ENUM_APPLIED_PRICE Inp_MA_Fast_applied_price = PRICE_CLOSE; // MA Fast: type of price //--- MA "Slow" input int Inp_MA_Slow_ma_period = 12; // MA Slow: averaging period input int Inp_MA_Slow_ma_shift = 0; // MA Slow: horizontal shift input ENUM_MA_METHOD Inp_MA_Slow_ma_method = MODE_SMA; // MA Slow: smoothing type input ENUM_APPLIED_PRICE Inp_MA_Slow_applied_price = PRICE_CLOSE; // MA Slow: type of price //--- indicator buffers double CrossingBuffer[]; double CrossingColors[]; double FastBuffer[]; double SlowBuffer[]; //--- int handle_iMA_Fast; // variable for storing the handle of the iMA indicator int handle_iMA_Slow; // variable for storing the handle of the iMA indicator //--- we will keep the number of values in the Moving Average indicator int bars_calculated=0; //--- int start_bar=0; double arrow_shift=0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,CrossingBuffer,INDICATOR_DATA); SetIndexBuffer(1,CrossingColors,INDICATOR_COLOR_INDEX); SetIndexBuffer(2,FastBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(3,SlowBuffer,INDICATOR_CALCULATIONS); //--- setting a code from the Wingdings charset as the property of PLOT_ARROW PlotIndexSetInteger(0,PLOT_ARROW,InpCode); //--- an empty value for plotting, for which there is no drawing PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); //--- create handle of the indicator iMA handle_iMA_Fast=iMA(Symbol(),Period(),Inp_MA_Fast_ma_period,Inp_MA_Fast_ma_shift, Inp_MA_Fast_ma_method,Inp_MA_Fast_applied_price); //--- if the handle is not created if(handle_iMA_Fast==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iMA (\"Fast\") indicator for the symbol %s/%s, error code %d", Symbol(), EnumToString(Period()), GetLastError()); //--- the indicator is stopped early return(INIT_FAILED); } //--- create handle of the indicator iMA handle_iMA_Slow=iMA(Symbol(),Period(),Inp_MA_Slow_ma_period,Inp_MA_Slow_ma_shift, Inp_MA_Slow_ma_method,Inp_MA_Slow_applied_price); //--- if the handle is not created if(handle_iMA_Slow==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iMA (\"Slow\") indicator for the symbol %s/%s, error code %d", Symbol(), EnumToString(Period()), GetLastError()); //--- the indicator is stopped early return(INIT_FAILED); } //--- start_bar=((Inp_MA_Fast_ma_period+Inp_MA_Fast_ma_shift)<(Inp_MA_Slow_ma_period+Inp_MA_Slow_ma_shift))?Inp_MA_Slow_ma_period+Inp_MA_Slow_ma_shift:Inp_MA_Fast_ma_period+Inp_MA_Fast_ma_shift; start_bar+=InpBar+3; //--- arrow_shift=Point()*3.0; //--- //bool add_Fast=ChartIndicatorAdd(0,0,handle_iMA_Fast); //bool add_Slow=ChartIndicatorAdd(0,0,handle_iMA_Slow); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 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[]) { if(rates_totalprev_calculated+1) { //--- if the iMABuffer array is greater than the number of values in the iMA indicator for symbol/period, then we don't copy everything //--- otherwise, we copy less than the size of indicator buffers if(calculated>rates_total) values_to_copy=rates_total; else values_to_copy=calculated; } else { //--- it means that it's not the first time of the indicator calculation, and since the last call of OnCalculate() //--- for calculation not more than one bar is added values_to_copy=(rates_total-prev_calculated)+1; } //--- fill the iMABuffer array with values of the Moving Average indicator //--- if FillArrayFromBuffer returns false, it means the information is nor ready yet, quit operation if(!FillArrayFromBuffer(FastBuffer,Inp_MA_Fast_ma_shift,handle_iMA_Fast,values_to_copy)) return(0); if(!FillArrayFromBuffer(SlowBuffer,Inp_MA_Slow_ma_shift,handle_iMA_Slow,values_to_copy)) return(0); //--- memorize the number of values in the Moving Average indicator bars_calculated=calculated; //--- main loop int limit=prev_calculated-1; if(limit<=0) { for(int i=0; iSlowBuffer[i-InpBar]) { CrossingBuffer[i-InpBar]=high[i-InpBar]+arrow_shift; CrossingColors[i-InpBar]=0.0; } else { if(FastBuffer[i-InpBar-1]>SlowBuffer[i-InpBar-1] && FastBuffer[i-InpBar]