Замучила ошибка there are no trading operations - страница 14

 
Maxim Kuznetsov:

подумайте что будет при Стоп-Аут. (у вас уже Маржин-Колл, стёпа близок как никогда)

вашу сделку принудительно закроют, но вы игнорируете подобный вариант и будете каждый тик за ней лезть (в историю, это долго) и посылать некорректные приказы.

Просто добавлю для всех кто "более 10-ти лет занимается программированием MQL"

Если что-то может случиться, то оно обязательно случается.

Стоп-Аут и Маржин-Колл не то чтобы нормально, но естественно, и советник должен быть к ним готов

Торговые условия могут меняться, они не постоянны. StopLevel прыгает, и даже плечо порой меняется.

Пользователь легко может задать/поменять Стоп/Тейк или закрыть сделку, даже просто ненароком - советник должен на это реагировать

Пользователь может открыть/закрыть ордер с Magic советника (или случайно задать Magic=0 и торговать "руками") - что робот при этом сделает ?

Баланс пополняется/снимается без рестартов советника - крайне важно чтобы робот умел в такое (недавно была тема - человек просто реально потерял деньги)

Терминал может быть перезагружен и долго обновляться или связь может пропасть на значительное время - всё это и всё что случилось в offline должно быть учтено

Валидатор проверят всего 1-2% от "кандидатского минимума", и люди ещё жалуются...

 
Renat Akhtyamov:

вроде бы писали последовательно, вопрос - ответ

все страницы темы доступны

Ренат, я понял что Вы считаете ордера. Я не понял зачем?


Maxim Kuznetsov:

Просто добавлю для всех кто "более 10-ти лет занимается программированием MQL"

Если что-то может случиться, то оно обязательно случается.

Стоп-Аут и Маржин-Колл не то чтобы нормально, но естественно, и советник должен быть к ним готов

Торговые условия могут меняться, они не постоянны. StopLevel прыгает, и даже плечо порой меняется.

Пользователь легко может задать/поменять Стоп/Тейк или закрыть сделку, даже просто ненароком - советник должен на это реагировать

Пользователь может открыть/закрыть ордер с Magic советника (или случайно задать Magic=0 и торговать "руками") - что робот при этом сделает ?

Баланс пополняется/снимается без рестартов советника - крайне важно чтобы робот умел в такое (недавно была тема - человек просто реально потерял деньги)

Терминал может быть перезагружен и долго обновляться или связь может пропасть на значительное время - всё это и всё что случилось в offline должно быть учтено

Валидатор проверят всего 1-2% от "кандидатского минимума", и люди ещё жалуются...

Максим, о чём Вы вообще?! Я что просил совета, что мне делать при стоп ауте. Прочитайте форум с 6-й страницы, на мой взгляд я очень подробно изложил свой вопрос.

 
Andrey Kaunov:

Ренат, я понял что Вы считаете ордера. Я не понял зачем?


Максим, о чём Вы вообще?! Я что просил совета что мне делать при стоп ауте. Прочитайте форум с 6-й страницы, на мой взгляд я очень подробно изложил свой вопрос.

потому что тикеты на реале не 0,,,,N

 
А, Вы про мой маленький код. Так там неважно какие тикеты. Ренат там же двухмерный массив. В ячейку [0] записывает тикет, а в ячейку [1] считает ордера. Можно было разными переменными сделать, но я чего то решил так.
 
Andrey Kaunov:

Ренат, я понял что Вы считаете ордера. Я не понял зачем?


Максим, о чём Вы вообще?! Я что просил совета, что мне делать при стоп ауте. Прочитайте форум с 6-й страницы, на мой взгляд я очень подробно изложил свой вопрос.

ну с вашим 10-летним опытом, ну чего можно посоветовать...да ничего в принципе :-)

вы-же игнорируете все советы и требуете исправить валидор под ваш советник

---

у вас по NZDUSD наступил стопаут, вам закрыли ордер, логике вашего советника пофик,  вы его всё-равно выбираете и отправляете OrderClose, получаете false. Дивную операцию повторяете на каждом тике, всё это дело тормозит и проверка отменяется. И это в простейшем.

про проверки торговых условий - см предыдущие 14 страниц

 
Andrey Kaunov:

Обратите внимание на это ваше сообщение:

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

Замучила ошибка there are no trading operations

Andrey Kaunov, 2020.07.25 11:42

Ренат, спасибо за  совет, я попробую.

Владимир, а Вы конструктивно разобраться в вопросе можете?! Разве я не проверяю лот на маржу и прочее? Статья "Какие проверки должен пройти ..." для меня уже как библия. Фрагменты кода выложил выше. Для полного соответствия изменил код согласно Вашим рекомендациям из статьи:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   //double free = AccountFreeMargin()*0.95;
   //double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   //if(is_margin && _lot*margin>free)  _lot=0.0;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=0.0;
   return(_lot);
}

Но всё равно получаю "нет торговых операций":

Хорошо, если функция всё время отправляет лот 0.0, тем самым не даёт открывать сделки, изменяю чтобы она отправляла минимальный лот:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   //double free = AccountFreeMargin()*0.95;
   //double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   //if(is_margin && _lot*margin>free)  _lot=0.0;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=min;
   return(_lot);
}

