Order filling and error 10030

I trade with a certain broker using an EA and I never used to have problems.

However recently my orders have been declined because of error 10030. Prior to this I used to input the order filling type as a parameter for the EA and it would work without a problem. But now even when I use

SymbolInfoInteger(Symbol(),SYMBOL_FILLING_MODE)

to get the filling mode from the broker it still brings up this error.

I am having this problem only with this broker, my EA works ok with other brokers. This brokers filling mode is

Immediate Or Cancel.

Has someone resolved a similar issue.

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(ENUM_ORDER_TYPE Type,double Volume,string SymbolTicker=NULL,int MagicNumber=0,ENUM_ORDER_TYPE_FILLING Filling=ORDER_FILLING_FOK)
   {
                        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);
   }


__request.type_filling = (ENUM_ORDER_TYPE_FILLING)SymbolInfoInteger(SymbolTicker,SYMBOL_FILLING_MODE);// Filling;       //filling mode

This is a bug.

SymbolInfoInteger() gives you a flag of possible filling mode, you can’t just use it to set your request field.

See also this discussion.

Thanks.

Let me look at it.

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