Ошибка валидации при релизе торгового робота в маркет. - страница 5

 
Спасибо за подсказку, но вероятно это не мой случай. У меня валидатор вообще не видит торговых функций, где уж тут до максимального количества ордеров добраться )))
 

Вот шайтан... Прошел валидацию, и теперь 

no trading operations

уже не ошибка

P.S. Это был случайный выстрел. Следующий тест опять та же шляпа


 
Andrey Kaunov:

Да тут не ошибка, я вообще не понимаю что за дичь. Ставлю костыль (деление на ноль) перед торговой функцией:

Он срабатывает:

Убираю его, выдаёт уже неизменное 

no trading operations.

Я не понимаю, что мешает валидатору сделать этот OrderSend(). Ведь если он до него доходит, должны быть ошибки выставления (хотя я их все пофиксил) 130, 131, 134, ..., а не "no trading operations". Осталось только прописать в OnInit() выставление какой нибудь отложки где нибудь далеко чтобы не сработала, не знаю уже как бороться с этим.

А какой смысл в таком костыле если под условие, при котором должна быть сделка, выполнение кода не входит?

 
Почему не входит?! Посмотри внимательно, Алексей. Как раз перед OrderSend костыль и стоит.
 
Andrey Kaunov:
Почему не входит?! Посмотри внимательно, Алексей. Как раз перед OrderSend костыль и стоит.

Правильно. Если не выполняется OrderSend значит до него выполнение кода не доходит по каким-то причинам. И хоть что перед ним ставьте в блок условия нет входа и нет исполнения, даже деления на ноль.

 

Постойте, я не понимаю. Если выполняется оператор 1 (деление на ноль), то следующий на очереди оператор if. А значит проверка его условия. Для проверки условия нужно выполнить функцию OrderSend, получается что она следующая на очереди после деления на ноль.

Ну да бог с ним. Для чистоты эксперимента я изменил код:


Результат тот же. С костылём - ошибка деления на ноль, без него результат выложил выше:  no trading operations.

 
Andrey Kaunov:

Постойте, я не понимаю. Если выполняется оператор 1 (деление на ноль), то следующий на очереди оператор if. А значит проверка его условия. Для проверки условия нужно выполнить функцию OrderSend, получается что она следующая на очереди после деления на ноль.

Ну да бог с ним. Для чистоты эксперимента я изменил код:


Результат тот же. С костылём - ошибка деления на ноль, без него результат выложил выше:  no trading operations.

Вы зря картинкой код выкладываете. Читать совершенно невозможно. Да и не в этом куске кода проблема. Проблема в том, что не выполняется какое-то из условий при каких-то входных параметрах, а уведомления об этом отсутствует.

 
Andrey Kaunov:
Почему не входит?!

А зачем вы пытаетесь писать в маркет, хуже чем для себя ?

это-же просто - перед тем как отправлять приказ, посмотреть "а вообще исполним ли он?"

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

(опция) если были тяжкие рассчёты, не грех и RefreshRates до чтения Bid Ask

Вот для себя любимого вы все эти проверки будете делать. Почему сейчас-то НЕТ ?

 

Вы думаете, я не проверяю. Размер лота проверяется в отдельной функции

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
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();
   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; //MathFloor(free/margin/step)*step;
   return(_lot);
}

Лимиты тут не нужны, т.к. Stop Loss и Take Profit равны нулю при открытии сделки. RefreshRates() обновляет данные при расчёте лота. Проверки связи и т.д. конечно нет перед каждым входом, но дело то не в этом во всём. Если бы OrderSend отправила запрос, была бы конкретная ошибка: 130, 131 и т.д. Но у меня то

Вообще не пытается отправить приказ на открытие. Даже в последнем тесте, когда из функции OnInit() я выставляю контрольную отложку

int OnInit() {
  
   int stops_level=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
   iTrailStart=inpTrailStart;
   iTrailStart2=inpTrailStart2;
   iTrailStartL=inpTrailStartL;
   //---
   if(stops_level>0) {
      if(inpTrailStart<stops_level+3) iTrailStart=stops_level+3;
      if(inpTrailStart2<stops_level+3) iTrailStart2=stops_level+3;
      if(inpTrailStartL<stops_level+3) iTrailStartL=stops_level+3;
   }
   
   Comment("");
   EventSetMillisecondTimer(300);
   ButtonCreate("V_5",5,25,50,20,"FLAT",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("V_7",60,25,50,20,"TREND",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("Auto",115,25,50,20,"Auto",9,clrBlack,C'236,233,235',clrNONE,false);
   ObjectCreate(0,"Lot",OBJ_EDIT,0,0,0);
   ObjectSetInteger(0,"Lot",OBJPROP_CORNER,CORNER_LEFT_LOWER);
   ObjectSetInteger(0,"Lot",OBJPROP_XDISTANCE,115);
   ObjectSetInteger(0,"Lot",OBJPROP_YDISTANCE,50);
   ObjectSetString(0,"Lot",OBJPROP_TEXT,"");
   ObjectSetInteger(0,"Lot",OBJPROP_ALIGN,ALIGN_RIGHT);
   ObjectSetInteger(0,"Lot",OBJPROP_FONTSIZE,9);
   ObjectSetInteger(0,"Lot",OBJPROP_COLOR,clrBlack);
   ObjectSetInteger(0,"Lot",OBJPROP_YSIZE,20);
   ButtonCreate("V_5_buy",5,50,50,20,"BUY",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("V_5_sell",60,50,50,20,"SELL",9,clrBlack,C'236,233,235', clrNONE,false); 
     
   test_ticket=OrderSend(_Symbol,OP_BUYLIMIT,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),_Point,30,0.0,0.0,"NZT-48_test",iMagicNumber,0,clrNONE);
   
   return(INIT_SUCCEEDED);
}//-------------------------------------- End OnInit ---------------------------------------- 

Alexey Viktorov:

Вы зря картинкой код выкладываете. Читать совершенно невозможно. Да и не в этом куске кода проблема. Проблема в том, что не выполняется какое-то из условий при каких-то входных параметрах, а уведомления об этом отсутствует.

Возможно. Но я уже перепроверил всё. Не знаю куда дальше копать.

 
Andrey Kaunov:

Вы думаете, я не проверяю. Размер лота проверяется в отдельной функции

Лимиты тут не нужны, т.к. Stop Loss и Take Profit равны нулю при открытии сделки. RefreshRates() обновляет данные при расчёте лота. Проверки связи и т.д. конечно нет перед каждым входом, но дело то не в этом во всём. Если бы OrderSend отправила запрос, была бы конкретная ошибка: 130, 131 и т.д. Но у меня то

Вообще не пытается отправить приказ на открытие. Даже в последнем тесте, когда из функции OnInit() я выставляю контрольную отложку


Возможно. Но я уже перепроверил всё. Не знаю куда дальше копать.

Посмотрите как сделаны прочие приказы в советнике. Где-то же вы собирались закрывать/изменять ордера ? не думаю что советник только и исключительно открывает

на открытии установился ticket<0 - гляньте прочую логику, что как она в реальности на это среагирует

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