for(int Closed = OrdersTotal()-1;Closed >= 0; Closed--) // OrdersTotal is the total of open ordersif(OrderSelect(Closed,SELECT_BY_POS,MODE_HISTORY) // this is looping through the closed orders
EURUSD,M1: open #1 buy 0.01 EURUSD at 1.43310 ok EURUSD,M1:初始买入订单#1 EURUSD,M1: 修改#1买入0.01 EURUSD at 1.43310 sl: 1.42810 tp: 1.43510 ok EURUSD,M1: 打开#2卖出0.01 EURUSD在1.43200 OK EURUSD,M1:下达2号相反的卖出指令 EURUSD,M1: 修改#2卖出0.01 EURUSD at 1.43200 sl: 1.43700 tp: 1.43000 ok EURUSD,M1: 打开#3买入0.01 EURUSD在1.43300 OK EURUSD,M1:下达3号相反的买入指令 EURUSD,M1: 修改#3买入0.01 EURUSD at 1.43300 sl: 1.42800 tp: 1.43500 ok
OTLastTick=OTCurrentTick; //shift OrderTotal
OTCurrentTick=OrdersTotal(); //reinit OrderTotalif(OTCurrentTick>0)Trail(); //Trailif(OTLastTick>=2//if OrderTotal has changed
&&OTCurrentTick<OTLastTick
&&OTCurrentTick>0){CloseAllOnSL();return;} //Check order closed on SL levelif(OTCurrentTick>=MaxOrders)return; //Dont open more orders. Trail and return.//Actually we have nothing more to do.//Only call opposite if the initial order of the serie is openif(OTCurrentTick>0)OpenOppositeOrder(); //<--------------------- include this line to call function (not sure if this the right method to do it...)
MM(); //<--------------------- include this line to call function (not sure if this the right method to do it...)if(OTCurrentTick==0){//init serie
BuyAllowed=true;
SellAllowed=true;
你好,Raptor。
在Tester中,当TrailingStop关闭时,所有订单都会关闭,但在Demo中,只有通过TrailingStop关闭的订单才会关闭,任何未平仓的订单仍旧开放。
在你建议的代码之上使用以下代码,其逻辑是。
"找到最后一个订单的条件,如果是平仓,那么执行代码开始关闭所有剩余的未平仓订单。"
有什么线索表明为什么会发生这种情况?
致以最崇高的敬意
路易斯
你好,Raptor。
在Tester中,当TrailingStop关闭时,所有的订单都被关闭,但在Demo中,只有通过TrailingStop关闭的订单才会关闭,任何未平仓的订单仍旧开放。
在你建议的代码之上使用以下代码,其逻辑是。
"找到最后一个订单的条件,如果是平仓,那么执行代码开始关闭所有剩余的未平仓订单。"
有什么线索表明为什么会发生这种情况?
你不能这样做....
也许你想用OrderssHistoryTotal(), 但 已关闭订单 的OrderCloseTime()永远不会==0。
.....
我在代码中使用BuyTicket和SellTicket来避免开多个订单,但似乎这不是正确的方法。
.....
当有条件开启第三个 订单时,问题就来了,等等。在这里,尽管有开仓的条件,而且代码对第二笔开仓处理得很好,但为什么代码在这里不起作用?
我知道你稍微改变了最初的主题,也许第一个问题已经讨论到了尽头(对我来说,这很好)。
如果你还想跟进最初的问题,你必须解释一下,因为我不太明白你在寻找什么。
我所调整的第一个片段可以防止代码打开多个订单。你似乎对它不满意,因此你删除了(或只是没有添加)它,但通过使用BuyTicket和SellTicket做类似的事情。
那么你说的是第三个订单......你要找的是这样的东西吗?
买->卖->买->卖->买
但要防止
买入->买入->卖出->买入->买入
换句话说,如果上一个开仓的订单是买入订单,那么下一个就必须是卖出,反之亦然?
或者你的EA应该开的最大订单量是多少?是不是2个,一个卖出,如果满足相反订单的条件,一个买入,但如果再次从买入触发点反弹,就不再是卖出?
如果这是真的,我在你最初的代码中加入的OpenOpposite计数器的问题是什么?
编辑。
我可以想象的第三个选项是,如果第一个相反的订单被止损了,你想再开一个相反的订单?
所以像这样。
买入->卖出->如果卖出已被阻止->卖出->如果卖出已被阻止->卖出
我知道你稍微改变了最初的主题,也许第一个问题已经讨论完了(这对我来说很好)。
如果你还想跟进最初的问题,你必须解释一下,因为我不太明白你在寻找什么。
我所调整的第一个片段可以防止代码打开多个订单。你似乎对它不满意,因此你删除了(或只是没有添加)它,但通过使用BuyTicket和SellTicket做类似的事情。
那么你说的是第三个订单......你要找的是这样的东西吗?
买->卖->买->卖->买
但要防止
买入->买入->卖出->买入->买入
换句话说,如果上一个开仓的订单是买入订单,那么下一个就必须是卖出,反之亦然?
或者你的EA应该开的最大订单量是多少?是不是2个,一个卖出,如果满足相反订单的条件,一个买入,但如果再次从买入触发点反弹,就不再是卖出?
如果这是真的,我在你最初的代码中加入的OpenOpposite计数器的问题是什么?
编辑。
我可以想象的第三个选项是,如果第一个相反的订单被止损了,你想再开一个相反的订单?
所以像这样。
买入->卖出->如果卖出已被止损->卖出->如果卖出已被止损->卖出
嗨,Kronin。
感谢你在这个问题上抽出时间来支持我。
该策略遵守这一逻辑。
假设第一笔订单是买入,然后通过追踪止损(TrailingStop)平仓,但是如果买入价(Bid)在订单开盘价(ReturnDistance)下反弹了一些点,卖出将打开,并通过追踪止损(TrailingStop)平仓,同样如果买入价(Ask)在订单开盘价之上反弹了一些点,则买入将打开。当最后一个订单通过追踪止损平仓或达到最大订单设置(7个)时,这个乒乓过程将结束。
多次开仓的问题发生在价格上升和下降跨越OrderOpenPrice的时候。因此,如果我们有一个买入,下一个订单可能是一个卖出,等等。
关于您之前的帮助,也许我没有很好地解释我的问题。任何提供的帮助对我来说都是最有价值的。
致以最美好的祝愿
路易斯
路易斯,我在你的代码上花了不少时间,但说实话,我并不确定我是否能达到你的要求。
请看附件。最终确定/修改它,测试它,了解它....,并告诉我至少它的工作原理接近、类似或完全是你所寻找的。我对这个策略还不是很确定。
请先不要添加新的功能(不要重新添加martingale)。代码已经够大了,你还有很多工作要做,要让它可靠地运行。
我不得不说,这段代码没有更清晰的安排。我不想改变你的运行部分(甚至你需要一个更好的错误处理)。我评论了一些部分,移动了一些部分,但它们都还在那里......
祝你愉快...
路易斯,我在你的代码上花了很多时间,但说实话,我不太确定我是否能做到你想要的。
请看附件。最后确定/修改它,测试它,理解它....,并告诉我至少它的工作原理与你所寻找的接近,类似或完全不同。我对这个策略还不是很确定。
请先不要添加新的功能(不要重新添加martingale)。代码已经够大了,你还有很多工作要做,要让它可靠地运行。
我不得不说,这段代码没有更清晰的安排。我不想改变你的运行部分(甚至你需要一个更好的错误处理)。我评论了一些部分,移动了一些部分,但它们都还在那里......
祝你愉快...
嗨,克罗尼。
在所有这些之前,我最感谢你花时间来支持我的问题。
虽然我相信你已经尽了最大的努力去理解这个策略,但有些事情还没有完全反应过来(当然是由于我对这个问题缺乏了解)。
我已经做了一些修改,购买了你的建议,但不确定是否做得正确。
有两个问题。
1 - 我们的想法是,一旦交易被追踪止损关闭,所有剩余的未平仓订单都应该关闭。这些订单不应该在止盈时关闭(止盈之所以存在是因为我想确定它是在冻结区)。所以我想用最后一个订单的收盘价来运行CloseAll函数(在尝试这样做时出现了一些愚蠢的事情...)。你使用最后关闭的票据来运行未平仓订单的关闭,但我不明白当交易通过追踪止损关闭时是否会发生这种情况......
2 - "乒乓 "不工作,至少在测试器中是这样。
在附件中是我所理解的进行了修改的文件。
谢谢你的耐心和时间。(更多信息在私人信息 中)
致以最崇高的敬意
路易斯
好的,我已经改变了算法,在SL而不是TP上关闭所有订单。(变化是将"<"替换为">"--你应该找到这个地方)。
乒乓对我来说确实有效,我只让它在测试器中以视觉模式运行。但我已经调整了你的输入参数,使其不是所有的订单都在几乎相同的时间打开。也许你必须验证默认参数。
它从最初的订单开始(我已经改变了print()语句),然后做相反的订单。
EURUSD,M1: open #1 buy 0.01 EURUSD at 1.43310 ok
EURUSD,M1:初始买入订单#1
EURUSD,M1: 修改#1买入0.01 EURUSD at 1.43310 sl: 1.42810 tp: 1.43510 ok
EURUSD,M1: 打开#2卖出0.01 EURUSD在1.43200 OK
EURUSD,M1:下达2号相反的卖出指令
EURUSD,M1: 修改#2卖出0.01 EURUSD at 1.43200 sl: 1.43700 tp: 1.43000 ok
EURUSD,M1: 打开#3买入0.01 EURUSD在1.43300 OK
EURUSD,M1:下达3号相反的买入指令
EURUSD,M1: 修改#3买入0.01 EURUSD at 1.43300 sl: 1.42800 tp: 1.43500 ok
我在OpenOppositeOrder()中加入了返回,当我打开一个订单时。通过设置,我可以开出一个买单,并在同一时间开出一个卖单。这导致了MaxOrder的不可靠。
也许更好的方法是,把它分成两个函数,或者给这个函数一个参数,只对卖单或买单运行。
btw. 你上传的代码没有交易!所有的交易都因为 "无效的LotSize "而失败....。
嗨,克罗尼。
谢谢你花时间来支持我。
关于 "你上传的代码没有交易!所有交易都失败了,因为'无效的手数'....",这是将MM代码移到文件末尾后发生的。我在代码的开头使用了MM();函数 的调用,似乎这种操作不起作用,但你发送的最后一段代码是有效的,MM()函数仍然在同一位置,并且是有效的,所以我在这里失去了....。
关于在同一个点上开仓的问题。
当EA进入图表时,它必须比当时的价格更多(或更少),这意味着当价格上升(或下降)时,OpenDistance买入(或卖出)订单会发生。从这里开始,当价格从OrderOpenPrice减去ReturnDistance后反弹下来时(如果最后一个订单是买入),下一个开盘就可以发生了,如果最后一个订单是卖出,也是同样的逻辑。也许必须有一个限制,以避免任何超出这个逻辑的开仓订单。
致以最崇高的敬意
路易斯
你在全局范围内定义了LotSize并将其初始化为0。在void MM()函数 中,你计算了一个只在该函数中有效的LotSize。我只删除了初始化,所以全局范围内的变量被更新了。
你能不能对每一个数值进行评论,以点为单位?
你想运行EA的符号的点差是多少?
但我已经调整了你的输入参数,使其不是所有的订单都在几乎相同的时间打开。也许你必须验证默认参数。
试着做同样的事情,让它在测试器中以视觉模式运行。
你在全局范围内定义了LotSize并将其初始化为0。在void MM()函数中,你计算了一个只在该函数中有效的LotSize。我只删除了初始化,所以全局范围内的变量被更新了。
你能不能对每一个数值进行评论,以点为单位?
你想运行EA的符号的点差是多少?
但我已经调整了你的输入参数,使其不是所有的订单都在几乎相同的时间打开。也许你必须验证默认参数。
试着做同样的事情,让它在测试器中以视觉模式运行。
嗨,克罗尼。
是的,我有很多东西要学....,现在明白了,当需要从一个函数的外部访问一个值时,必须是在全局。
外部的值要乘以10,因为EA也必须在5位数的经纪商上运行。我正在使用这个代码块来自动获取,但从WHRoeder得到的建议与金属不兼容。
金属对的价差可能是可变的。这就是为什么我使用代码来从止损位 出来。
关于这个问题,"但我已经调整了你的输入参数,使所有的订单不是在几乎相同的时间打开。也许你必须验证默认参数。"
在我看来(如果不是的话,对不起......),OpenDistance保持为2点,ReturnDistance现在也是2点。我现在看到的是,订单打开了,但不是在2点的差距。这是在一个ECN经纪商(IC Markets)的平台上运行的一个测试器。这是否有一些重要性?
事实上,订单不是在同一时间打开的,但似乎没有考虑到开放距离和回报距离,以获得正确的距离来打开订单。
你在代码中写道。
我加入了黑体字的一行,以调用函数OpenOppositeOrder,这里不确定这是否正确。另外,我不知道现在的点数与2点前的最后一个点数(OpenDistance)的比较在哪里。
如果我开始用我的问题来烦扰你,请原谅。
致以最崇高的敬意
路易斯