请教EA开仓问题

 

我写了代码,要使程序在检测到市场价格到达我预设的价格时检测是否持仓,如果已有持仓就不开单,并作出提示。如果没有持仓就开多单。现在执行出现这样的问题——价格到达预设价格后,连续两次开仓,两次开仓离得很近,2、3秒钟,应该是价格先后两次到达预设价格后开仓。为什么第二次开仓代码执行过程没有检测到第一次的持仓呢?难道那时候第一次持仓还没有来得及被记录吗?



void OnTick()
  {
   MqlTradeRequest request={};
   MqlTradeResult  result={};
   //int long_orderquantity=0;
   //int short_orderquantity=0;
   
   //开多单
   if(SymbolInfoDouble(Symbol(),SYMBOL_ASK)==longprice)
   {
      //if(long_orderquantity==0)
      if(PositionsTotal()==0)
      {
         ZeroMemory(request);
         ZeroMemory(result);
         request.action   =TRADE_ACTION_PENDING;                     // 交易操作类型
         request.position =0;                            // 关闭情况下的持仓单号
         request.symbol   =Symbol();                              // 交易品种
         request.volume   =volume;                                // 交易量
         request.type     =ORDER_TYPE_BUY_STOP;                    // 订单类型
         request.price    =longprice;                                 // 交易价格
         request.stoplimit=longstoploss;                              //止损价格  
         request.deviation=10;                                  // 可允许的价格偏差
         request.magic    =EXPERT_MAGIC;                           // 订单幻数
      //--- 发送请求
         if(!OrderSend(request,result))
           {
            //--- 显示数据失败
            PrintFormat("OrderSend %s %s %.2f at %.5f error %d",
                        request.symbol,EnumToString(request.type),volume,request.price,GetLastError());
           }
      //--- 通知成功操作
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
         printf("开多单成功");
        // long_orderquantity++;
      }
      else
      {
        ENUM_POSITION_TYPE type1=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);        
        PrintFormat("%s had been open.",EnumToString(type1));
      }
    }

 
没有人回答,解决不了,自己顶,在线等。
 
继续顶,希望有人帮忙解决
 

更新到EA板块。

可以通过以下方案解决。


【官网公告】找合规开发者,开发好EA 

【官网公告】找合规开发者,开发好EA
【官网公告】找合规开发者,开发好EA
  • 2022.09.23
  • www.mql5.com
大家好,我是官网版主 我们收到很多举报,希望大家不要贪小便宜吃大亏。 实话实说,开发EA时,全地球上最好的选择就是官方的自由职业者。 所有MT4和MT5的开发者都会使用官网,并且这里的开发过程,全程受到官方的保护...
 
Liang Liu #:
没有人回答,解决不了,自己顶,在线等。

建议检测持仓订单数量单独写一个子函数返回一个整型数据,来判断持仓数量;

看到你的代码里面是开的BuyStop;

建议Positions换为子函数精准判断持仓数量;


Positions是持仓,Orders是挂单?两者是有区别的。

 
你这个是开挂单,挂单不一定马上成交,因此检测仓位很可能还是0
原因: