Формула для filling

 

Подскажите пожалуйста,

как ЕА самому вычислить правильную величину для type_filling в MqlRequest

type_filling

Тип ордера по исполнению. Значение может быть одним из значений ENUM_ORDER_TYPE_FILLING

 
Ivan Ivanov:

Подскажите пожалуйста,

как ЕА самому вычислить правильную величину для type_filling в MqlRequest

type_filling

Тип ордера по исполнению. Значение может быть одним из значений ENUM_ORDER_TYPE_FILLING

Не пробовал, но возможно вызвать OrderCheck с разными значениями
https://www.mql5.com/en/docs/trading/ordercheck
Documentation on MQL5: Trade Functions / OrderCheck
Documentation on MQL5: Trade Functions / OrderCheck
  • www.mql5.com
The OrderCheck() function checks if there are enough money to execute a required trade operation. The check results are placed to the fields of the MqlTradeCheckResult structure. If funds are not enough for...
 

Проблема такая , вот Информация от 2 сервера :

Когда SymbolInfoInteger(_Symbol,SYMBOL_FILLING_MODE) дает

== 1 (FOK) , можно не указывать , вероятно 0

== 2 (IOC) , нужно указать 1

 

Есть две функции, результат которых применяется к объекту торгового класса CTrade::SetTypeFilling.

Через торговый класс CSymbolInfo:

сама функция

//+------------------------------------------------------------------+ 
//| Checks if the specified filling mode is allowed                  | 
//+------------------------------------------------------------------+ 
bool IsFillingTypeAllowed(int fill_type)
  {
//--- Obtain the value of the property that describes allowed filling modes 
   int filling=m_symbol.TradeFillFlags();
//--- Return true, if mode fill_type is allowed 
   return((filling & fill_type)==fill_type);
  }

и её вызов:

//---
   if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK))
      m_trade.SetTypeFilling(ORDER_FILLING_FOK);
   else if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC))
      m_trade.SetTypeFilling(ORDER_FILLING_IOC);
   else
      m_trade.SetTypeFilling(ORDER_FILLING_RETURN);
//---


или через системную SymbolInfoInteger:

//+------------------------------------------------------------------+ 
//| Checks if the specified filling mode is allowed                  | 
//+------------------------------------------------------------------+ 
bool IsFillingTypeAllowed(string symbol,int fill_type)
  {
//--- Obtain the value of the property that describes allowed filling modes 
   int filling=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
//--- Return true, if mode fill_type is allowed 
   return((filling & fill_type)==fill_type);
  }

и её вызов:

//---
   if(IsFillingTypeAllowed(Symbol(),SYMBOL_FILLING_FOK))
      m_trade.SetTypeFilling(ORDER_FILLING_FOK);
   else if(IsFillingTypeAllowed(Symbol(),SYMBOL_FILLING_IOC))
      m_trade.SetTypeFilling(ORDER_FILLING_IOC);
   else
      m_trade.SetTypeFilling(ORDER_FILLING_RETURN);
//---
 
Ivan Ivanov:

как ЕА самому вычислить правильную величину для type_filling в MqlRequest

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.02.25 16:12

// Возвращает тип исполнения ордера, равный Type, если он доступен на символе Symb, иначе - корректный вариант.
ENUM_ORDER_TYPE_FILLING GetFilling( const string Symb, const uint Type = ORDER_FILLING_FOK )
{
  const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Symb, SYMBOL_TRADE_EXEMODE);
  const int FillingMode = (int)::SymbolInfoInteger(Symb, SYMBOL_FILLING_MODE);

  return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
         (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
}
Применение
Request.type_filling = GetFilling(Request.symbol);
 
fxsaber:

Ну, у тебя, блин, возврат...

Вроде как функция возвращает ENUM_ORDER_TYPE_FILLING, но в return'e - через или стоят и bool значения, и значения перечисления ENUM_ORDER_TYPE_FILLING, и причем с этими "вопросиками", которые хрен без поллитры разберешься...

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

P.S. Оказывается, в return'e - возвращаются правильные значения, а bool'ы стоят внутри "вопросика"...  В общем, очередной раз убеждаюсь, что вопросик - это дерьмо, каких мало...

P.P.S.

Вот так, на мой взгляд, куда понятнее:

if((iFillingMode == 0 ||  (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) == true)
    {
    if(ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT) 
        return(ORDER_FILLING_RETURN)
    else   
        if(FillingMode == SYMBOL_FILLING_IOC)
            return(ORDER_FILLING_IOC)
          else
            return(ORDER_FILLING_FOK); 
    }           
else
    return((ENUM_ORDER_TYPE_FILLING)Type);
 
bool CTrade::SetTypeFillingBySymbol(const string symbol)
  {
//--- get possible filling policy types by symbol
   uint filling=(uint)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
   if((filling&SYMBOL_FILLING_FOK)==SYMBOL_FILLING_FOK)
     {
      m_type_filling=ORDER_FILLING_FOK;
      return(true);
     }
   if((filling&SYMBOL_FILLING_IOC)==SYMBOL_FILLING_IOC)
     {
      m_type_filling=ORDER_FILLING_IOC;
      return(true);
     }
//---
   return(false);
  }

делаю так, сбоев пока не было.

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

 
Alexandr Gavrilin:

делаю так, сбоев пока не было.

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

Так не получится использовать нужный филлинг-тип. Т.е. это навязывание какого-то конкретного.

 

И, что за странная конструкция:

 Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) == true

Здесь, как я понимаю, ты проверяешь, что Tуpe - это следующий элемент перечисления ?

Объясни для тупых, как работает эта функция !
 
George Merts:

И, что за странная конструкция:

 Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) == true

Здесь, как я понимаю, ты проверяешь, что Tуpe - это следующий элемент перечисления ?

Объясни для тупых, как работает эта функция !

Не помню, как она работает.

 

На счет этого filling-а еще 2016-ом обратился в сервисдеск, но почему-то так и ответа не получил.

В зависимости от брокера,  filling принимает значение 0,1,2,3.


 int filling=(int)SymbolInfoInteger(_Symbol,SYMBOL_FILLING_MODE);
 .
 .
 MqlTradeRequest   request={0};
 .
 .
 if(filling != 1 )   request.type_filling=ORDER_FILLING_FOK | ORDER_FILLING_IOC;


За 3 года продажи робота в маркете, жалобу не получил.

Но не нравится всё это.  Надо и еще учитывать тип исполнения  "Market" или "Instant" execution.