This is my first attempt to write a code in mql5 and there are a few issues I am facing.
I wanted to write a simple indicator that displays a red block if Pair1 bar is bullish and a green block if it is bearish.
Problem
#1: the label and arrow settings are not applied to the 2nd pair buffer. it shows a little circle instead of a square.
#2 : my iClose and iOpen return wrong values.
I must have made some rudimentary mistakes but I am not able to find them myself. Can someone please help me out here.
I wanted to write a simple indicator that displays a red block if Pair1 bar is bullish and a green block if it is bearish.
Problem
#1: the label and arrow settings are not applied to the 2nd pair buffer. it shows a little circle instead of a square.
#2 : my iClose and iOpen return wrong values.
I must have made some rudimentary mistakes but I am not able to find them myself. Can someone please help me out here.
Inserted Code
//+------------------------------------------------------------------+ //| Hedge.mq5 | //| Copyright 2012, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_minimum 1 #property indicator_maximum 10 #property indicator_buffers 4 #property indicator_plots 2 //--- plot Label1 #property indicator_color1 clrLime,clrRed #property indicator_type1 DRAW_COLOR_ARROW #property indicator_style1 STYLE_SOLID #property indicator_width1 2 // ---- plot Pair1 #property indicator_color2 clrLime,clrRed #property indicator_type2 DRAW_COLOR_ARROW #property indicator_style2 STYLE_SOLID #property indicator_width2 2 //--- input parameters input string Pair1="EURUSD"; input string Pair2="USDCHF"; //--- indicator buffers double Pair1Buffer[],Pair2Buffer[]; double Pair1CBuffer[],Pair2CBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,Pair1Buffer,INDICATOR_DATA); PlotIndexSetInteger(0,PLOT_ARROW,110); PlotIndexSetString(0,PLOT_LABEL,Pair1); SetIndexBuffer(1,Pair1CBuffer,INDICATOR_COLOR_INDEX); SetIndexBuffer(2,Pair2Buffer,INDICATOR_DATA); PlotIndexSetInteger(2,PLOT_ARROW,110); PlotIndexSetString(2,PLOT_LABEL,Pair2); SetIndexBuffer(3,Pair2CBuffer,INDICATOR_COLOR_INDEX); 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[]) { //--- //--- auxiliary variables int i=0; //--- set position for beginning if(i<prev_calculated) i=prev_calculated-1; //--- start calculations while(i<rates_total) { Pair1Buffer[i] = 2; Pair2Buffer[i] = 8; if( iClose(Pair1,0,i) >= iOpen(Pair1,0,i) ) { Pair1CBuffer[i] = 1; } else { Pair1CBuffer[i] = 0; } if( iClose(Pair2,0,i) > iOpen(Pair2,0,i) ) { Pair2CBuffer[i] = 1; } else { Pair2CBuffer[i] = 0; } i++; } //Try a fix shift. double temp[1]; int shift = 5; CopyOpen(Pair1,PERIOD_CURRENT,shift,1,temp); Comment("Open: " + DoubleToString(temp[0],Digits()) + "\n" + "Close: " + DoubleToString(iClose(Pair1,0,shift),Digits()) + "\nShift: " + IntegerToString(shift,1)); return(rates_total); } //+------------------------------------------------------------------+ double iClose(string symbol,int period, int shift){ double temp[1]; if(CopyClose(symbol,period(period),shift,1,temp) == 1) return(temp[0]); elsereturn(-1); } double iOpen(string symbol,int period, int shift){ double temp[1]; if(CopyOpen(symbol,period(period),shift,1,temp) == 1) return(temp[0]); else return(-1); } double iHigh(string symbol,int period, int shift){ double temp[1]; if(CopyOpen(symbol,period(period),shift,1,temp) == 1) return(temp[0]); else return(-1); } double iLow(string symbol,int period, int shift){ double temp[1]; if(CopyLow(symbol,period(period),shift,1,temp) == 1) return(temp[0]); else return(-1); } long iVolume(string symbol,int period, int shift, bool realVolume = true){ long temp[1]; if(realVolume) if(CopyRealVolume(symbol,period(period),shift,1,temp) != -1) return(temp[0]); else return(-1); else if (CopyTickVolume(symbol,period(period),shift,1,temp) != -1) return(temp[0]); else return(-1); } ENUM_TIMEFRAMES period(int tf = 0) { switch(tf) { case 0: return(PERIOD_CURRENT); case 1: return(PERIOD_M1); case 5: return(PERIOD_M5); case 15: return(PERIOD_M15); case 30: return(PERIOD_M30); case 60: return(PERIOD_H1); case 240: return(PERIOD_H4); case 1440: return(PERIOD_D1); case 10080: return(PERIOD_W1); case 43200: return(PERIOD_MN1); case 2: return(PERIOD_M2); case 3: return(PERIOD_M3); case 4: return(PERIOD_M4); case 6: return(PERIOD_M6); case 10: return(PERIOD_M10); case 12: return(PERIOD_M12); case 16385: return(PERIOD_H1); case 16386: return(PERIOD_H2); case 16387: return(PERIOD_H3); case 16388: return(PERIOD_H4); case 16390: return(PERIOD_H6); case 16392: return(PERIOD_H8); case 16396: return(PERIOD_H12); case 16408: return(PERIOD_D1); case 32769: return(PERIOD_W1); case 49153: return(PERIOD_MN1); default: return(PERIOD_CURRENT); } }