查看新文章:在 MQL5 中自动执行交易策略(第 24 部分):带有风险管理和跟踪止损的伦敦时段突破系统。
作者: Allan Munene MutiiriaAllan Munene Mutiiria
第二个问题是控制面板中的最高/最低水平和买入/卖出水平没有更新。
在图表上可以清楚地找到高/低范围水位,因此我猜测买入/卖出水位也应该显示在图表上,并在控制面板中更新,因为它们是直接从高/低范围水位导出的。
,您有什么建议可以让它正常工作?
,在此先表示感谢。
您好。感谢您的回复和反馈。假设你从未真正读过这篇文章,你只是做了即插即用的操作;该程序是以澳元兑美元符号开发的,因此在使用其他货币之前,请先在这里进行测试。这将让您深刻理解,因为随着货币对的变化,点数也需要调整。您可能还需要查看日志,寻找可能是由于设置错误导致失败的线索,但显然澳元兑美元和欧元兑美元的点数应该几乎相同。例如,您是在欧元兑美元上运行的,因此我们进行了类似的测试并尝试查看。
从图中可以看到有一个错误。这将导致测试无法正确运行。
另一个潜在原因是历史数据不可靠,尤其是在使用非常旧的数据运行时。在你的例子中,你是从 2020 年开始运行的。因此,让我们针对截图中的时间段进行测试。
从 2020.01.01 到 2020.01.31(技术上是 2020 年 1 月)进行测试后,实际上没有进行任何交易。如您所见,数据质量很差,15% 的数据非常不可靠。红色部分显示的数据完全为零,将鼠标悬停在上面,可以看到空白时段。现在我们来测试一下 2025 年 1 月的数据。
从图中可以看到,在历史质量为 100% 的情况下,我们有一些交易,一个月内有 19 笔交易。
因此,从你的问题来看,也许你需要检查测试数据的质量,因为我们已经证明默认设置在欧元兑美元符号上运行良好。希望这能说明问题并有所帮助。谢谢。交易愉快
第二个问题是控制面板中的最高/最低水平和买入/卖出水平没有更新。
在图表上可以清楚地找到高/低范围水位,因此我猜测买入/卖出水位也应该显示在图表上,并在控制面板中更新,因为它们是直接从高/低范围水位导出的。
,您有什么建议可以让它正常工作?
,在此先表示感谢。
至于您的第二个问题,文章中已经解释过了,但假设您的问题是由于测试数据不佳造成的,并给出提示,当范围处于计算状态时,您将始终看到 "计算中... "状态,直到有足够的数据来设置伦敦范围会话或您在输入中定义的会话。假设您使用的是默认设置,伦敦时间前为 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 时的数据仍然完好无损。但是,当午夜来临时,我们需要重新设置。请看下图。
可以看到,我们在午夜重置了其他范围计算的数据。实际上,当范围计算完成后,可视化可以帮助你了解真正发生了什么。例如,在您使用默认设置的情况下,我们将看到从 0300 时到 0800 时的运行条形图,因为这是我们定义的。见下图:
希望这能再次说明问题。您可以根据自己的交易风格调整一切。为避免您遇到的问题,建议您使用可靠的测试数据。谢谢。








新文章 MQL5 交易策略自动化(第24篇):集成风险管理与移动止损的伦敦时段突破系统已发布:
伦敦时段突破策略专门利用伦敦开盘时段市场波动率放大的特点:先识别伦敦开盘前形成的价格区间,再挂单,捕捉价格突破该区间的交易机会。该策略的价值在于:伦敦交易时段通常流动性充足、行情波动剧烈,能提供稳定的盈利机会;但同时必须做好严谨的风控,规避假突破与账户回撤风险。
本策略实现逻辑:计算伦敦盘前的最高价与最低价,设置带偏移量的Buy Stop 与 Sell Stop 挂单;结合盈亏比设置止盈、用移动止损锁定浮盈;同时限制持仓数量与单日最大回撤,以此保护本金安全。我们还将配备控制面板用于实时行情监控,并加入时段专属校验逻辑,确保仅在规定价格区间内开仓,让系统能够适配不同的市场环境。简而言之,下图即为我们所要搭建的整套交易系统架构示意。
作者:Allan Munene Mutiiria