English Русский Español Deutsch 日本語 Português
preview
改编版 MQL5 网格对冲 EA(第 III 部分):优化简单对冲策略(I)

改编版 MQL5 网格对冲 EA(第 III 部分):优化简单对冲策略(I)

MetaTrader 5交易系统 | 2 十二月 2024, 09:50
621 0
Sahil Bagdi
Sahil Bagdi

概述

欢迎来到我们的“优化简单对冲策略”系列的第三部分。在本段落中,我们先简要回顾我们迄今为止的进展。到目前为止,我们已经开发了两个关键组件:简单对冲智能系统(EA)和简单网格 EA。本文将专注于进一步完善简单对冲 EA。我们的目标是通过数学分析和蛮力方式的结合来提高其性能,从而找到实现该交易策略的最有效途径。

本讨论将主要集中在简单对冲策略的数学优化上。由于所需分析的复杂性和深度,在一篇文章中同时涵盖数学优化、以及后续的基于代码的优化是不切实际的。因此,我们将在本文中专门讨论数学层面,确保对优化过程背后的理论和计算进行深入探索。在本系列的后续文章中,我们将把重点转移到代码的优化方面,将实用的编程技术应用于我们在这里建立的理论基础。

以下是我们计划在本文中涵盖的内容:

  1. 深入研究优化:仔细观察
  2. 数学优化
  3. 结束语


深入研究优化:仔细观察

当我们说“优化”这个词时,脑海里会想到什么?这是一个既宽泛又复杂的术语,它经常浮现一个问题:“优化到底是什么?”

我们将其分解:其核心,优化是指将某物(无论是设计、系统还是决策)的完美度、功能、或有效性精炼至最高水平的行为、过程或方法。但我们面对现实吧,达成绝对完美更像是一种理想主义的追求。真实目标?依据我们拥有的资源把边界推动到极致,并努力争取最佳成果。

随着我们深入研究,很明显,优化领域非常广阔,有无数的方法可供我们选择。在本次讨论的境况下,我们将重点放在“经典对冲策略”上。在众多的优化技术中,两种方式脱颖而出,将成为我们探索的基石:

  1. 数学优化:这种方式利用数学的纯粹力量来发挥我们的优势。想象一下,能够创建盈利函数、回撤函数、及更等,然后使用这些结构基于可靠的、可量化的数据来优调我们的策略。这种方法不仅提升了我们的优化精度,而且还为提高我们的策略有效性提供了一条清晰的数学路径。

  2. 蛮力方式:另一条路是蛮力方式,其简单但范围却令人生畏。该方式涉及测试每个可能的输入组合,针对每个输入进行回测以便找到最可行的配置。目标呢?为了最大化盈利、或最小化回撤,这取决于我们的策略优先权。但重点的是要意识到房间里的大象:难以承受的大量输入组合。这种复杂性令回测每种可能的场景都是一项艰巨的任务,尤其是在资源和时间有限的情况下。

而这就是将这两种方式结合起来的美妙之处。首先应用数学优化,我们可以显著降低蛮力穷举的数量。这是一种策略性举措,令我们能够专注于最有前景的配置,令蛮力过程更易于管理和节省时间。

本质上,优化经历的旅程是理论精度和实际可行性之间的平衡。从数学优化开始,通过筛选浩瀚的可能性奠定基础。然后,转向蛮力令我们能够严格测试,并优调其余选项。这些方法共同形成了一对强立的搭档,指导我们最有效地优化我们的经典对冲策略。


数学优化

在涉足数学优化领域时,第一步是建立一个清晰且可操作的框架。这意味着要对我们的结果有重大影响的变量进行描述 — 在本例中为盈利。我们剖析一下在塑造我们的盈利函数中扮演关键角色的组件:

  1. 初始位置(IP):一个二元变量,其中 1 表示买入动作,0 表示卖出动作。这个初始选择为交易策略的方向奠定了基础。
  2. 初始手数(IL):第一轮交易内第一笔订单的量级,为交易规模奠定地基。
  3. 买入止盈(BTP):买单的预定盈利阈值,作为何处平仓、及确保收益的目标。
  4. 卖出止盈(STP):类似地,这是卖单的盈利目标,标志着卖单平仓、实现盈利的点位。
  5. 买卖距离(D):该空间参数定义买入和卖出订单价位之间的间隔,影响交易的入场点。
  6. 手数乘数(M):这个因子渐增后续订单的手数,基于交易轮次的进展引入动态调整。
  7. 订单数量(N):一轮内的订单总数,封装了交易策略的广度。

为清晰起见,这些参数以其简化形式表示,但值得注意的是,在方程中,其中一些变量将用下标注释法表示。

我们依据这些参数为基础,我们现在可以继续制定我们的盈利函数。这个函数的本质是在数学上表述我们的盈利(或亏损)如何受到这些变量变化的影响。盈利函数是我们优化过程的基石,令我们能够定量分析不同场景下不同交易策略的结果。

现在我们来编写盈利函数的参数:

如此我们最终的盈利函数将如下所示:

初看,盈利函数的数学表达式和符号看似令人生畏。不过,没有必要被吓倒。方程式的每个组件都有特定的作用,当分解时,有助于全面了解在我们的交易框架内盈利是如何产生的。

现在重点是理解盈利计算的动态。这种理解的核心是主要盈利函数,表示为 p(x),与其分量 g(x) 之间的区别,其中 x 表示订单或持仓的总数。这种区别至关重要,因为它为理解涵盖 x 笔持仓的交易轮次完成时如何产生盈利奠定了基础。我们有条不紊地解构这个概念,以便充分掌握其本质。

假设我们决定用单笔订单结束交易轮次。该场景展开如下:


在此设置中,g(x) 基于订单数量 (N)、和初始位置 (IP) 之间的交互取值。例如,如果我们将初始手数 (IL) 设置为 0.01,且便于解释起见,设 N 为 1,设初始位置 (IP) 表示买入动作(即 IP = 1),那么 g(x) 将取买入止盈 (BTP) 的数值。结果就是,我们的盈利函数 p(x) 变为 100 乘以 0.01 乘以 BTP = BTP,象征性地表明我们的盈利等于 BTP。该概述突出了一个重点:我们以点数为单位计算盈利,而非按货币。这种方式是特意选择的,以便盈利计算能普适跨不同货币,确保其适用性无关账户类型(微型或标准),并简化整体计算。将手数乘以 100 的基本原理很简单 — 它有助于将手数转换为准确的点数值,这是准确计算盈利的重要步骤。

现在我们研究 N 增加到 2 的场景,引入一个新的复杂度层:

 

这种轻微的调整令我们的盈利计算复杂化,并促使对根本原因进行更深入的探索,最好通过示例来概述。这种复杂性的一个关键组件是 “floor” 向下取整函数的引入,这是一种数学运算,令人回想起我们在学校学习的最大整数函数(GIF)。“floor” 函数服务于一个特定的目的:给定任何数值,它将分数部分截断为前面最大的整数。对于正值,此操作非常简单:floor(1.54) = 1,floor(4.52) = 4,依此类推。这种机制是我们的盈利函数不可或缺的一部分,并确保在计算中只考虑整数值,这种简化令我们专注于正值,并避免在这种境况下考虑负值。

我们公式的初始片段首先计算影响等级(IL)的 -100 倍向下取整,以 IL 等于 0.01 的情况为例概述。则计算出 -100 乘以 0.01 的结果,等于 -1。当我们将其与距离(D)整合时,该方程表示每笔未产生盈利的交易亏损 D 点数,如交易策略中所述。下一步是将 100 乘以 IL,再乘以乘数(M)向下取整后加入函数 g(x) 之中,其代表买入或卖出订单的止盈(TP)值。IL 和 M 的乘积决定了后续(第二笔)订单的手数,将此乘积乘以 100 有助于准确计算点数。

关于我们的方程中是否需要 “floor” 函数,浮现了一个关键问题。为了澄清,请考虑一个 IL 为 0.01,且 M 为 2 的示例,结果是 100 乘以 IL,再乘以 M,等于 2。在这种情况下,将 “floor” 函数应用于 2 会得到 2,这看似 “floor” 函数变得多余。不过,“floor” 函数的用途在不同的场景中变得明显:如果 IL 保持在 0.01,且 M 设置为 1.5,则 100 乘以 IL,再乘以 M 的乘积等于 1.5。此刻,重点的是要意识到 0.015 的手数是不允许的,因为经纪商要求手数必须是 0.01 的倍数。根据该策略,订单规模将恢复到 0.01,随后的手数以受控方式增加,从而确保它们在经纪商的约束下保持可行。例如,下一次手数计算为 0.01 乘以 1.5,再乘以 1.5,等于 0.0225,实际上,它四舍五入后为 0.02。因此,使用 “floor” 函数来调整方程。从而适应这种操作现实,确保诸如 0.01、及随后的 0.02 等手数能准确表述。这种调整确保模型反映了交易的实用约束,并强调在策略指南下,“floor” 函数需要接纳手数当中的小数递增。最后,这个调整后的值乘以 g(x),它对应于买入止盈或卖出止盈,进一步将交易策略参数整合到方程公式之中。这个详尽的分解阐明了方程式每个组成部分背后的基本原理,并强调了其构造中蕴含的策略考虑。

现在假设 N 为 3,那么我们获得盈利:


在 N 设置为 3 的场景中,该公式概括了在某些条件下获利的情况,从而产生一种基于 N 表示的订单数量的结构化方式来计算结果。第一段保持一致,代表第一笔订单有亏损。第二段通过将 g(x) 替换为 D 来适配这种方式,也反映了第二笔订单亏损。第三段的区别在于 M^2 的引入,这表明乘数效应呈指数级增长,其在给定的上下文中直接明了。

将该框架扩展为 N 的不同值,提出了一个普适方程,它全面概括了该交易策略的动态。这个方程适用于不同的 N 实例,作为基本模型,来理解随着订单数量增加的进度和潜在成果。

g(x) 的判定在买入止盈(BTP)和卖出止盈 (STP)之间交替,取决于初始持仓(IP)和 N 的奇偶校验。这个二元决策过程被映射到一个条件结构中,其中结果受 IP 和数字特征 N 的影响,即强调据其奇偶性。该机制可确保 g(x) 值的逻辑分配,该值与基于市场位置和订单顺序的策略目标保持一致。


使用 Desmos 绘图工具,通过允许实时调整参数来促进对该方程式的交互式探索,通过对变化的即时反馈来增强理解。该工具的能力在于显示特定于整数的结果,在订单数量本质上是一个离散变量的实际境况下尤其有价值。


Desmos 的演示依据预定义参数,展示了模型在标准条件下的行为,并揭示了在涵盖 10 笔订单的范围内,可以预期 15 个点的持续利润。

注意:为了简单起见,我们暂时忽略了点差。

观察结果也许会产生投资该策略的愿望;然而,必须谨慎行事,不要急于做出任何决定。在继续之前,仍有许多挑战和问题需要解决。为了更全面地了解状况,在我们的表中引入一个额外的列将是有益的。在此之前,我们花点时间制定、并写下构成这个新列的方程式。该准备步骤可确保采用清晰、结构化的方法来分析数据,从而实现更明智的决策过程。


该方程概括了最大可能的回撤。澄清一下,如果该轮次结束于第 10 笔订单,如果第 10 笔完成的订单是一笔亏损交易,则最大回撤将会非常接近亏损的金额。这可在等式中展现出来, 盈利前的亏损 'n' 从 0 到 'x-1',而以前 'n' 是从 0 到 'x-2'。

所示方程定义了最大潜在回撤,这是理解该策略中风险的关键概念。例如,假设轮次于第 10 笔订单结束。在这种境况下,最大回撤金额可以被认为非常接近第 10 笔订单亏损时所导致的损失。封装在方程中的回撤计算,变量 'n' 从 0 迭代到 x-1。此部分指定用于计算回撤的范围。这与之前计算亏损的方法不同,之前所涉 'n' 的遍历范围从 0 到 x-2,随后是盈利。对方程参数的这种调整,通过在实现潜在盈利之前考虑最大可能的亏损情况,提供了策略的风险档案的更准确表述。

