智能系统健壮性测试
概述
在策略开发中,有许多错综复杂的细节需要考虑,对于初学交易者其中许多都未予重视。如是结果,众多交易者,包括我自己,都不得不历经苦难来学习这些教训。本文基于我观察到的大多数初学交易者在 MQL5 上开发策略时常见的陷阱。它将提供一系列提示、技巧、和示例,帮助辨别不合格的 EA,并以一种易于实现的方式来测试我们自己 EA 的稳健性。目标是教导读者,帮助他们未来购买 EA 时避免遭遇骗局,以及预防他们自己开发策略时的错误。
EA 市场的红色警示
快速扫视 MQL5 市场,显见该处主要由卖家支配,推销使用 ChatGPT 或 Gemini AI 等热门大语言模型的 AI 交易系统。我坚信这些说辞没一个靠谱,一个简单原因:使用商业大语言模型进行回测,几乎不可能涉及前瞻偏差。进而,流行大语言模型与 MQL5 的集成会用到网页请求函数。故此,若卖家没有明确指出 EA 需要网络或提示,那就不像是合规的。在交易中引入大语言模型更健壮的方式,应涉及实盘测试、或基于 BERT 等初等模型构建。一篇近期论文例证了这一方式。
不过,有一些需要在此澄清。人工智能不仅仅意指大语言模型,尽管大多数人假定如此。大多数先进的机器学习技术,包括无监督学习、监督学习、和强化学习,对于这些 EA, 都可归类为使用人工智能。故此,如果卖家声称售卖的是人工智能 EA,这也并非虚假营销,而是他们采用了一些神经网络模型。不幸的是,大多数基于 AI 的 EA 根本未用哪怕最基础的神经网络模型,尽管其声称如此。验证这一点的一条途径就是查看他们是否提供额外的 ONNX 文件。如果产品仅由一个可执行文件组成,那么他们必须在 EA 中硬编码所有模型参数,这通常导致文件大小超过一兆字节。
EA 市场中还有一些其它红色警示:
- 止损范围比止盈范围要大得多。他们往往用指标过滤掉回测中的亏损交易,令亏损少见,打造高胜率的假象。而实际上,一次亏损就能抹平数笔盈利交易。
- 卖家只在其信号中少量投资,比如 10-100 美元,而售卖的 EA 则要求 1000 美元或更高。这表明他们预见账户最终会爆仓,试图从小额账户中兑现高百分比收益。
- 而账户都是新开的,仅有少量交易,信号中能创造 100% 的胜率。
- 采用马丁格尔、对冲、本金摊薄、或网格系统。亏损后翻倍加仓,或在回撤期间于同方向上增多交易,这些策略无疑都提升了风险。这些经典方式可追溯到 20 世纪,不太像是“深藏不露的圣杯”策略,因为它们的预期回报小于或等于零。
此处是一个简要的数学证明:

