量化策略开发,高质量社群,交易思路分享等相关内容
交易技巧
通过回转过滤器提高交易表现
利用锯齿效应
通过过滤市场回转,趋势跟踪策略的交易表现可以大大提高。以下是具体方法。
趋势跟踪策略在尽早识别趋势运动时最为盈利。但是,由于市场回转有时会突然结束并逆转,这些策略变得不太盈利。回转区域的总体价格变化可能相对较小,但区域内的价格波动可能很大。因此,趋势跟踪策略会产生错误的进入信号。为了解决这个问题,我们将展示如何表征回转数据并设计回转过滤器以减少错误的进入信号。
市场回转通常描述为一个方向上的单一强烈运动,随后是同等强烈的逆转。这通常发生在低波动时期的突破过程中。然而,在波动性市场条件下,尤其是对于较小的时间框架,回转模式可能包含多个上下价格波动。因此,趋势跟踪策略可能会被误导并产生一系列亏损交易。需要一个回转过滤器来减少多个回转价格波动的错误进入信号。
前瞻
在接下来的部分中,我们将研究回转和趋势价格数据的特征。在锯齿指示器的帮助下,我们识别出锯齿模式的属性,这些属性对建模回转行为和设计回转过滤器非常有用。
回转模式示例
首先,让我们看一下包含多个价格波动的典型回转模式。
图 1 显示了一小时 EURUSD 外汇数据的价格图。一个 90 点的 6 小时的向上趋势紧随其后的是一个 40 小时的回转区域。回转区域的总波动约为 45 点。锯齿模式,阈值为 15 点,整体覆盖在价格数据上。阈值参数控制锯齿运动并决定何时在相反方向创建新的锯齿段。对于向上的锯齿段,当收盘价跌破最高收盘价减去阈值时,向上的段结束并形成一个新的向下段。
图 1:EURUSD H1 回转示例。一个短暂的向上趋势后紧随一个较长的回转区域。锯齿模式覆盖在数据上。
方向变化率 (RODC) 指标
回转模式在特定的窗口大小内具有交替的上下锯齿段。窗口中的锯齿段数等于方向变化率(RODC)。
RODC = 100 X 段数 / 窗口中的(K线数)0 ≤ RODC < 100 ——方程 1
RODC 指标使用方程 1 并测量每 100 k线的方向变化次数。
图 2 显示了趋势和回转区域的指标。较大的 RODC 值匹配回转区域,而较小的值匹配趋势区域。
实施回转过滤器
回转过滤器基于 RODC 指标。它使用 RODC 指标的两个输入:
锯齿阈值(点)
锯齿窗口(K线数量)
回转过滤器利用了锯齿价格数据的两个属性:
窗口中的上下段数(RODC)。
从窗口中的第一K线到最后一K线的总回报(点)。
回报大小 = (最后收盘价 - 最初开盘价)—— 方程 2
在特定窗口中,小的回报大小和大的 RODC 值表征回转价格运动。有效的过滤器将使用回报大小的下限和 RODC 的上限来去除回转数据。
建模和分析回转与趋势数据
为了评估使用锯齿模式识别和过滤回转价格运动的可行性,需要对价格数据进行分析。分析使用一小时 EURUSD 图表的收盘价数据。
首先,我们定义分析中使用的一些术语。
术语:
锯齿阈值——对于向上的段,在声明新的向下段之前,从段的最高点起向下变化的数量(点)。向下段也是如此。
回报大小——K线、锯齿段或回转组的价格变化(点)。
段——锯齿模式的一部分。代表价格的向上或向下波动。由回报大小(点)和持续时间(K线)描述。
趋势——锯齿模式的单个段。由段的总回报大小和持续时间描述。平均回报大小和持续时间取决于锯齿阈值。
回转组(WSG)——包含两个或更多锯齿段。由组的总回报大小(点)、组的持续时间(K线)以及组内的最大段大小(点)来衡量。
接下来,我们定义模型中用于将收盘价数据集合指定为回转组或趋势段的标准。模型使用四个输入参数。
模型输入参数:
WSG 段阈值—WSG 内任何段允许的最大回报大小。
WSG 回报阈值—WSG 允许的最大回报大小。
锯齿阈值—定义锯齿模式中需要反转方向的最小变化量。
锯齿窗口—正在检查的K线数。
识别回转组的标准:
WSG 有两个或更多段。
WSG 回报大小较小,绝对值小于 WSG 回报阈值。
所有 WSG 段的绝对值均小于 WSG 段阈值。
识别趋势的标准:
总回报大小的绝对值大于 WSG 段阈值。趋势总是定义为一个锯齿段。
建模和分析集中在回答以下关键问题:
1.回转组中的锯齿段平均数量(RODC)是多少?
2.回转组和趋势段的平均持续时间(K线数)是多少?
3.回转组和趋势段的K线出现频率是多少?
4.最优的锯齿阈值大小是多少?
5.将趋势数据与回转数据分离的模型的最优输入值是多少?
1. 锯齿段的平均数量(RODC):
图 3 显示了每 100 K线的锯齿段平均数量(RODC),适用于回转组数据、所有数据和趋势数据,作为锯齿阈值的函数。
图3:方向变化率(RODC)。趋势和锯齿数据有很大的RODC分离。
三种数据类型的 RODC 计算为:
RODC WSG = 100 * Σ [WSG 段] / Σ [WSG 持续时间(K线数)]
RODC 趋势 = 100 * 总趋势段 / 总K线数
RODC 所有 = 100 * 总段数 / 总K线数
模型中使用了 50 点的 WSG 段阈值(最大)和 30 点的 WSG 回报阈值(最大)。趋势段大小必须超过 50 点。较大的锯齿阈值会导致回转组中的段数减少。
WSG 的平均 RODC 总是大于所有数据的平均 RODC。对于 10 点的锯齿阈值,WSG 的平均 RODC 为 27.8,趋势的平均 RODC 为 3.6。对于 20 点的锯齿阈值,WSG 的平均 RODC 为 21.4,趋势的平均 RODC 为 3.9。RODC 提供了回转和趋势数据的清晰区分。
2. 平均 WSG 持续时间
图 4 显示了回转组和趋势段的平均持续时间(K线数),作为锯齿阈值的函数。随着锯齿阈值的增加,趋势的平均持续时间线性增加。WSG 的平均持续时间设定了回转过滤器窗口的最小大小。
图4:趋势平均持续时间和回转组。回转组的平均时间为15至23根K线。
在 20 点的锯齿阈值下,平均 WSG 持续时间为 15.3 根K线。从图 3 中,相应的 RODC 为 21.4。将这两个值相乘并除以 100,得到每个 WSG 的平均段数为 3.3。
3.趋势和回转组的出现率
图 5 显示了趋势段和回转组的K线出现率,作为锯齿阈值的函数。在 20 点的锯齿阈值下,WSG 的K线子占总K线数的 20.8%,而趋势K线占总K线数的 62.5%。
图 5:趋势和回转K线的贡献。随着锯齿阈值增加,趋势段K线数增加,而回转段K线数减少。
4. 最优锯齿阈值大小
通过检查价格图表,较大的锯齿阈值(> 50 点)对回转不敏感,而较小的阈值(< 5 点)对长期趋势不敏感。对于 50 点的 WSG 段阈值,图 3 和图 5 建议 10–20 点的锯齿阈值最佳,因为回转和趋势数据都可见。虽然区间数据为小阈值产生了大的 RODC 值,但这些数据可以通过波动率过滤器和仔细选择锯齿阈值轻松去除。
5. 模型和过滤器的最优输入值
图 6 显示了 10 和 20 点锯齿阈值的通用 RODC 分布。较小的锯齿阈值有较大的平均 RODC,并且分布范围比较大的阈值宽。这表明较小的锯齿阈值更适合过滤器。
图 6:方向变化率的分布。RODC 分布具有显著的扩展,并随着阈值的降低而增加。显示了 10 和 20 点锯齿阈值的平均 WSG RODC。
从图 3 的讨论中,20 和 10 点锯齿阈值的平均 WSG RODC 值分别为 21.4 和 27.8。这些值位于图 6 中各自 RODC 分布的尾端。由于趋势区域的平均 RODC 值较小(<5),而回转区域的平均值较大(>20),回转过滤器将使用 RODC 的上限来减少回转的影响。
回转模型的输入是测试专家顾问中的回转过滤器的良好起点。
使用回转过滤器的交易表现
我们使用一个简单的趋势跟踪策略来估计盈利表现。单靠这个策略不会支持盈利交易系统,但有助于展示回转过滤器的表现。
长期交易策略要求快速移动平均线在指定的阈值数量(点)上超过慢速移动平均线。同样,短期交易策略要求快速移动平均线在相同的阈值数量下低于慢速移动平均线。快速移动平均期为 1–4 K线。进入或退出信号的其他规则是:
一次只能开一个交易。
布林带分离在上下限之间。
使用止盈、止损和移动止损退出交易。
交易的最大时长(K线数)是固定的。
新的买入信号会导致关闭空头头寸,反之亦然。
在生成交易信号后,使用锯齿模式属性过滤数据。锯齿模式有特定的窗口大小和阈值。过滤器逻辑是:
对允许的上下锯齿段数(RODC)设置上限。
对锯齿窗口的总回报大小设置下限(方程 2)。
在 2015–2022 年期间对五种货币对进行了评估,使用一小时图表。作为示例,图 7 显示了使用所述交易策略和回转过滤器的 EURUSD 货币对的盈利状况。手数为 0.10 时,通过 521 笔交易实现了 4845 美元的利润。
图7:欧元/美元的利润EA的回测测试表明,在8年的时间里,欧元/美元的利润稳步增长。
对于 EURUSD 货币对,最优锯齿阈值为 10 点。相应的 RODC 阈值为 16。
图 8 显示了五种货币对的测试结果,有无使用回转过滤器。表现结果通过盈利因子(利润/损失)和回报率(每笔交易的平均利润)进行衡量。在每种情况下,回转过滤器都提高了趋势跟踪策略的盈利能力。
图8:利润表现概述。在任何情况下,锯齿式过滤器都能提高趋势跟踪策略的利润率。
结论
市场回转期间,方向变化率增加;市场趋势期间,方向变化率减少。
RODC 有助于区分趋势和回转数据。
多段回转组的K线经常出现。
使用锯齿模式和 RODC 指标,回转过滤器提高了基本趋势跟踪策略的表现。
代码
Params
Numeric BkData(30); // 窗口大小
Numeric Lamda(15); // Zigzag 阈值
Numeric PerSmth(3); // 平滑周期
Vars
Numeric NumUp(0);
Numeric NumDn(0);
Numeric NumUD(0);
Numeric Idx(0);
Bool ModeUp(False);
Numeric ExtZigzag(0);
Numeric OneTick(0);
Numeric LamUp(0.0);
Numeric LamDn(0.0);
Numeric MULT(0);
Numeric Smoothed(0);
Numeric Xcls(0);
Numeric Xext(0);
Numeric i(0);
Events
// Bar更新事件函数
OnBar(ArrayRef<Integer> indexs)
{
Range[0:Datacount() - 1]
{
LamUp = Lamda;
LamDn = Lamda;
NumUp = 1; // 假设初始为上升模式
NumDn = 0;
NumUD = 1;
ModeUp = True; // 初始值
OneTick = MinMove * PriceScale;
MULT=IIF(PriceScale<1, 10, 1);
Xext = Close[BkData];
for Idx = i to (BkData - 1)
{
Xcls = Close[Idx];
if (ModeUp == False)
{
if (Xext > Xcls)
{
Xext = Xcls;
}
else if ((Xcls - Xext) / (OneTick*MULT) >= LamDn)
{
// 新模式
ModeUp = True;
Xext = Close;
NumUp = NumUp+1; // 增加上升模式计数
NumUD = NumUD+1; // 增加模式计数
}
}
else
{
if (Xext < Xcls)
{
Xext = Xcls;
}
else if ((Xcls - Xext) / (OneTick*MULT) <= -LamUp)
{
// 新模式
ModeUp = False;
Xext = Xcls;
NumDn = NumDn+1; // 增加下降模式计数
NumUD = NumUD+1; // 增加模式计数
}
}
}
if (NumUD == 0)
ExtZigzag = 100 / BkData;
else
ExtZigzag = 100 * NumUD / BkData;
Smoothed = Average(ExtZigzag, PerSmth);
PlotAuto( "RODC",Smoothed);
}
}