文章 "MQL5 交易策略自动化(第24篇):集成风险管理与移动止损的伦敦时段突破系统"

 

新文章 MQL5 交易策略自动化(第24篇):集成风险管理与移动止损的伦敦时段突破系统已发布:

本文将搭建一套伦敦时段突破交易系统,可识别伦敦开盘前区间的突破机会,并支持自定义交易类型、风险参数来挂入挂单。系统内置移动止损、盈亏比、最大回撤限制等功能,同时配备控制面板,可实时监控与管理交易。

伦敦时段突破策略专门利用伦敦开盘时段市场波动率放大的特点:先识别伦敦开盘前形成的价格区间,再挂单,捕捉价格突破该区间的交易机会。该策略的价值在于:伦敦交易时段通常流动性充足、行情波动剧烈,能提供稳定的盈利机会;但同时必须做好严谨的风控,规避假突破与账户回撤风险。

本策略实现逻辑:计算伦敦盘前的最高价与最低价,设置带偏移量的Buy Stop 与 Sell Stop 挂单;结合盈亏比设置止盈、用移动止损锁定浮盈;同时限制持仓数量与单日最大回撤,以此保护本金安全。我们还将配备控制面板用于实时行情监控,并加入时段专属校验逻辑,确保仅在规定价格区间内开仓,让系统能够适配不同的市场环境。简而言之,下图即为我们所要搭建的整套交易系统架构示意。

策略的具体实现


作者:Allan Munene Mutiiria

 
etherxp #:
谢谢)

欢迎

[删除]  
你能把指标上传到这里吗?
 
hungxiro #:
您能将指标上传到这里吗?

请阅读上面的文章。

 
文章不错。感谢您的努力!
 
Kyle Young Sangster #:
文章不错。感谢您的努力!

当然,感谢您的善意反馈。欢迎您的到来。

 

我下载了这段代码,并通过策略测试器 按原样运行。它每天都能找到范围,并在图表上画出方框。但是,它并没有每天都进行交易(假设它应该这样做)。在 1 个半月的时间里,它只进行了 3 次交易。


贸易记录


第二个问题是控制面板中的高/低位和买/卖位没有更新。

控制面板不更新


在图表上可以清楚地找到高/低范围水平,因此我猜测买入/卖出水平也应该显示在图表上,并在控制面板中更新,因为它们直接来源于高/低范围水平。

您有什么建议可以让它正常工作?

先此致谢。

 
Kyle Young Sangster 策略测试器 按原样运行。它每天都能找到范围,并在图表上画出方框。但是,它并没有每天进行交易(假设它应该这样做)。在 1 个半月的时间里,它只进行了 3 次交易。



第二个问题是控制面板中的最高/最低水平和买入/卖出水平没有更新。


在图表上可以清楚地找到高/低范围水位,因此我猜测买入/卖出水位也应该显示在图表上,并在控制面板中更新,因为它们是直接从高/低范围水位导出的。

,您有什么建议可以让它正常工作?

,在此先表示感谢。

无法编辑我的评论;我使用的是 MT5 5.00 版本,第 5214 版。

 
Kyle Young Sangster 策略测试器 按原样运行。它每天都能找到范围,并在图表上画出方框。但是,它并没有每天都进行交易(假设它应该这样做)。在 1 个半月的时间里,它只进行了 3 次交易。



第二个问题是控制面板中的最高/最低水平和买入/卖出水平没有更新。


在图表上可以清楚地找到高/低范围水位,因此我猜测买入/卖出水位也应该显示在图表上,并在控制面板中更新,因为它们是直接从高/低范围水位导出的。

,您有什么建议可以让它正常工作?

,在此先表示感谢。

您好。感谢您的回复和反馈。假设你从未真正读过这篇文章,你只是做了即插即用的操作;该程序是以澳元兑美元符号开发的,因此在使用其他货币之前,请先在这里进行测试。这将让您深刻理解,因为随着货币对的变化,点数也需要调整。您可能还需要查看日志,寻找可能是由于设置错误导致失败的线索,但显然澳元兑美元和欧元兑美元的点数应该几乎相同。例如,您是在欧元兑美元上运行的,因此我们进行了类似的测试并尝试查看。

欧元兑美元测试

从图中可以看到有一个错误。这将导致测试无法正确运行。

另一个潜在原因是历史数据不可靠,尤其是在使用非常旧的数据运行时。在你的例子中,你是从 2020 年开始运行的。因此,让我们针对截图中的时间段进行测试。

历史数据贫乏

从 2020.01.01 到 2020.01.31(技术上是 2020 年 1 月)进行测试后,实际上没有进行任何交易。如您所见,数据质量很差,15% 的数据非常不可靠。红色部分显示的数据完全为零,将鼠标悬停在上面,可以看到空白时段。现在我们来测试一下 2025 年 1 月的数据。

100 数据

从图中可以看到,在历史质量为 100% 的情况下,我们有一些交易,一个月内有 19 笔交易。

因此,从你的问题来看,也许你需要检查测试数据的质量,因为我们已经证明默认设置在欧元兑美元符号上运行良好。希望这能说明问题并有所帮助。谢谢。交易愉快

 
Kyle Young Sangster 策略测试器 按原样运行。它每天都能找到范围,并在图表上画出方框。但是,它并没有每天进行交易(假设它应该这样做)。在 1 个半月的时间里,它只进行了 3 次交易。



第二个问题是控制面板中的最高/最低水平和买入/卖出水平没有更新。


在图表上可以清楚地找到高/低范围水位,因此我猜测买入/卖出水位也应该显示在图表上,并在控制面板中更新,因为它们是直接从高/低范围水位导出的。

,您有什么建议可以让它正常工作?

,在此先表示感谢。

至于您的第二个问题,文章中已经解释过了,但假设您的问题是由于测试数据不佳造成的,并给出提示,当范围处于计算状态时,您将始终看到 "计算中... "状态,直到有足够的数据来设置伦敦范围会话或您在输入中定义的会话。假设您使用的是默认设置,伦敦时间前为 3 小时,而您从共享截图中看到的时间是 2 月 13 日,22:00 之后的 2 个条形图是 2*15 分钟 = 30,因此给出的 22:30 在范围计算时间之外,所以面板上的数据应该仍然可见,因为之前设置的范围仍在起作用,除非尚未找到第一个时段,并且从午夜开始达到范围计算时将被清除。见下图:

const int PreLondonStartHour = 3; //--- 伦敦会议前的固定开始时间
const int PreLondonStartMinute = 0; //--- 固定的伦敦前起始分钟数

您可能需要查看以下查找范围的逻辑

//+------------------------------------------------------------------+
//| 检查交易条件并下单
//+------------------------------------------------------------------+
void CheckTradingConditions(datetime currentTime) {
   MqlDateTime timeStruct;            //--- 时间结构
   TimeToStruct(currentTime, timeStruct); //--- 转换时间
   datetime today = StringToTime(StringFormat("%04d.%02d.%02d", timeStruct.year, timeStruct.mon, timeStruct.day)); //--- 今天获取

   datetime preLondonStart = today + PreLondonStartHour * 3600 + PreLondonStartMinute * 60; //--伦敦奥运会开幕前
   datetime londonStart = today + LondonStartHour * 3600 + LondonStartMinute * 60; //--- 伦敦开始
   datetime londonEnd = today + LondonEndHour * 3600 + LondonEndMinute * 60; //--- 伦敦结束
   analysisTime = londonStart;        //--- 设置分析时间

   if (currentTime < analysisTime) return; //--- 如果在分析之前退出

   double preLondonRange = GetRange(preLondonStart, currentTime, PreLondonHigh, PreLondonLow, PreLondonHighTime, PreLondonLowTime); //--- 获取范围
   if (preLondonRange < MinRangePoints || preLondonRange > MaxRangePoints) { //--- 检查范围限制
      noTradeToday = true;            //--- 设置无交易
      sessionChecksDone = true;       //--- 完成设置检查
      DrawSessionRanges(preLondonStart, londonEnd); //--- 绘制范围
      return;                         //--- 退出
   }

   LondonRangePoints = preLondonRange; //--- 设置范围点
   PlacePendingOrders(PreLondonHigh, PreLondonLow, today); //--- 下订单
   noTradeToday = true;               //--- 设置无交易
   sessionChecksDone = true;          //--- 完成设置检查
   DrawSessionRanges(preLondonStart, londonEnd); //--- 绘制范围
}

以及如何设置。

//+------------------------------------------------------------------+
// 使用当前数据更新面板|
//+------------------------------------------------------------------+
void UpdatePanel() {
   string rangeText = "Range (points): " + (LondonRangePoints > 0 ? DoubleToString(LondonRangePoints, 0) : "Calculating..."); //--- 格式化范围文本
   ObjectSetString(0, panelPrefix + "RangePoints", OBJPROP_TEXT, rangeText); //-- 更新范围文本

   //---

}

请看下图,虽然我们不知道您测试的年份,但我们会取 2025 年,如果像您的情况一样是 2020 年,我们没有这方面的高质量数据,所以无论如何,我们都使用 2025 年,因此范围计算应从午夜开始。

23:55

从图中可以看到,23:55 时的数据仍然完好无损。但是,当午夜来临时,我们需要重新设置。请看下图。

午夜数据 00:00

可以看到,我们在午夜重置了其他范围计算的数据。实际上,当范围计算完成后,可视化可以帮助你了解真正发生了什么。例如,在您使用默认设置的情况下,我们将看到从 0300 时到 0800 时的运行条形图,因为这是我们定义的。见下图:

范围小时数

希望这能再次说明问题。您可以根据自己的交易风格调整一切。为避免您遇到的问题,建议您使用可靠的测试数据。谢谢。