Автовалидация. Позиция или ордер слишком близко к рынку.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vitaly Stepanov
1114
Vitaly Stepanov  

Пытаюсь опубликовать новую версию советника в маркете, автовалидация не пропускает, хотя прежде пролетало на ура.

Modification failed due to order or position being close to market
Проблема в функции модификации ордера.
Возможно я чего то не вижу, но в тестере проблем и ошибок нет.Вопрос к гуру программирования: в чем ошибка?
//+------------------------------------------------------------------+
//| Check for long order modify                                      |
//+------------------------------------------------------------------+
void LongModify()
  {
   double atr=0;
   double Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   double Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double max_volume=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_LIMIT);

   if(CopyBuffer(handle_atr,0,0,2,buff_ATR)<2)
     {
      Print("CopyBuffer from iATR failed, no data",GetLastError());
     }
   else
      atr=buff_ATR[0];
//--- пройдем по всем отложенным ордерам
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(order.SelectByIndex(i))
         if(MAGIC==OrderGetInteger(ORDER_MAGIC) && OrderGetString(ORDER_SYMBOL)==Symbol())
            if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY_STOP)
              {
              double ticket=order.Ticket();
               double price=NormalizeDouble(Ask+atr,_Digits);
               {
                 if(MinOf()>0 && OrderGetDouble(ORDER_PRICE_OPEN)>NormalizeDouble(line_min+100*_Point,_Digits)
                  && OrderGetDouble(ORDER_PRICE_OPEN)-NormalizeDouble(line_min+100*_Point,_Digits)>Spread*_Point && NormalizeDouble(line_min+100*_Point,_Digits)-Ask>SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)*_Point)
                  price=NormalizeDouble(line_min+100*_Point,_Digits);
                       {
                  if((index_buy3<index_sell || index_buy2>index_sell5) && OpenBUY()==true)
                    {
                     double free_margin_check=account.FreeMarginCheck(_Symbol,(ENUM_ORDER_TYPE) ORDER_TYPE_BUY,OrderGetDouble(ORDER_VOLUME_INITIAL),price);
                     double margin_check=account.MarginCheck(_Symbol,(ENUM_ORDER_TYPE) ORDER_TYPE_BUY,OrderGetDouble(ORDER_VOLUME_INITIAL),price);
                     if(free_margin_check<margin_check)
                       {
                        //--- сообщим об ошибке и вернем false
                        Print("Not enough money for ",EnumToString(ORDER_TYPE_BUY_STOP)," ",Volume(_Symbol)," ",_Symbol);return;
                       }
                     else
                     if(max_volume>0 && NewOrderAllowedVolume(_Symbol)<=Volume(_Symbol))
                       {
                        Print("The lot is exceeded.");
                       }
                     else
                       {
                       if(OrderGetDouble(ORDER_PRICE_OPEN)>price && OrderGetDouble(ORDER_PRICE_OPEN)-price>Spread*_Point && price-Ask>SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)*_Point && OrderGetDouble(ORDER_PRICE_OPEN)-Ask>SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)*_Point)
                 {
                        //--- modify position
                        if(ExtTrade.OrderModify(ticket,price,0,0,ORDER_TIME_GTC,0))
                          {
                           Print("The order is modified. Modify parameters:",ExtTrade.ResultRetcode(),
                                 " (",price,")");
                          }
                        else
                          {
                           Print("(macd)Error modifying order",order.Ticket(),
                                 ". Modify parameters: ",ExtTrade.ResultRetcodeDescription()); return;
                                 }
                          }
                       }
                    }
                 }
              }
           }
   return;
  }
Stanislav Korotky
30472
Stanislav Korotky  
Vitaly Stepanov:

Пытаюсь опубликовать новую версию советника в маркете, автовалидация не пропускает, хотя прежде пролетало на ура.

В МТ4 было так, что стоплевел может сообщаться, как 0, что не означает, что его нет.

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

Вероятно, в МТ5 аналогично.

Vitaly Stepanov
1114
Vitaly Stepanov  
Stanislav Korotky:

В МТ4 было так, что стоплевел может сообщаться, как 0, что не означает, что его нет.

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

Вероятно, в МТ5 аналогично.

Спасибо. Но не понятно, как действовать в этом случае.

Stanislav Korotky
30472
Stanislav Korotky  
Vitaly Stepanov:

Спасибо. Но не понятно, как действовать в этом случае.

Можно взять размер спреда, если проблема останется, умножать его на 2.

Vitaly Stepanov
1114
Vitaly Stepanov  

Удивительно, но

SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)<Spread_ проканало!

ThVM!

Файлы:
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий