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

 
Alexey Viktorov:

Проходит не потому, что перекомпилировал, а потому, что тестирование началось с другой даты. И я заметил такую бяку, если подсунуть то что уже было, то тестирование не происходит, а сразу выдаётся предыдущий результат теста. Так-что не обольщайтесь такими костылями. Старайтесь сделать нормально. Если чего-то не хватает, или параметры недопустимые, сообщите об этом посредством Print и всё будет правильно.

Вот если это было связано только с другой датой, тогда бы мои проверки выявили бы это (не хватка баров и т.д.), но не в дате проблема. Если мне не как не удаётся воссоздать ошибку то что находит автоматическая валидация, то мне проще подсунуть то же самое и надеется что мести с покупателями найдем проблемное место (если такое есть). Данная реализация валидаций мне не даёт полное понимание где искать ошибку. А Print мне уже засунуто везде.

Alexey Viktorov:

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

А что-бы не получать предыдущий результат теста, надо изменить что-то, хоть добавить пустую строку( я это имел виду под "заново перекомпилировать").

 
Roman Gergert:

Разобрался наконецто, может кому поможет, в общем в сове у меня только при включенном  ММ была проверка на минимальный лот, а так хардкором устанавливался лот = 0.01, так вот, в валидаторе депозит оказывается равен 1$ (нашел эту инфу в одной из тем), соответственно он использует лот 0.001 (ну или около того) для торговли, а так как у меня в одном месте всегда был лот 0.01 соответственно ему не хватало средств и робот не торговал)

Точно, Роман, валидатор тестит с депозитом 1$.

В советнике есть функция нормализации лота. Если она возвращает 0, то сделка даже не пытается открыться:

      if((Auto() && (b==0 || (b>0 && BuyPriceMin-Ask>(b==1?iPointOrderStep_1:iPointOrderStep_2)*Point()))) || buy) {
         BuyLot=buy && LotFromPanel()>0 ? LotFromPanel() : BuyLot;
         double norm_lot=NormalizeLots(_Symbol,BuyLot);
         if(norm_lot>0.0) {  
            int ticket=OrderSend(Symbol(),OP_BUY,norm_lot,NormalizeDouble(Ask,_Digits),30,0,0,
                        "NZT-48",iMagicNumber,0,clrGreen);
            if(ticket>0) {
                ObjectSetInteger(0,"V_5_buy",OBJPROP_STATE,false);
                buy=false;
            }
            else  
               Print("Order Send error #",GetLastError());
         } else Print("Not enough money for the minimum lot");   
      }

Но непонятно как тогда эта функция советника нормализации лота отправляет лот 0.2 на открытие:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, 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;
   return(_lot);
}

Ведь если приходит на проверку лот 0.2, а маржа судя по логам 645, то эта часть выражения должна давать true

if(is_margin && _lot*margin>free)  _lot=0.0;     //0.2*645>0.95

И функция отправит 0.0, но никак не 0.2. Значение 0.2 она может отправить только если 

MarketInfo(symbol,MODE_MARGINREQUIRED);

вернула 0 или ничтожно малое значение. Я вообще не понимаю как работает этот валидатор.

Уважаемые разработчики MQL, отправляйте пожалуйста логи тестирования программ вместо сухих отчётов об ошибках валидации в три строчки. Нам, скромным программистам гораздо проще будет понять ошибки кода и исправить их. Можно на почту архивом, способ уж наверное придумаете )))

P.S. Забавная ситуация. 5-й день пытаюсь выложить на маркет отлично работающий в тестере и на реале советник.
 
Andrey Kaunov:

Точно, Роман, валидатор тестит с депозитом 1$.

В советнике есть функция нормализации лота. Если она возвращает 0, то сделка даже не пытается открыться:

Но непонятно как тогда эта функция советника нормализации лота отправляет лот 0.2 на открытие:

Ведь если приходит на проверку лот 0.2, а маржа судя по логам 645, то эта часть выражения должна давать true

И функция отправит 0.0, но никак не 0.2. Значение 0.2 она может отправить только если 

вернула 0 или ничтожно малое значение. Я вообще не понимаю как работает этот валидатор.

Уважаемые разработчики MQL, отправляйте пожалуйста логи тестирования программ вместо сухих отчётов об ошибках валидации в три строчки. Нам, скромным программистам гораздо проще будет понять ошибки кода и исправить их. Можно на почту архивом, способ уж наверное придумаете )))

P.S. Забавная ситуация. 5-й день пытаюсь выложить на маркет отлично работающий в тестере и на реале советник.

по ходу у Вас другое плечо, не то что в маркете, возможно 1:500

попробуйте привести расчет лота к плечу 1к100 заменив в коде только одну строку:

margin = AccountLeverage()*MarketInfo(symbol,MODE_MARGINREQUIRED)/100.0;

ну и минимальный лот для маркета 0.1 по моему....
 

Вы живёте в каком-то своём ограниченном мире. В обычном мире минимальный лот может сильно отличаться от 0.01

РЕцепт: читать и ещё раз читать статью "Какие проверки должен пройти ..."

