Automated Trading Championship 2011: Подготовка эксперта к Чемпионату - страница 34

 

Откуда может возникать такая ошибка? Експерт один раз прошел тест, потом перестал его проходить. В терминале на котировках организатора тест проходит без ошибок.

Понимать бы где не прав...   

5. Statistics
2011.01.03 15:00:00   failed instant sell 1.00 EURUSD at 1.33478 sl: 1.33818 tp: 1.33148 [Invalid request]
2011.01.06 22:00:00   failed instant buy 1.00 EURUSD at 1.30154 sl: 1.29802 tp: 1.30354 [Invalid request]
2011.01.13 22:00:00   failed instant buy 1.00 EURUSD at 1.33495 sl: 1.33141 tp: 1.33658 [Invalid request]
2011.01.18 17:00:00   failed instant sell 1.00 EURUSD at 1.33897 sl: 1.34237 tp: 1.33419 [Invalid request]
2011.01.20 10:00:00   failed instant buy 1.00 EURUSD at 1.34781 sl: 1.34426 tp: 1.35186 [Invalid request]
2011.01.24 12:00:00   failed instant sell 1.00 EURUSD at 1.35745 sl: 1.36085 tp: 1.35559 [Invalid request]
2011.01.25 08:00:00   failed instant buy 1.00 EURUSD at 1.36532 sl: 1.36176 tp: 1.36732 [Invalid request]
2011.01.25 14:00:00   failed instant sell 1.00 EURUSD at 1.35892 sl: 1.36232 tp: 1.35479 [Invalid request]
2011.02.02 15:00:00   failed instant sell 1.00 EURUSD at 1.38026 sl: 1.38366 tp: 1.37837 [Invalid request]
2011.02.08 16:00:00   failed instant buy 1.00 EURUSD at 1.36274 sl: 1.35922 tp: 1.36474 [Invalid request]

 вот фрагмент кода который открывает позицию... в данном случае BUY

стоплосс всегда 340 пунктов, тейкпрофит бывает разный но не менее 150 пунктов

//+------------------------------------------------------------------+
//| Открытие длинной позиции                                         |
//+------------------------------------------------------------------+
void LongPositionOpen(double tp_level,double sl_level,double lot)
  {
   MqlTradeRequest mrequest;                            // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;                              // Будет использоваться для получения результатов выполнения торговых запросов    
   double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);   // лучшее предложение на покупку
   double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);   // лучшее предложение на продажу
   bool ok;
   if(!PositionSelect(_Symbol))
     {
      mrequest.action = TRADE_ACTION_DEAL;              // немедленное исполнение
      mrequest.price = NormalizeDouble(Ask,_Digits);    // последняя цена ask
      mrequest.sl = NormalizeDouble(Bid-sl_level*_Point,_Digits);                                 // Stop Loss
      mrequest.tp = NormalizeDouble(Ask+tp_level*_Point,_Digits);                                  // Take Profit
      mrequest.symbol = _Symbol;                        // символ
      mrequest.volume = lot;                            // количество лотов для торговли
      mrequest.magic = 777;                               // Magic Number
      mrequest.type = ORDER_TYPE_BUY;                   // ордер на покупку
      mrequest.type_filling = ORDER_FILLING_AON;        // тип исполнения ордера - все или ничего
      mrequest.deviation=5;                             // проскальзывание от текущей цены       
      ok=OrderSend(mrequest,mresult);                      // отсылаем ордер
      k++;
      // если реквота или ордер не принят из за загрузки - пинаем еще несколько раз
      if((mresult.retcode==10004 || mresult.retcode==10006) && k<NumberOfTry)  
      {
       Sleep(1000);  
       LongPositionOpen(tp_level,sl_level,lot);
      }
     }
  }

 

 

MrGreen , Потому что не нужно если ордер не прошел "пинать еще раз"

никогда не используйте Sleep(1000)

внутри события приход нового тика.

хотите увидеть в терминале на котировках организатора эти же ошибки? - выстовите соответсвующие настройки в тестере по поводу реквот и задержек 

 
Loky:

MrGreen , Потому что не нужно если ордер не прошел "пинать еще раз"

никогда не используйте Sleep(1000)

внутри события приход нового тика.

хотите увидеть в терминале на котировках организатора эти же ошибки? - выстовите соответсвующие настройки в тестере по поводу реквот и задержек 

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

//+------------------------------------------------------------------+
//| Открытие длинной позиции                                         |
//+------------------------------------------------------------------+
void LongPositionOpen(double tp,double sl,double lot)
  {
   MqlTradeRequest request;                            // Будет использоваться для отсылки торговых запросов
   MqlTradeResult result;                              // Будет использоваться для получения результатов выполнения торговых запросов    
   MqlTradeCheckResult ChkResult;
   double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);   // лучшее предложение на покупку
   double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);   // лучшее предложение на продажу
   
   if(!PositionSelect(_Symbol))
     {
      request.action = TRADE_ACTION_DEAL;              // немедленное исполнение
      request.price = NormalizeDouble(Ask,_Digits);    // последняя цена ask
      request.sl = NormalizeDouble(Ask-sl*_Point,_Digits);                                 // Stop Loss
      request.tp = NormalizeDouble(Ask+tp*_Point,_Digits);                                  // Take Profit
      request.symbol = _Symbol;                        // символ
      request.volume = lot;                            // количество лотов для торговли
      request.magic = 777;                               // Magic Number
      request.type = ORDER_TYPE_BUY;                   // ордер на покупку
      request.type_filling = ORDER_FILLING_AON;        // тип исполнения ордера - все или ничего
      request.deviation=5;       
                      // проскальзывание от текущей цены       
       
      bool success=true;
      
      if(!MQL5InfoInteger(MQL5_TRADE_ALLOWED))            
      {
         Print("TRADE DISALLOWED");
         return;
      }
         
      success=OrderCheck(request,ChkResult); 
      if(success)
      {
         OrderSend(request,result);                      // отсылаем ордер
      }

      
      
     }
     
  }

 

 
MrGreen:

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

 

перед повторным посылом ордера нужно рефреш производить. 

но лучше его посылать с приходом  нового тика.

 

 
MrGreen:

Откуда может возникать такая ошибка? Експерт один раз прошел тест, потом перестал его проходить. В терминале на котировках организатора тест проходит без ошибок.

Понимать бы где не прав...   

Посылаете повторный запрос, а цены не обновляете. А они уже изменились.


 


 
Loky:

перед повторным посылом ордера нужно рефреш производить. 

но лучше его посылать с приходом  нового тика.

 

спасибо, сейчас попробую... гляди успею еще впрыгнуть в отходящий поезд :)
 
MrGreen:

Откуда может возникать такая ошибка? Експерт один раз прошел тест, потом перестал его проходить. В терминале на котировках организатора тест проходит без ошибок.

Понимать бы где не прав...   

 вот фрагмент кода который открывает позицию... в данном случае BUY

стоплосс всегда 340 пунктов, тейкпрофит бывает разный но не менее 150 пунктов

 

Одни и те же вопросы, аж скучно становится.

mrequest.deviation=5;                             // проскальзывание от текущей цены  

при спреде 25-35 пунктов это 99,99% получения реквоты.

 
Urain:

Одни и те же вопросы, аж скучно становится.

главное что бы на чемпионате не скучали :)  

Хороших трендов :) 

 
Vigor:

держите

void smartSell(string symbol, double lot, string comment) {
...
double limitlot = SymbolInfoDouble(symbol,SYMBOL_VOLUME_LIMIT);
...
lot = MathMin(limitlot,lot);


Нет ли тут логической ошибки? Если уже есть позиция buy объемом limitlot, то sell можно делать на 2*limitlot, т.е. переворот. У меня в аналогичном коде есть коррекция разрешенного объема с учетом направления имеющейся позиции.
 

Алилуя я в поезде :)

всем спасибо за консультации и всем учасникам успехов на чемпионате! 

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