如果他们的主干策略还没有明显优势(p 明显大于 0.5),那么回报期望低于或等于零,意即您长期来看会亏损,只是亏损还未落实。即使如马丁格尔或网格系统,据可盈利入场处构建,您的每笔交易仍旧会有最终亏光整个投资组合余额的风险,而不像大多数风险管理方式那样只有一小部分。如果您不确定账户大幅回撤时,您有能力保住更多资金,那我建议您不要用它们。
有件事需要澄清,即本章节旨在提高公众对当今 MQL5 市场盛行的常见虚假营销手法的感知,而非反对在 MQL5 上买卖 EA。事实上,我鼓励更多人在 MQL5 上销售 EA,当然是基于可信赖的营销、和真正健壮的 EA,从而助力营造一个更具信誉度的环境。
过度拟合
过度拟合是交易模型中常见的毛病,其中的策略在历史数据上表现良好,但在新的、前所未见的数据上普适失败。在本实验中,我们将用 Python 代码来演示交易模型中如何因参数选择而导致过度拟合发生。具体而言,我们将按照多特征随机生成交易场景,直观选择性过滤的影响,并观察若参数针对特定数据子集过度优化时性能如何变化。
我们从模拟一个包含 1000 笔随机交易样本的数据集开始,每个样本对应一个具有三个特征的交易决策:
- 特征 1:这可能代表各种市场状况,譬如 “a”、“b”、或 “c”。
- 特征 2:代表另一个因素,如 “d”、“e” 或 “f”,诸如资产波动性、或情绪。
- 特征 3:这或许代表其它交易指标,伴随的数值如 “g”、“h”、或 “i”。
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # Step 1: Generate random samples np.random.seed(42) # For reproducibility # Possible feature values feature_1_values = ['a', 'b', 'c'] feature_2_values = ['d', 'e', 'f'] feature_3_values = ['g', 'h', 'i'] # Generate random data n_samples = 1000 feature_1 = np.random.choice(feature_1_values, n_samples) feature_2 = np.random.choice(feature_2_values, n_samples) feature_3 = np.random.choice(feature_3_values, n_samples) outcome = np.random.choice([0, 1], n_samples) # Random binary outcome # Create a DataFrame df = pd.DataFrame({ 'feature_1': feature_1, 'feature_2': feature_2, 'feature_3': feature_3, 'outcome': outcome })
这些样本当中的每一个都会有一个对应的成果(胜或负),随机赋值 0 亦或 1。这些成果代表基于给定特征的假设交易结果,象征不同的参数值。
在真实世界交易中,选择正确的参数(诸如市场指标、交易时间窗口、或买卖信号阈值)对于模型表现至关紧要。然而,当模型过分调谐去适配历史数据中无法很好普适到新数据的特定形态时,就会发生过度拟合。
为演示这一点,我们首先只考虑特征 1 = 'b',特征 2 = 'd',且特征 3 = 'g' 的样本。
def plot_filtered_distribution(df, feature_filters): # Filter the DataFrame based on the specified feature values filtered_df = df for feature, value in feature_filters.items(): filtered_df = filtered_df[filtered_df[feature] == value] # Check if filtered dataframe is empty if filtered_df.empty: print("No data available for the selected feature combination.") return # Plot the distribution of outcomes based on the filtered data sns.countplot(x='outcome', data=filtered_df, palette='Set2') plt.title(f'Distribution of Outcomes (filtered by {", ".join([f"{key}={value}" for key, value in feature_filters.items()])})') plt.show() # Example usage: Visualize the distribution of outcomes when filtering by feature_1 = 'a', feature_2 = 'd', feature_3 = 'g' plot_filtered_distribution(df, {'feature_1': 'b', 'feature_2': 'd', 'feature_3': 'g'})

然后我们绘制结果分布,考虑样本,特征 1 = 'c',特征 2 = 'f',特征 3 = 'h'。

我们能清晰地看到,仅改变这三个参数,我们就能从随机生成的数据里挑出一个以亏损、或胜出为主的集合。这就展示了过度拟合的力量。专注特定的特征子集,我们强迫模型去适配狭窄的数的切片,而这会导致误导性结论。我们越是基于特征过滤数据,就越有可能观察到人为的高绩效(就成果而言),而这是过度拟合的堂匾。任意策略,为了过度拟合而配以足够多参数,终会得到盈利结果。
对于那些依赖基于特定参数集精调策略的交易者来说,这是一个极危警告,事因它们或许无法很好地普适未来的市场条件。关键定夺是模型的健壮性 — 即在广泛数据范围内保持绩效一致性 — 这远比针对狭窄参数范围进行优化更有价值。
在 MetaTrader 5 终端上优化
当我们试图为特定 EA、在覆盖特定时间段内的绩效选择最优值时,我们正在进行优化。如前面章节的演示,通过对少量参数小幅调整,很容易在少量随机数据上做到过度拟合。这引出了一个问题:我们如何在优化时避免这一错误,令我们的回测结果更具信誉度?本章节将探讨若干种途径,令以过度拟合风险最小化,确保在 MetaTrader 5 终端上执行优化时获得更健壮的结果。
1. 覆盖更长时间段的更多样本
根据大数定律,假设您的策略回报遵循某种分布形式,那随着样本数量增加,您的样本回报中值会近似该分布的中值。若非如日内交易或剥头皮那样的高频策略,建议使用至少 10 年、包括数千笔交易的数据进行测试。如果您的策略对宏观制度偏转敏感,仅据近期年份进行测试是可以接受的。然而,最终您需要足够的样本来验证该策略,因为到底多少样本才算足够并无统一规定。目标是明证存在一个历史性的重复形态,可运用到金融市场。
如果您的 EA 运行在较高时间帧,您可跨多种资产测试,来收集更多样本,潜在可能是将其转化成多资产策略。这种方式显著降低了过度拟合的似然性,在于策略的绩效将在更广泛的市场条件、及资产行为中接受测试。通过多元化的资产测试,您不光提升了策略的健壮性,也强化了其适配不同市场环境的能力。
2. 更少的可调参数
如前一个实验所示,您拥有的参数越多,优化过程筛选出获胜样本的途径就越多。在开始时随机生成的一个参数能够轻松筛选一组成功的结果,但这并不一定证明整个样本集的有效性。David Aronson 在《基于证据的技术分析》中调研了运用数据挖掘技术,并得出结论:单一可调参数策略不太可能存在,尽管它更不易出现过度拟合。推荐的方式是将可调参数的数量控制在少于五个。不影响结果的参数,譬如魔幻数字,不应被视为可调参数。像指标的回望周期这样的参数,能够固化为可广泛接受的数值,在这种情况下,它们不应算作优化过程中的可调参数。
3. 在您的回测和优化中审计佣金、点差、和掉期利率(隔夜利率)
使用策略测试器时,务必点击资金($)标志,检查设置的佣金、点差和利率是否反映您的实盘交易环境条件。


许多交易者错误地认为,如果他们的策略持续亏损,就意味着他们的行事与赢家策略所为相反。他们或许认为只要折返他们的交易方向,就将持续获胜。然而,事实远非如此。交易对散户来说是一场负和(非零和,因为无论胜负券商都会抽成)游戏。持续亏损的交易者更可能是其策略不再具备优势,其结果呈现出胜负随机分布。在这种情况下,亏损往往源于每笔交易支付的点差、佣金和利率费用。
相比您自行创建可盈利策略,您能开发出一款持续生成与盈利策略相反信号的策略更不靠谱。在前者情况下,您是在积极努力令策略获胜,而在后者中,您无所事事。
这就是为什么我不建议初学交易者尝试剥头皮策略 — 就统计数据而言劣势实在太大了。我们来参考一个示例:如果您正交易 EURUSD,典型条件的做市商(b-book broker)无佣金,但点差 1 点起;而 ECN 型做市商则是收取每手 7 美元佣金,而点差为 0.1 点起。如果您正在尝试 10 点止盈的剥头皮,无论哪种情况,每笔交易您实际上都支付了大约 10% 的佣金,无论胜负。对于高频交易者这尤其是个大问题,因为这些成本会随着时间逐渐蚕食盈利。
现在,假设您有一个 55% 胜率、风险回报比为 1:1 的健壮策略。如无点差或佣金因素,您的净值曲线即使按专业标准来看也很漂亮:

但因为您尝试剥头皮式小额盈利交易,而产生的佣金、点差和利率会带来 10% 成本,效果是增加了每笔交易的相对成本,您的净值曲线将变成劳而无获,如下所示:

模拟 Python 代码:
import numpy as np import matplotlib.pyplot as plt import pandas as pd # Parameters n_trades = 1000 # Number of trades win_rate = 0.55 # 55% win rate commission_rate = 0.1 # 10% commission per trade initial_balance = 10000 # Starting balance trade_amount = 100 # Amount per trade # Simulate the trades np.random.seed(42) # For reproducibility # Generate random outcomes (1 for win, 0 for loss) outcomes = np.random.choice([1, 0], size=n_trades, p=[win_rate, 1 - win_rate]) # Initialize balance and equity curve balance = initial_balance equity_curve = [balance] # Simulate each trade for outcome in outcomes: # Calculate the result of the trade if outcome == 1: # Win: add profit (trade_amount) and subtract commission balance += trade_amount - (trade_amount * commission_rate) else: # Loss: subtract loss (trade_amount) and subtract commission balance -= trade_amount + (trade_amount * commission_rate) # Append the updated balance to the equity curve equity_curve.append(balance) # Plot the equity curve plt.figure(figsize=(7, 4)) plt.plot(equity_curve) plt.title('Equity Curve with 10% Commission on Each Trade') plt.xlabel('Number of Trades') plt.ylabel('Balance') plt.grid(True) plt.show()
4. 在优化过程中采用更大步长,留意参数敏感性
在 MetaTrader 5 终端中优化,您可以调整每次参数试训的步长。建议采用相对于参数常用值更大的步长。专注于非常具体的数值很容易导致过度拟合,以及对制度偏移的敏感性。例如,去年,中值回归策略在 RSI 回望周期为 11 时效果最佳,但今年可能就是 13。如果我们专注于小而递增的数值,或许会错过相对于参数的更广阔绩效形态,且把时间浪费在低效优化上。

个人而言,我更喜欢用盈利因子作为指示绩效的量值,因其是一个比率,而非像总体回报那样的绝对数字。
盈利因子 = 毛盈利 / 毛亏损。
参数敏感性同样至关紧要。我们希望确保试训覆盖每个参数可能的广阔数值范围。理想情况下,最佳值周围区域应呈现凹形分布,随着参数值偏离最优设置,性能以稳定速率逐渐下降。这确保了尽管参数值变化下,策略依然维持优势,最佳绩效参数代表了策略的最优设定。

样本外测试
无论您正在优化参数,亦或在不同时间帧和品种上测试 EA,最好在您的测试中排除近期数据。在您修改原始 EA 之前,这些数据点应当在您的认知区域以外。这种方式被称为样本内/外测试。
该测试方法的目标是避免前瞻偏差,即基于近期市场行为的已知特征修改了 EA。它还有助于降低优化过程中的过度拟合风险。
为了实现这一点,首先确定您计划测试的总体样本规模。基于样本测试数量,您可选取样本内至样本外的比例,如 7:3、8:2、或 9:1。然后您用样本内数据对参数值和信号规则进行所有观察、推断、及修改。后续,应用最终的 EA 在样本外数据上进行回测,从而验证您的推断是否坚守始终。如果一款 EA 在样本内优化测试中取得优异结果,而在样本外测试中徒劳无获、甚至亏损,这可归咎为由于近期的形态偏移导致优势被侵蚀,或在样本内优化期间过度拟合。
当评估 EA 在样本内/外测试中是否始终如一时,有若干个关键量值要考虑。
首先,您应当创建一个没有杠杆复利效应的 EA 版本,因其可能会扭曲结果,并过度强调样本集尾部的重要性。
以下是需要关注的主要量值:
-
盈利因子:盈利应大于 1,合理范围在1.2 到 1.5 之间。盈利因子低于 1.2 或许表明该策略盈利能力不足,而数值高于 1.5 则可能表明样本量太小、或未考虑交易成本。而这并不一定意味着您的策略是骗局,若结果看起来不切实际,您就应当保持警惕。
-
最大净值回撤:专注最大净值回撤而非绝对回撤,因其它反映出潜在风险,而非已发生的风险。最大净值回撤应比您的个人最大回撤冗余至少要低 10%。如果风险过低,您可考虑提升 EA 的风险;如果风险过高,您或许需要重新评估您的策略风险配置。
-
LR 相关性:线性回归(LR)相关性衡量您的净值曲线的一致性。相关性大于 0.9 是整个测试周期内回报相对稳定的迹象。这有助于确保策略没有大幅波动,其绩效稳定。
-
多空仓位的胜率和交易量:如果您的 EA 多空双向交易,确保它们的胜率和交易量大致相近。若两者之间存在显著差异,可能是策略存在失衡的信号,或许要加以解决。
而其它量值也很重要,但评估您的 EA 可靠性时,无论是在样本内/外测试期间,这三项都是要留意的主要因素。

一些传统交易者优选前向游走分析,即逐片段执行样本内/外测试,“前向游走”直至当前时间点。然而,我认为这往往不必要,尤其若我们已确保参数的数量较少,且未过度拟合到特定数值。在这种情况下,这些最优参数值很可能会随时间维持一致。进而,我们已强调过,策略优势的关键在于其信号规则,而非其参数值。因此,一次样本内/外测试就足以验证结果。
话虽如此,那些基于机器学习的策略,情况有所不同。这些策略的优势通常来自底层机器学习模型的参数,而这些或许会根据训练数据的时间周期而显著变化。在这种情况下,前向游走分析变成必要项,审计模型性能伴以不同数据集时如何随时间变化。我在这篇文章中详细解释了如何实现前向游走分析。最终,关键定夺是 EA 在近期必须维持一定的盈利,才能确认其持续生存力。
异常值测试
异常值测试确保您的盈利并非受到少量异常值交易的驱动,审计收益的大部分,源自稳定、平衡的盈亏。这很重要,因为如果盈利主要来自少量异常值,就会削弱以更多样本来近似平均回报的价值。为了检查这一点,只需验证您的回测净值曲线,确保其上升非由少量毛刺导致,而是稳定、持续的成长。此外,您还能够比较回测报告中最大收益与平均增益来确认这一点。
我们还希望确保盈利不是主要集中在短时间内,因其可能表明暂时的制度偏差。为检查这一点,我们会验证月度回报的分布,从而确保一致性。首先,在报告上右键点击,并保存,以获取回测报告。

然后打开文件,留意 “Deals” 字段的行数(在本例中是 9342)。

import pandas as pd import matplotlib.pyplot as plt # Replace 'your_file.xlsx' with the path to your file input_file = 'your_backtest.xlsx' # Load the Excel file and skip the first {skiprows} rows, skiprows = the row of "DEAL" data = pd.read_excel(input_file, skiprows=9342) # Select the 'profit' column (assumed to be 'Unnamed: 10') and filter rows as per your instructions profit_data = data[['Time','Symbol','Profit','Balance']][1:-1] profit_data = profit_data[profit_data.index % 2 == 0] # Filter for rows with odd indices profit_data = profit_data.reset_index(drop=True) # Reset index # Convert to float, then apply the condition to set values to 1 if > 0, otherwise to 0 profit_data[['Profit','Balance']] = profit_data[['Profit','Balance']].apply(pd.to_numeric, errors='coerce').fillna(0) # Convert to float, replacing NaN with 0 # Load the data data = profit_data # Calculate percentage gain compared to the previous balance data['percentage_gain'] = data['Profit'] / data['Balance'].shift(1) * 100 # Drop the first row because it doesn't have a previous balance to compare data = data.dropna() # Ensure 'time' is in datetime format data['Time'] = pd.to_datetime(data['Time']) # Extract the year and month from the 'time' column data['year'] = data['Time'].dt.year data['month'] = data['Time'].dt.month_name() # Ensure months are ordered correctly (January to December) month_order = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] data['month'] = pd.Categorical(data['month'], categories=month_order, ordered=True) # Calculate the total return for each year-month combination monthly_return = data.groupby(['year', 'month'])['percentage_gain'].sum().unstack(fill_value=0) # Function to apply color formatting based on return value def colorize(val): color = 'green' if val > 0 else 'red' return f'background-color: {color}' # Display the table with color coding styled_table = monthly_return.style.applymap(colorize, subset=pd.IndexSlice[:, :]) # Show the table styled_table

在长线回测中,回撤月度几乎不可避免,但此刻我们需要专注于回报百分比,并确认没有任何一次回撤显著大于整个样本集的平均回报。
最后,如果您的 EA 交易多项资产,我们必须确保没有单一资产承包了盈利主体,而其它资产贡献微薄。为此,我们可扩充原始 Python 代码,添加代码行来生成一个饼图,展示跨不同资产的回报分布。
import seaborn as sns # Group by symbol and calculate the total profit/loss for each symbol symbol_return = data.groupby('Symbol')['percentage_gain'].sum() # Plot the pie chart plt.figure(figsize=(7, 3)) plt.pie(symbol_return, labels=symbol_return.index, autopct='%1.1f%%', startangle=90, colors=sns.color_palette("Set2", len(symbol_return))) # Title and display plt.title('Total Return by Symbol') plt.show()

