攫取盈利至最后的点位

6 八月 2019, 09:19
fxsaber
0
1 137

概述

本文涵盖了一种算法交易方法。 它与 MetaQuotes 平台没有直接关系,适用于广大众体。 如果您有任何不清楚的术语,请使用搜索选项。 本文的目的是寻找一款可盈利的交易系统(或交易机器人)。

在哪里挖掘?

这也是每位交易者试图发现的。 已进行了数百万次尝试。 如果您对现有解决方案感到满意,可以跳过本文并切换到下一篇。 但更合乎逻辑的解决方案是搜索尚未被大众发现的宝藏。

土壤

有关创建交易系统的大多数讨论都与依据历史柱线和其上应用的各种指标有关联。 这是覆盖率最高的领域,因此我们不会再过多涉及。 柱线体现出非常人工的实体; 因此,我们将使用更接近原始数据的东西,即价格的即时报价。 这种方法可以为我们提供一些信息优势。

铲子

赚取盈利的任务非常困难。 所以,有一种观点认为,该任务应通过复杂的智力方法来解决。 这些包括了机器学习,经济学数学模型,等等。 所有这些都有一个非常明显的缺点:创建和测试的周期很长(由于计算复杂性)。 因此,我们采取相反的方式,这涉及非常简单和快速的思路。 从而,我们将能够搜索不在特定位置,但处于非常广泛范围内的市场形态。

这种方法也许看起来很笨拙。 但周围有太多的信息,使用考古流苏在一个特定的地方寻找宝藏是低效的。 因此,我们需要一个优良好的研究工具。 该工具必须能够处理数百万个任意即时报价。 它必须很快速。 它必须能够方便地可视化发现的结果。 它必须有简短明了的指导。

考古挖掘机

如果您能够运用任何数学软件包,并且已经准备好去开发满足上述要求的系统,那就太棒了。 如果还没有,我们来利用 MetaTrader 5 平台的策略测试器,并充分发挥其优势。

该工具能与来自不同经纪商的大量即时报价协同操作,并且还可以附加其他经纪商。 它在其数据库中存储计算结果,并可以显示各种参数。 它还有自己的多线程优化器,基于对所有变化的全面测试和基于用户标准的遗传算法。

交易算法

我们还需要一种简单快速形式的交易算法思路。 这可以是任何思路。 最重要的准测是其速度。 另外建议您避免算法内的循环。 收到新的即时报价,快速执行操作并退出。

本文选取这个算法的一种变体作为基础。 这似乎是文章的核心,需要明确披露。 但它并非如此。 本文的目的不是这个特定的算法。 这就是将其掩盖的原因。

MQL5

交易算法是以 MQL5 语言创建的一款智能交易系统(EA)。 我们决定不使用柱线和指标。 所以,我们不得不使用即时报价和订单(订单的历史)。 这些智能交易系统可以方便地以 MQL4 编写,然后利用 MT4Orders 交易库 在一行当中将其转换为 MQL5。

#include <MT4Orders.mqh> // https://www.mql5.com/zh/code/16006

我们可以利用一些非常有用的函数库创建一个跨平台的代码(可以在 MetaTrader 4/5 中运行)。 交易算法必须快速,并且在测试器中需要最少的检查。

资源

我们在哪里可以获得研究所需的价格数据? 即时报价的来源很多。 我们从中选择其一。

当您处理较高含金量的岩石时,找到金块的机会可能更高。 因此,我们将利用具有更高潜在利润的即时报价。 在论坛评论中论述了判断这种比较条件的方法(俄语,使用内置翻译选项)。 基于这种方法,我选择了这个数千兆字节的即时报价数据存档。 数十亿的即时报价。

自定义即时报价

可以使用自定义品种将即时报价导入 MetaTrader 5 测试器。 这也许是太复杂了,无法快速理解,因此我们将利用现成的脚本 ThirdPartyTicks ,它依据所选报价存档中的数据创建此类品种。

ThirdPartyTicks 启动窗口,下载整个报价存档


燃料添加剂

需要在合理的时间内处理数十亿笔即时报价。 在搜索规律时,我们需要为交易算法输入生成数万亿笔即时报价。 这非常耗时,因此我们需要一种加速机制。

实际上,并非每笔即时报价都需要。 由于我们了解我们的交易算法,因此我们必须知晓哪些即时报价不会导致交易变化。 这意味着我们能够识别出无用即时报价,并将其从历史中删除。 这一过滤非常有效:

总即时报价(EURAUD.rann)= 613541522134296即时报价/秒),保留 = 80023750
记录...
过滤后 (MinPips = 5) 即时报价 = 7820486 (12.75%)

日志显示,即时报价的数量几乎减少了一个数量级。

MetaTrader 5 测试器有时非常细致(绝对有用),并且它执行大量计算,这对于研究分析可能没有必要的(有时它们是错误的)。 如果您知道其操作的细节,则可以避免这种情况,但我们目前不会考虑它们。 关于这个主题有一个论坛讨论(俄语)。

以下是交易算法的 MQL5 实现中所需的内容:

  • 仅使用限价订单开仓/平仓。
  • 净持逻辑。 此外,应在 MetaTrader 5 中开立净持结算帐户。
  • 交易 1 手 — 盈利以点为单位。
  • 在服务器上启动,测试器中自定义品种没有佣金。
  • 自定义品种应设置为“兑换”。

单次启动结果应如下所示

单次启动 
    结果

高亮列示意使用限价订单执行持仓逆转。 它们全部按照要求的价格执行。 按照要求的价格准确执行非常重要。

即时报价

市场行为取决于日内时间。 因此,我们利用 BestInterval 函数库:为此,在 EA 源代码中写入两行:

#define BESTINTERVAL_ONTESTER // Optimization criterion - profit of the best interval.
#include <fxsaber\BestInterval\BestInterval.mqh> // Calculating the best trading interval

这将在 EA 中提供额外的输入参数

BestInterval 输入参数

我们按照 BestInterval 条件进行优化,即交易仅在日内的特定时间进行时,该条件等于 EA 示意的最高利润。

挖掘机

我们已准备了交易算法。 已过滤的自定义即时报价也已准备就绪。 现在我们需要通过 MetaTrader 5 测试器以某种方式将它们组合在一起。 这可以通过 MultiTester 方案来解决,它会自动使用每个自定义品种,并用此品种执行 EA 优化。

输入参数用来启动市场观察中所有自定义品种的优化


优化间隔

覆盖整个历史优化 EA 是没有意义的 - 如果它有规律性,或过度拟合,结果将很难理解。 由于我们受“数字脱粒机”计算的引导,我们依靠大量的交易。

对于统计结论,成交越多越好。 成交生存期越短,风险越低。 一般来说,大量的成交结果更好。 虽然对此没有正确的解释。

甚至于,我们需要高频交易,所以我们可以选择一个较小间隔。 它可能仍然会包含大量成交。

优化间隔

就是比最后四个月略少。

我们开始吧。


人工

81 个品种的所有计算(源自存档的所有数据)在 10 个小时内完成,其中一些时间我们用来让作者睡觉。 因此,在晚上进行测试更方便。 由于 MetaTrader 5 测试器是多核的,因此它还额外提供了 10 小时取暖。

检查 MetaTrader 5 测试数据库中的优化缓存。

优化缓存



从数据库中打开记录,并查看所选品种的相应优化结果。

手工检查所有变体(81)。 这个过程可以自动化,但尚未实现,因此我只得花费一个小时的时间。 我们来分析其中一个品种作为例子。 针对每个品种都做同样的事情。

一个品种优化结果


此处,如果一个品种的优化结果按 BestInterval 条件排序。 自定义品种的优点是不限制负余额。 就是余额大小不影响交易,所以无需关注于此。

我们搜寻大量的成交。 因此,选择红色列中的一个记录,并运行单个测试。 其交易图表如下:

全天候操作图表



这是全天候的交易。 在单个测试结束时可以找到以下记录:

BestInterval Action(true - single pass & MT4-style & Virtual is required) = false

Profit = -2392.00 = -2392.00 + 0.00 (0.00%) - Amount of Delete Intervals = 0 (2019.04.01 - 2019.07.20)
00:00:00 - 23:59:59 : Profit = -2392.00 (100.00%), Total = 2612 (70.64%), PF = 0.94, Mean = -0.92, DD = 3840.00, RF = -0.62
SUMMARY: 00:00:00 - 23:59:59 : Profit = -2392.00 (100.00%), Total = 2612 (70.64%), PF = 0.94, Mean = -0.92, DD = 3840.00, RF = -0.62

Profit = 4035.00 = -2392.00 + 6427.00 (-268.69%) - Amount of Delete Intervals = 1 (2019.04.01 - 2019.07.20), 20:00 - 08:00, CountHours = 11
00:00:00 - 07:58:54 : Profit = 1074.00 (26.62%), Total = 349 (76.22%), PF = 1.21, Mean = 3.08, DD = 709.00, RF = 1.51
19:41:38 - 23:59:59 : Profit = 2961.00 (73.38%), Total = 348 (76.44%), PF = 1.94, Mean = 8.51, DD = 358.00, RF = 8.27
SUMMARY: 00:00:00 - 23:59:59 : Profit = 4035.00 (100.00%), Total = 697 (76.33%), PF = 1.49, Mean = 5.79, DD = 484.00, RF = 8.34
BestInterval is saved in "TesterEA"-file in common(MT5)/base(MT4) folder.

final balance - InitBalance (10000.00) + Profit (-2392.00) without BestInterval.
OnTester - Profit (4035.00) with BestInterval.
final balance 7608.00 USD
OnTester result 4035

从记录中可以看出,为了实现 4035 点的利润,应该从晚上 8 点到早上 8 点进行交易。 若要查看交易如何,请转到输入参数,并指示需要激活 BestInterval。

BestInterval 激活


确保在 MetaTrader 5 中禁用优化模式。 以下是如何禁用它:

BestInterval 激活禁用优化


启动并查看 BestInterval 用例结果。

BestInterval 应用结果


检查单个测试日志,以便确保其运行良好

BestInterval Action(true - single pass & MT4-style & Virtual is required) = true
Calculation time activated intervals is 2019.07.23 16:27:25 - TesterEA (common folder) 00:13:14 ago.

Amount of Delete Intervals = 1 (2019.04.01 - 2019.07.20), 20:00 - 08:00, CountHours = 11
00:00:00 - 07:58:54 : Profit = 1074.00 (26.62%), Total = 349 (76.22%), PF = 1.21, Mean = 3.08, DD = 709.00, RF = 1.51
19:41:38 - 23:59:59 : Profit = 2961.00 (73.38%), Total = 348 (76.44%), PF = 1.94, Mean = 8.51, DD = 358.00, RF = 8.27
SUMMARY: 00:00:00 - 23:59:59 : Profit = 4035.00 (100.00%), Total = 697 (76.33%), PF = 1.49, Mean = 5.79

final balance - InitBalance (10000.00) + Profit (4035.00) with BestInterval.
OnTester - Virtual InitBalance (10000.00) + Profit (-2403.00) without BestInterval. Profit is calculated with TickValue=1 and w/o Commission+Swap.
final balance 14035.00 USD
OnTester result 7597

结果似乎很好。 有大量成交,余额图形非常平滑。 但现在有必要依据整个历史启动 EA。

检查依据整个历史记录的优化结果

每当我们得到一个糟糕的图表,表明在优化间隔中,我们的结果存在数理性过度拟合。 但结果在其他区段不起作用。 因此,如果您在实际交易中启动此策略,您会亏光存款。

前驱测试

MetaTrader 5 测试器支持前驱测试模式。 在我的观念里,这种测试是自欺欺人。 因此,更好的解决方案是依据整个历史查验两到三个好结果。 如果依据整个历史记录且得不到一个良好结果,则不要采用该策略。 执行前驱测试得到的更多结果,也是过度拟合。

黄金

图形始终如此糟糕吗? 我们的情况确实如此 - 依据整个可用历史记录测试时,优化值表现出不良结果。

依据整个历史测试结果之一

优化间隔以红色显示。 如您所见,如果测试周期比优化间隔长得多,则观察到良好的稳定性。


珠宝

在所有测试之后,已经能清晰地选择未来操作的品种:EURCHF。 上述测试的报告:

整个历史交易结果

以点为单位的数学期望以红色高亮显示。 这是一个非常重要的参数! EURCHF 的佣金约为 4.40 点。 这意味着经纪商将获得三分之二的利润。 这太多了。

删除 BestInterval 并添加输入,以便调整交易时间。 我们从最大回撤时间结束开始优化,在上图中用绿色标记。 如果有很多参数,则会进行遗传优化若干次。

为了避免在优化期间搜索规则性时出现强烈失真,请删除非系统数据。

非系统尖峰

为此,请在源代码中编写以下内容:

const bool TradeTime = (TimeCurrent() < D'2018.02.10') || (TimeCurrent() >= D'2018.02.12');

结果就是,我们在未过滤的品种中,设法增加了两倍数学预期收益。

马丁格尔/网格

当然,我尝试应用其他方法,例如订单网格等。 首先,我很高兴看到数学收益的增长。 但我无法解释原因。 我发现 MetaTrader 5 测试器对净持结算账户运用了不同的计算方法。 因此,显示的计算值不是我们期望看到的内容。 我编写了正确的计算:

// Calculating expected payoff on hedging accounts corresponds to traditional calculation.
double OnTester()
{
  double Res = 0;
  
  if (HistorySelect(0, INT_MAX))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
      Res += HistoryDealGetDouble(HistoryDealGetTicket(i), DEAL_VOLUME);
  
  Res /= 2;
  
  if (Res)
    Res = TesterStatistics(STAT_PROFIT) / Res;
  
  return(Res);
}

结果充分证实了一种理论:网格无法改善经过优化的交易策略。 这是一个精确而简洁的结论。

货币化

现在我们需要判定如何交易的思路。 审查不同经纪商的交易条件(包括价格历史),特别是检查限价订单的执行情况。 一些经纪商通过市价订单执行限价订单,允许负数滑点。 有些则禁止限价挂单部分埋单。 回避这样的经纪商,因为每一点对我们都很重要(参见文章标题)。 因此,在选择交易条件时我们必须非常小心。

交易策略本身意味着大量交易。

交易间隔示例


我设法找到一个合适的交易位置。 此处的初始限价挂单很快就会到达流动性提供者,从而增加了填单的机会。 此处另一个奖励是可能的滑点。 在数学期望中,每一点都很重要。 这至少能够抵消部分佣金。

实时交易

实时交易是在 MetaTrader 4 平台上进行的。 因此,我使用了跨平台功能。

为了达成实盘和测试结果的最大对应,我必须实现以下操作规化。

  • 启动智能交易系统后,利用 HistoryTicks 函数库 访问达至当前状态的即时报价历史记录。
  • 利用虚拟函数库,智能交易系统会在虚拟环境中自动调整即时报价历史记录。
  • 在 EA 设置里指定整个交易历史,直至当前时刻显示在浏览器中。 这能令输入值中的出错概率最小化。 如果有亏损,则必定存在错误。
  • EA 继续在虚拟环境中的每笔即时报价上进行交易。 如果关闭 EA,重新启动后它将继续交易,就像没有停止一样。
  • 非理想的真实环境不断与虚拟环境同步,其中执行是完美的。

所有这些步骤都是需要的,以便增加数学收益,但是我会将这些步骤应用到几乎任何交易系统。 当然,如果您不想受到打扰,可以省略此部分。 尽管,我看到这些步骤在实际交易当中是真正有助的。 这些步骤对于此类交易策略尤为重要。

多样化

仅选择一组输入值是不够的。 我们事先无法知道哪种优化变体将来会表现出良好的绩效。

因此,我迅速选择了八种变体,并在它们之间均衡等分。 所有这些都是同时启动的(八个图表,每个 EA 运行时有单独的 MagicNumber)。 这可能看起来像一个网格。 但它与网格交易系统无关。 这是八个独立的交易系统。

馅饼蛋糕

假设您启动了交易系统。 您接下来可以做什么? 有若干种方法。 从信任管理和 PAMM 到信号跟单服务。

由于我们正在讨论按点攫取利润点,则此策略仅可出于公关目的提供为信号。 订户将无法获利,因为他们在跟单时会出现负数滑点。 因此,对于他们来说,数学预期收益将变为负数。 这意味着很可能订户将会损失钱财。

当一种交易方法公开发布时,这可能导致整个系统或其基本原理的逆向工程。 这是从公开系统中受益的另一种可能性。

此外,有可能查看似乎良好的系统如何损失存款。 这是不可避免的。

回忆录

研究任何特定相关主题期间,您会遇到各种情况。 我还记得几个案例。 在这个帖子中曾提到过 EURDKK (俄语).

在红色间隔内交易系统优化的结果

该图显示了在红色间隔内经过优化的交易系统的性能。 我现在无法重现它。 但我记得优化间隔左边的图片更好,并体现为一条直线。 这几乎是一个圣杯,它是在真实账户上运行的,并且展示出类似于测试器的表现。 新的一年后,它开始持续亏损。 我足够明智地停止交易。 早期盈利后来我亏损了大约 10%。 我迄今不知道是什么造成的。

于此最重要的结论是,即使几乎是一个圣杯,也会造成亏损。 但我记得这个案子是由于其他原因,

这是 NOKSEK 品种。 您是否注意过这个品种? 为什么?


结论

这篇文章包含了一些哲学斗争:反对古典知识分子方法的“数字脱粒机”。 您可以为自己选择合适的解决方案。

一些技巧和思路可能会有所帮助。

本文中所有注意事项背后都有一个有趣的论断:如果您手中有一个可盈利交易系统,那么您很可能永远不会知道它。 我认为很多优秀的系统都被抛弃了。 文章表明,测试交易系统不仅仅是用一两个品种启动它。

您应该测试一天中的不同时间。 蒙特卡罗方法是不可取的。 这可能破坏有关系统盈利能力的结论。

通用系统不太可能获利。 您可以争取每一个点。

至于 MetaTrader 5 测试器,有时它很棒! 有时会令人失望,但如果没有测试器,就不可能完成如今的研究。 感谢开发人员! 我希望将来会发布改进的版本。

还有什么

我无法在本文中包含以下内容:

  • 其他品种。
  • 在 MetaTrader 5 中计算滑点。
  • 展示限价挂单的正滑点如何涵盖佣金。
  • 展示当前可用的 MetaTrader 5 不适合使用止盈。
  • 隔夜费对结果的影响。
  • EURCHF 系统在两个年度(2018 和 2019)的五月都显示出非常相似的亏损结果。
  • 创建通过自动优化器评估交易系统有效性的标准。
  • 创建混搭品种。
  • 遗传优化前,检测全部参数的重要性。
  • 品种的复验不应影响已发现的规律和交易系统的表现。
  • 解释测试器的结果很重要。
  • 点差或局部极值。

本文译自 MetaQuotes Software Corp. 撰写的俄文原文
原文地址: https://www.mql5.com/ru/articles/7113

开发一个跨平台的EA交易来根据风险设置止损和获利 开发一个跨平台的EA交易来根据风险设置止损和获利

在本文中,我们将创建一个EA交易,用于基于风险值自动进行入场手数的计算。此外,EA交易将能够以止损的比率来自动设置获利,也就是说,它可以根据任何选择的比率计算获利,例如3比1、4比1或任何其他选择的值。

轻松快捷开发 MetaTrader 程序的函数库(第九部分):与 MQL4 的兼容性 - 准备数据 轻松快捷开发 MetaTrader 程序的函数库(第九部分):与 MQL4 的兼容性 - 准备数据

在之前的文章中,我们已着手创建一个大型跨平台函数库,简化 MetaTrader 5 和 MetaTrader 4 平台程序的开发。 在第八部分中,我们实现了跟踪订单和持仓修改事件的类。 在此,我们将令其与 MQL4 完全兼容来,极大改进函数库。

通过谷歌服务安排邮寄活动 通过谷歌服务安排邮寄活动

交易者可能希望安排一次邮寄活动,以维持与其他交易者、订户、客户或朋友的业务关系。此外,可能需要发送屏幕截图、日志或报告。这些任务可能不是最经常出现的任务,但是拥有这样的特性显然是一个优势。本文讨论同时使用几个Google服务,在C#上开发适当的程序集,并将其与MQL工具集成。

轻松快捷开发 MetaTrader 程序的函数库(第十部分):与 MQL4 的兼容性 - 开仓和激活挂单的事件 轻松快捷开发 MetaTrader 程序的函数库(第十部分):与 MQL4 的兼容性 - 开仓和激活挂单的事件

在之前的文章中,我们已着手创建一个大型跨平台函数库,简化 MetaTrader 5 和 MetaTrader 4 平台程序的开发。 在第九部分中,我们开始改进 MQL4 的库类。 在此,我们将继续改进函数库,确保其与 MQL4 的完全兼容。