ordersend()请求无效怎么解决2

Liang Liu  

为什么下面这段代码平多单有效,平空单总不成功提示无效请求呢?

void OnStart() 

  { 
   MqlTradeRequest MyTrade={};
   MqlTradeResult MyResult={};
   MqlTick MyTick;
   SymbolInfoTick(Symbol(),MyTick);
   int total=PositionsTotal();   
   ZeroMemory(MyTrade);
   ZeroMemory(MyResult);
   
   for(int i=total-1;i>=0;i--)
     {
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
      ulong  position_ticket=PositionGetTicket(i);
      MyTrade.position=position_ticket;
      MyTrade.action=TRADE_ACTION_DEAL;
      MyTrade.magic=001;
      MyTrade.symbol=Symbol();
      MyTrade.volume=0.01;
      if(type==POSITION_TYPE_BUY)
      {
       MyTrade.type=ORDER_TYPE_SELL;
       MyTrade.price=MyTick.bid;
      }
      else if(type==POSITION_TYPE_SELL)
             {
              MyTrade.type=ORDER_TYPE_BUY;
              MyTrade.price=MyTick.ask;
             }   
      MyTrade.deviation=100;
      MyTrade.type_filling=ORDER_FILLING_FOK;
      MyTrade.comment="Test";
     }
   if(!OrderSend(MyTrade,MyResult))
   Print(MyResult.retcode," ",MyResult.ask," ",SymbolInfoInteger(Symbol(),SYMBOL_DIGITS)," ",0.01);
  }
Liang Liu  
Liang Liu:

为什么下面这段代码平多单有效,平空单总不成功提示无效请求呢?

void OnStart() 

  { 
   MqlTradeRequest MyTrade={};
   MqlTradeResult MyResult={};
   MqlTick MyTick;
   SymbolInfoTick(Symbol(),MyTick);
   int total=PositionsTotal();   
   ZeroMemory(MyTrade);
   ZeroMemory(MyResult);
   
   for(int i=total-1;i>=0;i--)
     {
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
      ulong  position_ticket=PositionGetTicket(i);
      MyTrade.position=position_ticket;
      MyTrade.action=TRADE_ACTION_DEAL;
      MyTrade.magic=001;
      MyTrade.symbol=Symbol();
      MyTrade.volume=0.01;
      if(type==POSITION_TYPE_BUY)
      {
       MyTrade.type=ORDER_TYPE_SELL;
       MyTrade.price=MyTick.bid;
      }
      else if(type==POSITION_TYPE_SELL)
             {
              MyTrade.type=ORDER_TYPE_BUY;
              MyTrade.price=MyTick.ask;
             }   
      MyTrade.deviation=100;
      MyTrade.type_filling=ORDER_FILLING_FOK;
      MyTrade.comment="Test";
     }
   if(!OrderSend(MyTrade,MyResult))
   Print(MyResult.retcode," ",MyResult.ask," ",SymbolInfoInteger(Symbol(),SYMBOL_DIGITS)," ",0.01);
  }

为什么用ENUM_POSITION_TYPE取得的type变量总是0(POSITION_TYPE_BUY)?即使持仓是空单,也是0,就是这导致程序判断持仓总是多单,执行平多单(开空单)操作,从而令平空单失败。哪位给说说为啥会这样?

Mage He  

因为在获取type的时候,得先选中订单,例如PositionSelectByTicket,PositionGetSymbol 或者 PositionSelect.

这在帮助文件都写了,仔细看……

原因: