Бета-версия платформы MetaTrader 5 build 1845: Функции для работы с барами в MQL5 и улучшения в тестере стратегий - страница 6

 
Ihor Herasko:

ExpertRemove()

Для индикаторов такого, к сожалению, нет.

нее, удалять эксперта не нужно, а нужно лишь прекратить выполнение mq-программы из любого места, вот к примеру:

bool ServerDisable(int count=10){
   for(int i=0;i<count;i++){
      if(IsConnected())
         if(IsTradeAllowed())
            if(!IsTradeContextBusy()){RefreshRates(); return(false);}
      Sleep(157);
   }
   Print(__FUNCTION__," Торговый сервер не отвечает");
return(true);}

я при выставлении  ордеров проверяю разрешение на торговые операции путем вызова функции if(ServerDisable()) return;, заодно и обновляю котировки

если сервер недоступен, то будет последовательный выход из функции открытия ордера и потом буду еще проверять выставлен ли ордер в OnTick()....

а реально то нечего не нужно больше ни проверять ни делать - нет связи с сервером, значит нужно ждать следующего тика, а значит нужно просто передать управление терминалу

вот типа так:

bool ServerDisable(int count=10){
   for(int i=0;i<count;i++){
      if(IsConnected())
         if(IsTradeAllowed())
            if(!IsTradeContextBusy()){RefreshRates(); return(false);}
      Sleep(157);
   }
   Print(__FUNCTION__," Торговый сервер не отвечает");
HLT();}


 

 
Igor Makanu:

нее, удалять эксперта не нужно, а нужно лишь прекратить выполнение mq-программы из любого места, вот к примеру:

я при выставлении  ордеров проверяю разрешение на торговые операции путем вызова функции ServerDisable(), заодно и обновляю котировки

если сервер недоступен, то будет последовательный выход из функции открытия ордера и потом буду еще проверять выставлен ли ордер в OnTick()....

а реально то нечего не нужно больше ни проверять ни делать - нет связи с сервером, значит нужно ждать следующего тика, а значит нужно просто передать управление терминалу

вот типа так:


 

В начале OnTick() проверка, если не прошли её - return; что и будет соответствовать передаче управления терминалу до след.тика.
 
Artyom Trishkin:
В начале OnTick() проверка, если не прошли её - return; что и будет соответствовать передаче управления терминалу до след.тика.

да все это ясно, так все и делается, но вот Вы проверили, что торговые операции разрешены, затем начинаете считать ордера, проверять что закрыть, проверять что там с сигналами на открытие, а потом собрались выставить ордер, тут 2 варианта:

1. не проверяете больше доступность торговых операций - имхо не корректно, я проверяю непосредственно перед попыткой выставления ордера

2. проверяете еще раз доступность торговых операций - имхо, правильно, но если сервер не дает выставить ордер, то потом начинаем выходить различными способами из mql-программы с передачей управления терминалу

я же предлагаю иметь возможность в любом месте выполнения mql-программы прекратить работу mql-программы

ЗЫ: на кой это? ну как бы есть ECN, там не факт, что успели на одном тике выставить ордер и не факт, что на этом тике сможете закрыть другой ордер, или модифицировать тейк и стоплосс выставленного ордера, для некоторых стратегий не нужно сервер "долбить запросами", проще все это сделать на следующем тике, если с первого раза не получилось

 
Igor Makanu:

я же предлагаю иметь возможность в любом месте выполнения mql-программы прекратить работу mql-программы

Вам уже указали, как это сделать:  ExpertRemove.  Прекращение работы - это и есть выгрузка программы, другого варианта быть не может.   

А то что вы тут навыдумывали с "передачей управления терминалу" через вызов функции - это приведёт к рекурсии.

 
Alexey Navoykov:

Вам уже указали, как это сделать:  ExpertRemove.  Прекращение работы - это и есть выгрузка программы, другого варианта быть не может.   

А то что вы тут навыдумывали с "передачей управления терминалу" через вызов функции - это приведёт к рекурсии.

ничего я не выдумывал, в Делфи всегда был Halt, Abort и Exit, вот и предложил по аналогии

 

iLowest и iHighest работают с ошибками. Если iHighest работает еще более-менее сносно, то iLowest работает совсем некорректно и ужасно тормозит. Код скрипта для проверки:

#property strict
void OnStart()
{
 Comment("");
 string comment;
 int bars=1;
 uint time1 = GetTickCount();
 for(int i=0; i<30; i++)
   {
    ResetLastError();
    comment+="i="+(string)i+"   iHighest="+(string)iHighest(_Symbol, PERIOD_CURRENT, MODE_CLOSE, bars, i)+"  Error="+(string)GetLastError()+"\n";
   }
 uint time2 = GetTickCount();    
 comment+="Time = "+(string)(time2-time1)+" msec\n=====================\n";  
 for(int i=0; i<30; i++)
   {
    ResetLastError();
    comment+="i="+(string)i+"   iLowest="+(string)iLowest(_Symbol, PERIOD_CURRENT, MODE_CLOSE, bars, i)+"  Error="+(string)GetLastError()+"\n";
   }  
 Comment(comment+"Time = "+(string)(GetTickCount()-time2)+" msec");  
}


При bars=1, iHighest отрабатывает корректно и моментально. iLowest выполняет код более 16-ти секунд! И выдает некорректные значения. Должны выдаваться номера баров по порядку начиная с нулевого.

При bars=0 или отрицательном значении, обе функции вообще виснут. В MQL4 они в этом случае искали минимальное и максимальное значение среди всей доступной истории баров.

Файлы:
Test.mq5  1 kb
 
Sergey Klimov:

Для чего вы ставите в начале кода эту строчку?:

Comment("");

 Это ведь ведёт к перерисовке графика. Оно вам надо, создавать такую лишнюю нагрузку? 

Я могу понять, когда ставят такую строчку в коды, в которых функция Comment() вообще не выводит комментарии на график, от слова совсем. Поскольку, видимо, это сродни некоторому вампиризму./* Подпитаться возмущёнными эмоциями каких-то пользователей, когда такой код удалит какой-то нужный комментарий, оставленный на графике другой программой.*/

Но у вас не такая ситуация.

 

P./S.:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Renat Fatkhullin, 2017.12.05 02:51

...

В МТ5 функция Comment явным образом вызывает перерисовку чарта, так как в приоритет ставится именно отображение коммента на чарте. Иначе функция бесполезна.

...

Отсюда дополнительные выводы при проведении бенчмарков:

  • ...
  • всегда нужно знать и доказывать утверждения "почему кадр отрисуется" и "инвалидирую ли я внутреннюю картину рынка, чтобы терминал решил перерисовать кадр"
  • нельзя во время бенчмарков делать множественные выводы Comment в МТ5, всегда нужно думать о том, как вы влияете на отрисовку

  • ...

  • частая перерисовка чартов в бенчмарках ведет к большой зависимости результатов от графической карты.
    по сути некоторые тесты могут вылиться в тестирование графической карты, а не алгоритмов или функций. тест на ноутбуке и стационарном компьютере могут показать кратно разные результаты просто из-за 3-5 кратно медленной видеокарты

...


 
Dina Paches:

Для чего вы ставите в начале кода эту строчку?:

 Это ведь ведёт к перерисовке графика. Оно вам надо, создавать такую лишнюю нагрузку?

Как работает функция Comment я знаю. Поэтому и поставил ее чтобы принудительно очищать экран от предыдущих результатов теста. Я проводил многократные тесты с различными параметрами и т.к. функция iLowest работает по несколько секунд, или скрипт мог вообще зависнуть, то было не совсем понятно, вижу ли я всё ещё старые данные от старых тестов или же это уже появились новые данные. Самый простой и удобный, на мой взгляд, выход из этого был через принудительную очистку в начале теста. Естественно что в реальной программе такого не будет.

P.S. Про создание лишней однократной нагрузки при запуске тестового скрипта в течении нескольких микросекунд функцией Comment, это конечно смешно. Мой компьютер это героически вынес. Тут как говорится "No Comments" :)

 
Sergey Klimov:

Как работает функция Comment я знаю. Поэтому и поставил ее чтобы принудительно очищать экран от предыдущих результатов теста. Я проводил многократные тесты с различными параметрами и т.к. функция iLowest работает по несколько секунд, или скрипт мог вообще зависнуть, то было не совсем понятно, вижу ли я всё ещё старые данные от старых тестов или же это уже появились новые данные. Самый простой и удобный, на мой взгляд, выход из этого был через принудительную очистку в начале теста. Естественно что в реальной программе такого не будет.

P.S. Про создание лишней однократной нагрузки при запуске тестового скрипта в течении нескольких микросекунд функцией Comment, это конечно смешно. Мой компьютер это героически вынес. Тут как говорится "No Comments" :)

Два раза по тридцать оборотов у вас работают по несколько секунд или скрипт может вообще зависнуть?

Вы что-то путаете.

У вас что может вызывать замедление (но вряд ли такое, какое описываете), к примеру: - это то, что при формировании текстовых строк, вы прямо в них вызываете довольно мощные функции (iHighest и iLowest)