请教orderselect嵌套问题怎么解决?

 
      for(int cnt=0; cnt<total; cnt++)
        {
         OrderSelect(cnt, SELECT_BY_POS,MODE_TRADES);
         Print("186---未区分多空时------cnt=",cnt);
         Print("187---未区分多空时-----OrderType()=",OrderType());
         Print("1188--未区分多空时----OrderTicket()=",OrderTicket());
         if(MA1>MA2// && //lan_buypos()<=lan_sellpos())||//小级别多头,空仓多,平空仓
            //MA2>MA3 &&
            //selljindanjianju>30*Point &&
           lan_buypos()<=lan_sellpos()
           )//大级多头,多仓多,空仓有利仍平空代替开多
           {

         Print("196-------------多头时--未区分多空时------cnt=",cnt);



------------------------------

double lan_buypos()

  {

   double a=0;

   int t=OrdersTotal();

   for(int i=t-1; i>=0; i--)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

        {

         if(OrderSymbol()==Symbol() && OrderType()==OP_BUY)// && OrderMagicNumber()==magic)

           {

            a=a+OrderLots();

           }

        }

     }

   return(a);

  }


问题:for函数用了orderselect选中订单,在for嵌套了if条件为调用buypos函数,而buypos函数又用了一次orderselect,,,但是这个buypos用完选择后,此时系统选中的订单已不再是for当时选中的订单,怎么解决呢?

 

在第一层for之前,先调用 lan_buypos 和 lan_sellpos

   double buys = lan_buypos();
   double sells = lan_sellpos();
   for(int cnt=0; cnt<total; cnt++)
   {
      if(!OrderSelect(cnt, SELECT_BY_POS,MODE_TRADES))continue;
      Print("186---未区分多空时------cnt=",cnt);
      Print("187---未区分多空时-----OrderType()=",OrderType());
      Print("1188--未区分多空时----OrderTicket()=",OrderTicket());
      if(MA1>MA2 && buys<sells)
      {
         //...
      }
      if(buys>sells)
      {
       //...
      }

   }
 
老师的解决方法非常不错。其实,第一个FOR不妨直接用--,就不存在你说的问题了。因为,序号遍历的订单,如果这个订单因某种原因被平仓,这个订单就会被系统自动移动到历史订单列表里了, 当前持仓订单列表系统会自动剔除, 因此,排序序号当然会变了。