在前面的文章中, 我开发了一个简单的网格EA,可以在MetaTrader 4和MetaTrader 5中使用。它的主要特点是,在放置一个网格之后,在当前网格以利润或最大整体损失关闭之前,它不会向它添加新的订单。
根据测试,我们的网格EA 自2018年以来显示盈利,不幸的是,在以存款持续亏损为标志的2014-2018年期间,情况并非如此。因此,把它用在真实的账户上太危险了。在本文中,我们将基于一个新的交易理念开发一个网格EA。
本文第一部分提出的EA的主要思想是基于这样一个假设,即价格通常会朝某个方向移动。这意味着,如果我们在错误的方向上打开多个订单,则在正确的方向上打开的新订单能够补偿损失。因此,我们迟早能够为所有未结订单获得必要的利润。在实现这个想法时,我们在当前价格之上设置一个 N 个买入订单的网格,在当前价格之下设置相同数量的卖出订单的网格。
然而,进一步的测试表明,价格经常触及上方的订单,然后向下触及下方的订单,只会再次上升。这样,它逐渐激活所有或几乎所有的买入和卖出订单,将所有潜在利润降至零。显然,这样的交易体系还远远不够完善。
然而,如果这种价格行为如此频繁,而且外汇价格经常在一定范围内波动,那么我们为什么不利用这一点为我们的利益服务呢?我们仍然会将多头网格设置为高于当前价格,在低于当前价格设置空头网格。但我们会做出两个重要的改变。
首先,我们将为每个头寸而不是整个头寸链设定获利。为每个单独的订单配置止损的设置也要实现。然而,测试表明,应用止损不会带来利润。因此,我们不会使用它。
第二,如果当前价格与前一个价格不同,我们将不断向网格添加新的限价订单,j价格移动太远的限价订单将被删除。因此,如果价格向上移动一个网格,我们会在当前网格的末尾在价格上方添加一个新的限价买入订单,在当前价格下方添加限价卖出订单作为第一个订单,而当前价格下方的最后一个限价卖出订单将被删除。这样,我们的网格就可以跟随资产价格。
在一个趋势中,我们将在趋势变化期间按订单获得利润。如有修正,我们将从中获利。因此,如果在一个大的时间范围内,价格朝着一个变化的方向移动,不管价格方向如何,我们都会获得利润。
现在让我们检查一下实际结果。
与第一篇文章不同,这里我们将不分析EA的源代码。本文附带了 MetaTrader 4 和 MetaTrader 5 的源代码和编译后的EA,供您查看。在本文中,我们将构建算法并进行测试。
网格订单之间的距离.
我们将从网格中限制订单之间的距离开始。所有限价单应设置在彼此之间的相似距离上,如果我们一次设置整个网格而不在价格变化时对其进行编辑,这不是问题。然而,我们的网格是“浮动的”。在设置新的限价订单之前,我们需要以某种方式定义在这个网格步骤中是否存在限价订单。
我们不能简单地检查限价订单是否以同样的价格存在,订单的价格可能会高几点或低几点。如果我们不考虑这一点,我们的EA可能会以相对相似的价格设定数百个限价订单,破坏我们的交易。
为了避免这个问题,我们将不设置点的限制订单之间的距离,相反,我们将使用价格差来设置网格步骤之间的距离,这是通过 Decade for limit orders EA 参数来完成的。
如果其值为正数,则指定要在其中设置网格订单的小数位。例如,值2表示网格设置为价格步的每1/100。例如,如果当前价格为1.1234,则买入网格设置为1.13、1.14、1.15,…,而卖出网格设置为1.11、1.10、1.09,…。换句话说,网格订单之间的距离将是4位和5位交易品种(大多数外汇交易品种)上的100点。
对于相同的价格,如果 Decade 等于 3, 网格就位于第三个小数位:
这样,我们的订单之间就有10个点的距离。如果参数值为0,则网格的步长为1(例如,在111、112、113、114处)。
此参数还支持负值,他们把 Decade 从小数点向左移动。例如,-1表示网格设置为步长10,而-2表示步长100。
这种网格放置方法简化了在必要的网格步骤中检查是否存在限价订单,但也允许考虑交易中的近似价格形成的水平。事实上,我们以近似价格设置限价订单。
还有另一个参数影响网格步长 — "Shift in points". 它允许将网格步数从整数转换为指定的点数。例如,在 decade 等于 2 和 shift 等于 1
的情况下,如果是高于当前价格的买入订单,则网格的位置不是1.12、1.13、1.14,而是1.121、1.131、1.141;如果是低于当前价格的卖出订单,则网格的位置是1.119、1.129、1.139。这使得我们能够更有效地利用近似价,希望在不利的情况下,价格在向相反方向移动之前不会触及限价指令。
对于 "Shift in points" 参数, 测试表明,这并不总是会产生积极的结果。
主要 EA 参数.
除上述参数外,EA还有多个其他参数:
其中最重要的是:
单独订单的获利应单独提及,此参数的最佳值主要取决于交易品种价格的变动。然而大多数情况下,它位于 1-5 之间,接近1的值和接近5的值都有它们的好处。
值越低,持仓利润越小,平仓速度越快,这提供了两个好处:
大的获利也有好处:
因此,在小的获利情况下,存款回撤(和潜在利润)较低。
Closing all positions. 除了为单独的网格订单获利外,您还可以使用许多其他参数在某些事件发生时关闭所有未结头寸。所有这些参数都收集在单独的 “Closing all positions”组中:
最初,在退出范围时关闭所有仓位可能看起来很有吸引力,然而,在实践中,它通常会破坏以前获得的全部利润。正如我们将在下面看到的,决定在价格退出其区间并出现强劲趋势后做什么是这种交易策略的一个关键。
其它参数. 我们只分析了EA中存在的一小部分参数,我们将查看下面的一些其他参数。但是,有一些参数我们不打算应用,它们的名字用(-)做了标记,它们中的每一个都实现了一个特定的思想,但是它们的应用没有产生积极的结果。尽管它们对我们没用,我们还是要看看它们,你可以在你的策略中使用它们,或者找到一些方法来改进它们。
在我们开始测试之前,让我们再看看EA的基础以及它是如何实现的。
很难相对确定地预测大多数资产的价格变动,价格可能先上涨形成新的高点,然后再下跌形成新的低点。然后,这一走势又发生了变化,价格上涨,收盘价略低于前一个高点,或者形成一个新的高点。长期的单向价格变动通常伴随着修正。这正是我们所需要的,因为不管价格方向如何,我们都会获得利润。
为此,我们将在当前价格上下设定限价订单。订单之间的距离应相同,高于价格,我们将设定买入订单,假设价格目前上涨,它也将在以后这样做。卖出订单应低于价格。
网格中的订单数是使用 "Max number of limit orders in one direction"参数设置的,这个值在这里并不重要。当一个新的柱出现在载入 EA 的时间框架上时,如果价格与当前订单中的任何一个相接触,我们将向网格添加新的订单,从而使其处于未平仓状态。
因此,只有当价格在一个时间框架条内穿透所有网格订单并随后沿同一方向移动时,参数 “Max number of limit orders in one direction”(一个方向上的最大限制订单数)才可能相关。
时间框架. 试验结果表明,EA在M5上有较好的效果。因此,我们将在这里进行所有的测试。
选择市场. EA正是基于这样一个理念:范围市场(包括外汇市场)是最好的。此外,如果能在价格所在的W1或MN时间框架内看到一个范围,那就更好了。
例如,让我们看看 AUDCAD:
它在过去5-10年在一定的范围内,从理论上讲,我们选择的交易策略应该适合 AUDCAD 和类似交易品种,让我们检验一下。
我们将在以下交易品种上测试EA: EURUSD, AUDUSD 和 AUDCAD. 对于所有这些交易品种,我们将使用10个点的网格步长测试 (decade 3). 我们可以使用100个点(decade 2)的更大步长进行交易,但这将是一个长期交易,每年只有少量交易。
测试时间段.
在本文中,我们对小于1年的时期不感兴趣。为了进行测试,我们将查看4年(2015-2019年)的时间段,并在此期间搜索最有利可图的设置。EA未在超过10年的时间内通过测试,或在低获利水平下以小利润通过测试。所以,这不是“十年不用管”的EA。
首先,让我们测试一下交易策略的基本概念。所有参数默认设置,包括我们已经分析过的参数:
优化由单独订单的获利以及“Shift in points”参数执行。优化方法 — 1 分钟 OHLC. 随后,最终结果将使用 "每次报价" 方法进行测试。所有测试的报告都附在文章后面。
试验结果表明,以2为获利点,1为转移点,取得了较好的效果:
最重要的测试结果:
交易品种 |
最大回撤 |
利润 |
恢复系数 |
利润因子 | 交易数 |
---|---|---|---|---|---|
EURUSD |
23 522 |
20 641 |
0.88 |
1.39 |
40 536 |
虽然我们最终获得了利润,但结果并不令人满意。明确显示了 恢复系数 等于 0.88.
事实上,恢复系数显示利润与最大回撤的比率(利润除以最大回撤)。如果其价值低于1,我们的利润将低于EA的回撤。
我相信,我们大多数人都会对每年至少100%的存款利润感到满意。由于我们在4年的时间内进行试验,恢复系数超过4会使我们满意。让我们试着改进我们的交易系统。
Do not place the nearest orders.
如上所述,EA在价格变动后应用浮动网格。如果价格上涨,EA将为当前价格设置额外的限价订单。
但是,如果最近的订单在修正过程中经常被触发,而不是被获利了结,怎么办?我们不要再下太接近价格的订单了。这可以通过“Do not place the nearest orders”布尔参数实现。让我们看看激活后会发生什么:
差别不是很明显,也许,我们将在测试结果中看到它们:
交易品种 |
最大回撤 |
利润 |
恢复系数 |
利润因子 | 交易数 |
---|---|---|---|---|---|
EURUSD |
12 987 |
15 302 |
1.18 |
1.64 |
21 350 |
我们已将交易数量减少了近2倍。如果你想从经纪商的奖金中获利,这不是好消息。利润水平也有所下降。但是,最大回撤量下降了近2倍,恢复系数超过1。
在 decade
等于3(网格顺序之间的距离为10点)的情况下,该参数对其他工具的作用方式相同。它允许减少交易数量,因为小幅度的价格变动修正不会到达网格。如果价格目前处于一个趋势中,这种情况是有希望的。但是,如果我们在一个范围内(无论如何,价格会返回到先前打开的订单),使用这个参数会降低潜在利润。
Entry in the bar direction.
让我们继续改进我们的EA。几乎所有的交易大师都只建议在局部趋势方向进行交易,如何定义这种趋势?一切都很简单,如果价格在前一个柱上上涨,只交易多头,反之亦然。
通常,建议在每日图表上分析局部的趋势,换言之,如果价格昨天上涨,就做多交易。如果下跌,做空。让我们遵循这个建议。除了D1,我们还将测试其他时间段。
要在柱形移动方向配置交易,我们将使用来自“in bar direction”组的EA参数:
在对不同时间段的柱进行测试后,发现 MN 时间段最适合EURUSD:
测试结果以表格显示:
交易品种 |
最大回撤 |
利润 |
恢复系数 |
利润因子 | 交易数 |
---|---|---|---|---|---|
EURUSD |
13 044 |
19 227 |
1.48 |
1.8 |
23 445 |
根据柱形入场提高了所有交易品种上的结果,但是,在 MN 上根据柱形入场可能是一个例外,因为 D1在大多数情况下工作得很好。由于我们在给定时刻仅在一个方向上设置网格,因此使用“Do not place the nearest orders”参数没有意义。
Trading in a range. 如文章主题所述,EA设计用于在一个范围内交易。因此,如果价格在 W1或 MN 图的范围内,其交易结果应该更好。让我们通过设置交易范围来检查这一点。为此我们将需要 "Do not open Long if the price is less than", "Do not open Long if the price exceeds", "Do not open Short if the price is less than" 和 "Do not open Short if the price exceeds" 参数,
把 "Do not open Long if the price exceeds" 和 "Do not open Short if the price exceeds" 参数粗略设为 1.17849. 把其它两个参数设为 1.09314:
结果明显改进了:
交易品种 |
最大回撤 |
利润 |
恢复系数 |
利润因子 | 交易数 |
---|---|---|---|---|---|
EURUSD |
2 412 |
10 964 |
4.55 |
6.16 |
6 974 |
Close all positions when increasing equity.
在文章的开始,我们描述了 "Closing all positions" 参数组,它包含了 "When equity increased, $" 参数。逻辑告诉我们,参数应该改善我们的结果,因为它允许关闭所有目前打开的亏损头寸并重新开始交易。要做到这一点,只需等到价格进入范围,我们账户的权益按规定值增加。根据交易大师的说法,价格在整个时间的70%范围内波动。
实际上,使用这个参数并不总是能提高结果。这可能是因为我们结束了亏损交易,这些交易可能在价格反转期间变成有利可图的交易。
然而,在我们的例子中, "When equity increased, $" 参数实际上改进了结果,值为 $2 000 看来是最佳的,
交易品种 |
最大回撤 |
利润 |
恢复系数 |
利润因子 | 交易数 |
---|---|---|---|---|---|
EURUSD |
3 200 |
18 532 |
5.79 |
3.8 |
6 954 |
这是EURUSD上的最后一次测试,让我们得出一些结论。我们在使用固定手数时,每年获得了近150%的利润率。换言之,如果我们在增加账户余额时增加了这一数额,我们就能获得更多的利润。
然而,结果并不令人印象深刻。我们每年得到150%的增长,而回撤几乎是100%。大多数投资者要求回撤不超过存款的20%。我认为,这是一个相当奇怪的要求,因为在这种情况下,80%的余额是闲置的。你也可以把它们存到银行,剩下的20%留作交易用。然而,存在这样的要求,这意味着我们需要将交易量减少5倍,以保持在20%的回撤范围内。因此,预期利润是每年30%,而不是150%。结果远非完美,
让我们测试其它的交易品种。
测试结果. 如前所述,每项中间试验的所有报告均随附在文章中,连同最终试验的设定文件,EURUSD 和其他所述交易品种。
让我们从基本设置开始测试 AUDUSD:
优化由根据获利和“shift in points”参数执行。在获利为 3 而 shift 为 0 时获得了最佳结果:
交易品种 |
最大回撤 |
利润 |
恢复系数 |
利润因子 | 交易数 |
---|---|---|---|---|---|
AUDUSD |
21 468 |
-546 |
-0.03 |
0.99 |
18 104 |
Do not place the nearest orders. 即使有最好的基本参数,我们也无法获得利润。但是让我们尝试启用 "Do not place the nearest orders" 参数:
交易品种 |
最大回撤 |
利润 |
恢复系数 |
利润因子 | 交易数 |
---|---|---|---|---|---|
AUDUSD |
14 701 |
14 415 |
0.98 |
1.54 |
15 049 |
Entry in the bar direction.
这看起来好多了,让我们在不同的时间段内根据前一个柱入场来测试:
交易品种 |
最大回撤 |
利润 |
恢复系数 |
利润因子 | 交易数 |
---|---|---|---|---|---|
AUDUSD |
9 186 |
8 364 |
0.91 |
1.56 |
8 573 |
Trading in a range.
结果证明,D1是最好的,尽管它的结果也有点恶化。不管怎样,让我们用它在一个范围内测试工作。让我们大致将范围边界设置为比当前价格高0.79728,比当前价格低0.70417:
交易品种 |
最大回撤 |
利润 |
恢复系数 |
利润因子 | 交易数 |
---|---|---|---|---|---|
AUDUSD |
6 769 | 11 937 |
1.76 |
2.35 |
7 591 |
Close all positions when increasing equity.
如预期,结果有所改善,恢复系数几乎翻了一番。最后,让我们测试一下用净值增加时关闭所有仓位:
交易品种 |
最大回撤 |
利润 |
恢复系数 |
利润因子 | 交易数 |
---|---|---|---|---|---|
AUDUSD |
4 270 |
8 552 |
2 |
1.74 |
7 593 |
如果我们在净值增加1000时平仓,则可能将恢复系数增加至2。这对最终结果来说是微利。也许,AUDCAD 会更好…
在本文的开头,我们提到了 AUDCAD 图表来说明适合EA的价格变动。它的 MN 时间表清楚地显示了价格变动的范围。现在是时候检查这个交易品种的交易利润了。
基本测试显示,在获利为4而 shift 等于 0 结果最好:
交易品种 |
最大回撤 |
利润 |
恢复系数 |
利润因子 | 交易数 |
---|---|---|---|---|---|
AUDCAD |
8 216 |
16 149 |
1.97 |
1.53 |
17 852 |
Max orders at the same price.
使用基本设置,我们达到了大约2的恢复系数,也就是说,当使用 AUDUSD 的最终设置时,结果是相同的。
如果我们更改了“Max orders at the same price”(相同价格下的最大订单数)参数,则可以进一步改进此结果,我们在文中还没有描述它,它的默认值是 33. 这意味着EA可以在同一个方向以相同的价格打开多达33个头寸。实际上,这意味着一个价格下的头寸数量是无限的,因为我们在测试期间从未以一个价格打开过超过10个的头寸。
如何以单一价格开仓?一切都很简单,假设价格上涨并触及最近的订单,之后,价格回落,使EA以相同的价格设定一个新的限价订单。之后,价格会再次测试下订单的水平,以此类推。
我们之前没有考虑过"Max orders at a single price" 参数,因为以相同价格打开无限数量的头寸允许增加EA盈利能力,但 AUDCAD 的情况不同。也许,这与交易品种价格变动有关,但如果我们禁用对已用于未平仓的价格下限价订单,结果会更好。因此,把 "Max order at a single price" 设为 1:
交易品种 |
最大回撤 |
利润 |
恢复系数 |
利润因子 | 交易数 |
---|---|---|---|---|---|
AUDCAD |
5 896 |
18 087 |
3.07 |
2.63 | 10 821 |
Do not place the nearest orders.
我们设法使恢复系数增加了1.5倍以上。现在,让我们回到老路并测试启用“Do not place the nearest orders”参数:
交易品种 |
最大回撤 |
利润 |
恢复系数 |
利润因子 | 交易数 |
---|---|---|---|---|---|
AUDCAD |
5 656 |
13 692 |
2.42 |
2.61 |
8 306 |
我们必须承认结果有点糟糕,但是,让我们考虑这个参数,尝试恢复测试。
Entry in the bar direction.
在前一个柱形移动方向上的测试条目证明,D1是最好的时间框架:
交易品种 |
最大回撤 |
利润 |
恢复系数 |
利润因子 | 交易数 |
---|---|---|---|---|---|
AUDCAD |
3 857 |
8 848 |
2.29 |
2.58 |
5 487 |
然而,这并没有帮助改善结果。事实上,情况变得更糟了。
Trading in a range.
让我们通过设置EA的工作范围来继续测试,上边界价格为1.02603,下边界价格为0.93186。
交易品种 |
最大回撤 |
利润 |
恢复系数 |
利润因子 | 交易数 |
---|---|---|---|---|---|
AUDCAD |
2 684 |
9 692 |
3.61 |
3.33 |
5 224 |
这个范围并没有让我们再次失望,并且稍微提高了结果。
Close all positions when increasing equity.
标准集的最后一个优化选项:
交易品种 |
最大回撤 |
利润 |
恢复系数 |
利润因子 | 交易数 |
---|---|---|---|---|---|
AUDCAD |
2 818 |
6 022 |
2.14 |
1.74 |
5 479 |
替代测试让我们丢弃使恢复系数恶化的参数,在没有这些参数的情况下进行测试。这意味着我们应禁用“Do not place the nearest orders”(不要下最近的订单),并在柱形移动方向入场。此外,我们不会在净值增加时关闭所有头寸:
交易品种 |
最大回撤
|
利润 |
恢复系数
|
利润因子 | 交易数 |
---|---|---|---|---|---|
AUDCAD |
5 124 |
19 121 |
3.73 |
3.17 |
10 301 |
结果有所改善,但只有一点点。我们每年大约有100%的利润。
经过所有的测试,我们得到了一些结果。他们不可能被称为有前途,但这仍然是一种利润。不过,这太过骗人了。
EA 的盈利能力是通过限制其交易范围来实现的。这是从历史上看的,我们不能确定价格是否会保持不变。我们可能会幸运几次,看看价格如何从范围边界回落。但最终我们的运气会结束。那我们该怎么办?
一个可能的选择是关闭所有头寸。这听起来是个不错的选择。但实际上,这意味着损失了大部分或全部利润。为了增加对伤害的侮辱,价格肯定会在第二天逆转。
根据测试,最好的选择是等到价格回到区间。或者,您可以等到价格找到一个新的范围后再进行交易,直到价格回到前一个范围。
这可能需要几年时间。然而,价格迟早会回归。
如果你不想等五年或更长的时间,那么唯一的选择就是手工交易,并尝试使用手中的卡在市场上获得优势。
到目前为止,我们只讨论能够提高其盈利能力的EA参数。每个参数代表一个特定的想法。在EA开发过程中,测试了很多想法。不幸的是,它们中的大多数只会进一步恶化EA结果。因此,删除了适当的代码,或者在实现某个想法的参数名称的开头用“-”标记。
我们将在这里查看这些参数,但根据测试,更改它们的值不会带来任何好处。
Limit order type. 默认情况下,EA将买入订单设置为高于当前价格,将卖出订单设置为低于当前价格。这些订单被称为 Buy Stop 和 Sell Stop,默认参数值是 STOP.
如果它设为 LIMIT, EA 将使用 Buy Limit 和 Sell Limit 订单。换言之,它的行为将发生巨大的变化:它会将卖出订单设置在高于价格的位置,而买入订单则设置在低于价格的位置,从而逆势交易。这可能也会带来一些利润,但相对于回撤而言,这将要低得多。
Increasing a lot in a chain. 默认情况下,网格中的所有订单都具有相同的交易量,但是,此参数使网格中每个新订单的交易量都可能超过前一个订单。这种增加可能同时发生在算术和几何级数中。
测试表明,这可能会增加获得的利润,但仅仅是因为增加了最大回撤量。因此,恢复系数总是低于使用固定手数时的恢复系数。
Use trailing stop. 整个参数组允许为每个单独的订单启用跟踪止损,不幸的是,根据测试,这不是一个好主意。
在本文中,我们研究了另一个可能的网格。它比我们在前一篇文章中分析的要好。但我们仍然获得了一个非常高风险的交易策略,它迟早会毁掉一笔存款。
这是否意味着网格不能用于开发相对良好的低风险EA?我现在还不想得出这样的结论,因为我们还有另一种方法来安排网格EA。
我们将在下一篇文章中讨论它。像往常一样,我们将把注意力集中在跨平台的EA上。它能够使用固定手数上显示2010年至2019年的以下结果:
交易品种 |
最大回撤 |
利润 |
恢复系数 |
交易数 |
---|---|---|---|---|
USDCAD |
953 |
7 328 |
7.69 |
3 388 |
NZDUSD | 1 404 |
11 288 |
8.04 | 2 795 |
SBUX (2013-2019) |
140 | 1 890 |
13.5 | 442 |
本社区仅针对特定人员开放
查看需注册登录并通过风险意识测评
5秒后跳转登录页面...
移动端课程