开单疑问

 

我编写了一个开多单的代码,市场到我预设价格后,先检查有没有持仓,如果有就不开多单,如果没有就按照预设价格开多单。但执行之后问题出现——市场波动到预设价格后,程序就会开两次单,之后才打印出已经有持仓的提示。两次开单先后差几秒钟,应该是市场价格先后两次到达预设价格导致短时间内开两单。为什么第二次开单没有检测出有持仓了呢?难道是第二次价格出现得太快,导致第一次程序还没有把positiontotal()函数写进去?

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));
      }
    }

}

 
Liang Liu:

我编写了一个开多单的代码,市场到我预设价格后,先检查有没有持仓,如果有就不开多单,如果没有就按照预设价格开多单。但执行之后问题出现——市场波动到预设价格后,程序就会开两次单,之后才打印出已经有持仓的提示。两次开单先后差几秒钟,应该是市场价格先后两次到达预设价格导致短时间内开两单。为什么第二次开单没有检测出有持仓了呢?难道是第二次价格出现得太快,导致第一次程序还没有把positiontotal()函数写进去?

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));
      }
    }

}

MT4跟MT5是不一样的,T5要繁琐多了。你这个很明显不只是开两张的问题,你的持仓检测跟订单执行本身就不合理。我相信专业点的人一眼就看出来。

 

你这个是挂单不是市价单,有可能挂单会不会还没有成交,因此你positionsTotal()还是0,所以程序继续开挂单

原因: