【新人求助】关于Ordersend()函数无法实时交易的问题。

 

  大家好,我是一个MQL的初学者,然后在试用Ordersend()碰到了一点问题——我的程序无法自动实时交易,完全不知道为什么,大家可以帮一下忙么,谢谢了。

  

  以下一段是我写的测试程序主体部分,它实现的就是同时向两个方向建仓一次

 

 

 

这段运行时最重要的就只有两行

 

 tb = OrderSend(Symbol(),OP_BUY,newss,Ask,50,Ask-zhisuninit*Point,Ask+zhiyinginit*Point,"jty",16384,0,Red);

 ts = OrderSend(Symbol(),OP_SELL,newss,Bid,50,Bid+zhisuninit*Point,Bid-zhiyinginit*Point,"jty",16384,0,Green); 

 

然后我做了一下测试,在测试时是能运行的。 

 

 

 但是实际运行时,虽然没有任何错误,但是它无法自动建仓,而且返回的订单号都是 -1

 

  

 

但是,如果勾选需要人工确认后,能够显示订单窗口

 

 

 

 

 

 我十分希望这个问题能够解决,因为如果不能自动交易,那智能交易系统的意义就很小了。

 

再次谢谢大家。

 

最后附上全部测试代码:

 

#property copyright "Copyright 2012, jty"
 #property link      " "
 
 //--- input parameters
 extern int       zhisuninit = 300;
 extern int       zhiyinginit = 600;
 extern int       zhisun2 = 300;
 extern int       zhiying2 = 300; 
 
 //+------------------------------------------------------------------+
 //| expert initialization function                                   |
 //+------------------------------------------------------------------+
 int init()
   {
 //----
    
 //----
    return(0);
   }
 //+------------------------------------------------------------------+
 //| expert deinitialization function                                 |
 //+------------------------------------------------------------------+
 int deinit()
   {
 //----
    
 //----
    return(0);
   }
 //+------------------------------------------------------------------+
 //| expert start function                                            |
 //+------------------------------------------------------------------+
 
 int start()
   {
 //----
    static int total;
    static int tb = 99998;
    static int ts = 99998;
    static double newss;
 
    static bool init = true; //为了验证是否已经建仓,建仓只执行一次
    
    if(AccountEquity()>50)
    {   
       total=OrdersTotal(); //总手数
    
       if((total<1)&&(init == true)) 
           {
                   newss = shoushu();
                   
                   Alert ("Start:");
                   
                   tb = OrderSend(Symbol(),OP_BUY,newss,Ask,50,Ask-zhisuninit*Point,Ask+zhiyinginit*Point,"jty",16384,0,Red);   //买
                   ts = OrderSend(Symbol(),OP_SELL,newss,Bid,50,Bid+zhisuninit*Point,Bid-zhiyinginit*Point,"jty",16384,0,Green);//卖
                   
 
                   
                   if((tb!=99998)&&(ts!=99998)&&(tb!=-1)&&(tb!=-1))
                       init = false;
                       
                   Alert ("Number of buy-ticket is ",tb, ", and the sell-ticket is" ,ts);//显示订单编号
           }       
    }      
    
 //----
    return(0);
   }
 //+------------------------------------------------------------------+
 
 
 //计算手数
 double shoushu ()
 {
    double resultat;
    
    resultat = AccountEquity()/6/1000/10/2/2;
    if(resultat<0.01)
       resultat = 0.01;
    else 
       resultat = NormalizeDouble(resultat,2);
       
    return (resultat);   
 }
 

try to use GetLastError() for any potential problems checking.

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

for error code. 

 
henryzhong:

try to use GetLastError() for any potential problems checking.

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

for error code. 


Thank you, after the test, there is an error : ERR_INVALID_STOPS (130), but I don't know why, could you help me ?

The program is the same. 

 
henryzhong的帮助下,我截取了错误信息,此信息是ERR_INVALID_STOPS(130) (无效停止) ,但是我不知道是什么原因呢,大家能帮帮我么,谢谢了。
 

我又回来了 。我很像帮你测试,但是我这里测试账号连接不上。郁闷呢。

你这个错误是在那里获得的?

你的意思,你交易了2单就停止了不交易了是吧? 

 

你判断交易单中是买还是卖单。才平仓

         ticket = OrderSend(Symbol(),OP_BUY,0.1, Ask, slippage, 0, 0, "Open Buy", 0, 0, Red);

            if(ticket<0)

           {

            Print("OrderSend Buy失败错误看多0 #",GetLastError());

            return(0);

           } 

 

这样捕捉错误信息。看是什么地方报错 

 

NormalizeDouble()一下止损止盈参数试试,结果如何。 

jiapingren11:
henryzhong的帮助下,我截取了错误信息,此信息是ERR_INVALID_STOPS(130) (无效停止) ,但是我不知道是什么原因呢,大家能帮帮我么,谢谢了。
 
int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, void comment, void magic, void expiration, void arrow_color)
这个功能主要应用于开仓位置和挂单交易.
由交易服务器返回定单的定单编号或者-1,说明是错误的。获得另外的错误信息, 查看GetLastError()函数。
注解:市场定单的开启(OP_SELL or OP_BUY), 只有最后的卖价格或买价格可以应用到开价格中. 如果执行当前带有不同证券的业务,必须使用带有MODE_BID 或 MODE_ASK参量的MarketInfo()函数获得. 预测或是不标准的价格不可用. 如果没有要求重新开价格或者没有按照小数点后的数字正常化,错误129 (ERR_INVALID_PRICE)将会生成. 如果请求开价格的日期完全过期,错误138 (ERR_REQUOTE)将会生成. 如果请求的价格是过时的,仓位只能够在当前价格位打开/只有当前价格位在price+-slippage范围内.

止损和赢利水平线不能够关闭市场. 最小距离的终止水平点可以使用MarketInfo ()函数得到MODE_STOPLEVEL参量。 在错误或水平位不正常停止情况下,错误130 (ERR_INVALID_STOPS)将会生成.

在挂单的位置,开价格不能够终止市场活动. 最小距离的终止水平点可以使用MarketInfo ()函数得到MODE_STOPLEVEL参量。 在错误或水平位不正常停止情况下,错误130 (ERR_INVALID_STOPS)将会生成.

挂单交易的期限在一些服务器上禁止应用。这种情况下,一个特殊的非零值的参量将会产生,错误 147 (ERR_TRADE_EXPIRATION_DENIED)将会生成。

在一些服务器上,开仓和挂单交易的总数会被限定。如果超出限定,则不能开启新仓位。这样交易服务器返回到错误 148 (ERR_TRADE_TOO_MANY_ORDERS)。

 

止损和赢利水平线不能够关闭市场. 最小距离的终止水平点可以使用MarketInfo ()函数得到MODE_STOPLEVEL参量。 在错误或水平位不正常停止情况下,错误130 (ERR_INVALID_STOPS)将会生成.

在挂单的位置,开价格不能够终止市场活动. 最小距离的终止水平点可以使用MarketInfo ()函数得到MODE_STOPLEVEL参量。 在错误或水平位不正常停止情况下,错误130 (ERR_INVALID_STOPS)将会生成.

原因: