Order filling (Persistent Problem)

 

I keep getting order filling error 10030 with FxPro.

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);
   }


 

 
   if(IsFillingTypeAllowed(SymbolTicker,SYMBOL_FILLING_FOK))
     {
      _checked_filling=ORDER_FILLING_FOK;
     }
   else if(IsFillingTypeAllowed(SymbolTicker,SYMBOL_FILLING_IOC))
     {
      _checked_filling=ORDER_FILLING_IOC;
     }
   else
     {
      _checked_filling=ORDER_FILLING_RETURN;
     }
 
Alain Verleyen:
   if(IsFillingTypeAllowed(SymbolTicker,SYMBOL_FILLING_FOK))
     {
      _checked_filling=ORDER_FILLING_FOK;
     }
   else if(IsFillingTypeAllowed(SymbolTicker,SYMBOL_FILLING_IOC))
     {
      _checked_filling=ORDER_FILLING_IOC;
     }
   else
     {
      _checked_filling=ORDER_FILLING_RETURN;
     }
Thanks. 
Just made these changes. 
Not entirely sure why this would work and not my code but am giving it a try.
 
Stephen Njuki:
Thanks. 
Just made these changes. 
Not entirely sure why this would work and not my code but am giving it a try.
You can't mix SYMBOL_FILLING_xxx and ORDER_FILLING_xxx
 
Alain Verleyen:
You can't mix SYMBOL_FILLING_xxx and ORDER_FILLING_xxx
LOL thx 😊 I had totally missed that. 
Reason: