I am having a lot of issues with this broker. I just discovered
SymbolInfoDouble(Symbol(),SYMBOL_BID);
returns
DBL_MAX;
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:
bool IsFillingTypeAllowed(string symbol,int fill_type)
{
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);
}