Вам бы следовало предоставить свой код, вот тогда будет предметный разговор, а так это ни о чем, экстрасенсы нынче в отпуске...
А на счет "некорректности работы инициализирующего блока и не предусмотрел "выпрямления" этой ситуации" - все в руках самого прогера - что сделал, то и имеет.
Не могу согласиться, что "все в руках самого прогера", хотя и к помощи экстрасенсов и духов прибегать в этом случае нет необходимости, как и к конкретным кодам. Это проблема не кода а алгоритма исполнения программы, который заложен разработчиками в МТ4, а не "прогером".
МТ4, при включении, запускает все инструменты, init, start (1 раз) и все это на старых данных последнего вашего включения. И только после этого идет обновление данных. Таким образом, использовать
специальную одноразовую функцию init
для одноразовой инициализации параметров, содержащих данные по рынку,
невозможно!
Почему бы не сделать корректно, обновить данные и на них запустить все инструменты? И всё. Как инженер, я понимаю, что могут существовать проблемы реализации того или иного алгоритма, но, в данном случае, это маловероятно.
Кстати, сама же MQ на это и "напарывается". Посмотрите код элементарного встроенного индикатора Volumes. Для организации инициализации индикатора на исторических барах графика в блоке start они используют хитроумную функцию IndicatorCounted() и в результате не менее хитроумных вычислений они пытаются свести цикл к одному срабатыванию.
int start()
{
int i,nLimit,nCountedBars;
//---- bars count that does not changed after last indicator launch.
nCountedBars=IndicatorCounted();
//---- last counted bar will be recounted
if(nCountedBars>0) nCountedBars--;
nLimit=Bars-nCountedBars;
//----
for(i=0; i<nLimit; i++)
{
double dVolume=Volume[i];
if(i==Bars-1 || dVolume>Volume[i+1])
{
ExtVolumesBuffer[i]=dVolume;
ExtVolumesUpBuffer[i]=dVolume;
ExtVolumesDownBuffer[i]=0.0;
}
else
{
ExtVolumesBuffer[i]=dVolume;
ExtVolumesUpBuffer[i]=0.0;
ExtVolumesDownBuffer[i]=dVolume;
}
}
//---- done
return(0);
}
"Пытаются" потому что это не удаётся. Запись в буфера происходит 2 а то и 3 раза. И это на каждом тике, которые следуют с промежутком до 50 мс, а то и меньше. Даже обычный флаг однократного срабатывания вместо всех этих вычислений, о котором говорил Vladradon, работает корректней и "ест" меньше.
int start()
{
int i,nLimit,nCountedBars;
double dVolume=Volume[i];
if(dVolume>Volume[i+1])//i==Bars-1 ||
{
ExtVolumesUpBuffer[i]=dVolume;
ExtVolumesDownBuffer[i]=0.0;
}
else
{
ExtVolumesBuffer[i]=dVolume;
ExtVolumesUpBuffer[i]=0.0;
ExtVolumesDownBuffer[i]=dVolume;
}
if (bOn)
{
//---- bars count that does not changed after last indicator launch.
nCountedBars=IndicatorCounted();
//---- last counted bar will be recounted
Print("nCountedBars = ",nCountedBars);
if(nCountedBars>0) nCountedBars--;
Print("nCountedBars-- = ",nCountedBars);
nLimit=Bars-nCountedBars-1;
//Print("nLimit0 = ",nLimit," i0 = ",i);//----
for(i=0; i<nLimit; i++)
{
dVolume=Volume[i];
if(i==Bars-1 || dVolume>Volume[i+1])
{
ExtVolumesUpBuffer[i]=dVolume;
ExtVolumesDownBuffer[i]=0.0;
}
else
{
ExtVolumesBuffer[i]=dVolume;
ExtVolumesUpBuffer[i]=0.0;
ExtVolumesDownBuffer[i]=dVolume;
}
}
bOn=0;
} //if (bOn)
//---- done
return(0);
}
А, если бы MQ имел алгоритм работы функции init, упомянутый мной выше, не нужно было бы изощрятся.
Когда я начинал изучать MQL4 у меня стоял МТ4 билд 12. Я думал, что к настоящему моменту подобного уровня баги устранены, как и окно нового ордера на все графики с которым ничего невозможно сделать.