Error 130

 

Hi, I'm new to MT4 and I need some help with Error 130. I'm trying to use a very simple code to test how MT4 works with my broker (Forex.com). However, I'm stuck at the Error 130 for my EA. I tried to change the SL and TP, but it doesn't help. I also checked the STOPLEVEL for my broker is 10. But no matter what I change the number to, it always tells me Error 130. Here is the code. I know the code looks retarded, it's because I modified only to debug the error. Please help!

extern double TakeProfit = 40;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   int cnt, ticket, total;
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external 
// variables (Lots, StopLoss, TakeProfit, 
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
// to simplify the coding and speed up access
// data are put into internal variables
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
   TakeProfit=MarketInfo(Symbol(),MODE_STOPLEVEL);

   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
      if(MacdCurrent<0 /*&& MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious*/)
        {
         /*ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,30,Ask-TakeProfit*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);*/
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-30,Bid+30,"macd sample",16383,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // check for short position (SELL) possibility
      if(MacdCurrent>0 /*&& MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
         MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious*/)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+30,Ask-30,"macd sample",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
   // it is important to enter the market correctly, 
   // but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {
            // should it be closed?
            if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel*Point))
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                 return(0); // exit
                }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else // go to short position
           {
            // should it be closed?
            if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0); // exit
              }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
// the end.
 
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-30,Bid+30,"macd sample",16383,0,Green);
if bid = 1.30 your stoploss would be - 28.70 Trie
  Bid - 30*Point   
 

Thanks for your reply. I got what you mean. I made that mistake during revising the code. However, this is not the real problem at. I changed the code to this, and print out the SL and TP at the error, the print out is :

2012.03.15 09:39:42 MACD Sample EURUSD,M1: Error opening BUY order : 130 Ask: 1.3011 SL: 1.2996 TP: 1.3026

This is driving me crazy. Please help.

      if(MacdCurrent<0 /*&& MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious*/)
        {
         SL=Ask-TakeProfit*Point;
         TP=Ask+TakeProfit*Point;
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,SL,TP,"macd sample",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()," Ask: ",Ask," SL: ",SL," TP: ",TP); 
         return(0); 
        }
      // check for short position (SELL) possibility
      if(MacdCurrent>0 /*&& MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
         MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious*/)
        {
         SL=Bid+TakeProfit*Point;
         TP=Bid-TakeProfit*Point;
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,SL,TP,"macd sample",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()," Bid: ",Bid," SL: ",SL," TP: ",TP); 
         return(0); 
        }
      return(0);


 

I got it. My broker does not accept SL and TP with OrderSend function. Has to be mod later.

This is not specified by the broker or the documentation. STRONGLY recommend this to be noted in the doc.

 
jiehe21:

Thanks for your reply. I got what you mean. I made that mistake during revising the code. However, this is not the real problem at. I changed the code to this, and print out the SL and TP at the error, the print out is :

2012.03.15 09:39:42 MACD Sample EURUSD,M1: Error opening BUY order : 130 Ask: 1.3011 SL: 1.2996 TP: 1.3026

This is driving me crazy. Please help.


Your broker could be ECN and then you're not allowed to place new trades with directly set Stoploss and TakeProfit setting

Here https://www.mql5.com/en/code/10317 you find an example how to deal with that

 
Or just use the search function top right or Google . . . . there is a myriad of posts about ECN and error 130: ECN/130
 
jiehe21:

Thanks for your reply. I got what you mean. I made that mistake during revising the code. However, this is not the real problem at. I changed the code to this, and print out the SL and TP at the error, the print out is :

2012.03.15 09:39:42 MACD Sample EURUSD,M1: Error opening BUY order : 130 Ask: 1.3011 SL: 1.2996 TP: 1.3026

SL=Ask-TakeProfit*Point;
TP=Ask+TakeProfit*Point;
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,SL,TP,"macd sample",16384,0,Green);
  1. Not adjusting for 4/5 digit broker, tp, sl, AND slippage.
  2. Not adjusting for ECN
  3. You BUY at the ASK, your stops are relative to the BID.
Reason: