为什么这样子才能在不同价位开单的小问题 - 页 2 12 新评论 [删除] 2010.01.27 16:48 #11 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 [删除] 2010.01.28 03:31 #12 为了说明问题把程序控制在只执行一小段时间内,代码附后,改变中断就会出现不同的情况。 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 Loong 2010.01.28 10:11 #13 解决办法: 1.不用break,直接return试试。 2.不要在for结构里调OrdersTotal,在外面调,存在变量里,这样至少不会被OrderSend影响。但是不能保证完全遍历Orders。 3.不要在for循环里调OrderSend,只置个标志变量,然后break,这样应该能保证退出循环,再根据标志变量决定要不要OrderSend。 任何一种应该都可以,1最简单,2有漏洞,3逻辑清晰。 Loong 2010.01.28 10:11 #14 时间限制条件定义成输入参数比较方便 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 [删除] 2010.01.28 17:46 #15 我想明白了,为什么中断放在判断句后结果是正确的,即始终只要最后成交的那一单,其它没有必要看。 // 再次感谢Loong的热心帮助。 12 新评论 原因: 取消 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
想起来应该看看是不是多执行了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
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的热心帮助。