Почему не работает конструкция if(Volume()==1) для работы «по ценам открытия». Исследование. - страница 3

 
TheXpert писал(а) >>

Были прецеденты для MQL?

Я не пользуюсь такой конструкцией, потому что она потенциально опасна. Возможно, в MQL нет проблем с использованием ретурна в теле цикла, но Вы не можете поручиться за разработчиков языка.

 
PapaYozh >>:

Я не пользуюсь такой конструкцией, потому что она потенциально опасна. Возможно, в MQL нет проблем с использованием ретурна в теле цикла, но Вы не можете поручиться за разработчиков языка.

Эта конструкция не опасней, чем goto.

Как говорится, переходя дорогу, сначала посмотри налево, потом на право и только после этого продолжай движение.

Опасность, обычно заключается в среднем слабом знании программистами материальной части,

а именно как происходит процесс вызова подпрограммы и что делает компилятор при этом.

От этого появилась боязнь, что при выходе из вложенных циклов по returt может разрушиться стек или потеряться память или,

не ровен час, возникнет исключение или, просто, программист забудет, что и где он return.

Но заметьте, мы же не выходим по return каждых две строки, что можем запутаться и потерять нить повествования.

От этого, в свое время, при анализе самых распространенных ошибок в C была принята рекомендация

по возможности не использовать return и goto внутри цикла, которая, в последствии, переросла в запрет на применение

команды goto в современных "продвинутых" языках программирования.

 

Да, кстати, если вы работаете в советнике с разными тайм фреймами, например,

советник стоит на D1, а вы работаете с двумя алгоритмами, - первый на D1, второй на H4,

то нужно сделать следующую модификацию:

external int StartTick=5;
datetime	LastTimeD1=0;
datetime	LastTimeH4=0;
int init()
{
   LastTimeD1 = iTime(NULL,PERIOD_D1,0);
   LastTimeH4 = iTime(NULL,PERIOD_H4,0); 
}
int start()
{
   if(IsTesting()==true) StartTick=1;
   if(iTime(NULL,PERIOD_D1,0) != LastTimeD1 &&   iVolume(NULL,PERIOD_D1,0)>=StartTick) 
   {
      LastTime = iTime(NULL,PERIOD_D1,0); 
      //код для периода D1
   }
   if(iTime(NULL,PERIOD_H4,0) != LastTimeH4 &&   iVolume(NULL,PERIOD_H4,0)>=StartTick) 
   {
      LastTime = iTime(NULL,PERIOD_H4,0); 
      //код для периода H4
   }
}

И не забывайте, что тестирования советников с несколькими тайм фреймами в режиме «по ценам открытия»

невозможно, т.к. будет работать только та часть советника, которая настроена на тайм фрейм, на котором тестируется

советник, например, если в тестере стратегии в поле "Период:" вы выбрали D1, а в советнике у вас есть выбор для D1 и H4, последний период

и, соответственно, логика его работы будет проигнорирована. Работать будет только D1.

Чтобы этого избежать нужно перейти на режим тестирование "Контрольные точки". Это медленнее чем "по ценам открытия",

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

время открытия ордеров.

Причина обращения: