Подскажите пожалуйста,
как ЕА самому вычислить правильную величину для type_filling в MqlRequest
type_filling |
Тип ордера по исполнению. Значение может быть одним из значений ENUM_ORDER_TYPE_FILLING |
https://www.mql5.com/en/docs/trading/ordercheck
- www.mql5.com
Проблема такая , вот Информация от 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); //---
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка mql5, тонкости и приёмы работы
fxsaber, 2017.02.25 16:12
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);
}
Ну, у тебя, блин, возврат...
Вроде как функция возвращает 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); }
делаю так, сбоев пока не было.
дальше уже эту переменную используем при формировании запроса.
делаю так, сбоев пока не было.
дальше уже эту переменную используем при формировании запроса.
Так не получится использовать нужный филлинг-тип. Т.е. это навязывание какого-то конкретного.
И, что за странная конструкция:
Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) == true
Здесь, как я понимаю, ты проверяешь, что Tуpe - это следующий элемент перечисления ?
И, что за странная конструкция:
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.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Подскажите пожалуйста,
как ЕА самому вычислить правильную величину для type_filling в MqlRequest
type_filling
Тип ордера по исполнению. Значение может быть одним из значений ENUM_ORDER_TYPE_FILLING