I already looked there.
As I said I tried to set each of the three fill methods.
Do I set it correctly?
I took a look in “Trade.mqh”
In the Function “Ctrade::PositionClose” there is a call to “ClearStructures();” which sets all members of “m_request” to 0.
Afterwords some values are reset correctly but “m_request.type_filling” is not set.
Then the order is send using “OrderSend(m_request,m_result)”.
How can this function work for anybody?
There is no way of to set the filling method from outside when closing position, is there?
Is this a bug?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка 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);
}
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
fxsaber, 2017.02.08 14:19
#define TOSTRING(A) #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"
string ToString( const MqlTradeRequest &Request )
{
return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) + TOSTRING(Request.tp) +
TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
TOSTRING(Request.position) + TOSTRING(Request.position_by));
}
string ToString( const MqlTradeResult &Result )
{
return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +
TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +
TOSTRING(Result.retcode_external));
}
#include <MT4Orders.mqh>
#define PRINT(A) A; Print(#A + "\n" + ToString(MT4ORDERS::LastTradeRequest) + ToString(MT4ORDERS::LastTradeResult));
#define Point _Point
#define Bid (::SymbolInfoDouble(_Symbol, ::SYMBOL_BID))
#define Ask (::SymbolInfoDouble(_Symbol, ::SYMBOL_ASK))
void OnStart()
{
Print(TOSTRING(AccountInfoString(ACCOUNT_SERVER)));
// Открыли позицию
const int TicketPosition = PRINT(OrderSend(NULL, OP_BUY, 1, Ask, 100, 0, 0, "My Position"))
if (OrderSelect(TicketPosition, SELECT_BY_TICKET))
{
// Установили SL/TP
PRINT(OrderModify(OrderTicket(), OrderOpenPrice(), Bid - 100 * Point, Bid + 100 * Point, 0))
// Закрыли позицию
PRINT(OrderClose(OrderTicket(), OrderLots(), Bid, 100))
}
// Установили отложенный ордер
const int TicketOrder = PRINT(OrderSend(NULL, OP_BUYLIMIT, 1, Ask - 100 * Point, 100, 0, 0, "My Order"))
if (OrderSelect(TicketOrder, SELECT_BY_TICKET))
{
// Удалили ордер
PRINT(OrderDelete(OrderTicket()))
}
}
Run the script and look at the log
OrderClose(OrderTicket(),OrderLots(),Bid,100) Request.action = TRADE_ACTION_DEAL (1) Request.magic = 0 Request.order = 0 Request.symbol = EURUSD Request.volume = 1.0 Request.price = 1.0645 Request.stoplimit = 0.0 Request.sl = 0.0 Request.tp = 0.0 Request.deviation = 100 Request.type = ORDER_TYPE_SELL (1) Request.type_filling = ORDER_FILLING_IOC (1) Request.type_time = ORDER_TIME_GTC (0) Request.expiration = 1970.01.01 00:00:00 Request.comment = Request.position = 57775 Request.position_by = 0 Result.retcode = 10009 Result.deal = 9321 Result.order = 57776 Result.volume = 1.0 Result.price = 0.0 Result.bid = 0.0 Result.ask = 0.0 Result.comment = Request executed Result.request_id = 591 Result.retcode_external = 0
I‘m trying to close a position but I get always the ERROR: invalid fill.
The code is basically as follows:
... CpositionInfo PInfo; CTrade Trade; ... for(uint i=0; i<PositionsTotal(); i++) { if(PInfo.SelectByIndex(i)) { if(...) { Trade.PositionClose(PInfo.Ticket()); } } }
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
fxsaber, 2017.03.30 14:11
// MQL4&5-code #include <MT4Orders.mqh> #define _CS(A) ((!IsStopped()) && (A)) bool CloseAllPositions( const bool AllSymbols = true, const int Slippage = 0 ) { bool Res = true; MqlTick Tick; for (int i = OrdersTotal() - 1; _CS(i >= 0); i--) if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (AllSymbols ? true : (OrderSymbol() == Symbol())) && SymbolInfoTick(OrderSymbol(), Tick)) Res &= OrderClose(OrderTicket(), OrderLots(), (OrderType() == OP_BUY) ? Tick.bid : Tick.ask, Slippage); return(Res); }
For those who have trouble with Ternary statements:
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); if ( FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1) ) { 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 Type; } }
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
I‘m trying to close a position but I get always the ERROR: invalid fill.
The code is basically as follows:
Which produces the log-entry:
Core 1 2017.03.22 18:00:00 failed market sell 14.00 BMW [Unsupported filling mode]
Core 1 2017.03.22 18:00:00 CTrade::OrderSend: market sell 14.00 position #27 BMW [invalid fill]
I also tried
directly before thestatement.
But I always get the same massage. So what am I doing wrong?