Backtesting keep throwing Order Send Error 130 / 138

 

I try to back test my expert advisor, but it keep sending error 130 / 138, very rarely it goes thru. I read somewhere that I can't use predetermined variable for backtest, I already try to change all the predetermined variable. Is something else


piploss = pipgain  = 0.03


double price = iClose(Symbol(), PERIOD_H1, 1);
   if (up > down && up-down >= 0.5){
      double stoploss = NormalizeDouble(price-piploss, 4);
      double takeprofit = NormalizeDouble(price+pipgain, 4);
      //double stoploss = price-piploss*Point;
      //double takeprofit = price+pipgain*Point;
      Print("buy price: " + price + ", stoploss: " + stoploss + ", takeprofit: " + takeprofit);
      int ticket = OrderSend(Symbol(), OP_BUY, 1, price, 10, stoploss, takeprofit, "buy", 16384, 0, clrGreen);
      if (ticket<0){
         Print("Order send error: ", GetLastError());
      } else{
         Print("Order success");
      }
   } else if (down > up && down-up >= 0.5) {
      double stoploss = NormalizeDouble(price+piploss, 4);
      double takeprofit = NormalizeDouble(price-pipgain, 4);
      //double stoploss = price+piploss*Point;
      //double takeprofit = price-pipgain*Point;
      Print("sell price: " + price + ", stoploss: " + stoploss + ", takeprofit: " + takeprofit);
      int ticket = OrderSend(Symbol(), OP_SELL, 1, price, 10, stoploss, takeprofit, "sell", 16384, 0, clrGreen);
      if (ticket<0){
         Print("Order send error: ", GetLastError());
      } else{
         Print("Order success");
      }
   } else {
      Print("sideway");
   }
 

OP_BUY/OP_SELL are market orders. You buy at the Ask and sell at the Bid. price is off most of the times.

This would work:

      double stoploss = NormalizeDouble(Ask-piploss, 4);
      double takeprofit = NormalizeDouble(Ask+pipgain, 4);
      Print("buy price: " + Ask + ", stoploss: " + stoploss + ", takeprofit: " + takeprofit);
      int ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 10, stoploss, takeprofit, "buy", 16384, 0, clrGreen);
 
double price = iClose(Symbol(), PERIOD_H1, 1);
   if (up > down && up-down >= 0.5){
      double stoploss = NormalizeDouble(price-piploss, 4);
      double takeprofit = NormalizeDouble(price+pipgain, 4);
      //double stoploss = price-piploss*Point;
      //double takeprofit = price+pipgain*Point;
      Print("buy price: " + price + ", stoploss: " + stoploss + ", takeprofit: " + takeprofit);
      int ticket = OrderSend(Symbol(), OP_BUY, 1, price, 10, stoploss, takeprofit, "buy", 16384, 0, clrGreen);
  1. 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

  2. You buy at the Ask and sell at the Bid. So for buy orders you pay the spread on open. For sell orders you pay the spread on close.
    1. Your buy order's TP/SL (or Sell Stop's/Sell Limit's entry) are triggered when the Bid reaches it. Not the Ask. Your SL is shorter by the spread and your TP is longer.
    2. Your sell order's TP/SL (or Buy Stop's/Buy Limit's entry) will be triggered when the Ask reaches it. To trigger at 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.)

  3. You used NormalizeDouble, It's use is usually wrong, as it is in your case.

  4. Never risk more than a small percentage of your account, certainly less than 2% per trade, 6% total. In code (MT4): Risk depends on your initial stop loss, lot size, and the value of the pair.
    1. You place the stop where it needs to be - where the reason for the trade is no longer valid. E.g. trading a support bounce the stop goes below the support.
      1. AccountBalance * percent/100 = RISK = OrderLots * (|OrderOpenPrice - OrderStopLoss| * DeltaPerLot + CommissionPerLot) (Note OOP-OSL includes the spread, and DeltaPerLot is usually around $10/pip but it takes account of the exchange rates of the pair vs. your account currency.)
      2. Do NOT use TickValue by itself - DeltaPerLot and verify that MODE_TICKVALUE is returning a value in your deposit currency, as promised by the documentation, or whether it is returning a value in the instrument's base currency.
                  MODE_TICKVALUE is not reliable on non-fx instruments with many brokers.
      3. You must normalize lots properly and check against min and max.
      4. You must also check FreeMargin to avoid stop out
      Most pairs are worth about $10 per PIP SL is $5/$10/5=0.1 Lots maximum.