Перед отсылкой торгового приказа нужно проверять: пройдет ли он, хватит ли маржи ...


В общем валидатор пока справляется со своей главной задачей: отсеивать недоработанный код из Маркета.

 
Renat Akhtyamov:

по ходу у Вас другое плечо, не то что в маркете, возможно 1:500

попробуйте привести расчет лота к плечу 1к100 заменив в коде только одну строку:

margin = AccountLeverage()*MarketInfo(symbol,MODE_MARGINREQUIRED)/100.0;

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

Vladimir Karputov:

Вы живёте в каком-то своём ограниченном мире. В обычном мире минимальный лот может сильно отличаться от 0.01

РЕцепт: читать и ещё раз читать статью "Какие проверки должен пройти ..."

Перед отсылкой торгового приказа нужно проверять: пройдет ли он, хватит ли маржи ...


В общем валидатор пока справляется со своей главной задачей: отсеивать недоработанный код из Маркета.

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

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
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$.


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

Vladimir Karputov:

...

В общем валидатор пока справляется со своей главной задачей: отсеивать недоработанный код из Маркета.

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

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

 
Andrey Kaunov:
   

... Мы же не друг против друга работаем! Я понимаю, вместе пытаемся что то заработать.

Андрей, я в выходные как то раз напоролся на зависший сервак

то есть он тупо не кушал MarketInfo(...)

еле еле победил такое

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

Например, я спрашиваю - какое плечо?

Он говорит 0(ноль)

Я добавляю в коде - если равно 0, то 100

Если логика понятна, то все получится и удачи!

 

Понятно, Ренат, спасибо.

Я уж и так кучу костылей наставил, но в некоторых местах я откровенно в тупике. И ведь хочется чтобы адекватный код проходил адекватную проверку. К тому же найти проблему при отсутствии логов тестирования не невозможно но крайне трудозатратно.

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

 
Andrey Kaunov:

Понятно, Ренат, спасибо.

Я уж и так кучу костылей наставил, но в некоторых местах я откровенно в тупике. И ведь хочется чтобы адекватный код проходил адекватную проверку. К тому же найти проблему при отсутствии логов тестирования не невозможно но крайне трудозатратно.

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

Да, вы не один столкнулись с этой проблемой, в соседней ветке ещё один столкнулся - вас уже двое.

Так-же посмотрите, сколько в сутки выкладывается советников в маркет без каких либо проблем, это называется "Уровень профессионализма".

 

Виталий, если Вам и другим "профессионалам" удаётся пройти валидацию с первого раза, могу только поаплодировать. Но веток по подобной проблеме далеко не две, а больше. Плюс не все пишут, некоторые просто читают. Советник, к слову, не мой. Я готовлю его в маркет для клиента. Но это не отменяет вышеописанных проблем. Если вы внимательно прочли мой пост, может как "профессионал" предложите решение проблемы. Выложить пост по типу: "Ты тупой, а я умный" - много знаний не нужно. 

Вот Вам ещё задачка. Почему, добавив в начало OnTick() безусловное последовательное открытие 5 сделок через 5 минут минимальным лотом, валидатор так же выдает мне: "no trading operations"

void OnTick() { 
   static int test_ticket[2]={0,0};
   if(test_ticket[1]<5 && test_ticket[0]==0) {
      test_ticket[0]=OrderSend(_Symbol,OP_BUY,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),NormalizeDouble(Ask,_Digits),30,0.0,0.0,"NZT-48_test",33333,0,clrNONE);
      if(test_ticket[0]>0) test_ticket[1]++;
   }   
   if(OrderSelect(test_ticket[0],SELECT_BY_TICKET))
      if(OrderCloseTime()==0 && OrderOpenTime()+300<TimeCurrent())
         if(OrderClose(test_ticket[0],NormalizeDouble(OrderLots(),2),NormalizeDouble(Bid,_Digits),30,clrNONE)) {
            printf("Test order closed, ticket #%d",test_ticket[0]);
            test_ticket[0]=0;
         }   
...
}
 
Andrey Kaunov:

Виталий, если Вам и другим "профессионалам" удаётся пройти валидацию с первого раза, могу только поаплодировать. Но веток по подобной проблеме далеко не две, а больше. Плюс не все пишут, некоторые просто читают. Советник, к слову, не мой. Я готовлю его в маркет для клиента. Но это не отменяет вышеописанных проблем. Если вы внимательно прочили мой пост, может как "профессионал" предложите решение проблемы. Выложить пост по типу: "Ты тупой, а я умный" - много знаний не нужно. 

Вот Вам ещё задачка. Почему, добавив в начало OnTick() безусловное последовательное открытие 5 сделок через 5 минут минимальным лотом, валидатор так же выдает мне: "no trading operations"

а Вы сначала положите сюда полный ответ валидатора

и с чего Вы решили, что валидатор назначает тикеты по принципу который придумали Вы?

для того чтобы открыть 5 сделок, нужно считать количество открытых сделок, а не париться тикетами
Причина обращения: