Invalid order for OP_BUY/SELL WITH SL TP

 

Hi everybody,

I'm just beginning to use MQL4 and i'm begining to like it!!

I'm encoutering my first issue, i'm trying to set BUY and SELL order, but it don't work when i put stop loss and take profit values (if i put 0 it works).


For exemple if i put :

ordreb = OrderSend( Symbol(), 0, 0.1,Ask, 3,0,0,"Achat",0,0,Green); 

it works, but not with :

ordreb = OrderSend( Symbol(), 0, 0.1,Ask, 3,Ask-25*Point,Ask+25*Point,"Achat",0,0,Green); 

it return -1 !


Do you know why it doesn't work?


Cyrille

 

Try to check the value of special last_error variable by GetLastError().

 
It returns 130
 

https://docs.mql4.com/constants/errors :

ERR_INVALID_STOPS 130 Invalid stops.

https://docs.mql4.com/trading/OrderSend :

"StopLoss and TakeProfit levels cannot be too close to the market. The minimal distance of stop levels in points can be obtained using the MarketInfo() function with MODE_STOPLEVEL parameter. In the case of erroneous or unnormalized stop levels, the error 130 (ERR_INVALID_STOPS) will be generated."

Normalization => https://docs.mql4.com/convert/NormalizeDouble

 

It's stange

Print("Error :"+MarketInfo(Symbol(),MODE_STOPLEVEL));

it 's give : Return Error : 0.00000000


And if i put manually very high take profit and very low stop low, i sill get the same error.

 

Use https://docs.mql4.com/convert/DoubleToStr to print.

And do use normalization => https://docs.mql4.com/convert/NormalizeDouble :

"The calculated StopLoss and TakeProfit values, as well as open price of pending orders must be normalized with a precision the value of which is stored in the pre-defined variable of Digits."

 

Hi again, and thanx for your previous answer.

I tried with all digit from 1 to 8 with values near and far from current price, but i'm still getting the same error. I can't find what is false :(.

 
  1. You do not have to normalize the stops (at least on IBFX) as long as they're beyond MarketInfo(Symbol(), MODE_STOPLEVEL)*Point from the market.
  2. On a ECN broker, you must open the trade and then set the stops.
  3. On a five digit broker, you must adjust TP, SL, and slippage
    //++++ These are adjusted for 5 digit brokers.
    double  pips2points,    // slippage  3 pips    3=points    30=points
            pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
    int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)
    int     init(){
        if (Digits == 5 || Digits == 3){    // Adjust for five (5) digit brokers.
                    pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
        } else {    pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; }
        // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
    

 

Thanks for your answer.


I tried many think but i'm certainly don't doint it well.


For example, for this order :

OrderSend( Symbol(), 0, 0.1,Ask, 3,Ask - 50 * Point,Ask + 25 * Point,"Achat",0,0,Green);

How would you write it with your variables?


I tried to understand, but i'm not enought exprerienced to

Thanx a lot

 

AIS2 Trading Robot :

...
 
//< 7.4. Data Feed 29 >```````````````````````````````````````````````````````````````````````````````````````//< 397>
                                                                                                              //< 398>
//< 7.4.1. Common Data 14 >                                                                                   //< 399>
       avd.QuoteAsk      = MarketInfo ( aes.Symbol , MODE_ASK            )                                  ; //< 400>
       avd.QuoteBid      = MarketInfo ( aes.Symbol , MODE_BID            )                                  ; //< 401>
       avd.QuotePoint    = MarketInfo ( aes.Symbol , MODE_POINT          )                                  ; //< 402>
       avd.QuoteSpread   = MarketInfo ( aes.Symbol , MODE_SPREAD         ) * avd.QuotePoint                 ; //< 403>
       avd.QuoteFreeze   = MarketInfo ( aes.Symbol , MODE_FREEZELEVEL    ) * avd.QuotePoint                 ; //< 404>
       avd.QuoteStops    = MarketInfo ( aes.Symbol , MODE_STOPLEVEL      ) * avd.QuotePoint                 ; //< 405>
       avi.Digits        = MarketInfo ( aes.Symbol , MODE_DIGITS         )                                  ; //< 413>
...
//</7.4.1. Common Data 14 >                                                                                   //< 414>

...

//< 7.5. Trading Strategy Interface Reset 4 >`````````````````````````````````````````````````````````````````//< 442>
                                                                                                              //< 443>
       avi.Command       = EMPTY                                                                            ; //< 444>
       avd.Price         = EMPTY                                                                            ; //< 445>
       avd.Stop          = EMPTY                                                                            ; //< 446>
       avd.Take          = EMPTY                                                                            ; //< 447>
                                                                                                              //< 448>
//</7.5. Trading Strategy Interface Reset 4 >`````````````````````````````````````````````````````````````````//< 449>

...

//< 7.7. Trading Strategy Logic 33 >``````````````````````````````````````````````````````````````````````````//< 546>
...
//< 7.7.2. Buy Rules 2 >                                                                                      //< 553>
     if ( NormalizeDouble  ( avd.Close.1   -   avd.Average.1                             , avi.Digits ) > 0 ) //< 554>
     if ( NormalizeDouble  ( avd.QuoteAsk  - ( avd.High.1 + avd.QuoteSpread )            , avi.Digits ) > 0 ) //< 555>
//</7.7.2. Buy Rules 2 >                                                                                      //< 556>
                                                                                                              //< 557>
//< 7.7.3. Trading Strategy Interface Set for Buy 8 >                                                         //< 558>
        { avd.Price        = NormalizeDouble ( avd.QuoteAsk                                  , avi.Digits ) ; //< 559>
          avd.Stop         = NormalizeDouble ( avd.High.1 + avd.QuoteSpread  - avd.QuoteStop , avi.Digits ) ; //< 560>
          avd.Take         = NormalizeDouble ( avd.QuoteAsk                  + avd.QuoteTake , avi.Digits ) ; //< 561>
                                                                                                              //< 562>
          if               ( NormalizeDouble (                                                                //< 563>
                           ( avd.Take  - avd.Price                    ) - avd.QuoteStops , avi.Digits ) > 0 ) //< 564>
          if               ( NormalizeDouble (                                                                //< 565>
                           ( avd.Price - avd.QuoteSpread - avd.Stop   ) - avd.QuoteStops , avi.Digits ) > 0 ) //< 566>
               avi.Command = OP_BUY                                                                       ; } //< 567>
//</7.7.3. Trading Strategy Interface Set for Buy 8 >                                                         //< 568>
...
//</7.7. Trading Strategy Logic 33 >``````````````````````````````````````````````````````````````````````````//< 591>

...

//< 7.8.4. Order Send Trading Function 29 >                                                                   //< 636>
...
              int ali.Ticket          = OrderSend          ( aes.Symbol    , avi.Command  , ald.Size      ,   //< 654>
                                        avd.Price   ,  0   , avd.Stop      , avd.Take     , ""            ,   //< 655>
                                        aci.OrderID ,  0   , 0                                            ) ; //< 656>
...
 
 

 

Ok thank you i will try that.


Just one question, is

Ask

equivalent to

MarketInfo (Symbol(), MODE_ASK)


?

Reason: