Top Menu

Feedburner

Right-Side Top Menu

OrderSend Error 130 — What to Do?

October 6, 2008 (Last updated on April 23, 2013)

The expert advisors that work on one broker can stop working on another; the problem with them often lies in OrderSend Error 130. If you see Error 130 in the Log of your MetaTrader platform when your expert advisor should be opening a position, then that means that the stop-loss or take-profit levels are set to close to the current market price. In the MQL documentation this error is called ERR_INVALID_STOPS («Invalid stops»). Some Forex broker set the minimum distance between the current price and the stop-loss/take-profit levels to prevent scalping or abusing the quote delays. That’s not a real problem for the majority of the expert advisors that don’t use scalping. To prevent this error from occurring, you need to change the expert’s code.

First, you might want to know what’s the minimum stoplevel is set in your broker’s MetaTrader server. Adding this line of code will output the current minimum stoplevel for the currency pair of the chart, where you run the EA:
Print(MarketInfo(Symbol(), MODE_STOPLEVEL));

You shouldn’t be using stop-loss or take-profit level, which are closer than MarketInfo(Symbol(), MODE_STOPLEVEL) to the current market price. If your EA calculates stops and take-profits dynamically, this is what I suggest you to do:

  1. Declare a global variable for the minimum StopLevel; e.g.:
    int StopLevel;
  2. In the init() function of your expert advisor define the minimum StopLevel:
    StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL) + MarketInfo(Symbol(), MODE_SPREAD);
    Note, that adding a spread difference is also required.
  3. The next time your stop-loss or take-profit is calculated, just check them to be not less than StopLevel:
    if (StopLoss < StopLevel) StopLoss = StopLevel;
    if (TakeProfit < StopLevel) TakeProfit = StopLevel;
  4. Don’t forget to refresh the current market rates with RefreshRates() before adding the stop-loss/take-profits levels to the actual market rates.

That should help in the majority of the cases. At least, for me such handling of the OrderSend Error 130 has always worked.

Update 2011-12-15: Some brokers (ECN ones) don’t allow expert advisors to set stop-loss or take-profit level in the OrderSend() function, even if it’s greater than their MODE_STOPLEVEL. In this case, you’ll have to change your EA to send orders without SL and TP and then use OrderModify() function to set stop-loss and take-profit on the open position.

Update 2012-05-28: More on ECN-compatibility.

If you have any questions or suggestions regarding OrderSend Error 130 problem with expert advisors, please feel free to reply using the form below.

