English Русский Español Deutsch 日本語 Português
preview
练习开发交易策略

练习开发交易策略

MetaTrader 5交易 | 5 十一月 2024, 14:11
567 0
Aleksej Poljakov
Aleksej Poljakov

概述

交易策略是一种固定计划,旨在通过做多或做空市场来实现盈利回报。通过组合各种想法,交易者可以制定自己的策略,以满足他们的特定需求和风格偏好。

可能的交易策略数量如此之多,甚至连对它们进行分类都成了一项艰巨的任务。不过,大多数交易策略通常都包含一定的要素。

  • 工作交易品种和时间框架。
  • 指标、过滤器等。
  • 开仓和平仓规则。
  • 资金和风险管理。

除这些要素外,交易策略还可能包括其他参数。交易策略可能有交易时间限制,例如,允许在上午 9 点至下午 1 点之间开仓,而在此时间段之外的进场信号将被忽略。

对交易策略参数的主要要求是其一致性和不存在内部矛盾。假设交易者决定使用某种资金管理方法,之后,交易者希望在策略中添加追踪止损。这两个要素是相互矛盾的。资金管理要求设置预先确定的止损和获利水平。但是,追踪止损可能会在价格达到止盈之前平仓,从而导致利润低于预期。要解决这一矛盾,交易者必须使用固定仓位交易量或取消追踪止损。

任何交易策略都必须以某种统计优势为基础。而且,这种优势应该长期存在。

制定策略的一个重要步骤是测试。使用策略测试器,您可以评估交易策略的功能及其优缺点。如有必要,您可以进行所需的更改。此外,测试器还能选择最佳策略参数,从而改善交易结果。


简单策略

最简单的交易策略是基于简单移动平均线的策略。其原理非常简单:价格越过指标线,此时就会建立仓位。仓位类型取决于交叉点发生的方向:如果价格从下向上移动 - 买入,从上向下移动 - 卖出。 

让我们仔细看看这一策略。首先,让我们从数学的角度来理解一下什么是交点。从本质上讲,它表示跟踪差值的符号:

当差值的符号变为相反时,就发生了相交。

现在,让我们试着以不同的方式来看待这种差值。根据其计算方法,SMA 是价格总和除以价格数量。因此,我们的第一步是将差值缩小到一个共同点:

让我们去掉分母。这样做的原因是,通过去分母,我们可以将差值转换成整数。使用整数更简单、更方便。让我们将差值乘以等于 N 的比例因子,再除以点值。这样,我们可以得到以下公式

但我们对简单的差值不感兴趣。我们需要知道的是,在给定的交易品种和时间框架内,这种差异出现的频率有多高。在这种情况下,我使用 H1 时间框架的 EURUSD。以下是 N=24 的统计数据。

你喜欢这张图片吗?如果你对这个问题的回答是 "啊,我见过更好的",那么你就不是交易者。一个真正的交易者应该对这张照片感到满意。交易者可能喜欢的第一件事就是不对称。其次,差异的分布似乎并不均匀。

让我们休息一下。普通人会做什么噩梦?我猜这些噩梦可能是吸血鬼、狼人或行尸走肉。你知道交易员最可怕的噩梦是什么吗?它就是正态分布

设想一个游戏:如果是正面,我付给你一些钱;如果是反面,你就付给我钱。我们兴奋地抛出一枚硬币,结果 ...... 这个游戏没有任何意义。硬币是公平的,这意味着正面和反面平均出现的次数相同(对等)。你我都不可能从这个游戏中致富。解决这种情况的办法只有一个:你需要破坏硬币,让其中一面更频繁地掉落出来。这将使我们摆脱统一分配,实现利润的变化;有人将开始更频繁地获胜。

让我们回到我们的策略上来。差异分布不均,且偏向负值。显然,基于移动平均线和价格交点的策略效果并不好。在该策略的经典版本中,当差值的符号发生变化时,即以零作为平均值时,就会开仓。但由于分布的性质,我们最好使用中位数而不是零。因此,只有当差值超过中位值时,才应开仓。

这种选择是可能的,但不适用于我们。中位数将样本分成两半:一半样本低于中位数,另一半样本高于中位数。这表明,在达到中位数后,差值的增减概率大致相同。

我们的做法略有不同,会在差值达到最大或最小值时开仓。这些时刻将与价格偏离均线的最大值相对应。在此之后,价格和均线很可能开始趋近。此外,由于该指标更具惯性("滞后"),我们可以希望价格会走得更远,从而为我们带来利润。

如何在实践中加以落实?首先,我们收集历史上的差值。我们设定了某种触发阈值。例如,我将使用最大值和最小值的 15%。如果当前差值小于下限值,则建立买入仓位。如果当前差值高于上限值,则打开卖出仓位。

仓位的关闭遵循同样的原则,但触发阈值设定为 45%(略低于中位数,中位数水平为 50%)。如果差值高于下限,我们就关闭买入仓位。如果差值低于上限值,则卖出仓位被平仓。

这些就是交易策略的规则。让我们看看它在测试器中的表现如何。在测试中,我们使用欧元兑美元(EURUSD)交易品种、H1 时间框架,测试区间为 01/01/2023 至 12/31/2023。我们使用 EA 默认参数对其进行测试。

余额曲线如下。

对于这样一个简单的策略来说,结果还不错,但你可以改进它。首先,您可以为买入和卖出仓位设置不同的触发阈值。分布是不对称的,因此这种方法可以产生积极的效果。

您可能不仅需要监控移动平均值的差异,还需要监控移动平均值的变化。例如,差值增加,而移动平均值减小,在这种情况下,建仓信号可能会更强。


更复杂的策略

要生成建仓信号,可以使用两个不同周期数的 SMA。在上一个例子中,我们使用的是当前价格。那么,可以将价格视为周期为 1 的均线。这一策略背后的理念非常简单。周期长的移动平均线显示主要趋势,周期短的平均线显示趋势变化的瞬间。

所有必要的计算均按照前一种策略进行。唯一不同的是,您需要用周期更短的 SMA 值代替价格值。

使用两条 SMA 可以更精确地配置策略参数。直观地说,该策略的盈利能力不仅取决于建仓和平仓水平,还取决于均线的周期。这是其中一个选项中的余额曲线。

添加另一个参数后,我们就有机会在策略中加入一个额外的过滤器。在我们的示例中,该过滤器只在开仓时起作用。例如,只有当小周期 SMA 开始上升时,才能建立买入仓位。因此,只有当该 SMA 值下降时,才允许建立卖出仓位。使用该过滤器能达到什么效果?建立仓位的数量肯定会减少,这将有助于减少存款负载。让我们来看看这个过滤器是如何工作的。

过滤器 总净利润 毛利润 毛损失 利润因子 期望收益 采收率 夏普比率 Z 值
false 1 670.84 2 039.73 -368.89 5.53 4.49 1.78 2.91 -17.52
true 379.20 607.75 -228.55 2.66 2.92 0.92 1.95 -10.26

过滤器极大地影响了交易结果。在此策略中,我们使用两条均线。每个过滤器都可以独立使用,也可以一起使用。过滤器既可用于打开仓位,也可用于关闭仓位。


复杂的策略

我们已经讨论过两个 SMA 的使用,是否可以使用三个 MA 呢?是的。进一步说,您还可以在一个策略中使用任意多个 MA。让我们看看如何在实践中实现这一点。

我们取几条不同周期的移动平均线,求出它们的总和,大致看起来是这样的:

在这种情况下,系数 k 的总和必须等于零。这可以通过不同的方式来取得。最简单的解决方案之一是使用有限差分。任何阶次的有限差分都可以通过取前一阶差分并减去其副本,再将系数指数偏移 1 而得到。

例如,一阶差分等于 k1-k2。

在此基础上,我们可以计算二阶差分:(k1-k2)-(k2-k3)=k1-2*k2+k3。

同样,我们可以求出三阶差分:(k1-2*k2+k3)-(k2-2*k3+k4)=k1-3*k2+3*k3-k4。以此类推。

如果不想费力计算,可以直接从 Pascal 三角形中提取所需的行。只需记住更改系数前面的符号即可。

我在这个例子中使用了三条 SMA,对它们采用二阶差分系数。因此,所有计算都将根据以下公式进行:

这种策略的结果取决于三个参数。哪怕是改变一条 SMA 的周期,也会对结果产生重大影响。下面举例说明这种策略的执行情况。

我们可以继续增加移动平均线的数量。乍一看,这一决定似乎非常合理,然而,这种方法会走进死胡同。我们可以使用任意数量的 SMA,但最终仍将使用一个振荡器。我们可以添加的每一条新的 SMA 都只是改变了该振荡器的系数和特性,仅此而已。我们本可以做得更简单一些,就是立即开始寻找最优振荡器的最优系数。遗憾的是,这项任务并不那么简单。


复杂性的新级别

在开发交易策略时,主要原则是不要放弃,并始终寻找新的机会。我们已经看到了使用一个指标所能达到的效果。现在,让我们看看如何使用多个指标创建策略。

在本策略中,我将使用经典的移动平均线。根据每个指标,您可以利用当前价格与指标值之间的差值来构建振荡指标。我们已经了解了如何使用 SMA 实现这一功能。不过,其他指标的情况就比较复杂了。

线性技术指标的核心是一组系数乘以相应的价格参考。指标的结果数值就是这些乘法的总和。例如,SMA 可以表示如下:

然而,EMA 并非如此简单。首先,对于指数平滑法,采用几何级数计算系数,初始系数范围为 0...1。其次,一般来说,EMA 周期数是无限的。更准确地说,EMA 周期等于指标设法处理的价格读数的数量。

让我们稍微改变一下 EMA:我们将使用 2 的幂次作为系数,而指标周期将任意设置。因此,我们的指标公式如下:

我们的指标将类似于周期为 3 的标准 EMA。我们的指标周期数越长,它们之间的距离就越近。

经过这样的修改,我们就能建立一个输出为整数值的振荡器。我们已经考虑了所有其他操作,包括将差值归入同分母、应用比例系数等。

SMMA 采用以下算法构建。首先,我们计算 SMA 值,然后对这些值进行另一次平均。结果是一个三角形窗口函数。我们将用这个函数来制作一个振荡器。

LWMA 系数由步长为 1 的算术级数求得。从本质上讲,EMA 和 LWMA 是 "遗忘" 过去数据的不同模型。EMA 比 LWMA 更快地遗忘过去的数据。

接下来的步骤非常简单。根据每个指标,我们建立自己的独立振荡指标。每个振荡指标都有自己的统计数据。根据这些统计数据,我们生成开仓和平仓信号。

在这里,我们需要决定如何运行我们的交易策略。四个振荡指标中的每一个只能产生四个可能信号中的一个:

  • 建立买入仓位

  • 建立卖出仓位

  • 关闭买入仓位

  • 关闭卖出仓位

第五个信号是 "什么也不做",但默认情况下是启用的,所以我们不计算它。

可能会出现每个指标都发出自己信号的情况,而这些信号会相互矛盾。示例

  • SMA 发出买入信号

  • EMA 发出卖出平仓信号

  • SMMA 发出卖出开仓信号

  • LWMA 生成关闭买入仓位的信号

在这种情况下,交易者该怎么办?首先,交易者需要记住拜占庭将军(Byzantine generals)问题。拜占庭将军问题的本质是,可以从多个来源获得不同的信号。有些信号可能是假的,有些则可能是真的。要确定哪个信号为真,需要遵循一个简单的规则:如果信号来自三分之二以上的信号源,就可以认为该信号是可靠的。

设 N 为指标总数,然后,可以用公式计算出发出相同信号的指标的最少数量:

我们共有四个指标。这意味着,只有当至少三个指标发出相同信号时,交易者才能采取任何行动。

这就是该理论。让我们来介绍一下我们的交易策略是如何运作的。首先,我们需要为每个指标收集单独的统计数据。根据这些统计数据,每个指标都会生成自己的信号。如果至少有三个信号匹配,那么 EA 就会认为信号正确并执行它。

现在,让我们来看看拜占庭将军们能否获利。

那么,这种方法也可以用在交易中。此外,这种交易策略还允许增加参数数量。对于每个指标,您都可以输入自己的开仓和平仓水平。这将使策略更加灵活,并对交易绩效产生积极影响。

基于多个指标,您可以以另一种方式构建交易系统。 

收集统计数据后,我们可以估算出每个指标的特定值出现的频率。利用这个频率,我们可以构建一个经验分布函数

设 N 为样本总量,f[i] 为第 i 个指标值的频率。然后就可以用下面的公式求出经验分布函数:

该函数用于描述下一个指标值小于当前指标值的概率。从图形上看是这样的:

因此,我们有四种不同的概率。但我们需要的是一个值。我们可以使用贝叶斯分类器来得到它。最终概率是由每个指标的概率通过公式计算得出的:

我们将利用这种概率来生成信号。只有当概率达到一定值时,才会建立或关闭仓位。

让我们看看这种方法能否用于交易。

现在,让我们尝试为开仓添加一个过滤器。这种过滤器的工作原理非常简单:

  • 只有当最终概率开始增加时,才允许建立买入仓位;

  • 只有当概率开始下降时,才允许建立卖出仓位。

因此,我们可以减少仓位数量,减轻存款负载。

可为平仓添加类似的过滤器。它有可能稍微提高这一策略的盈利能力。

我们已经考虑过根据几个不相关的指标创建交易策略的可能性。这种方法的主要特点是,所有指标应尽可能彼此不同。例如,如果我们使用周期等于 2 的 SMA 和 SMMA,那么它们的系数将相等。这将产生同一指标的两个副本。必须避免这种情况,因为信号会发生偏移,策略将无法正常运行。


提高复杂程度

让我们回到起点 - 根据一个指标开发策略。不过,这次我们将增加策略的复杂性。我们将以 CCI 指标为基础。

经典 CCI 的计算方法很简单:它是价格与移动平均线之间的差值,用标准差进行归一化。

采用这种方法,要获得用于收集统计数据的整数有些困难。因此,我们将对这一指标稍作修改。我们将使用中位数价格和绝对偏差来代替 SMA 和 StDev。

找到中位数非常简单。我们需要按升序对原始值集进行排序。居中的数值就是中位数。中位数的主要优点是不受异常值的影响。

我们将采取以下行动。首先,我们将获得所需的价格数量,并找出它们的中位数。由于我们方法的特殊性,价格数必须是奇数 - 只有在这种情况下,我们才能得到一个整数。接下来,我们将找出当前价格与中位数之间的差值,从而得到第一个统计量。我截去了出现频率最高的数值,使图表特征更加明显。

现在,我们需要找出价格与中位数之间差值的绝对值。让我们找出这些差异的中位数,这将是我们对标准差和第二个统计量的估计值。

我们得到了很好的分布,但不对称,也不均匀。让我们看看它们能否帮助我们进行交易。

我们的交易策略将非常简单。我们将利用价格与中位数之差的统计数据来生成开仓和平仓信号。如果当前差值远远偏离零,那么我们就会开仓,期待回归中位数。

标准偏差统计量将用作过滤器。较大的偏差可能预示着市场的某些强烈波动。此时,我们将禁止开仓。

让我们看看这一策略是否奏效。

我们使用了最简单的偏差过滤器。事实上,较大的偏差可能意味着您需要改变入市方向。例如,信号表示您应该建立买入仓位,而偏差则表示您应该将仓位类型改为卖出。

另一种可能的过滤器可以建立在中值的基础上。中值可以与任何价格值相吻合。这就是为什么中位数是一个非线性指标。让我们设定以下条件:只有中位数和价格与某个指数重合时,才会进行交易。例如,如果中位数等于指数为 5 的价格,余额线就是这个样子。

我们可以看到,即使是一个指标,也可以提供大量的选项。交易者的主要任务是分析所有可能性,并将其中最好的用于交易。


结论

撰写交易策略可能并不像乍看起来那么困难。然而,要成功实现策略,您应该考虑许多因素,并以理解和经验来对待这一过程。本文仅介绍了一些可能的解决方案和方法,对开发策略可能有用。交易者在选择过滤信号源等时必须非常谨慎。开发的策是一项非常令人兴奋的活动,有很大的创造空间。


撰写本文时使用了以下程序。

名称 类型 描述
scr SMA1 脚本 计算并显示价格与 SMA 之间差值的分布情况
  • iPeriod 是 SMA 周期
EA SMA1 EA 使用 "价格 - SMA" 策略进行交易
  • iPeriod 是 SMA 周期
  • LvlOpen 是打开仓位的水平
  • LvlClose 是平仓水平
EA SMA2 EA
使用 "两条 SMA" 策略进行交易
  • PeriodMPeriodN 是均线周期
  • Filter 是 SMA 过滤器
EA SMA3 EA 使用三条 SMA 进行交易
EA Byzantine Generals EA 使用四个指标进行交易,根据拜占庭将军问题生成信号
EA NBC EA 使用四个指标进行交易,信号使用贝叶斯方法计算
scr CCI 脚本 收集有关 CCI 指标的统计数据
EA CCI EA 使用 CCI 指标的统计数据进行交易
  • LvlStDev 是基于标准偏差的截断水平
  • Filter 是一个非负数,用于指定价格指数,必须与中位数相吻合。


本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/14494

附加的文件 |
scr_SMA1.mq5 (5.28 KB)
EA_SMA1.mq5 (4.52 KB)
EA_SMA2.mq5 (5.15 KB)
EA_SMA3.mq5 (5.71 KB)
EA_NBC.mq5 (7.07 KB)
scr_CCI.mq5 (3.14 KB)
EA_CCI.mq5 (5.69 KB)
构建K线图趋势约束模型(第一部分):针对EA和技术指标 构建K线图趋势约束模型(第一部分):针对EA和技术指标
本文面向初学者和专业的MQL5开发者。它提供了一段代码,用于定义并限制信号生成指标仅在较长的时间框架的趋势中运行。通过这种方式,交易者可以通过融入更广泛的市场视角来增强他们的策略,从而可能产生更稳健和可靠的交易信号。
种群优化算法:人工多社区搜索对象(MSO) 种群优化算法:人工多社区搜索对象(MSO)
这是上一篇研究社群概念文章的延续。本文使用迁徙和记忆算法探讨社群的演化。结果将有助于理解社区系统的演化,并将其应用于优化和寻找解。
开发回放系统(第 44 部分):Chart Trader 项目(三) 开发回放系统(第 44 部分):Chart Trader 项目(三)
在上一篇文章中,我介绍了如何操作模板数据以便在 OBJ_CHART 中使用。在那篇文章中,我只是概述了这一主题,并没有深入探讨细节,因为在那个版本中,这项工作是以非常简单的方式完成的。这样做是为了更容易解释内容,因为尽管很多事情表面上很简单,但其中有些并不那么明显,如果不了解最简单、最基本的部分,就无法真正理解全局。
利用Python进行季节性过滤并为EA的ONNX深度学习模型选择时间周期 利用Python进行季节性过滤并为EA的ONNX深度学习模型选择时间周期
在利用Python构建深度学习模型时,我们能否从季节性因素中获益?为ONNX模型过滤数据是否有助于获得更好的结果?我们应该使用哪个时间周期?本文将全面探讨这些问题。