И получаю историю, что сделки всё таки происходят (см. скрины ниже). Но минимальный лот конечно очень странный приходит, но пусть приходит. Но сделки то есть!

Вот в этой ситуации очень странно поступает валидатор, делая минимальный лот 0.2 при депозите 1$.


Естественно при таком подходе никаких сделок не будет! И это при совершенно адекватном коде. К слову, я убрал для тестирования все условия по индикаторам и т.п. Сделки начинают открываться сразу же после запуска советника.

Так с чем же справляется валидатор?! Мне видится пока только с тем, чтобы взорвать мозг программистам! 

Заметьте, я не прошу что то менять в валидаторе. Можно просто нам видеть логи тестирования. Тогда станет понятно с какими параметрами проходят тесты, на каких депозитах. В конце концов принтами можно будет хотя бы отследить где ошибка в коде и оперативно её исправить. А не тыкать пальцем в небо целую неделю, пытаясь только локализовать ошибку. Мы же не друг против друга работаем! Я понимаю, вместе пытаемся что то заработать.

Самый первый ваш скрин. Вы привязались к сообщению, что на NZDUSD нет торговых операций. И уже 14 страниц боретесь с этой мельницей.

А основная-то ошибка на первом скрине вовсе не эта. А та, что сообщает вам о слишком долгом тестировании на GBPUSD. Именно потому, что там у вас тест длился очень долго, валидатор его и прервал по таймауту.

Запустите профилировщик кода на GBPUSD, M30 и пусть торгует часа три. Далее поглядите узкие места и исправьте.

 
Maxim Kuznetsov:


---

у вас по NZDUSD наступил стопаут, вам закрыли ордер, логике вашего советника пофик,  вы его всё-равно выбираете и отправляете OrderClose, получаете false. Дивную операцию повторяете на каждом тике, всё это дело тормозит и проверка отменяется. И это в простейшем.

про проверки торговых условий - см предыдущие 14 страниц

Максим, Вы очень невнимательно прочитали код.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   gl_lots=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   gl_ask=NormalizeDouble(Ask,_Digits);
   gl_bid=NormalizeDouble(Bid,_Digits);
   gl_comm="test";
//---
   if(AccountFreeMarginCheck(_Symbol,OP_BUY,gl_lots)<=0 || GetLastError()==134) {
      printf("Not enough money for the minimum lot: %.4f",gl_lots); 
      return;
   }
   if(test_ticket[1]<8 && test_ticket[0]==0) {
      test_ticket[0]=OrderSend((StringCompare(_Symbol,"NZDUSD")==0?"NZDUSD":_Symbol),OP_BUY,gl_lots,gl_ask,30,0.0,0.0,gl_comm,33333,0,clrNONE);
      if(test_ticket[0]>0) test_ticket[1]++;
      else if(Fun_Error(GetLastError())==1) return; 
   }   
   if(test_ticket[0]>0)
      if(OrderSelect(test_ticket[0],SELECT_BY_TICKET)) {
         if(OrderCloseTime()==0 && OrderOpenTime()+300<TimeCurrent())
            if(OrderClose(test_ticket[0],OrderLots(),gl_bid,30,clrNONE)) {
               printf("Test order closed, ticket #%d",test_ticket[0]);
               test_ticket[0]=0;
            } else if(Fun_Error(GetLastError())==1) return;
      } else if(Fun_Error(GetLastError())==1) return;
}

Указанное маркером условие не даст уйти на функцию OrderClose(), если ордер закрыт, это первое. А второе, если бы по NZDUSD был открыт хоть один ордер, валидатор не вернул бы "нет торговых операций".

Artyom Trishkin:

...

Запустите профилировщик кода на GBPUSD, M30 и пусть торгует часа три. Далее поглядите узкие места и исправьте.

Хорошо, Артём. Попробую.

 
Andrey Kaunov:

Максим, Вы очень невнимательно прочитали код.

Указанное маркером условие не даст уйти на функцию OrderClose(), это первое. А второе, если бы по NZDUSD был открыт хоть один ордер, валидатор не вернул бы "нет торговых операций".


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

отбросьте "опыт" и перепишите советник как для себя, так чтобы не было страшно ставить его на личный немалый счёт. Валидатор непричём

 
Да я не прошу лично вас, Максим, ничего отлаживать. Код кривой, отлично, но валидацию именно он проходит. Вопрос то совсем в другом.
 
Artyom Trishkin:

...

Запустите профилировщик кода на GBPUSD, M30 и пусть торгует часа три. Далее поглядите узкие места и исправьте.

Артём, профилировщик узких мест не показал. Весь код работает ровно, без каких то патологически долгих процессов.

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

В общем, пройдёшь или нет валидацию, зависит только от "настроения" валидатора (напряжения в сети, каких то энергопотоков или х.з. там чего ещё). При этом код в обычном тестере при вменяемых параметрах никогда не зависал и не давал каких либо сбоев, на любых парах и ТФ.

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