59 Responses to “OrderSend Error 130 — What to Do?”

  1. Jonathan

    Epic Tip!! TY!!!

    Reply

    khan Reply:

    I keep getting this error non stop. my ordersend() function is as follows:
    currentOrder = OrderSend(currencies[i], OP_SELL, 0.1, Bid, 3, Bid+(MarketInfo(currencies[i], MODE_STOPLEVEL) + MarketInfo(currencies[i], MODE_SPREAD))*0.0001, Bid-(MarketInfo(currencies[i], MODE_STOPLEVEL) + MarketInfo(currencies[i], MODE_SPREAD))*0.0001,”Sell”, BlueViolet);

    The stuff in the stop loss and take profit areas were things that the internet told me to do but yet it still does not work. Please help!

    Reply

    admin Reply:

    Perhaps, you are trying that on ECN account, where placing orders with SL and TP is prohibited? In that case, you have to send first an order without SL/TP and then modify it to add SL/TP.

    Reply

    khan Reply:

    Can you tell me what I have to put in stoploss if I want to set it to 5 pips , and takeprofit to ten pips for both buy and sell trades? Thank you for replying to original post.

    Reply

    admin Reply:

    Buy trades:
    Ask – 5 * Point
    Ask + 10 * Point
    Sell trades:
    Bid + 5 * Point
    Ask – 10 * Point

    Reply

  2. kovas

    “Some Forex broker set the minimum distance between the current price and the stop-loss/take-profit levels to prevent scalping or abusing the quote delays.”
    Whats is the reason for broker to do that if you can stop loos by hand ?

    Reply

    Andrei Reply:

    Because it’s almost impossible to constantly abuse the low stop-loss manually. Real abusers create EAs that do that.

    Reply

  3. Richard

    Hi,
    Thanks for the info – but I have a question I hope you can help with. My EA places pending orders, with TP and SL placed between 25 and 50 pips from open. Every now and then I get error 130, I presume because the SL is close to current price. Surely the error should only occur when SL is too close to the opening price, NOT the current price on a pending trade. adjusting the SL too much will change the nature of the trade – any ideas for this one. BTW I am using Alpari UK.
    Thanks
    Richard

    Reply

    Andrei Reply:

    Richard,

    I am not sure but I believe that it’s not because SL or TP are close to the current price, but because your opening price in the pending order is too close to the current.

    Reply

  4. Jon

    Another current issue deals with Market Execution vs Instant Execution. One is MM with instant execution and the other one is non-dealing with Market Execution. Market Execution that is done by STP and ECN cannot send TP and SL along with the order. You have to modify order and then set the TP and SL.

    Reply

    Andrei Reply:

    Why do you think so?

    Reply

    Mark Reply:

    How I can do this. Can you help step by step?

    Reply

  5. David

    Thank you very much for the code.
    It fix my problem

    Reply

  6. alvin

    Dear !

    I try to use EA in demo account and it work fine.But when i use it on real account,always have error ordersend 130.

    Pleas ! help me to know why ?

    Thanks !

    Reply

    admin Reply:

    What setting do you use?

    Reply

    alvin Reply:

    I am use defaul setting for both of 2 account. Something wrong here ?

    Reply

    alvin Reply:

    I am using phoenix v56_03, please ! help me

    Reply

    admin Reply:

    Did you download Phonex from here:
    http://www.earnforex.com/metatrader_expert_advisors/Phoenix
    or from somewhere else?

    Reply

    alvin Reply:

    Nobody can help me with this problem :(

    Reply

  7. alvin

    Yes ! i am download your shared phoenix and use in GBPUSD.

    On demo account no problem but on real account it issue

    Reply

    admin Reply:

    Is the symbol called “GBPUSD” in your broker’s MT4? Are you sure there are no extra symbols, like “#GBPUSD” or “xGBPUSD”?

    Reply

    alvin Reply:

    Dear !

    Thank so much, i had fix that promlem, now that EA work fine :D

    Reply

    admin Reply:

    And how did you do it?

    Reply

    juan david Reply:

    im having the same problem with phoenix ( downloaded form here) and im running default settings with the recommended pairs.

    i have a 1000 demo account.

    thanks in advance

    Reply

    admin Reply:

    Did you try the proposed solution? Does your broker allows setting SL and TP on positions in the open order?

    Reply

  8. Nadine

    I have an EA with SL set to 650 (65 pips) and TP set to 800 (80 pips) but am still getting error 130 on execution. It works fine in Strategy Tester. The log file is as follows:

    9:00:10 MACross GBPUSDm,H1: Alert: MA crossover -> SELL GBPUSDm
    09:00:10 MACross GBPUSDm,H1: MA crossover: Error opening SELL order : 130
    09:00:10 MACross GBPUSDm,H1: Bid: 1.558 SL: 1.5645 TP: 1.55

    The code for this is:

          if ( CurrPrice  SELL " + Symbol());
             res=OrderSend(Symbol(),OP_SELL,Lots,CurrPrice,3,CurrPrice+sLoss, CurrPrice-tProf,"MA cross SELL",MAGICMA,0,Red);
               if ( res &lt; 0 ) {Print(&quot;MA crossover:  Error opening SELL order : &quot;,GetLastError());
                                   Print(&quot;Bid: &quot;, Bid, &quot; SL: &quot;, CurrPrice+sLoss, &quot; TP: &quot;, CurrPrice-tProf); }
          }

    Do you have any ideas on how to resolve this?

    Reply

    admin Reply:

    If you are trading on ECN account, you can’t set SL or TP on position opening, you have to do it after the order is executed.

    Reply

  9. Nadine

    Not sure what an ECN account is, but I know for market order, it’s not possible to set SL/TP on opening, but I have other EAs that work fine doing that.

    Reply

    admin Reply:

    If you are sure that other EA are setting SL & TP in OrderSend() and don’t get OrderSend error 130 on this same account, then my only suggestion to you would be to apply NormalizeDouble() to your stop-loss and take-profit levels. E.g.:

    OrderSend(Symbol(),OP_SELL,Lots,CurrPrice,3,NormalizeDouble(CurrPrice+sLoss, Digits), NormalizeDouble(CurrPrice-tProf, Digits),"MA cross SELL",MAGICMA,0,Red);

    Reply

  10. Nadine

    Thanks. I will try that.

    Reply

  11. Nadine

    The conditions were just met, but the EA did not execute. Same error 130. I’m going to try a different approach. That’s for your assistance.

    Reply

    admin Reply:

    Please let us know if you find the solution.

    Reply

  12. Tushar

    Hi,

    I have EA Which Give me 130 ERROR while Execute Order.
    Like You said ECN Broker not Allow to put SL/TP while Order Execute.

    So I need help to Chane EA program, like this First Send Order Only , After Modify it with SL and TP. Also How TO Hide SL/TP Like FAPTURBO EA.

    Please i need Your help.

    Thanks.

    Reply

    admin Reply:

    You can contact Fapturbo support with this request.

    Reply

  13. almun

    EA name: cm_martini
    worked in another broker but can’t work in exness broker , can you help me to modify that EA. please send modified EA to my email : almunpdam@yahoo.co.id

    Reply

    admin Reply:

    If you put a download link here, I can look at it.

    Reply

  14. menny

    hi
    i have EA thats works great in the EUR/USD pair but when im trying to place it on the S&P or Nasdaq its give me error 130. when im running backtest its working great.
    when trying to trade demo its always give me errors and not sending my orders. any idea? i didnt understood where to place this line :”Print(MarketInfo(Symbol(), MODE_STOPLEVEL));” for checking.
    thanks for your help

    Reply

    admin Reply:

    You need to place it anywhere in the init() function of the EA’s source code (.mq4 file). If you do not have the .mq4 file and have only .ex4, then it is not possible to add anything to your EA or alter it to fix the appearing error.

    Reply

    menny Reply:

    i have the .mq4 file. i placed it here:
    int init() {
    //—-
    Print(MarketInfo(Symbol(), MODE_STOPLEVEL));
    pnt=MarketInfo(Symbol(),MODE_POINT);
    dig=MarketInfo(Symbol(),MODE_DIGITS);
    but where it should write me whats the stop levels minimum?
    after i do that what should i do?
    and why the back test is working well but live demo isnt?
    any ideas?
    thanks alot!!!menny

    Reply

    admin Reply:

    It should print the value to your Experts tab.

    Reply

  15. menny

    sorry my friend i dont know where it does that i cant find it. anyway any explansion why its working in the back test and not in live demo?
    is there any chance its because it sends sell stop + tp + sl at the same time? maybe it should place the tp and sl just after the sell stop is filled?
    thanks

    Reply

    admin Reply:

    Here’s the Experts tab:
    Experts Tab

    Yes, it may be so that the TP/SL should be set separately after the order is already open. But earlier you have said that you tried it on EUR/USD live demo and it worked.

    Reply

  16. menny

    well in this tab its doesnt show me the stop level just writing me the error.
    in the EURUSD the EA works great only in nasdaq and s&p it shows me the error while trading live demo. but when im back testing it works fine.
    what to do??

    Reply

    admin Reply:

    Have you compiled the EA after you have added that line of code to init() function?
    Are you sure it doesn’t print anything when you attach the EA to a chart?

    Reply

  17. menny

    what is compiled?

    Reply

    admin Reply:

    When you apply some change to the EA’s code, you need to press a Compile button (F7).

    See this tutorial for more info:
    http://www.earnforex.com/blog/2007/07/metatrader-expert-advisros-users/

    Reply

  18. nambok

    My EA works on the strategy tester but it doesnt work on the live account (test). I get a orderSend() 130

    Reply

    admin Reply:

    Do you trade on ECN account and send orders with SL/TP on them?

    Reply

    nambok Reply:

    yup, im trying to do scalping and my broker allows it, why would it allow on the strategy test and not the live account

    Reply

    admin Reply:

    It has nothing to do with allowing or disallowing scalping. If your broker uses ECN execution, your EA has to set SL/TP after opening a position.

    Strategy Tester uses non-ECN execution.

    Reply

    nambok Reply:

    I see this makes sense, do you happened to know if Finfx is a ECN broker?

    thanks a lot for your help :)

    Reply

    admin Reply:

    As far as I know, FinFX offers both ECN and non-ECN accounts.

    Reply

  19. Sector

    Hello admin,
    My EA made Error 130 on FinFx ECN acc.
    and I don’t know how to fix this.
    Can I send you my EA mql4, to fix?
    this is my e-mail: sectorson@gmail.com

    Thank you in advance.

    Reply

    admin Reply:

    You can upload your EA to some file sharing website and post the download link here. Though I cannot promise you that I will fix it.

    Reply

    Sector Reply:

    I upload EA, this is a link:
    http://www.4shared.com/rar/2u3hzv8H/EA_ROBOT.html

    Reply

    admin Reply:

    Yeah, the EA applies SL and TP directly on position opening. It can be fixed by removing SL/TP from position opening procedures and transfer it to OrderModify() calls after positions are opened.

    Unfortunately, this EA is a decompiled code and it is hell of a job to make sense out of anything there. You better contact its author asking to make it ECN-friendly.

    Reply

  20. Max

    Hi

    I have run the EA and it keep showing Ordersend Error 130 and Ordermodify error 130. Is there a problem on the following that you can advice?

    Problem A :-

      for(c=0;c =0;trade--)
                  {
                   if(!OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
                      continue;
                   if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)
                      continue;
                   if(OrderSymbol()==Symbol()||OrderMagicNumber()==MagicNumber)
                     {
                      if(OrderType()==OP_BUY)
                        {
                         profit=NormalizeDouble((Bid-AvgPrice)/Point,0);
                         if(profitstoptrade))
                            //     OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Blue);
                            OrderModify(OrderTicket(),AvgPrice,stopcal,OrderTakeProfit(),0,Aqua);
                        }//Long
                      if(OrderType()==OP_SELL)
                        {
                         profit=NormalizeDouble((AvgPrice-Ask)/Point,0);
                         if(profit<start)
                            continue;
                         stoptrade=OrderStopLoss();
                         stopcal=Ask+(stop*Point);
                         if(stoptrade==0||(stoptrade!=0&&stopcal<stoptrade))
                            //     OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Red);
                            OrderModify(OrderTicket(),AvgPrice,stopcal,OrderTakeProfit(),0,Red);
                        }//Shrt
                     }
                   Sleep(1000);
                  }//for
               }

    Reply

    Andriy Moraru Reply:

    I cannot see that from what you have posted. Did you read this blog post? It explains that stop-loss price should be no closer to the opening price than broker defined STOPLEVEL. Check if your EA follows this rule.

    Reply

  21. Max

    problem B

     case OP_SELL:
                      for(c=0;c < NumberOfTries;c++)
                        {
                         ticket=OrderSend(Symbol(),OP_SELL,pLots,Bid,sp,StopShort(Ask,sl),TakeShort(Bid,tp),pComment,pMagic,pExpiration,pColor);
                         err=GetLastError();
                         if(err==0)
                           {
                            break;
                           }
                         else
                           {
                            if(err==4 || err==137 ||err==146 || err==136) //Busy errors
                              {
                               Sleep(5000);
                               continue;
                              }
                            else //normal error

    Reply

Leave a Reply

required
required (will not be published)
optional

Follow EarnForex Blog on Google Plus