为了判定按我们的默认输入参数导致的最大可能回撤,我们仔细观察新引入的变量值如何随 'x' 而变化。这一步对于理解不同 'x' 对潜在回撤的直接影响至关重要,从而深入理解我们策略处于不同场景的相关风险。

鉴于我们在第 10 笔订单中获胜,我们预计最大回撤为 $15,345 美元。这个数字相当可观,尤其对比相对适中的 $15 美元奖励。考虑到这些动态,我们将 BTP 和 STP 从 15 点提升到 50 点,

现在我们看看结果如何,

这与我们之前的情况相比发生了重大转变,当时我们的亏损呈指数级增长。现在,我们发现自己处于一个持续实现收益的位置,突显出高度有利的风险回报率。伴以如此令人鼓舞的成果,它提出了一个问题:为什么要将自己限制在 50 点的目标上?我们来探索将目标扩展到 100 点的潜力。

注意这里的一个关键观察结果:涵盖 x 的所有值,c(x) 的值保持不变,而 p(x) 有所提升。这种差异也许会引起所有观察者的注意,因为潜在收益大于亏损具有显著优势。然而,人们一定好奇潜在的陷阱。为了解决这个问题,考虑 BTP 和 STP 两者是否都设置为 10,000 点。在这种情况下,价格达到这些目标需要很长时间。这让我们得出了一个关键的见解:BTP 和 STP 越高,完成轮的机会就越低,即达到 BTP 或 STP。本质上,这引入了一个隐藏元素,我们称之为 “p”,其表示轮次依据给定 x 完成的概率。不加选择地增加 BTP 和 STP 会减少 “p”,而 “p” 越低,轮次完成的可能性就越小。因此,无论潜在盈利如何,如果 'p' 最小,则预期盈利也许永远不会兑现。由于我们主要与 EURUSD 打交道,其中 100 点的波动已经很大,故我们针对 BTP 和 STP 都应用了 50 点的临时限制。该限制基于直觉,可以根据需要进行调整,以便有效平衡风险和回报。

计算 “p”,并计算我们的预期盈利是一项复杂的挑战。虽然数学优化提供了一种结构化的方法,但仅靠它无法判定 'p' — 轮次完成的概率 — 这需要图表分析才能更详细地理解。由于 p 本质上不稳定,且行为作为随机变化,因此进一步浮现出复杂性。重点的是要认识到 'p' 代表一个概率值的向量,每个元素都表示在一定数量的总订单后轮次结束的概率。例如,向量的第一个元素表示仅以一笔订单完成轮次的概率,该逻辑扩展到不同订单总数的其它元素。对于这个概念的全面研究,特别是其应用和影响,在本系列的下一期中,当我们过渡到基于代码的优化时,将是一个关键重点。

在我们的分析中,我们忽略了一个重要因素:点差。点差在我们的策略中起着举足轻重的作用,影响着盈利和亏损两者。为了解决这个问题,我们通过从 p(x) 和 c(x) 中减去某些项来调整计算,以便在我们的分析中包括点差。


重点要注意的是,我们的调整考虑了从 0 到 x-1 的所有交易,认识到点差会影响每笔交易,无论盈亏。出于简化,我们目前将点差(表示为 S)视为常数值。做出这个决定是为了避免我们的数学分析因点差波动的增加而复杂化。尽管这种简化限制了我们模型的真实性,但这样令我们能够专注于策略的核心方面,而不会因过于复杂而陷入困境。


现在我们已经在计算中引入了 s(x),我们打算把点差对我们盈利的实际影响进行量化。影响相当明显,随着 x 的增加,与点差相关的亏损会升级,潜在达到 32,000 点,或约 $3,200 美元。这种调整不仅令我们的潜在盈利减少了 s(x),而且令我们的潜在亏损增加了相同额度,从而明显改变了我们的风险回报率。这一转变突显了在我们的策略规划中考虑点差的至关重要性,并强调了在优化我们的对冲策略时需要仔细管理这一因素。

来到我们的最后一项任务,当我们谈论 “减少蛮力的情况” 时,我们指的是选择性地消除某些不太可能为我们的策略产生有益结果的参数组合的过程。该步骤对于优化我们的方法至关重要,尤其是在准备基于代码的优化时,因为它令我们能够将计算资源集中在探索最有前景的配置上。

例如,我们来研究这样一个场景:我们将参数 BTP(买入止盈点)、STP(卖出止盈点)、和 D(距离)都设置为 15,其中 M(乘数)为 1.5。

当我们分析这些设置的结果时,我们很快意识到这些参数会导致不满意的结果。因此,很明显,将这些特定值纳入我们的策略、或进一步的优化工作定是徒劳的。

那么问题就变成了,我们如何主动识别和剔除这种无效的参数组合?虽然我最初发现这些参数是偶然的,但系统地识别和剔除所有次优输入是一项重大挑战。这需要一种有理有据的方式,可能包括初步分析,以便评估不同参数集的可行性,然后再进行全面的蛮力优化。以这种方式,我们可以简化优化过程,并确保我们只花精力探索有望提高我们交易策略有效性的参数组合。

在优化过程中解决系统识别和剔除次优参数组合的挑战是一项复杂的任务,我们将在本系列的后续部分中解决。这种方式将确保对最有前景的策略进行集中和有效的探索,从而提高我们交易方法的整体有效性。就这些,我们到此为止,并在下一部分继续。


结束语

在本系列的第三部分中,我们开始针对优化简单对冲策略进行更深入探索,主要深入研究数学分析,并获取我们将在下一部分中所要作的蛮力方式的基本思路。

展望未来,本系列的后续文章将从理论探索转向基于代码的实用优化,将迄今为止获得的原则和见解应用于实际交易场景。这一转变有望锐化我们的策略重点,为寻求最大回报、同时有效管理风险的交易者提供切实的改进和可行的策略。

贯穿整个系列,您的参与和反馈非常宝贵,我鼓励您在我们前进的过程中继续分享您的想法和建议。我们不仅仅是一起优化交易策略;我们正在为更明智、更有效的交易决策铺平道路,这些决策可以经得起市场波动和不确定性的考验。

祝您编码愉快!祝您交易愉快!


本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/13972

比尔·威廉姆斯策略(或结合其他指标和预测) 比尔·威廉姆斯策略(或结合其他指标和预测)
在这篇文章中,我们将探讨比尔·威廉姆斯的一个著名策略,对其进行讨论,并尝试通过其他指标和预测来改进这一策略。
理解编程范式(第 2 部分):面向对象方式开发价格行为智能系统 理解编程范式(第 2 部分):面向对象方式开发价格行为智能系统
学习面向对象的编程范式,及其在 MQL5 代码中的应用。这是第二篇文章,更深入地讲解面向对象编程的规范,并通过一个实际示例提供上手经验。您将学习如何运用 EMA 指标,和烛条价格数据,将我们早期开发的过程化价格行为智能系统转换为面向对象的代码。
开发回放系统(第 46 部分):Chart Trade 项目(五) 开发回放系统(第 46 部分):Chart Trade 项目(五)
厌倦了浪费时间搜索应用程序工作所需的文件吗?在可执行文件中包含所有内容如何?这样,你就不用再去找东西了。我知道很多人都使用这种分发和存储形式,但还有一种更合适的方式。至少在可执行文件的分发和存储方面是这样。这里将介绍的方法非常有用,因为您可以将 MetaTrader 5 本身用作优秀的助手,也可以使用 MQL5。此外,它并不难理解。
密码锁算法(CLA) 密码锁算法(CLA)
在本文中,我们将重新考虑密码锁,将它们从安全机制转变为解决复杂优化问题的工具。让我们探索密码锁的世界,不再将其视为简单的安全装置,而是作为优化问题新方法的灵感来源。我们将创建一整群“锁”,其中每把锁都代表问题的一个独特解决方案。然后,我们将开发一种算法来“破解”这些锁,并从机器学习到交易系统开发等多个领域中找到最优解。