
自适应算法(第三部分): 放弃优化
介绍
在阅读本文之前,我建议您学习“开发自适应算法(第二部分):提高效率”系列的第二篇文章。本文采用的方法与前面讨论的方法有很大不同,但阅读前面的文章对了解主题将非常有用。
分析缺点
与上一篇文章一样,我将从分析上一个成功版本的缺点开始。在分析过程中发现了以下缺陷:
- 根据烛形分析生成仓位打开/关平信号,烛形的大小不稳定,它们有的大,有的小。基于下跌或上涨烛形的过度开仓并不少见。之后,下跌烛形和上涨烛形的数量变得相等,而未平仓的利润仍然是负数。那么,我们应该平仓还是等待获利?在前一种情况下,整个交易要点变得失去意义,算法开始接收损失。在后一种情况下,我们迟早会面临大幅回撤。
- 不管烛形的种类如何,价格都会变动。市场可能由下跌蜡烛主导,而价格上涨是因为上涨蜡烛比下跌蜡烛大。如果你有未平的仓位,这是特别不愉快的。
- 预测烛形未来大小的任务仍然没有解决。
- 有时,在开仓后,一种烛形的超额量在很长一段时间内不会减少,因此价格可能会继续逆着仓位方向波动,这会引起大幅回撤。最重要的是,目前还不清楚价格何时会反转,是否会完全反转。
- 仓位是按照时间开启的,有时,价格会在很长一段时间内保持不变,而随着新烛形的到来,仓位会继续打开。这样的时刻在节假日尤其危险,比如圣诞节,此时交易活跃度较低,算法只是因为时间而开仓。
- 算法设置应针对每个交易工具分别进行优化。设置这些参数的唯一原因是它们在历史上工作得更好。该算法通过了21年的回溯测试,但不是所有工具都通过。根据历史调整参数不是最好的解决方案。
- 目前还不清楚为什么它对某些交易工具的效果更好、更稳定,而对其他交易工具的效果更差。
- 当交易工具的行为发生变化导致算法遭受损失时,这也是未知的。事实上,不知道风险情况何时发生。我可以计算出这样一个时刻的概率,但这将是一个非常粗略的结果。
- 没有任何理论能够解释工具在未来将如何变化,以及为什么有必要使用明显次优的参数,以便价格序列的统计参数有波动的余地。这大大降低了盈利能力。
我认为以上所有的缺点都很严重。我们可以继续修改算法,一个接一个地改进特性,但最好是从中吸取一切精华,几乎从头开始开发。我将从修正理论基础开始。
该算法应该是完全自适应的,因此它将被开发用于货币和交易所市场,任何工具都能用。这一点很重要,因为人们应该清楚地了解一个市场与另一个市场的区别。如果有这样的理解,那么把它变成一个算法是有意义的。这一次,我切换到 MetaTrader 5 平台,因为它有一个功能更强大的策略测试器,不仅可以用于外汇交易工具,也可以用于交易所工具。
在开发过程中,您需要不断地回答这样一个问题:为什么某个参数具有某个值。在理想的情况下,在参数中设置任何值的原因都应该是合理的。
将蜡烛图转换为方块图
在新版本中,我决定不使用蜡烛图,因为它们的参数不稳定。更准确地说,只使用M1蜡烛,因为继续处理分时(tick)会导致资源消耗的显著增加。理想情况下,处理分时比较好。
我将分析N个点的块,这些块与 renko 类似,但它们基于稍微不同的算法。我已经在文章“什么是趋势,市场结构是基于趋势还是基于横盘”中提到了方块图及其在分析中的优势。
图 1. 方块图表
图1显示了一个方块图表,方块图的一般视图显示在图的底部,而上图显示了方块在价格图上的外观。方块是从一个固定的时间构建到过去和未来的。在图中,固定时间显示为黄色垂直线。这是一个零点,从这个零点,方块被构建成过去和未来。构造算法是镜像的,事实上,这些方块是建立在过去和未来在进一步的开发中将是重要的。
之所以需要区块,是因为它们的主要参数是稳定的、可控的,最重要的是,利润/亏损主要取决于价格在各点上的变动。
市场模型
基本模式类似于我在前面的算法中使用的模式:下跌方块的数量与上涨方块的数量之间的局部偏差,以及随后回归到某种均衡状态。这种模式是统计的,所以我们需要从分析方块图的统计特征开始。为此,我开发了一个特殊的指标 Max_distribution,如文章“什么是趋势,市场结构是基于趋势还是平缓的”所述。
该指标衡量分块价格序列的统计参数。它能够同时显示多个块大小的数据。例如,我们想知道块大小在10到1000点之间的图表有什么统计特征。在指标设置中设置最小块大小,并通过乘法因子获得所有其他大小的块。
主要的指标操作模式是衡量方块的数量价格垂直移动的N步。
图 2. 以24个步骤更改垂直块数
图2显示了一个示例。测量 N 步价格传递的块数。收集所需的样本数(例如,100),并定义平均值。这种分析是针对不同大小的区块进行的。
图 3. 不同方块大小的平均振幅
图3显示了24个方块分步中垂直平均振幅分布的示例。每个直方图列是其块大小的平均振幅值。样本数量为1000个。最小块的测量值在左边,而最大块的测量值在右边。对于大小为0.00015的方块,价格分24步在1000个样本中垂直移动5.9个区块。对于大小为0.00967的方块,价格分24步在1000个样本中垂直移动4.2个块。
红线表示参考值,如果价格序列是随机游走,则会出现参考值。对于24步,这是垂直方向上3.868块的值。参考值是通过组合方法计算出来的,可以用图4中的表格清楚地表示出来。
图 4. 计算24步的参考值
图4显示了在随机游走的情况下,价格平均分24步移动的区块的参考垂直值的计算。在最后一列中,此值转换为幂,随机游动的平均振幅趋于24^0.4526。可以为每个步骤数重新计算参考值。表格以.xlsx格式附在文章后面。
我对各种交易工具进行了研究:大约35种货币对、100多种股票、10种加密货币和大约10种商品,没有严重的偏差。一般来说,所有工具的图像都大致相似,平均幅度从快速增长的加密货币的7到货币对的3.8不等,一些低流动性股票甚至可能跌破3.8点。
平均振幅是在24步或其他一些步数中获得的,但这意味着什么?让我们用正弦波转换成块形式来表示图表,如图5所示。
图 5. 方块状正弦波
设块的大小为正弦波周期的一半,是24步,则周期数为48步。如果我们测量24步25个样本的平均振幅,我们得到24步10.33块的平均振幅。随着样本数的增加,平均振幅趋于12或步数除以2。价格序列不是正弦波,但正弦波便于交易。现在,如果我们在测量平均振幅时得到的值超过12,则块大小不够大,并且24个块不适合作为一半的周期。但小于12表示两个原因:方块太大,或者价格序列的趋势变化不像正弦波那样线性。我目前没有考虑趋势斜率,我稍后再做。
根据已开发的 Max_distribution 指标的读数,我们可以粗略估计价格序列与正弦波的相似程度。为了实现这一点,让我们看看正弦波的指标直方图是什么样子的。
图 6. 正弦波平均振幅与块大小的关系
在图6中,我们可以看到,在小区块的情况下,价格以24个步骤垂直移动24个区块。但随着区块大小的增加,价格以24个步骤移动区块的数量变小了。当块大小与波动幅度相当时,垂直方向上的块数降为零。在图3中,最大值为5.9,趋向于参考值3.868。因此,价格序列可以表示为“噪声”正弦波,在某些尺度上总是具有某种趋势分量。也就是说,市场应该总是有一个当前表现为横盘的标度(反转概率高于趋势延续的标度)和一个当前表现为趋势的标度(延续概率高于反转的标度)。
我以前的一篇文章《什么是趋势?市场结构是基于趋势还是横盘》解释了采用趋势和横盘定义的原因。
使用 Max_distribution 指标,我测量了不同交易工具的平均垂直区块数,不仅是24个,而且还测量了其他步数。示例如图7所示。
图 7. 平均振幅与样本步数的关系
图7中的白色列显示了从10到120的步数的测量运动幅度,每个测量的步数为2和1000个样本。红线表示给定步数的参考值。如我们所见,随着步数的增加,未观察到与主要趋势的显著偏差。测量值曲线的整体形状与参考曲线相似。测量值是使用 GBPUSD,但我也为其他工具做了研究。有许多交易工具的直方图值超过了参考值,但总的趋势仍然存在,可以用一个非线性方程来描述。
众所周知,市场不可能有稳定的简单规律。这意味着当前的趋势尺度在不断变化,同时,横盘尺度也会变得有趋势。
我将使用图7中24步的平均振幅,即 3.86。我假设运动是由趋势和类似正弦波的横盘部分组成。在这种情况下,可以计算平均振幅的趋势部分。为了实现这一点,24步的3.86*2=7.72个垂直块要四舍五入到8,因为这些块只能是整数值。如果我们到达趋势区域,那么价格在24步中垂直移动8个方块。当然,价格可以在24步中垂直移动24个方块大小,但这并不重要。我稍后再解释原因。
结果表明,价格在趋势区24步内垂直移动8个区块。这意味着在一个方向上有16个块,在另一个方向上有8个块。众所周知,趋势部分应紧跟在横盘部分之后,以便平均振幅保持稳定(在大量样本上相当稳定)。但市场不是正弦波。如图7所示,垂直块的数量随着步数的增加而增加。因此,我将假设在较少的步数中出现的与平均值的偏差返回到在较多的步数中的平均值。
图7中的图表允许我们定义价格在26、28、30、32和34个步数中的平均通过量:
26 步 = 3.98; 28 步 = 4.11; 30 步 = 4.2; 32 步 = 4.36.
在24步中,价格已经垂直移动了8个区块,但在28步中,它应该平均垂直移动4.1个区块,如果向下舍入到整数值,则为4个区块。这意味着,在接下来的4步中,可能从之前的4个块的移动中回滚(rollback)。市场并非如此可预测,事件不太可能按照这种情况发展。图7中的同一个图表允许我们定义价格在116步中垂直通过8个区块。
图 8. 可能的场景
图8显示了两种可能的场景,这是两个极端的选择。它们不太可能出现,而且是为了形象化。最有可能的是,这些事件将遵循中间场景之一。现在最重要的是,我们知道平均每个步的价格应该通过多少。如我们所见,回滚越尖锐,回滚越深,反之亦然。
从长远来看,振幅趋于其平均值。对于24步,这是3.8个垂直块,而对于116步,这是8个垂直块。
这是模型的结构,它允许根据趋势移动参数和进一步的价格行为计算每个交易工具的回滚特性。趋势变动越剧烈,回退越快,它变得越深。趋势越平坦,回退越大,深度越浅。现在所有这些都可以用数字表示,以工具的统计参数为基础。
图 9. 趋势运动与回滚深度
图9显示了它在真实图表上的外观。我们可以看到剧烈的波动和向左侧的剧烈的回滚,回滚深度超过60%。在右侧,有一个更平滑的波动和更长的回滚导致30%的回滚。这是因为价格在右图中经历了更多的步数,并且在运动形成过程中其幅度增加。
这种行为的原因不仅可以解释为价格序列具有它所遵循的平均振幅,而且还可以解释为资本的急剧流入/流出导致了剧烈的波动,其金额大大超过了当前的流动性。大量头寸开仓后,它也应当会平仓。谁拥有多少资金并不重要 —— 一个参与者还是几个参与者也是。如果我们立即全部平仓,价格会回到原来的水平,即回退100%。但如果考虑到流入的流动性,仓位逐渐平仓,那么较大的数量只会引起小的波动。交易者退出头寸的速度越快,他/她的资本产生的波动的回滚就越强烈。
重要的是,定价的基本特征证实了这种模式。
整个理论不在本节中描述,但足以据此开始开发算法。其余部分将在整个过程中进行描述。
跟踪趋势
与前面的算法一样,机器人要进行逆势交易,仓位由一系列订单组成。该算法的任务是尽可能精确地确定入口点,以生成序列开仓信号。理想情况下,信号在序列开始时产生的频率越高,单位时间内获得的利润就越多。这意味着信号应该是频繁的和高质量的。
机器人将分析下跌和上涨方块的数量,如果它发现上涨方块的数量与正常值有显著偏差,那么它就会为一系列卖出头寸生成一个信号。下跌方块也是如此,它们的偏离导致产生买入序列信号。
现在我要开发一个基本的算法,这个算法以后会修改,所以它的模块应该是灵活的。系列开始信号基于下跌/上涨方块超额百分比阈值。与前面的算法一样,要将分析的块数设置在从最小值到最大值的范围内。但是,这里这样做是为了其他目的。
开始和完成系列的阈值百分比
由于方块范围用于分析(例如,24-34),因此对每个块数使用固定的阈值百分比是不正确的。由24个区块和75%的主要区块组成的组合的概率不等于34个区块出现这种组合的概率。组合的概率是相同的,这意味着应用的阈值百分比应该是动态的,并且取决于这种组合的概率。
在设置中,阈值百分比是根据落入该范围的概率来设置的。然后应重新计算所需的块数。落入该范围的概率是用组合数学的规则来计算的。我创建了一个表,允许将概率转换为每个块数的阈值百分比。
图 10. 概率表格
图10显示了重新计算落入开仓百分比范围的概率的表格。该表格假设100%的移动在0-16垂直块的范围内,持续16步。落入2.1%范围的概率(对于图10中的表格)意味着只有2.1%的移动通过10-16以16个步骤垂直分块。在设置中,设置落入该范围的概率,例如2.2,同时算法使用表格搜索小于或等于2.2的最接近值,并取该值对应的百分比。现在,它是 81.25%. 因此,每个块数都有其自己的阈值百分比。表格以.xlsx格式附在文章后面。
在以前的版本中,当未平仓的总利润低于阈值时,仓位关闭。这不是最好的解决方案,因为它会导致多个问题。因为我在这个版本中使用固定大小的块,所以当超额的百分比下降到必要的值时,可以关闭仓位。如果在固定数量的块上打开仓位,则在操作过程中样本中的块数会增加。
平仓阈值百分比也通过落在该范围内的概率来计算。但落入范围的概率是相反的,不过,这没有什么关系。该表有一个单独的列用于计算平仓百分比。假设我想在值大于或等于75时平仓,就要找到大于75的最接近值。对于16个区块,这是78.9,对应于平仓百分比阈值=62.5%。
在操作期间,由于新的块被关闭,因此样本中的块数增加。因此,只要有仓位打开,每个新块上的更多块的关闭百分比就会重新计算。
系列中所有头寸的获利都设置为预期的平仓点。这就是根据当前市场状态控制回滚的算法的实现方式。样本中在序列开始(趋势运动)后形成的块越多,产生的回滚越少。
目前阈值百分比的实现并不完美。它是在算法开发的一开始就开发出来的,稍后,我将修改这个方法。所有打开/关闭百分比应根据测量当前块数的平均振幅进行调整。在当前的版本中,我没有考虑到价格序列参数对于上涨和下跌的市场是不对称的。这在外汇市场可能并不重要,但对股市来说却很重要。我将在算法的未来版本中考虑这一点。
阈值百分比的计算方法已经被开发出来,所以现在我们可以不经过优化就回答关于所需阈值百分比的问题。为此建立了以下公式:
;
- Nb - 用于分析的方块数目;
- aa - 根据给定块数的指标读数的平均振幅;
- Ka - 平均振幅乘数比率. 对于正弦波,比率为 2. 但是,这个值应该为市场定制,这样我们就可以增加一点;
- Kc - 计算平仓百分比的平均振幅乘数比率;
- %open - 开启序列的百分比阈值.
我们只能对单个数量的块执行此过程,而其余的块则使用概率表重新计算。
也可以根据指标读数预先计算平仓百分比。
;
计算平仓百分比的公式看起来是一样的,只使用不同的乘数因子 Kc。它应该等于1,并且可以自定义它。
基于平均振幅等于3.8的分析,您可以将24个区块的开启阈值百分比设置为66.67%。使用概率表重新计算其他值。
跟踪趋势
正如我之前提到的,市场没有稳定的模式和稳定的波动幅度。在一定数量的具有固定大小的块上分析趋势度是一个值得怀疑的解决方案。分析窗口应该是动态的,并且可以实时调整。将块数设置为24-28。
我为什么选择这样一个分析窗口?我是根据平均振幅=3.8选择这些值的。它们取决于阈值打开/关闭百分比。在一个信号之后有这个数量的块,我们在序列的开始处获得4个利润块。分析窗口中的块越多,算法就越精确。如果区块大小按比例改变,那么获得多少利润区块没有根本区别:4个或10个。然而,由于在每个新块处打开仓位,因此它们的数量随着操作精度的增加而增加。这将对结果产生负面影响。
接下来,我们需要定义最小块大小,以便进行分析。这些方块是根据形成的M1烛形构建的,最小离散化速率为1分钟。这些块不能做得太小,因为它们最终将在蜡烛内部构建,使得这样的分析毫无意义。因此,最小块大小将根据蜡烛的大小来确定。为了实现这一点,我们可以在一个大的时间段内使用ATR,比如1440分钟(一天)或更长的时间,并将其值乘以比率。2-5的比率应该是可以接受的,尽管这取决于交易工具的特点。
如果蜡烛的大小很不均匀,那么最好使用较大的比例。第二个标准是佣金和差价。4个方块的利润应该大大高于我们将支付的佣金。方块的大小越小,序列启动信号出现的频率就越高,我们可以赚取的利润也就越多。在这里我们需要找到一个平衡点。最后,最小块大小取决于烛形大小和佣金。选择最小块大小有明确的标准,
文中提出的块尺寸选择方法在理论和实践上都是很好的。不过,我已经有了一个基于改进市场模式的改进机制。解释新机制需要一篇单独的文章,因此我将仅限于上面描述的方法。
如果机器人分析一定数量的具有固定大小的块,由于市场参数总是变化的,市场趋势和回退的大小是不同的,因此需要一种自适应机制。
机器人分析具有最小尺寸的块。当它发现一个小的趋势区域,其超出的百分比超过阈值1时,它应该定义一个趋势存在的最大尺度。为此,应扫描更大的区域。由于用于分析的块的数量是固定的,因此我们需要增加块的大小,并查看在较大的块大小上发生了什么。我将最小块大小命名为TF1,类似于时间框架。这是一个合成块时间框架。较大的块将使用乘法比率KTF获得,例如,它将等于1.1。
1. 序列启动信号
有必要引入基本时间框架的概念(在这里和下面讨论时间框架时,时间框架是指块时间框架)。基本时间范围是检测序列开始信号的时间范围。
算法应该创建几个额外的块时间段,并在更高的时间段上检查序列开始信号。
在KTF=1.1的情况下,看下5个时间段就足够了。因此,最大的时间段块将比最小的时间段块大1.6倍。如果其中一个较高的时间段具有信号开始序列,则算法将切换到该时间段并使其成为基本的时间框架。在找到基本的时间框架后,我们需要再次创建5个更大的时间框架并重复扫描。这允许我们找到超过阈值的最大时间范围。
动画 1
在这个阶段,任务是找到一个最长的时间框架,在这个框架上有一个系列开始的信号,并使之成为基本的时间框架。动画1显示了这是如何工作的。我们可以看到算法扫描的是小块,一旦找到信号,它就增加块大小并选择具有最大块大小的基本时间框架。它计算出它所能确定的最大趋势的收盘位置的回退。
此时,使用块编号范围而不是固定值变得非常重要。在该示例中,在信号中搜索24-28个块的范围。具有更多块的样本被视为有更高优先级,如果在24和28块上都检测到信号,则28块成为基本样本。附加时间段的情况也是如此:在24-28个块的范围内搜索信号。具有更大数据块大小的时间段被视为更高优先级。在此时间范围内,优先考虑具有大量块的样本。
这种机制是必要的,因为在建造方块时存在一些不精确之处。大数据块大小的时间段并不总是覆盖更大的数据范围。
图 11. 构造方块的不精确性
图11演示了10个较大的块可能比10个较小的块覆盖更少的数据。使用24-28的分析块的数量范围来最小化这种影响。机器人可能会移动到更大的基本时间范围,并增加样本中的块数。在那之后,它将更容易移动到一个更大的时间段,而样本中的块更少。
所以,为什么 KTF = 1.1?乘法因子越低,算法越精确,但我们需要同时查看的时间段就越多。为了使块大小相对于基本时间段增加1.6倍,我们只需要查看5个时间段。如果 KTF = 1.05, 我们将必须考虑10个时间框架,它们带来了额外的计算负载。但乘法比越小,它就越精确。
2. 开启仓位的延迟
序列启动信号已经找到,但如果我们现在打开位置,由于自适应能力弱,结果将是可疑的。价格可能会继续向同一方向移动,而且很可能会这样。我们需要确保找到最大规模,趋势结束。为了实现这一点,序列开始信号应该在下一个时间段不存在,并且算法应该不能增加基本时间段。高时间段上的序列开始信号现在不存在,但是高时间段块覆盖了更大的数据范围,并且相对于趋势开始移到过去。
在定义了基本的时间框架之后,我们需要给价格时间,以便在更高的时间框架上生成一个信号。价格应该有足够的变动幅度,以便我们能够在更大的时间范围内变动。只有经过足够的时间在更高的时间范围内形成信号,但信号尚未形成,我们才能开仓。首先,我解决了(a)中描述的问题。然后我对这个机制进行了显著的修改,结果得到了极大的改善。我将在(b)点中描述它。
a) 在趋势阶段延迟
一般来说,高时间段的区块比基本时间段的区块更深入历史。这意味着我们应该等到24-28个更高的时间段块与基本时间段的24-28个块符合相同的历史范围。检查应在任何烛形上进行。
图 12. 延迟开仓,以便向更高的时间段移动
图12显示,我们需要等待2分钟,以便较大的块适应较小的块占用的时间范围。如果在延迟期间在其中一个较高的时间段(我们可以看到其中几个)上检测到序列开始信号,则基本时间段将增加,并且延迟将重复。如果算法在延迟后无法移动到更高的时间段,则已找到最大趋势标度,是时候打开一个仓位了。
这种方法是可行的,但还远远不够完美。它是在早期的算法版本中实现的,我将展示它的测试。因此,我介绍了它是怎样工作的。(b)中描述的改进延迟算法已在修改过程中开发。
b) 基于工具统计参数的延迟
方法目标与(a)中的目标类似。较高的时间段应涵盖与基本时间段相同的趋势部分。
在这种方法中,我将使用交易工具的统计参数来定义延迟完成时刻。在延迟期间,算法必须定义趋势结束,或移到更高的时间范围,或打开一个仓位。因此,最好的解决方案是使用较高的时间段块来计算延迟时间。由于一个交易工具的主要统计特征已经在 %open 阈值百分比中考虑在内,我将用它来定义延迟持续时间。
首先,定义接收序列开始信号(Vb)时价格垂直传递的块数。然后使用基本和下一个时间帧块大小来定义应该垂直传递以形成更高时间帧(Nd)的所有Vb块的更高时间帧块的数量。之后,知道价格通常不会严格垂直移动,并且知道移动的性质,我们需要计算较高时间帧(Nbd)的延迟块的数量。
;
- Vb — 序列起始的主要块数;
- mnb — 分析范围的最小块数。如果范围为24-28,则为24个块;
- Nd — 延迟编号;
- Bsd — 更高时间框架的方块大小;
- BSB — 基本时间框架的方块大小;
- kfd — 用于调整延迟块的数目的乘法因子;
- addkfd — 用于调整延迟块数量的加法系数。
例子: 如果 mbn=24; %open=75; BSB=0.00064; Bsd= 0.0007. 则 Vb=18. 这意味着24个方块中的18个方块应该是同一个方向。计算价格在基本时间框架内18个区块内移动的点数。18*BSB = 0.01152. 计算价格应该在较高时间段的18个区块内通过多少。18*Bsd = 0.0126. 定义缺少多少点以形成所有更高的时间段块。0.0126-0.01152=0.00108. 将获得的值除以更高的时间框架方块大小。Nd=0.00108/0.0007=1.54. 结果是1.54个块丢失,无法进入更高的时间范围。
如果价格严格垂直移动,则获得的值是有效的,事实并非如此。在24个方块中,只有18个在一个方向,6个在另一个方向。因此,1.5个区块应重新计算为交易工具的正确区块数。这就是我们如何得到 Nbd = 3. 因此,在现实中,鉴于这一交易工具的趋势走势特点,我们需要等待三个更高时间段的形成。
然而,仅仅等待所需数量的延迟块(示例中为3个块)通过并不是最有效的解决方案。只有当价格沿着检测到的趋势移动,并且有可能过渡到更高的时间范围时,等待才有意义。我们需要将Nd区块的最小数量乘以Bsd区块大小,并从基本时间段区块关闭价格中挑选出走向趋势的必要点数。这将是参考点的价格应达到,使移动到更高的时间框架。现在,在关闭每个新的更高时间段块之后,我们需要检查剩余的块是否足以使价格达到参考点。
例如:Nbd=3个区块,趋势为看跌。参考点位于基本时间段区块关闭价格下方1.54个区块。在较高的时间范围内形成下降块,然后形成增长块。仍保留一个延迟块。没有必要再等下去了,如果形成了另一个延迟块,它将不能穿过参考点。继续延迟是没有意义的。过渡到一个更高的时间框架不会发生,我们可以打开一个仓位了。
所有这些都显示在动画2中。
动画 2
我以正弦波为例,当前版本无法定义交易工具的统计特征。所以我手动设置开启和关闭的百分比。这个功能将在未来的版本中实现。算法是自行定义交易工具。它定义了块大小和开启仓位的时刻。
我们可以看到测试是从小块开始的。接下来,该算法在跟踪趋势的同时增加块的大小。在定义最大趋势大小后打开一个仓位,然后计算趋势的回滚。对于正弦波,回滚为100%,因此计算结束点并设置获利。我选择正弦波进行可视化,简化了对操作过程的理解。该算法利用几乎整个正弦波的振幅来盈利,除了在新的趋势段开始的第二个块的一小部分。
3. 跟踪序列
在打开序列中的第一个仓位后,算法继续寻找机会移动到更高的时间段,以便调整其工作,并在趋势继续的情况下移动到更高的时间段。当然,有些仓位是在较小的时间框架内开仓的,而有些仓位是在较高的时间框架内开仓的。回滚大小总是根据机器人发现的最大趋势来计算的。
由此产生的算法忽略了两个极端的市场条件。如果市场横盘,没有任何规模的趋势(这不是典型的交易工具),机器人永远不会开始这个序列。但是,如果市场处于稳定的趋势中,比如在大盘暴涨或暴跌期间,该算法就无法打开头寸,因为它会不断地增加时间范围,直到趋势结束。在这种情况下,要根据趋势本身的规模和交易工具统计特征的变化,调整趋势完成的标准。
结论
主要目标是开发能够处理任何数据的算法。如果输入数据不符合其稳定性标准,它将不会进行交易。换言之,我们的任务不是为特定的市场开发一个盈利的算法,并且试图预测价格走向。本文的任务是使算法在一定的条件下和价格序列的统计特性下都能盈利。只有在满足这些条件时,它才应该进行交易。如果我们知道算法交易利润的条件,当这些条件不满足时就不需要交易。在建立这样一个算法之后,它应该具备关于市场价格形成的细微差别的知识,以提高算法的效率。
所描述的功能仍然不足以实现稳定的自动操作,但是已经建立了基本的理论模型和算法操作的基础。完成的工作量已经相当大。把每件事都写进一篇文章是困难的,因此,我将在接下来的文章中描述其余的函数和测试。
已开发功能的参数已移动到设置,以便进行调整。在算法操作设置中设置某个值的原因有非常具体的解释,甚至有用来计算它们的公式。最终的算法将有许多设置。他们需要配置算法本身,因为它是相当复杂的,它的各个模块应该有效地相互作用。此算法中的设置不是为了根据历史调整性能参数,它们旨在优化模块的操作和交互。
在图表和指标窗口中构建方块的指标代码附在文章后面。这些都是相同的指标,但在可视化方面有所不同。这些指标的需求规范和先前算法版本的完整需求规范附在下面。
相关这个主题的之前文章
本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/8807
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
This article was written by a user of the site and reflects their personal views. MetaQuotes Ltd is not responsible for the accuracy of the information presented, nor for any consequences resulting from the use of the solutions, strategies or recommendations described.




非常有趣的工作!感谢您分享这种方法。
大多数情况下,价格会超过 100%的覆盖率......但所有情况下都会达到......
我只阅读了文件的架构部分。
最后两篇文章中描述的算法相当稳定。在相同的设置下,我对 SP500 指数的 56 种股票(5 年)、俄罗斯公司的 28 种股票(8 年)、28 种货币对(9 年)和 17 种加密货币对(3 年)进行了测试。没有任何优化,机器人自己完成了所有工作,并显示出稳定的结果,在所有测试结果的基础上显示出利润。这样或那样,但考虑到所有佣金,他的交易都是正数。但仍有工作要做。
在 28 个 SP 500 股票上是这样操作的:
在 28 只俄罗斯股票上也是这样,设置相同
长期以来,我一直在思考这样一个问题:运动并不会因为效率而结束,新的运动也不会因为效率而开始。很明显,平衡是不存在的,而市场总是试图达到平衡,制造新的偏离平衡的情况。市场在交易的同时,总是在失去平衡。交易越活跃,资金流入越多,偏离平衡的程度就越大。但你需要依靠一些东西,你仍然需要某种零点。在每一个尺度上,这个零点的位置都不同,因此,当在一个尺度上市场达到零点时,在另一个尺度上,它反而会离开零点。事实证明,从大尺度到小尺度之间存在着货币供应形式的反馈。
我不发布新的代码,因为它们已经比较昂贵了。即使是我发布的代码也给我带来了金钱,我还不准备在公开场合介绍当前的发展情况。
本文所采用的算法非常可靠。根据配置,我们在 56 个 SP500 指数(5 年)、28 个俄罗斯企业指数(8 年)、28 个股票(9 年)和 17 个股票(3 年)中进行了测试。机器人没有进行任何优化,一切都很顺利,结果很好,根据所有测试结果获得了利润。无论形式如何,他都是在考虑到所有因素的情况下,以有利可图的方式开展业务。但是,还有工作要做。
这就是 28 个 SP 500 分区的功能:
和 28 个俄语配置一样
我们已经有很多时间来思考,如果没有一个高效的移动装置,也没有一个新的移动装置,会是什么样子。显然,市场并不存在平衡,而市场一直在试图实现平衡,并创造出新的平衡条件。市场在运作的同时,也在不断失去平衡。市场越活跃,资金流入越多,平衡的破坏就越大。但是,人们需要对某种事物充满信心,也需要某种 "零起点"。在每个等级中,零点都位于不同的位置,因此,当一个等级的市场趋向于零点时,另一个等级的市场则相反。可以看出,在市场供应形式中,存在着大市场对小市场的反馈。
不要张贴新的代码,因为现在的代码太少了。同样,我发布的新代码也让我赚了不少钱,但我现在还不能立即公开我的开发成果。
他的工作非常出色,我也很喜欢他,但他的工作还有其他方面......
考虑到在一种绒毛中(绒毛被压缩并参考价格),在为提高工作效率所需的相同数量的绒毛中,绒头和绒羽之间的变化与绒毛的部分波动相同。所有音乐形式、音乐活动、音乐工具、音乐价格的任何变化,都会产生同样的效果。因此,所有乐器的效果都差不多。我们可以认为,一个动作只有在后退 50% 时才会结束。平衡。我们现在正在同一个地方......就像我说的,我不是数学专家,我需要几年时间来学习......与天鹅绒竞赛可能是一种非常粗鲁的方法......:)
下面,图片显示了欧元兑美元、布伦特和西门子的日波动率变化,最新的波动率是现在。欧元兑美元 布兰特西门子公司



