я не верю в чудеса )

 

upd  Коллеги, это 5! В смысле, это пятая версия )))

Здравствуйте!

Есть 2 эксперта с одинаковым кодом. onTick код вычисляет значение iBands с параметрами.

При запуске (отладка на исторических данных) одного эксперта  значение вычисляется при первом же onTick, при запуске другого только на втором


Вопрос )

Как такое возможно? 

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnTick()
  {
   double lV;
    lV    =  iBandsMQL4(NULL,PERIOD_CURRENT,20,0,1,PRICE_CLOSE, UPPER_BAND,10);
  }
double iBandsMQL4(const string inSymbol,const ENUM_TIMEFRAMES inTF, const int inPeriod,const int inBandsShift,const double inDeviation,const ENUM_APPLIED_PRICE inAppliedPrice, 
                  const int inBuffNumber, 
                  const int inIndex)
  {
   double lBuf[],lReturnValue;
   int    lH;
   //lH =     iBands(Symbol(),PERIOD_CURRENT,20,0,1,PRICE_CLOSE);
   lH =     iBands(inSymbol, inTF, inPeriod, inBandsShift, inDeviation, inAppliedPrice);
   if(lH<0)
     {
      Print("couldn't get iBands handle",GetLastError());
      return(-1);
     }
    lReturnValue = iBandsGet(lH,inBuffNumber, inIndex);
    return(lReturnValue);
  }  
double iBandsGet(const int inHandle, const int inBuffer, const int inIndex)
  {
   double lBands[];
   ResetLastError();
   if(CopyBuffer(inHandle,inBuffer,inIndex,1,lBands)<0)
     {
      PrintFormat("Failed to copy data from the iBands indicator, error code %d",GetLastError());
      return(0.0);
     }
   return(lBands[0]);
  }
 
Это же от 5-ки код, зачем его сюда перенесли?
 
Dmitry Fedoseev:
Это же от 5-ки код, зачем его сюда перенесли?

вот-вот и я о том же ) 

Может есть робот, который запал на название iBandsMQL4 

 

Вот это:

lH =     iBands(inSymbol, inTF, inPeriod, inBandsShift, inDeviation, inAppliedPrice);

Надо выполнить один раз в ините, а не на каждом тике.

 
Dmitry Fedoseev:

Вот это:

Надо выполнить один раз в ините, а не на каждом тике.

Так то советник работает, но все равно спасибо за идею по оптимизации!

Беспокойство вызывает только, что один и тот же код по-разному ведет себя без видимых на то причин.

 
Nikolai Karetnikov:

Так то советник работает, но все равно спасибо за идею по оптимизации!

Беспокойство вызывает только, что один и тот же код по-разному ведет себя без видимых на то причин.

Ты не понял что тебе объяснили, перечитай ещё раз
 
Aleksei Beliakov:
Ты не понял что тебе объяснили, перечитай ещё раз

В ответе отсутствует объяснение, вместо этого - совет. Совет отличный, я им воспользовался. Но в нем нет указания на причину поведения, показанного на видео.

Так что, если причина вам понятна, будьте добры, потрудитесь объяснить, пожалуйста, почему при инициализации дескриптора 

lH =     iBands в событии onTick(), один и тот же код работает по-разному

 
Nikolai Karetnikov:

В ответе отсутствует объяснение, вместо этого - совет. Совет отличный, я им воспользовался. Но в нем нет указания на причину поведения, показанного на видео.

Так что, если причина вам понятна, будьте добры, потрудитесь объяснить, пожалуйста, почему при инициализации дескриптора 

lH =     iBands в событии onTick(), один и тот же код работает по-разному

Не успевает терминал произвести расчет индикатора до вызова первого CopyBuffer
 
Vladimir Simakov:
Не успевает терминал произвести расчет индикатора до вызова первого CopyBuffer

коллеги, проблемы конечно же никакой нет. Воспользовавшись советом Дмитрия, оригинальный советник я изменил и при его работе нулевых значений не возникает. Спасибо !

Но расставить точки над i все же хотелось бы. На видео четко показано, что при запуске одного советника всегда расчет индикатора происходит верно с первого раза, а при запуске второго советника всегда расчет индикатора происходит верно только со второго раза. Код обоих советников идентичен. Т.е. в первом случае терминал успевает, а во втором не успевает. Почему не успевает во втором случае - никто не знает.

Выходит, что создание дескриптора индикатора в событии onTick может привести к непредсказуемым результатам по неизвестным причинам.

По-моему, это говорит о неких особенностях самого терминала, особенностях о которых здесь не прозвучало ни слова.

 
Николай, исследуйте эту заморочку. Посмотрите что происходит, проблема ли с вызовом iCustom() или CopyBuffer() не срабатывает?
 
Dmitry Fedoseev:
Николай, исследуйте эту заморочку. Посмотрите что происходит, проблема ли с вызовом iCustom() или CopyBuffer() не срабатывает?

CopyBuffer не срабатывает. Дескриптор (хендл) ненулевой.