这里的代码是启动一半手数的平仓,并停止在同一价格上连续平仓一半的交易--(它不是 "in start() "中唯一的东西,只是让它更容易看到)。
int start()
{
if(OpenOrdersThisPair(Symbol())>0) //If there is a trade open = do below, which ever is applicable.
{
if(OrderType()==OP_BUY && OrderOpenPrice() > OrderStopLoss())
{
CloseHalfOrder(); // Closes half at 1:1 - then calls another void to break even on the trade +3.
}
if(OrderType()==OP_SELL && OrderOpenPrice() < OrderStopLoss())
{
CloseHalfOrder1(); // Closes half at 1:1 - then calls another void to break even on the trade +3.
}
}
}
正如我在上面粘贴的,如果我把订单减半,与OrderTicket()无关,任何打开的 "OP_BUY "将被反复调用?
我需要一种方法来编写代码,以便在 "in start() "和上面的代码中,它不会在已经关闭一半的订单后,每次都调用 "OP_BUY"?
对不起,但我不明白这对我有什么帮助。在for循环中发生了什么以及调用了什么无效并不重要。问题是我在 "int start() "中首先调用什么?正如我在上面粘贴的,如果我把订单减半,与OrderTicket()无关,任何打开的 "OP_BUY "将被反复调用?我需要一种方法来编写代码,以便在 "in start() "和上面的代码中,它不会在已经关闭一半的订单后,每次都调用 "OP_BUY"?
被调用的void只是一个在start()中被调用的函数. . .这和代码直接在start()中调用是一样的。
伪装代码。
寻找OP_BUYs
如果找到 - TP是在BE吗?
如果TP不在BE,并且Bid>=第一个目标,则将TP移至BE并关闭一半的订单
如果TP在BE,什么都不做
是的!!!谢谢你RaptorUK!
对不起,我并不像我所说的那样愚蠢,你知道的;)- 只是在我刚开始接触一些东西时,有时需要稍微重申一下...。
我意识到每个人在几页前就已经告诉我了--我为没有接受或理解它而感到抱歉!
好了!我们终于成功地完成了一半的工作。我们终于成功地关闭了一半,移动到收支平衡,并停止了以同样的价格连续关闭一半的情况 :D!因此,它几乎是点到为止的完美!!
我现在要做的,基本上是把这个复制和粘贴到我的其他出口,并改变一些规则,然后就可以了!鲍勃的叔叔=它的排序:)
我将把它全部贴在这里,使它公平地供其他人使用,如果他们愿意的话--毕竟,别人的大量耐心使我不仅能编码,而且还能理解它 :)
哦,如果价格没有达到1:1的第一个目标,但止损大于进场....,你有什么建议?那么我如何围绕这个问题创建一个规则呢....?
你什么时候修改为盈亏平衡?
如果没有达到目标,交易将在OrderStopLoss()关闭。
你什么时候修改到收支平衡?
如果没有达到目标,交易将在OrderStopLoss()关闭。
我使用OrderClose()关闭一半,如果返回true,那么我就调用breakeven void,将止损移至收支平衡?这样一来,剩下的未平仓的手数就不会继续被平仓,因为如果头寸已经被移到了收支平衡,那么我就会写上,在达到固定的获利价格1:2之前,不会再平仓。
然而,有些交易在达到第一个目标之前就已经达到了进场价或超过了盈亏平衡点,不会触发半价平仓......
另外,有些交易中,半价出场,然后移动到收支平衡的做法是完美的,....,有些交易它应该是有效的,但它没有做任何事情?这可能是由于数据不足和策略测试器 的缺陷,还是我的代码存在不一致的地方?
哦,我仍然收到OrderModify 1--真他妈让人生气......
在你关闭订单后,你如何识别订单,然后修改SL以实现收支平衡?你知道你不能使用原来的票据号码吧?当您关闭一个订单时,原来的票据号码被关闭。剩余的部分会被赋予一个新的票据号码。识别它的一个方法是在你关闭前获得OrderOpenTime()。在您关闭订单后,剩下的部分将得到一个新的票据号码,但OrderOpenTime()将与之前一样。
你也可以使用OrderOpenTime()来识别它,防止它被反复关闭。
或者,你可以在部分关闭之前修改它。你的订单的剩余部分将保留修改后的SL或TP。
下面是一个测试。在0.09打开,部分关闭0.07,留下0.02
注意票号的变化,但开仓时间 保持不变。
23:42:48 2013.08.01 11:28 SDCMegaTrend EURUSD,M1: open #14 buy 0.09 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 ok
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: close #14 buy 0.07 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 at price 1.3253
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1:警报:Ticket 14 OrderOpenTime before part close:1375356521
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1:警报:票据15 OrderOpenTime: 1375356521
23:42:48 2013.08.01 12:45 SDCMegaTrend EURUSD,M1: close #15 buy 0.02 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 at price 1.3242
在你关闭订单后,你如何识别订单,然后修改SL以实现收支平衡?你知道你不能使用原来的票据号码吧?当您关闭一个订单时,原来的票据号码被关闭。剩余的部分会被赋予一个新的票据号码。识别它的一个方法是在你关闭前获得OrderOpenTime()。在您关闭订单后,剩下的部分将得到一个新的票据号码,但OrderOpenTime()将与之前一样。
你也可以使用OrderOpenTime()来识别它,防止它被反复关闭。
或者,你可以在部分关闭之前修改它。你的订单的剩余部分将保留修改后的SL或TP。
下面是一个测试。在0.09打开,部分关闭0.07,留下0.02
注意票号的变化,但开仓时间保持不变。
23:42:48 2013.08.01 11:28 SDCMegaTrend EURUSD,M1: open #14 buy 0.09 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 ok
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: close #14 buy 0.07 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 at price 1.3253
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1:警报:14号票OrderOpenTime前部分关闭。1375356521
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1:警报:票据15 OrderOpenTime: 1375356521
23:42:48 2013.08.01 12:45 SDCMegaTrend EURUSD,M1: close #15 buy 0.02 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 at price 1.3242
啊 - 太棒了,谢谢你。我完全忘记了OrderOpenTime()--这是个很好的方法!谢谢你的提示--我现在就去实验一下。在我之前的帖子中,我已经设法让它运行得更顺畅了--OrderModify错误1现在很少出现了。它现在似乎工作得更顺利了。 唯一的问题是,如果我有一笔交易,
止损 大于OrderEntry()-(假设我们谈论的是多头),那么它将不会关闭一半的订单,因为关闭一半的主要标准没有得到满足。
这里的代码是启动一半手数的平仓,并停止在同一价格上连续平仓一半的交易--(它不是 "in start() "中唯一的东西,只是让它更容易看到)。
我如何结合OrderOpenTime()函数来更好地控制,以确保每笔交易以1:1的比例平仓,而不会因为止损>=OrderOpen()而错过任何机会?
有几种方法可以确保每个订单都被部分平仓,我最喜欢的方法是在部分平仓时将TP修改一个点。
例如,我需要一个100点的止损点,所以我以99点的止损点开单。我知道在达到止盈点 之前,我的订单将在40点时被部分关闭。当这种情况发生时,我将TP修改为100点。因此,任何盈利>=40点且TP<100点的订单都需要部分关闭。任何TP>99点的订单已经被部分关闭。如果你这样做,那么SL是什么就没有区别了。只需确保在计算前将所有订单的价格加倍归一。