我们只需确保没有单一资产主导饼图。
高级建议
于此我列举了四种更高级的健壮性测试,或许需要更多专业知识和时间。
1. 实盘交易测试:
在真实或纸面交易环境中,以较小规模仓位实现该策略,并在真实市场条件下监控其随时间的绩效。实盘交易能测试出策略应对真实市场动态的能力,包括滑点、点差、以及执行延迟。
它有助于评估该策略在真实交易条件和情绪压力下,能否如预期执行,或超越回测或模拟成绩。
2. 蒙特卡洛模拟:
运行一个蒙特卡洛模拟,随机打散交易成果(盈亏)的顺序,并生成大量可能的净值曲线。还可包括针对入场点、或止损等参数的随机调整。
蒙特卡洛模拟有助于评估策略应对随机市场条件的健壮性,提供潜在最糟糕场景的洞察,并确保策略不会依据以往数据过度优化。
3. 回撤与崩盘风险分析 :
分析该策略的最大回撤,即净值中峰顶至谷低的最大亏损,并计算破产风险,或是按当前风险/回报配置,账户余额降至零的概率。
这些量值提供了策略风险配置的更深入理解,有助于评估最大回撤是否可接受,以及在特定市场条件下账户亏光的似然性。这种分析对于长期生存至关紧要。
4. 滑点与执行模拟:
在预期进出点与实际市场执行点之间引入随机变化,模拟滑点和真实世界的执行延迟。您可基于市场波动性、交易规模、和流动性等因素来为滑点建模。MetaTrader 5 策略测试工具有压力测试,对此很有帮助。
执行是影响真实世界盈利能力的关键因素。该测试有助于评估策略对于滑点的敏感度,以及在不理想的执行条件下是否仍能维持盈利。在大多数仅在高波动时期交易的策略中,比如新闻事件策略,滑点尤为紧要。除此之外,我提议大多数散户不必专注于此,因为滑点是双向的。在大多数情况下,正、负滑点相互抵消,相较于其它交易成本,令其影响相对较小。
结束语
在本文中,我演示了如何严格测试您的智能系统,或任何卖给您的智能系统的健壮性。首先,我提高了人们对潜在营销手段的感知,即在 MQL5 市场中卖家如何采用欺诈性操控数据,并解释了这些手段为何无效。接着,我利用一个 Python 实验概述了过度拟合的概念。其后,我概括了在 MetaTrader 5 中执行回测和优化时要考虑的关键因素,并解释了每个提示背后的动机。随即,我讨论了样本外测试,详细说明了如何评估各种报告量值。我还涵盖了三种异常值检测 — 交易、时间、和品种 — 并提供了如何检测每种异常值的明确指导。最后,我针对更高级的健壮性测试提出了进一步建议,并完结本文。
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/16957
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
本文由网站的一位用户撰写,反映了他们的个人观点。MetaQuotes Ltd 不对所提供信息的准确性负责,也不对因使用所述解决方案、策略或建议而产生的任何后果负责。
MQL5 简介(第 11 部分):MQL5 中使用内置指标的初学者指南(二)
精通日志记录(第六部分):数据库日志存储方案
价格行为分析工具包开发(第19部分):ZigZag分析器
您应当知道的 MQL5 向导技术(第 53 部分):市场促进指数
两者之间的巨大差异可能预示着策略失衡,需要加以解决。
这是否适用于偏向趋势方向(买入趋势比卖出趋势占主导地位的时间更长。EA 的胜率和交易量是否仍然相似?
感谢您的评论。
这取决于策略中涉及多少贝塔值。如果单一资产策略的交易时间框架更高、持有期更长,那么策略结果很可能会偏向宏观趋势。这就是为什么我建议大家通过更高频率的交易或在多个不相关资产上分散策略来交易大额(交易量)策略的原因。如果一个策略的优点不涉及趋势偏差假设,买入和卖出规则对称,那么在大样本量下,它应该会有相似的交易量和胜率。
当然,有些策略也会有趋势偏差假设,比如某些指数多头策略。对于这类策略,交易者应该只交易一边,因为他们的假设已经认为另一个方向不会像这个方向一样好。只要确保不使用过多的偏差假设,就应该没问题。
感谢Zhuo花时间做这个,让我开阔了使用Python分析结果的眼界,我面临的主要挑战是,是EA还是趋势导致了结果:)也许应该包括一个概率指标
考虑在交易市场和您的回溯测试结果之间进行月回报相关性检查。如果相关性很高,比如超过 0.2,那么这可能表明市场趋势是造成回溯测试结果的主要原因,这是不可取的。
有中文版本吗?
如果有,请同时提交中文版。
如果没有,您是否需要 MQL5 文档组提供中文翻译?
有中文版吗?
如果有,请同时提交中文版。
如果没有,您是否需要 MQL5 文档组提供中文翻译?
您好,我所有的翻译都是由 MQL5 自动完成的。中文版通常在提交几个月后推出,但具体发布日期不清楚。