为什么这样子才能在不同价位开单的小问题 - 页 2

 
Loong 写道 >>

想起来应该看看是不是多执行了start()

for循环开头加上Print

看Print的结果,到底是循环错了,还是又执行了start()

您好Loong,经上面两种情形的测试,iexe的结果相同,都是9161,这么说就没有重复执行start()的情况出现。

//

23:25:14 2009.12.01 23:59 AA EURUSD,M1: iexe=9161
23:25:14 2009.12.01 23:59 Tester: order #1 is closed

 
为了说明问题把程序控制在只执行一小段时间内,代码附后,改变中断就会出现不同的情况。
double   Lot=0.01;
int start()
  {
//----
   if(!(TimeCurrent()>=StrToTime("2009.12.01 16:00") && TimeCurrent()<=StrToTime("2009.12.01 16:20")))
      return(0);

   static int iexe = 0;
   iexe++;
   Print("iexe=", iexe);

   if(OpenSellS(PERIOD_M1))
         OpenSellOk(111);
   if(OpenSellS(PERIOD_M5))
         OpenSellOk(222);
   return(0);
  }
//+------------------------------------------------------------------+
void OpenSellOk(int MagicNu)
{
   int SOK;
   if(OrdersTotal()==0)
      SOK=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Bid+50*Point,Bid-5*Point,"HaHa",MagicNu,0,Blue);
   else
   {
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
         Print("i=", i, ", OrdersTotal()=", OrdersTotal());
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
         {
            if(OrderSymbol() == Symbol() && OrderType()==OP_SELL && OrderMagicNumber()==MagicNu && OrderOpenPrice( )<Bid)
            {
               Lot=OrderLots( )+0.01;
               SOK=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Bid+50*Point,Bid-5*Point,"HaHa",MagicNu,0,Blue);
//               break;
            }
               break;//----为什么中断放在这里才能正确在不同价位开仓
         }
         else  return(0);
      }
   }
}
bool OpenSellS(int _Period)
{
   if(_Period==1 && TimeCurrent()>=StrToTime("2009.12.01 16:05") && TimeCurrent()<=StrToTime("2009.12.01 16:09"))
      return(true);
   else
      return(false);
   if(_Period==5 && TimeCurrent()>=StrToTime("2009.12.01 16:05") && TimeCurrent()<=StrToTime("2009.12.01 16:15"))
      return(true);
   else
      return(false);
}
附加的文件:
aa_1.mq4  2 kb
 
解决办法:
1.不用break,直接return试试。
2.不要在for结构里调OrdersTotal,在外面调,存在变量里,这样至少不会被OrderSend影响。但是不能保证完全遍历Orders。
3.不要在for循环里调OrderSend,只置个标志变量,然后break,这样应该能保证退出循环,再根据标志变量决定要不要OrderSend。
任何一种应该都可以,1最简单,2有漏洞,3逻辑清晰。
 
时间限制条件定义成输入参数比较方便
extern datetime timeBegin = D'2009.12.01 16:00';
extern datetime timeEnd = D'2009.12.01 16:20';
int start()
{
if(!(TimeCurrent()>=timeBegin && TimeCurrent()<=timeEnd))
return(0);
https://docs.mql4.com/basis/types/datetime
 

我想明白了,为什么中断放在判断句后结果是正确的,即始终只要最后成交的那一单,其它没有必要看。

//

再次感谢Loong的热心帮助。

原因: