- Order filling type problem. Help?
- Error opening SELL order = 130
- EA Issues with Order Filling Modes for DJ30 Symbol
You need to fix your code. The filling mode can be changed by the broker, or different between brokers, so your EA should deal with all situation.
Post the relevant code if you need help.
You need to fix your code. The filling mode can be changed by the broker, or different between brokers, so your EA should deal with all situation.
Post the relevant code if you need help.
Here is my code
{
int _open_error = 0;
if(SymbolTicker==NULL){SymbolTicker=Symbol();}
//--- declare and initialize the trade request and result of trade request
MqlTradeRequest __request={0};
MqlTradeResult __result={0};
double _open_volume=Volume;
if(PositionSelect(SymbolTicker)&&SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_LIMIT)!=0.0)
{
_open_volume=MathMin(Volume,SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_LIMIT)-Volume);
}
if(_open_volume==0.0)
{
return(_open_error);
}
int _order_count=0,_orders=(int)MathMax(1.0,MathCeil(_open_volume/MathMax((SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_LIMIT)==0.0?10.0:SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_LIMIT)),SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_MAX))));
while(_open_volume>0.0&&_order_count<_orders)
{
//printf(__FUNCSIG__+" min: "+DoubleToString(SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_STEP))+" step:"+DoubleToString(SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_MIN)));
double _order_volume=MathMin(SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_MAX),MathMax(SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_MIN),(MathRound(_open_volume/MathMax(SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_MIN),SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_STEP)))*MathMax(SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_MIN),SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_STEP)))));
ZeroMemory(__request);
ZeroMemory(__result);
//--- parameters of request
__request.type_filling = (ENUM_ORDER_TYPE_FILLING)SymbolInfoInteger(SymbolTicker,SYMBOL_FILLING_MODE);// Filling; //filling mode
__request.action =TRADE_ACTION_DEAL; // type of trade operation
__request.symbol =SymbolTicker; // symbol
__request.volume =_order_volume; // volume of 0.1 lot
__request.type =Type; // order type
__request.price =(Type==ORDER_TYPE_BUY?SymbolInfoDouble(SymbolTicker,SYMBOL_ASK):SymbolInfoDouble(SymbolTicker,SYMBOL_BID)); // price for opening
__request.deviation=5; // allowed deviation from the price
__request.magic =MagicNumber; // MagicNumber of the order
__request.comment =IntegerToString(MagicNumber); // Comment
//--- send the request
if(!OrderSend(__request,__result))
{
_open_error = GetLastError();
PrintFormat("OrderSend error %d",_open_error); // if unable to send the request, output the error code
}
_order_count++;
_open_volume-=_order_volume;
if(_open_volume<=0.0||_order_count>=_orders)
{
break;
}
}
//--- information about the operation
PrintFormat("retcode=%u deal=%I64u order=%I64u",__result.retcode,__result.deal,__result.order);
return(_open_error);
}
This is a bug.
SymbolInfoInteger() gives you a flag of possible filling mode, you can't just use it to set your request field.

This is a bug.
SymbolInfoInteger() gives you a flag of possible filling mode, you can't just use it to set your request field.
I am having a lot of issues with this broker. I just discovered
returns
I have to use MqlTick!!
Anyway I am still getting the same error after making adjustments to check for order-filling.
Here is my code:
{
int filling = (int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
return((filling & fill_type)==fill_type);
}
int Open(ENUM_ORDER_TYPE Type,double Volume,string SymbolTicker=NULL,int MagicNumber=0)
{
int _open_error = 0;
if(SymbolTicker==NULL){SymbolTicker=Symbol();}
//--- declare and initialize the trade request and result of trade request
MqlTradeRequest __request={0};
MqlTradeResult __result={0};
double _open_volume=Volume;
if(PositionSelect(SymbolTicker)&&SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_LIMIT)!=0.0)
{
_open_volume=MathMin(Volume,SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_LIMIT)-Volume);
}
if(_open_volume==0.0)
{
return(_open_error);
}
int _order_count=0,_orders=(int)MathMax(1.0,MathCeil(_open_volume/MathMax((SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_LIMIT)==0.0?10.0:SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_LIMIT)),SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_MAX))));
MqlTick _tick;SymbolInfoTick(SymbolTicker,_tick);
double _bid = _tick.bid, _ask = _tick.ask;
if(_bid!=0.0&&_bid!=DBL_MAX&&_bid!=DBL_MIN&&_ask!=0.0&&_ask!=DBL_MAX&&_ask!=DBL_MIN)
{
while(_open_volume>0.0&&_order_count<_orders)
{
//printf(__FUNCSIG__+" min: "+DoubleToString(SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_STEP))+" step:"+DoubleToString(SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_MIN)));
double _order_volume=MathMin(SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_MAX),MathMax(SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_MIN),(MathRound(_open_volume/MathMax(SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_MIN),SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_STEP)))*MathMax(SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_MIN),SymbolInfoDouble(SymbolTicker,SYMBOL_VOLUME_STEP)))));
ZeroMemory(__request);
ZeroMemory(__result);
//--- parameters of request
//
ENUM_ORDER_TYPE_FILLING _checked_filling = INVALID_HANDLE;
if(IsFillingTypeAllowed(SymbolTicker,ORDER_FILLING_FOK))
{
_checked_filling = ORDER_FILLING_FOK;
}
else if(IsFillingTypeAllowed(SymbolTicker,ORDER_FILLING_IOC))
{
_checked_filling = ORDER_FILLING_IOC;
}
else if(IsFillingTypeAllowed(SymbolTicker,ORDER_FILLING_RETURN))
{
_checked_filling = ORDER_FILLING_RETURN;
}
//
if(_checked_filling!=INVALID_HANDLE)
{
__request.type_filling = _checked_filling; //filling mode
__request.action =TRADE_ACTION_DEAL; // type of trade operation
__request.symbol =SymbolTicker; // symbol
__request.volume =_order_volume; // volume of 0.1 lot
__request.type =Type; // order type
__request.price =(Type==ORDER_TYPE_BUY?_ask:_bid); // price for opening
__request.deviation=5; // allowed deviation from the price
__request.magic =MagicNumber; // MagicNumber of the order
__request.comment =IntegerToString(MagicNumber); // Comment
//--- send the request
if(!OrderSend(__request,__result))
{
_open_error = GetLastError();
PrintFormat("OrderSend error %d",_open_error); // if unable to send the request, output the error code
}
_order_count++;
_open_volume-=_order_volume;
if(_open_volume<=0.0||_order_count>=_orders)
{
break;
}
}
else
{
printf(__FUNCSIG__+" unable to determine order filling!, order OPEN failed");
}
}
}
//--- information about the operation
PrintFormat("retcode=%u deal=%I64u order=%I64u",__result.retcode,__result.deal,__result.order);
return(_open_error);
}

- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use