[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 563 1...556557558559560561562563564565566567568569570...631 新评论 [删除] 2012.12.02 10:09 #5621 delf: 上一个订单必须在任何方向关闭,下一个订单必须在另一个方向打开(分别满足条件时)。 更严格的选择#define OrderBuy 0 #define OrderSell 1 int NewOrder; int RezultatSend; int start() { ... ... if(OrdersTotal()==0) { if(NewOrder==OrderBuy) { if(/*Условие для Buy*/) { RezultatSend=OrderSend(/*...buy*/); //Ставим Buy if(RezultatSend!=-1)NewOrder=OrderSell; //Если ставка прошла } } else { if(/*Условие для Sell*/) { RezultatSend=OrderSend(/*...*/); //Ставим Sell if(RezultatSend!=-1)NewOrder=OrderBuy; //Если ставка прошла } } } ... ... } [删除] 2012.12.02 10:22 #5622 abeiks:一段时间以来, ,我一直试图 ,重新设计 买入 平仓 区块 ,只关闭最后两个 买入头寸,但是失败了。 你能告诉 ,如何重做 区块 ? 做一个函数(块)来关闭最后一个位置是比较容易和方便的。并运行两次。在一个循环中,或只是在一个行中。 TarasBY 2012.12.02 11:22 #5623 abeiks: 一段时间以来, ,我一直试图 ,重新设计 买入 平仓 区块 ,只关闭最后两个 买入头寸,但是失败了。 你能告诉 ,如何重做 区块 ? 前段时间,我给了 你一个找到最后位置的解决算法。然后如何处理它们是很重要的:计算、删除、修改STOPs。如果你不能至少以 "形象和相似性 "来写代码,它就不是你的(编程)... Nauris Zukas 2012.12.02 11:25 #5624 rigonich: 谢谢你! Nauris Zukas 2012.12.02 11:29 #5625 peshihod: 做一个函数(块)来关闭最后一个位置,这更容易,也更方便。并运行两次。在一个循环中,或只是在一个行中。谢谢你,这是个好办法,我也要试试。 [Deleted] 2012.12.02 11:41 #5626 delf: 我一定是措辞不当 :( 有一个开单的算法。 我需要,在关闭最后一个订单的任何变体中,下面的订单在其他方向打开(当条件相应出现时)。 所有的工作,但如果我已经通过止损关闭,例如卖出,并有条件在这个方向上打开一个卖出,开口继续。我们需要的是等待条件购买。 也就是说,我们需要检查最后一个关闭的订单,所以它不会与开盘的订单重合(买-卖-买-卖的交替)。只有一个订单或等待信号在运行。 我知道我们也许应该使用OrdersHistoryTotal(),但在一个工作的EA中,它看起来如何? 谢谢你。 这可能是某个地方的情况。但如果历史上有大量的订单,最好是使用自己的订单簿。https://www.mql5.com/ru/articles/1404https://www.mql5.com/ru/articles/1390//+------------------------------------------------------------------+ //| 0000.mq4 | //+------------------------------------------------------------------+ #property copyright "" #property link "" void CloseOrder(string signal) { int i,Ticket=-1,error; double Price; datetime time=0; for (i=0;i<OrdersHistoryTotal();i++) { if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)); { error=GetLastError();Print("Ошибка OrderSelect() = ", error); } if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic ||OrderClosePrice()==OrderStopLoss()) { if(OrderCloseTime()>time) { time=OrderCloseTime();Ticket=OrderTicket(); } } } if(!OrderSelect(Ticket,SELECT_BY_TICKET,MODE_HISTORY)) { error=GetLastError();Print("Ошибка OrderSelect() = ",error); } if(OrderType()==OP_BUY&&signal=="CloseBUY"||OrderType()==OP_SELL&&signal=="CloseSELL")return; if(signal=="CloseBUY")Price=NormalizeDouble(Bid,Digits); if(signal=="CloseSELL")Price=NormalizeDouble(Ask,Digits); for (i=0;i<OrdersTotal();i++) { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)); { error=GetLastError();Print("Ошибка OrderSelect() = ",error); } if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic) { if(OrderType()==OP_BUY&&signal=="CloseBUY"||OrderType()==OP_SELL||signal=="CloseSELL") { Ticket=OrderClose(OrderTicket(),OrderLots(),Price,0,CLR_NONE); } } if(Ticket<0) { error=GetLastError();Print("Ошибка = ",error); } } return; } Delf 2012.12.02 12:17 #5627 peshihod: 一个更严格的选择 非常感谢每个人的回应,结果已经实现,正是我所需要的。 TarasBY 2012.12.02 12:20 #5628 delf:我一定是措辞不当 :(有一个开单的算法。我需要,在关闭最后一个订单的任何变体中,下面的订单在其他方向打开(当条件相应出现时)。所有的工作,但如果我已经通过止损关闭,例如卖出,并有条件在这个方向上打开一个卖出,开口继续。我们需要的是等待条件购买。也就是说,我们需要检查最后一个关闭的订单,所以它不会与开盘的订单重合(买-卖-买-卖的交替)。只有一个订单或等待信号在运行。我知道我们也许应该使用OrdersHistoryTotal(),但在一个工作的EA中,它看起来如何?谢谢你。如果你想学习编程,你可以翻阅别人的代码(这就是CodaBase的作用),或者从解决问题的算法着手。要求别人为你写代码是最无望的学习方式。更多的时候,你会得到一个糟糕的编码解决方案,就像(比喻)你的邻居每时每刻都在门口叫你,问 "你叫什么名字"--这是关于不必要的(多余的)计算。解决你的问题的算法可能如下。首先,你需要确保你没有 "你的 "订单。这个问题,如果不是对测试者来说(我们可以将解决方案限制在条件if (OrdersTotal() == 0),通过使用匹配OrderMagicNumber()和Symbol()的过滤器对订单进行搜索就可以解决。然后你检查条件(根据你的策略)来打开订单。如果有信号,那么使用OrdersHistoryTotal()的搜索(通常是列表中的最后一个),计算出最后一个关闭订单的OrderType()。如果打开订单的信号和最后关闭订单的类型不一致,则根据信号打开订单。这种方法涉及的计算量最小,大大减少了测试器中专家顾问优化 的时间。 Nauris Zukas 2012.12.02 12:48 #5629 TarasBY: 前段时间,我给了 你解决最后位置搜索的算法。然后如何处理它们并不重要:计数、删除、修改STOP。如果你不能至少以 "形象和相似性 "来写代码,它就不是你的(编程)... 是的,我同意,编程不是我的专长,所以我在这里学习和提问。 我试图在你的 算法中加入平仓,但是失败了(所有的买入头寸都在平仓),所以我决定从另一个角度 来解决这个问题,看看在一个现成的平仓块上平仓最后两个买入头寸的方案,这个方案是 提供给我的,也是提供给我的。 如果你能告诉我如何关闭最后两个买入头寸,我将非常感激。我 将明白我在哪里犯了错误。double profits_buy_2pos() { int ordercount = 0, OpenOrders = OrdersTotal(); double pr_buy = 0; for (int cnt = OpenOrders - 1; cnt >= 0; cnt--) // scan all orders and positions. .. { if (!OrderSelect (cnt, SELECT_BY_POS)) return (0.0); if (OrderSymbol() != Symbol()) continue; if (OrderMagicNumber() != magic) continue; if (OrderType() != OP_BUY) continue; pr_buy += OrderProfit(); ordercount++; if (ordercount == 2) break; } Print ("::::::::::::::::::::::::: pr_buy2 = ", pr_buy); Print ("::::::::::::::::::::::::: ordercount = ", ordercount); return (pr_buy); } Delf 2012.12.02 13:17 #5630 TarasBY: 如果你想学习如何编程,要么解析其他人的代码(这就是CodaBase的作用),要么遵循手头任务的算法。要求别人为你写代码是最无望的学习方式。大多数情况下,你会得到不是你的任务的最佳代码,就像(比喻)当你的邻居每分钟按响你的门铃并问 "你叫什么名字"--这是关于不必要的(多余的)计算。 我完全同意你的观点。你是100%正确的。这是正确的方法,我一直在努力遵循它。然而,在没有课本的情况下学习MQL4,无缘无故地读书,结果一无所获。反正我不得不分析别人的代码,因为在大多数情况下,我无法将自己的疯狂想法放入程序中。我已经开始在....excel中建立策略(它离我更近,更容易理解)。至于战略的基本要素,它已经非常成功和明确(当然是在历史上)。但我应该进一步考虑到交易的特殊性:浮动点差、互换、经纪公司的特殊性,很难将所有这些纳入exel公式。因此,我决定分析excel和MQL中的利润差异。坦率地说,差异太大,对我不利。我还不知道,我将分析每个位置,也许专家顾问犯了一个错误,但这取决于我。 总之,这个论坛上的好心人帮助我解决了一个具体的问题,真是一个伟大的人,谢谢你们。 1...556557558559560561562563564565566567568569570...631 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
delf:
上一个订单必须在任何方向关闭,下一个订单必须在另一个方向打开(分别满足条件时)。
更严格的选择
abeiks:
一段时间以来, ,我一直试图 ,重新设计 买入 平仓 区块 ,只关闭最后两个 买入头寸,但是失败了。 你能告诉 ,如何重做 区块 ?
一段时间以来, ,我一直试图 ,重新设计 买入 平仓 区块 ,只关闭最后两个 买入头寸,但是失败了。 你能告诉 ,如何重做 区块 ?
谢谢你!
做一个函数(块)来关闭最后一个位置,这更容易,也更方便。并运行两次。在一个循环中,或只是在一个行中。
谢谢你,这是个好办法,我也要试试。
我一定是措辞不当 :(
有一个开单的算法。
我需要,在关闭最后一个订单的任何变体中,下面的订单在其他方向打开(当条件相应出现时)。
所有的工作,但如果我已经通过止损关闭,例如卖出,并有条件在这个方向上打开一个卖出,开口继续。我们需要的是等待条件购买。
也就是说,我们需要检查最后一个关闭的订单,所以它不会与开盘的订单重合(买-卖-买-卖的交替)。只有一个订单或等待信号在运行。
我知道我们也许应该使用OrdersHistoryTotal(),但在一个工作的EA中,它看起来如何?
谢谢你。
这可能是某个地方的情况。但如果历史上有大量的订单,最好是使用自己的订单簿。https://www.mql5.com/ru/articles/1404https://www.mql5.com/ru/articles/1390
一个更严格的选择
我一定是措辞不当 :(
有一个开单的算法。
我需要,在关闭最后一个订单的任何变体中,下面的订单在其他方向打开(当条件相应出现时)。
所有的工作,但如果我已经通过止损关闭,例如卖出,并有条件在这个方向上打开一个卖出,开口继续。我们需要的是等待条件购买。
也就是说,我们需要检查最后一个关闭的订单,所以它不会与开盘的订单重合(买-卖-买-卖的交替)。只有一个订单或等待信号在运行。
我知道我们也许应该使用OrdersHistoryTotal(),但在一个工作的EA中,它看起来如何?
谢谢你。
如果你想学习编程,你可以翻阅别人的代码(这就是CodaBase的作用),或者从解决问题的算法着手。要求别人为你写代码是最无望的学习方式。更多的时候,你会得到一个糟糕的编码解决方案,就像(比喻)你的邻居每时每刻都在门口叫你,问 "你叫什么名字"--这是关于不必要的(多余的)计算。
解决你的问题的算法可能如下。首先,你需要确保你没有 "你的 "订单。这个问题,如果不是对测试者来说(我们可以将解决方案限制在条件if (OrdersTotal() == 0),通过使用匹配OrderMagicNumber()和Symbol()的过滤器对订单进行搜索就可以解决。然后你检查条件(根据你的策略)来打开订单。如果有信号,那么使用OrdersHistoryTotal()的搜索(通常是列表中的最后一个),计算出最后一个关闭订单的OrderType()。如果打开订单的信号和最后关闭订单的类型不一致,则根据信号打开订单。
这种方法涉及的计算量最小,大大减少了测试器中专家顾问优化 的时间。
前段时间,我给了 你解决最后位置搜索的算法。然后如何处理它们并不重要:计数、删除、修改STOP。如果你不能至少以 "形象和相似性 "来写代码,它就不是你的(编程)...
是的,我同意,编程不是我的专长,所以我在这里学习和提问。 我试图在你的 算法中加入平仓,但是失败了(所有的买入头寸都在平仓),所以我决定从另一个角度 来解决这个问题,看看在一个现成的平仓块上平仓最后两个买入头寸的方案,这个方案是 提供给我的,也是提供给我的。
如果你能告诉我如何关闭最后两个买入头寸,我将非常感激。我 将明白我在哪里犯了错误。
如果你想学习如何编程,要么解析其他人的代码(这就是CodaBase的作用),要么遵循手头任务的算法。要求别人为你写代码是最无望的学习方式。大多数情况下,你会得到不是你的任务的最佳代码,就像(比喻)当你的邻居每分钟按响你的门铃并问 "你叫什么名字"--这是关于不必要的(多余的)计算。
我完全同意你的观点。你是100%正确的。这是正确的方法,我一直在努力遵循它。然而,在没有课本的情况下学习MQL4,无缘无故地读书,结果一无所获。反正我不得不分析别人的代码,因为在大多数情况下,我无法将自己的疯狂想法放入程序中。我已经开始在....excel中建立策略(它离我更近,更容易理解)。至于战略的基本要素,它已经非常成功和明确(当然是在历史上)。但我应该进一步考虑到交易的特殊性:浮动点差、互换、经纪公司的特殊性,很难将所有这些纳入exel公式。因此,我决定分析excel和MQL中的利润差异。坦率地说,差异太大,对我不利。我还不知道,我将分析每个位置,也许专家顾问犯了一个错误,但这取决于我。
总之,这个论坛上的好心人帮助我解决了一个具体的问题,真是一个伟大的人,谢谢你们。