Не могу пройти валидатор: "Not enough money" !

 

Здравствуйте, начал использовать в советнике отложенные ордера и он перестал проходить валидатор.

Причем ругает именно отложенные ордера.

Испробовал два варианта:

1. Адаптировал функцию проверки из документации к отложенным ордерам

bool CheckMoneyForTrade_Pend(string symb,double lots,double offset,ENUM_ORDER_TYPE type)
  {
//--- получим цену открытия
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=mqltick.ask+offset*_Point;
   if(type==ORDER_TYPE_SELL_STOP)
      price=mqltick.bid-offset*_Point;
//--- значения необходимой и свободной маржи
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   double margin_pend=AccountInfoDouble(ACCOUNT_MARGIN_INITIAL);
   double margin_position=AccountInfoDouble(ACCOUNT_MARGIN_MAINTENANCE);
   //--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- если не хватает средств на проведение операции
   if(margin+margin_pend+margin_position>free_margin)
     {
      //--- сообщим об ошибке и вернем false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }

2. Взял текст на форуме у гуру и превратил в функцию:

bool CheckMoneyForTrade(string symb,double lots,double offset,ENUM_ORDER_TYPE type)
{
//--- check volume before OrderSend to avoid "not enough money" error (CTrade)
   double price=SymbolInfoDouble(symb,SYMBOL_ASK)+offset*_Point;
   if(type==ORDER_TYPE_SELL_STOP)
      price=SymbolInfoDouble(symb,SYMBOL_BID)-offset*_Point;

   double free_margin_check=m_account.FreeMarginCheck(symb,
                            type,
                            lots,
                            price);
   double margin_check=m_account.MarginCheck(symb,
                       type,
                       lots,
                       price);
   if(free_margin_check>margin_check) return(true); else return(false);
 }


 
Aleksander Gladkov:

Здравствуйте, начал использовать в советнике отложенные ордера и он перестал проходить валидатор.

Ситуация может возникнуть если вы проверяете маржу для каждого ордера отдельно и выставляете их. Так их можно выставить хоть 100 штук и маржи будет всё равно достаточно для выставления очередного ордера. 

А вот когда эти ордера начнут срабатывать и превращаться в позиции, вот тогда появится дефицит маржи и вы получите сообщение- где бабки бл*! (not enough money)

Либо суммируйте маржу всех выставленных ордеров, либо при снижении маржи  удаляйте ещё не сработавшие.

 
Aleksandr Slavskii #:

Ситуация может возникнуть если вы проверяете маржу для каждого ордера отдельно и выставляете их. Так их можно выставить хоть 100 штук и маржи будет всё равно достаточно для выставления очередного ордера. 

А вот когда эти ордера начнут срабатывать и превращаться в позиции, вот тогда появится дефицит маржи и вы получите сообщение- где бабки бл*! (not enough money)

Либо суммируйте маржу всех выставленных ордеров, либо при снижении маржи  удаляйте ещё не сработавшие.

Спасибо, думаю Вы правы, попробую как советуете.

Получилось!

Дело в том, что в документации:

bool  OrderCalcMargin(
   ENUM_ORDER_TYPE       action,           // тип ордера
   string                symbol,           // имя символа
   double                volume,           // объем
   double                price,            // цена открытия
   double&               margin            // переменная для получения значения маржи
   );

Параметры

action

[in]  Тип ордера, может принимать значения из перечисления ENUM_ORDER_TYPE.

Однако, если использовать тип отложенного ордера, например: ORDER_TYPE_SELL_STOP результат будет = 0.

То есть для отложенных ордеров надо использовать тип ORDER_TYPE_SELL и суммировать маржу всех отложенных для проверки с Free_margin на старте.