EA需要的简单代码(修改两个未结订单) - 页 2 12345 新评论 Tjipke de Vries 2012.03.09 12:56 #11 kwng111: 对不起,在我看来,你的帖子不是madmax3的解决方案。 你不需要在一个名为void CloseAll()的函数中修改交易。 此外,你必须选择OrderSymbol()和OrderMagicNumber()。 而在这部分程序中 } for (int i =1; i < OrdersTotal(); i++) { if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) { OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); } } 待定交易仍然会被修改 [删除] 2012.03.09 13:52 #12 以下是整个EA的修改后的代码。 //+------------------------------------------------------------------+ //| TimeBasedEA.mq4 | //| Copyright © 2008, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ //changed by: "forex4capital@yahoo.ca" //changed again by: madmax3 // Time frame: M5 and higher extern int MagicNumber = 20080122; extern double DistancefromAsk; extern double DistancefromBid; extern double TakeProfit = 28; extern double StopLoss = 55; extern double Lots = 0.1; extern int StartHour = 2300; // Open Trade time extern bool OpenBuy = true; extern bool OpenSell = true; extern int NumBuys = 1; extern int NumSells = 1; extern int Slippage = 2; //+------------------------------------------------------------------+ //| S T A R T | //+------------------------------------------------------------------+ int start() { int cnt, ticket, total; if (TimeDayOfWeek(TimeCurrent())==5 && TimeCurrent()>=StrToTime("22:59")) { CloseAll(); return(0); } int ct; //-------------------------------------+ if(Bars<100) { Print("bars less than 100"); return(0); } //-------------------------------------+ //-------------------------------------+ if(TakeProfit<10) { Print("TakeProfit less than 10"); return(0); // check TakeProfit } //-------------------------------------+ ct = Hour() * 100 + Minute(); total=OrdersTotal(); if(total<1) { // no opened orders identified if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // check for long position (BUY) possibility if(ct == StartHour && Close[1]>Open[1] && OpenBuy) //if(ct == StartHour && High[1]<Open[0] && OpenBuy) { for ( cnt = 0; cnt < NumBuys; cnt++) { ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromAsk*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromBid*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); } return; } // check for short position (SELL) possibility if(ct == StartHour && Close[1]<Open[1] && OpenSell) //if(ct == StartHour && Low[1]>Open[0] && OpenSell) { for ( cnt = 0; cnt < NumSells; cnt++) { ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromAsk*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromBid*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); } return; } } for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if ( OrderSelect(iPos, SELECT_BY_POS) // Only my orders w/ && OrderMagicNumber() == MagicNumber // my magic number && OrderSymbol() == "EURUSD" // and my pair. ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); if (!OrderSelect(iPos, SELECT_BY_POS)) Alert("OrderSelect failed: ", GetLastError());} return(0); } void CloseAll() { for(int cnt=OrdersTotal()-1;cnt>=0;cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if (OrderMagicNumber()!=MagicNumber) continue; // // // // // if (OrderType()==OP_BUY || OrderType()==OP_SELL) { for(int c=0; c<3; c++) { RefreshRates(); if (OrderType()==OP_BUY) { double cp = Bid;} else { cp = Ask;} OrderClose(OrderTicket(),OrderLots(),cp,0,Yellow); int err=GetLastError(); if(err==4 || err==136 || err==137 || err==138 || err==146) { Sleep(5000); continue; } break; } break; } } } // the end. CloseAll()函数的存在是为了在指定的时间关闭交易,如果它们持续了这么久。 这部分代码是我想弄清楚的修订部分。 (你可以看到MagicNumber和Symbol都在那里,但只有挂单 仍在被修改) for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if ( OrderSelect(iPos, SELECT_BY_POS) // Only my orders w/ && OrderMagicNumber() == MagicNumber // my magic number && OrderSymbol() == "EURUSD" // and my pair. ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); if (!OrderSelect(iPos, SELECT_BY_POS)) Alert("OrderSelect failed: ", GetLastError());} William Roeder 2012.03.09 13:54 #13 deVries: } for (int i =1; i < OrdersTotal(); i++) { if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) { OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); } } for(int cnt=OrdersTotal()-1;cnt>=0;cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); int total=OrdersTotal(); if(total>1) 你昨天被告知,选择将无法工作。 并说你必须测试返回代码和约总 如果你不打算费心阅读帖子并纠正你的代码,我们也不会费心尝试帮助你。 [删除] 2012.03.09 14:06 #14 WHRoeder: 昨天有人告诉 你,选择将不工作。 并说你必须测试返回代码和关于总 如果你不打算费心阅读帖子并纠正你的代码,我们也不会费心去尝试帮助你。 我已经做了以上两件事,我想你是指错了人。我是最初的发帖人,而不是deVries,我已经把代码改成了这样(如之前发布的)。 for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if ( OrderSelect(iPos, SELECT_BY_POS) // Only my orders w/ && OrderMagicNumber() == MagicNumber // my magic number && OrderSymbol() == "EURUSD" // and my pair. ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); if (!OrderSelect(iPos, SELECT_BY_POS)) Alert("OrderSelect failed: ", GetLastError());} 现在的问题是,它修改了挂单,而我希望它只修改未平仓的订单,而且只在同一符号的两个未平仓订单同时打开并运行时才修改。我已经尝试了不同的数字组合和OrderSelect数字,但我仍然对此感到困惑。 Simon Gniadkowski 2012.03.09 14:13 #15 madmax3: 我已经做了以上两件事,我想你指的是错误的人。我是最初的发帖人,而不是deVries,我已经把代码改成了这样(如之前发布的)。 现在的问题是,它修改了挂单,而我希望它只修改未平仓的订单,而且只在同一符号的两个未平仓订单同时打开并运行时才修改。我已经尝试了不同的数字组合和OrderSelect数字,但我仍然对此感到困惑。 所以你需要循环浏览你的未平仓订单,像你上面那样检查符号和MagicNumber ... ...但你也需要检查OrderType() <=OP_SELL...计算匹配的订单,如果是2个 ... ...然后再次循环,OrderModify() 。 你要学习的唯一方法是阅读关于每个函数的文档,掌握它们的工作原理 ...... 例如 OrderType() [删除] 2012.03.13 15:10 #16 我已经尝试了各种不同的代码,但仍然无法准确地工作。当有两笔交易时,它修改了其中一笔交易,而且一直在修改,我只需要修改一次,我需要修改两笔交易。 for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--) if ( OrderSelect(iPos, SELECT_BY_POS) // Only my orders w/ && OrderMagicNumber() == MagicNumber // my magic number && OrderSymbol() == "EURUSD" // and my pair. && (OrderType() <= OP_SELL) ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); if (OrderSelect(iPos, SELECT_BY_POS)) if (OrderType() <= OP_BUY) if (!OrderSelect(iPos, SELECT_BY_POS)) {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);} if (!OrderSelect(iPos, SELECT_BY_POS)) Alert("OrderSelect failed: ", GetLastError());} return(0); } for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--) if ( OrderSelect(iPos, SELECT_BY_POS) // Only my orders w/ && OrderMagicNumber() == MagicNumber // my magic number && OrderSymbol() == "EURUSD" // and my pair. && (OrderType() <= OP_SELL) && (OrderType() <=OP_BUY) ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);} if (OrderSelect(iPos-1, SELECT_BY_POS)) {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue); return(0); }} 有什么建议,我应该怎么做?我已经阅读了相关的文件。 Simon Gniadkowski 2012.03.13 16:19 #17 订单修改前和修改后的区别是什么? 什么变化? [删除] 2012.03.13 16:43 #18 首先设置了两个订单,然后其中一个(在这种情况下,当我测试具体日期时是卖出)被执行。在当天晚些时候,第二个订单(仍然存在)被执行,这个交易是买入。 卖出是订单1,买入是订单2。买入(订单2)的TakeProfit被修改了16.3点(我不知道为什么它没有增加20点),然后TakeProfit在同一分钟内增加了0.2点,这种情况一直在发生,TakeProfit在一天中不断被修改,有时增加,有时减少,不知道为什么会发生。 编辑:我认为16.3点和进一步的变化也是受点差的影响? Simon Gniadkowski 2012.03.13 17:04 #19 好吧,我们能不能回到开头......。 我知道你试图修改两个订单......但你到底想做什么?"尾随SL"?"其他"?"你想实现什么? William Roeder 2012.03.13 17:11 #20 madmax3 2012.03.09 15:06 WHRoeder。 昨天有人告诉你,选择将不工作。 并说你必须测试返回代码和约总 如果你不打算费心阅读帖子并纠正你的代码,我们也不会费心去尝试帮助你。 我已经做了以上两件事,你应该是指错人了吧? 我指的是你之前的 直接帖子 madmax3 2012.03.09 14:52 这里是整个EA的修订代码。 total=OrdersTotal(); if(total<1) 它仍然显示了我所说的 问题。 12345 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
对不起,在我看来,你的帖子不是madmax3的解决方案。
你不需要在一个名为void CloseAll()的函数中修改交易。
此外,你必须选择OrderSymbol()和OrderMagicNumber()。
而在这部分程序中
待定交易仍然会被修改
以下是整个EA的修改后的代码。
CloseAll()函数的存在是为了在指定的时间关闭交易,如果它们持续了这么久。
这部分代码是我想弄清楚的修订部分。
(你可以看到MagicNumber和Symbol都在那里,但只有挂单 仍在被修改)
你昨天被告知,选择将无法工作。 并说你必须测试返回代码和约总
如果你不打算费心阅读帖子并纠正你的代码,我们也不会费心尝试帮助你。
昨天有人告诉 你,选择将不工作。 并说你必须测试返回代码和关于总
如果你不打算费心阅读帖子并纠正你的代码,我们也不会费心去尝试帮助你。
我已经做了以上两件事,我想你是指错了人。我是最初的发帖人,而不是deVries,我已经把代码改成了这样(如之前发布的)。
现在的问题是,它修改了挂单,而我希望它只修改未平仓的订单,而且只在同一符号的两个未平仓订单同时打开并运行时才修改。我已经尝试了不同的数字组合和OrderSelect数字,但我仍然对此感到困惑。
我已经做了以上两件事,我想你指的是错误的人。我是最初的发帖人,而不是deVries,我已经把代码改成了这样(如之前发布的)。
现在的问题是,它修改了挂单,而我希望它只修改未平仓的订单,而且只在同一符号的两个未平仓订单同时打开并运行时才修改。我已经尝试了不同的数字组合和OrderSelect数字,但我仍然对此感到困惑。
所以你需要循环浏览你的未平仓订单,像你上面那样检查符号和MagicNumber ... ...但你也需要检查OrderType() <=OP_SELL...计算匹配的订单,如果是2个 ... ...然后再次循环,OrderModify() 。
你要学习的唯一方法是阅读关于每个函数的文档,掌握它们的工作原理 ...... 例如 OrderType()
我已经尝试了各种不同的代码,但仍然无法准确地工作。当有两笔交易时,它修改了其中一笔交易,而且一直在修改,我只需要修改一次,我需要修改两笔交易。
有什么建议,我应该怎么做?我已经阅读了相关的文件。
首先设置了两个订单,然后其中一个(在这种情况下,当我测试具体日期时是卖出)被执行。在当天晚些时候,第二个订单(仍然存在)被执行,这个交易是买入。
卖出是订单1,买入是订单2。买入(订单2)的TakeProfit被修改了16.3点(我不知道为什么它没有增加20点),然后TakeProfit在同一分钟内增加了0.2点,这种情况一直在发生,TakeProfit在一天中不断被修改,有时增加,有时减少,不知道为什么会发生。
编辑:我认为16.3点和进一步的变化也是受点差的影响?
昨天有人告诉你,选择将不工作。 并说你必须测试返回代码和约总
如果你不打算费心阅读帖子并纠正你的代码,我们也不会费心去尝试帮助你。
我已经做了以上两件事,你应该是指错人了吧?
我指的是你之前的 直接帖子
这里是整个EA的修订代码。