这是供应与需求之间的结果,是一个负面市场的平衡空间。PS - 那么,在同样的变化幅度下,汽车保有量是否会相同呢?Quem sabe!:)
E eu acho o contrário ... quanto mais liquidez, mais equilíbrio / equilíbrio.这种方法能更好地保证更多的流动性......是未来的趋势。
他的工作非常出色,我也很欣赏,但他的工作有更大的局限性......
如果考虑到在一个vela(可压缩的脂肪,指的是价格)中,为了提高工作效率,你会发现在abertura和fechamento之间有一个变化,这个变化等同于vela中的部分波动。所有音乐形式、音乐活动、音乐工具、音乐价格的任何变化,都会产生同样的效果。因此,所有乐器的效果都差不多。我们可以认为,一个动作只有在后退 50% 时才会结束。平衡。我们现在正在同一个地方......就像我说的,我不是数学专家,我需要几年时间来学习......与天鹅绒竞赛可能是一种非常粗鲁的方法......:)
下面,图片显示了欧元兑美元、布伦特和西门子的日波动率变化,最新的波动率是现在。欧元兑美元 布兰特西门子公司
这是供应与需求之间的结果,是一个负面市场的平衡空间。PS--那么,在同样的变化量下,汽车数量是否会相同呢?Quem sabe!:)
E eu acho o contrário ... quanto mais liquidez, mais equilíbrio / equilíbrio.这种方法能更好地保证更多的流动性......是未来的趋势。
我不再分析蜡烛了。为什么,我在这篇文章中做了详细描述https://www.mql5.com/zh/articles/8136
但简而言之:价格的时间离散化引入了随机成分,最好将其去除。
目前,我使用的是由 N 个点组成的区块,但区块的大小不是静态的,而是动态的,会随图形的形状而变化。我开发了一种 "正确 "的价格量化机制,可以最大限度地消除价格序列中的随机成分。
我的机器人会在不同的工具上显示相同的结果,因为我特别试图了解某些资产的定价与其他资产的定价有何不同。当我们看蜡烛图时,烛台是扭曲的,我们不明白为什么欧元兑美元与原油不同,我们不明白根本原因。但如果采用正确的离散化方法,一切都会变得简单得多,基础也会变得清晰。
我还没有在文章中描述过这一点,但价格序列有一些特殊性。它们不是线性的。价格序列始终是 x/y 函数,具有非线性。通过分析非线性大小的区块,市场结构就会显现出来。大多数资产都是趋势性的,但也有持平的资产。此外,对于增长而言,它们可以是趋势,而对于下跌而言,它们可以是平缓的。也就是说,您正确地指出,有必要分别分析市场的上涨和下跌阶段。我不得不形成自己的趋势概念,并在这篇文章中写道: https://www.mql5.com/zh/articles/8184
也就是说,市场有偏离 50%概率的根本原因。这个原因就是市场波动的零点。但据我了解,您不仅需要分析最近的数值,还需要分析以前的数值。历史值作为当前偏差的附加系数,会增加或减少其重要性。
在图表上,您显示的是什么,是百分比刻度吗,我的理解对吗?
我不再分析蜡烛。为什么,我在这篇文章中有详细描述https://www.mql5.com/zh/articles/8136
但简而言之:价格的时间离散化引入了随机成分,我们希望摆脱这种成分。
目前,我使用的是由 N 个点组成的区块,但区块的大小不是静态的,而是动态的,会随图形形状的变化而变化。我开发了一种 "正确 "的价格量化机制,可以最大限度地消除价格序列中的随机成分。
我的机器人会在不同的工具上显示相同的结果,因为我特别试图了解某些资产的定价与其他资产的定价有何不同。当我们看蜡烛图时,烛台是扭曲的,我们不明白为什么欧元兑美元与原油不同,我们不明白根本原因。但如果采用正确的离散化方法,一切都会变得简单得多,基础也会变得清晰。
我还没有在文章中描述过这一点,但价格序列有一些特殊性。它们不是线性的。价格序列始终是 x/y 函数,具有非线性。通过分析非线性大小的区块,市场结构就会显现出来。大多数资产都是趋势性的,但也有持平的资产。此外,对于增长而言,它们可以是趋势,而对于下跌而言,它们可以是平缓的。也就是说,您正确地指出,有必要分别分析市场的上涨和下跌阶段。我不得不形成自己的趋势概念,并在这篇文章中加以阐述: https://www.mql5.com/zh/articles/8184
也就是说,市场有偏离 50%概率的根本原因。这个原因就是市场波动的零点。但据我了解,您不仅需要分析最近的数值,还需要分析以前的数值。历史值作为当前偏差的附加系数,会增加或减少其重要性。
在图表上,您显示的是什么,是百分比刻度吗,我的理解对吗?
谢谢您的回复。

正如我在您写这篇文章之前所做的,我只是在写完之后才理解了一些东西......:)
是的,我 现在理解了您的价格/蜡烛图,这是一种准确的方法,正如我告诉过您的延迟一样。
是的,我的图像也是用波动率百分比表示的。
正如我之前所说,所有时期的平均值、蜡烛图、走势、价格的任何部分、开盘价和收盘价都是任何时期内变化的 50%,真正的变化,其他 50%,都没有反映出来......
我也说过,蜡烛图只是价格的压缩和参考部分,但正如您所说,并不是您工作的最佳参考,现在,我明白了,这是一个很好的方法。您创建了自己的系统来切割价格:)
我会继续阅读您的文章。非常好的材料。谢谢您的分享!
下面是欧元兑美元每日变化率(波动率加价格变化)的图片,以满足好奇心。
欧元兑美元、欧元兑澳元和澳元兑美元的日叠加蜡烛图变化率。如果您在每种货币上以相同的保证金建仓,三个月后的结果将是点差和掉期的成本。
您的指标显示错误