Error 130

 

I get the error 130 when placing an order, this stands for invalid stoploss but i don't see what is wrong so i was wondering if someone could help me out. The code is:

extern int dPrice = 5;     

extern double MinLotSize = 0.01;

extern int period = 20;

extern int TakeProfit = 10;   

extern int StopLoss = 100;

extern int magicNBLong = 1111;     

extern int magicNBShort = 1112;



void OnStart()

  {

  

  double MA = NormalizeDouble(iMA(NULL,0,period,0,MODE_SMA,PRICE_CLOSE,0),Digits);

   double RSI = iRSI(NULL,0,period,PRICE_CLOSE,0);

   double UpperLimit = MA + dPrice * Point;

   double LowerLimit = MA - dPrice * Point;

   

   double TakeProfitLong = MA + TakeProfit * Point;

   double StopLossLong = MA - StopLoss * Point;

   

   double TakeProfitShort = MA - TakeProfit * Point;

   double StopLossShort = MA + StopLoss * Point;

      if(Bid >=  UpperLimit && RSI > 50)

      {

         //Place first Long order

         int ticket1 = OrderSend(NULL,OP_BUY,MinLotSize,Bid,0,StopLossLong,TakeProfitLong,NULL,magicNBLong);

         if(ticket1 < 0)

         {

            Alert("Order 1 Rejected");

            Alert(GetLastError());

         }

         else

         {

            Alert("Order 1 ticket # " + string(ticket1));

         }   

      }

   

  }
 
Use the </> button to insert your code.
 
Fabian Lambregts:

I get the error 130 when placing an order, this stands for invalid stoploss but i don't see what is wrong so i was wondering if someone could help me out. The code is:

You are calculating your stops as a distance from an MA, you are not checking them in relation to the order entry price.

 
Fabian Lambregts:

I get the error 130 when placing an order, this stands for invalid stoploss but i don't see what is wrong so i was wondering if someone could help me out. The code is:

I didnt see a check for stop level allowed, maybe your stop is something like 10 points and your broker only allow to be placed after 50 points...
 
  1.    double UpperLimit = MA + dPrice * Point;
    
       double LowerLimit = MA - dPrice * Point;
    
    Creating your stops relative to the MA, not relative to the open price.
  2. You can't move stops (or pending prices) closer to the market than the minimum: MODE_STOPLEVEL * _Point or SymbolInfoInteger(SYMBOL_TRADE_STOPS_LEVEL).
              Requirements and Limitations in Making Trades - Appendixes - MQL4 Tutorial

    On some ECN type brokers the value might be zero (the broker doesn't know). Use a minimum of two (2) PIPs.

    The checks a trading robot must pass before publication in the Market - MQL5 Articles (2016)

  3. You buy at the Ask and sell at the Bid. Pending Buy Stop orders become market orders when hit and open at the Ask.

    1. Your buy order's TP/SL (or Sell Stop's/Sell Limit's entry) are triggered when the Bid / OrderClosePrice reaches it. Using Ask±n, makes your SL shorter and your TP longer, by the spread. Don't you want the specified amount used in either direction?

    2. Your sell order's TP/SL (or Buy Stop's/Buy Limit's entry) will be triggered when the Ask / OrderClosePrice reaches it. To trigger close to a specific Bid price, add the average spread.
                MODE_SPREAD (Paul) - MQL4 programming forum - Page 3 #25

    3. The charts show Bid prices only. Turn on the Ask line to see how big the spread is (Tools → Options (control+O) → charts → Show ask line.)
      Most brokers with variable spreads widen considerably at end of day (5 PM ET) ± 30 minutes. My GBPJPY shows average spread = 26 points, but average maximum spread = 134 (your broker will be similar).

  4. int ticket1 = OrderSend(NULL,OP_BUY,MinLotSize,Bid,0,StopLossLong,TakeProfitLong,NULL,magicNBLong);
    

    Be careful with NULL.

    1. On MT4, you can use NULL in place of _Symbol only in those calls that the documentation specially says you can. iHigh does, iCustom does, MarketInfo does not, OrderSend does not.
    2. Don't use NULL (except for pointers where you explicitly check for it.) Use _Symbol and _Period, that is minimalist as possible and more efficient.
    3. Zero is the same as PERIOD_CURRENT which means _Period. Don't hard code numbers.
    4. MT4: No need for a function call with iHigh(NULL,0,s) just use the predefined arrays, i.e. High[].
    5. Cloud Protector Bug? - MQL4 programming forum (2020.07.25)