Theo998:
My first question on this forum is about accessing close values of a symbol different than Symbol(). I don't understand how it works since when adding multiple identical indicators (identical input parameters) in the same chart (even on simulation) which uses another symbols values (using iClose(...)) values from iClose differs on each indicator instance. How does it work? Why, on the same tick/bar, with identical parameters, one instance of an indicator gets X value from iClose(...) and another instance of the same indicator gets a value different from X of the exact same iClose(...)? |
|
Hi whroeder1,
I'm afraid I don't understand where is the problem or what am I doing wrong.
I'm testing it with a much more simple code, using a custom RSI and adding it to another Symbol chart. I'm opening manually the other Symbol chart to avoid any error. Still it doesn't work. What's wrong with this code? :? Thanks in advance.
EDIT: I'm not getting any error; just wrong values.
//+------------------------------------------------------------------+ //| RSI.mq4 | //| Copyright 2005-2014, MetaQuotes Software Corp. | //| https://www.mql4.com | //+------------------------------------------------------------------+ #property copyright "2005-2014, MetaQuotes Software Corp." #property link "https://www.mql4.com" #property description "Relative Strength Index" #property strict #property indicator_separate_window #property indicator_minimum 0 #property indicator_maximum 100 #property indicator_buffers 1 #property indicator_color1 DodgerBlue #property indicator_level1 30.0 #property indicator_level2 70.0 #property indicator_levelcolor clrSilver #property indicator_levelstyle STYLE_DOT //--- input parameters input string InpSymbol="USDCAD"; // SYMBOL input int InpRSIPeriod=2; // RSI Period //--- buffers double ExtRSIBuffer[]; double ExtPosBuffer[]; double ExtNegBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit(void) { string short_name; //--- 2 additional buffers are used for counting. IndicatorBuffers(3); SetIndexBuffer(1,ExtPosBuffer); SetIndexBuffer(2,ExtNegBuffer); //--- indicator line SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtRSIBuffer); //--- name for DataWindow and indicator subwindow label short_name="RSI("+string(InpRSIPeriod)+")"; IndicatorShortName(short_name); SetIndexLabel(0,short_name); //--- check for input if(InpRSIPeriod<2) { Print("Incorrect value for input variable InpRSIPeriod = ",InpRSIPeriod); return(INIT_FAILED); } //--- SetIndexDrawBegin(0,InpRSIPeriod); //--- initialization done return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Relative Strength Index | //+------------------------------------------------------------------+ 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[]) { int i,pos; double diff; int Myindex0 = iBarShift(InpSymbol, PERIOD_M1, TimeCurrent(), false); int MyRatesTotal = iBars(InpSymbol, PERIOD_M1); //--- if(Bars<=InpRSIPeriod || InpRSIPeriod<2) return(0); //--- counting from 0 to rates_total ArraySetAsSeries(ExtRSIBuffer,false); ArraySetAsSeries(ExtPosBuffer,false); ArraySetAsSeries(ExtNegBuffer,false); ArraySetAsSeries(close,false); //--- preliminary calculations pos=prev_calculated-1; if(pos<=InpRSIPeriod) { //--- first RSIPeriod values of the indicator are not calculated ExtRSIBuffer[0]=0.0; ExtPosBuffer[0]=0.0; ExtNegBuffer[0]=0.0; double sump=0.0; double sumn=0.0; for(i=1; i<=InpRSIPeriod; i++) { ExtRSIBuffer[i]=0.0; ExtPosBuffer[i]=0.0; ExtNegBuffer[i]=0.0; //diff=close[i]-close[i-1]; diff=iClose(InpSymbol, PERIOD_M1,i)-iClose(InpSymbol, PERIOD_M1,i-1); //###########################> MODIFIED if(diff>0) sump+=diff; else sumn-=diff; } //--- calculate first visible value ExtPosBuffer[InpRSIPeriod]=sump/InpRSIPeriod; ExtNegBuffer[InpRSIPeriod]=sumn/InpRSIPeriod; if(ExtNegBuffer[InpRSIPeriod]!=0.0) ExtRSIBuffer[InpRSIPeriod]=100.0-(100.0/(1.0+ExtPosBuffer[InpRSIPeriod]/ExtNegBuffer[InpRSIPeriod])); else { if(ExtPosBuffer[InpRSIPeriod]!=0.0) ExtRSIBuffer[InpRSIPeriod]=100.0; else ExtRSIBuffer[InpRSIPeriod]=50.0; } //--- prepare the position value for main calculation pos=InpRSIPeriod+1; } //--- the main loop of calculations //for(i=pos; i<rates_total && !IsStopped(); i++) for(i=pos; i<MyRatesTotal && !IsStopped(); i++) //###########################> MODIFIED { //diff=close[i]-close[i-1]; diff=iClose(InpSymbol, PERIOD_M1,i)-iClose(InpSymbol, PERIOD_M1,i-1); //###########################> MODIFIED ExtPosBuffer[i]=(ExtPosBuffer[i-1]*(InpRSIPeriod-1)+(diff>0.0?diff:0.0))/InpRSIPeriod; ExtNegBuffer[i]=(ExtNegBuffer[i-1]*(InpRSIPeriod-1)+(diff<0.0?-diff:0.0))/InpRSIPeriod; if(ExtNegBuffer[i]!=0.0) ExtRSIBuffer[i]=100.0-100.0/(1+ExtPosBuffer[i]/ExtNegBuffer[i]); else { if(ExtPosBuffer[i]!=0.0) ExtRSIBuffer[i]=100.0; else ExtRSIBuffer[i]=50.0; } } //--- return(MyRatesTotal); //###########################> MODIFIED } //+------------------------------------------------------------------+
Hi whroeder1,
I'm afraid I don't understand where is the problem or what am I doing wrong.
I'm testing it with a much more simple code, using a custom RSI and adding it to another Symbol chart. I'm opening manually the other Symbol chart to avoid any error. Still it doesn't work. What's wrong with this code? :? Thanks in advance.
EDIT: I'm not getting any error; just wrong values.
I would try using a MqlRates array with CopyTime to see if that fixes your problem.
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
My first question on this forum is about accessing close values of a symbol different than Symbol().
I don't understand how it works since when adding multiple identical indicators (identical input parameters) in the same chart (even on simulation) which uses another symbols values (using iClose(...)) values from iClose differs on each indicator instance.
How does it work? Why, on the same tick/bar, with identical parameters, one instance of an indicator gets X value from iClose(...) and another instance of the same indicator gets a value different from X of the exact same iClose(...)? Does anyone know something about it?
Thanks in advance.