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);
}
}