English Русский Español Deutsch 日本語
preview
智能系统健壮性测试

智能系统健壮性测试

MetaTrader 5示例 |
354 8
Zhuo Kai Chen
Zhuo Kai Chen

概述

在策略开发中,有许多错综复杂的细节需要考虑,对于初学交易者其中许多都未予重视。如是结果,众多交易者,包括我自己,都不得不历经苦难来学习这些教训。本文基于我观察到的大多数初学交易者在 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

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

过度拟合示例 2

我们能清晰地看到,仅改变这三个参数,我们就能从随机生成的数据里挑出一个以亏损、或胜出为主的集合。这就展示了过度拟合的力量。专注特定的特征子集,我们强迫模型去适配狭窄的数的切片,而这会导致误导性结论。我们越是基于特征过滤数据,就越有可能观察到人为的高绩效(就成果而言),而这是过度拟合的堂匾。任意策略,为了过度拟合而配以足够多参数,终会得到盈利结果。

对于那些依赖基于特定参数集精调策略的交易者来说,这是一个极危警告,事因它们或许无法很好地普适未来的市场条件。关键定夺是模型的健壮性 — 即在广泛数据范围内保持绩效一致性 — 这远比针对狭窄参数范围进行优化更有价值。


在 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,合理范围在1.2 到 1.5 之间。盈利因子低于 1.2 或许表明该策略盈利能力不足,而数值高于 1.5 则可能表明样本量太小、或未考虑交易成本。而这并不一定意味着您的策略是骗局,若结果看起来不切实际,您就应当保持警惕。

    2. 最大净值回撤:专注最大净值回撤而非绝对回撤,因其它反映出潜在风险,而非已发生的风险。最大净值回撤应比您的个人最大回撤冗余至少要低 10%。如果风险过低,您可考虑提升 EA 的风险;如果风险过高,您或许需要重新评估您的策略风险配置。

    3. LR 相关性:线性回归(LR)相关性衡量您的净值曲线的一致性。相关性大于 0.9 是整个测试周期内回报相对稳定的迹象。这有助于确保策略没有大幅波动,其绩效稳定。

    4. 多空仓位的胜率和交易量:如果您的 EA 多空双向交易,确保它们的胜率和交易量大致相近。若两者之间存在显著差异,可能是策略存在失衡的信号,或许要加以解决。

    而其它量值也很重要,但评估您的 EA 可靠性时,无论是在样本内/外测试期间,这三项都是要留意的主要因素。

    样本回测

    一些传统交易者优选前向游走分析,即逐片段执行样本内/外测试,“前向游走”直至当前时间点。然而,我认为这往往不必要,尤其若我们已确保参数的数量较少,且未过度拟合到特定数值。在这种情况下,这些最优参数值很可能会随时间维持一致。进而,我们已强调过,策略优势的关键在于其信号规则,而非其参数值。因此,一次样本内/外测试就足以验证结果。

    话虽如此,那些基于机器学习的策略,情况有所不同。这些策略的优势通常来自底层机器学习模型的参数,而这些或许会根据训练数据的时间周期而显著变化。在这种情况下,前向游走分析变成必要项,审计模型性能伴以不同数据集时如何随时间变化。我在这篇文章中详细解释了如何实现前向游走分析。最终,关键定夺是 EA 在近期必须维持一定的盈利,才能确认其持续生存力。


    异常值测试

    异常值测试确保您的盈利并非受到少量异常值交易的驱动,审计收益的大部分,源自稳定、平衡的盈亏。这很重要,因为如果盈利主要来自少量异常值,就会削弱以更多样本来近似平均回报的价值。为了检查这一点,只需验证您的回测净值曲线,确保其上升非由少量毛刺导致,而是稳定、持续的成长。此外,您还能够比较回测报告中最大收益与平均增益来确认这一点。

    我们还希望确保盈利不是主要集中在短时间内,因其可能表明暂时的制度偏差。为检查这一点,我们会验证月度回报的分布,从而确保一致性。首先,在报告上右键点击,并保存,以获取回测报告。 

    保存 Excel 报告

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

    查找行

    最后,您可在 Jupyter 笔记簿中运行以下 Python 代码,输出一份按百分比计算的月度回报表格。
    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

    附加的文件 |
    最近评论 | 前往讨论 (8)
    Zhuo Kai Chen
    Zhuo Kai Chen | 11 3月 2025 在 02:38
    Daniel Opoku 交易量:如果您的 EA 同时交易多头和空头头寸,请确保它们的胜率和交易量相当接近。

    两者之间的巨大差异可能预示着策略失衡,需要加以解决。

    这是否适用于偏向趋势方向(买入趋势比卖出趋势占主导地位的时间更长。EA 的胜率和交易量是否仍然相似?

    感谢您的评论。

    这取决于策略中涉及多少贝塔值。如果单一资产策略的交易时间框架更高、持有期更长,那么策略结果很可能会偏向宏观趋势。这就是为什么我建议大家通过更高频率的交易或在多个不相关资产上分散策略来交易大额(交易量)策略的原因。如果一个策略的优点不涉及趋势偏差假设,买入和卖出规则对称,那么在大样本量下,它应该会有相似的交易量和胜率。

    当然,有些策略也会有趋势偏差假设,比如某些指数多头策略。对于这类策略,交易者应该只交易一边,因为他们的假设已经认为另一个方向不会像这个方向一样好。只要确保不使用过多的偏差假设,就应该没问题。

    linfo2
    linfo2 | 26 3月 2025 在 03:10
    感谢Zhuo花时间做这个,让我开阔了使用Python分析结果的眼界,对我来说主要的挑战是,结果是由EA还是趋势造成的:)也许应该包括一个概率指标
    Zhuo Kai Chen
    Zhuo Kai Chen | 26 3月 2025 在 06:29
    linfo2 #:
    感谢Zhuo花时间做这个,让我开阔了使用Python分析结果的眼界,我面临的主要挑战是,是EA还是趋势导致了结果:)也许应该包括一个概率指标

    考虑在交易市场和您的回溯测试结果之间进行月回报相关性检查。如果相关性很高,比如超过 0.2,那么这可能表明市场趋势是造成回溯测试结果的主要原因,这是不可取的。

    Xiangdong Guo
    Xiangdong Guo | 20 11月 2025 在 14:39

    有中文版本吗?

    如果有,请同时提交中文版。

    如果没有,您是否需要 MQL5 文档组提供中文翻译?

    Zhuo Kai Chen
    Zhuo Kai Chen | 21 11月 2025 在 11:32
    Xiangdong Guo #:

    有中文版吗?

    如果有,请同时提交中文版。

    如果没有,您是否需要 MQL5 文档组提供中文翻译?

    您好,我所有的翻译都是由 MQL5 自动完成的。中文版通常在提交几个月后推出,但具体发布日期不清楚。

    MQL5 简介(第 11 部分):MQL5 中使用内置指标的初学者指南(二) MQL5 简介(第 11 部分):MQL5 中使用内置指标的初学者指南(二)
    了解如何使用 RSI、MA 和随机震荡指标等多种指标在 MQL5 中开发 EA 交易来检测隐藏的看涨和看跌背离。学习实施有效的风险管理并通过详细的示例和完整注释的源代码实现交易自动化,以达到教育目的!
    精通日志记录(第六部分):数据库日志存储方案 精通日志记录(第六部分):数据库日志存储方案
    本文探讨如何利用数据库以结构化、可扩展的方式存储日志。内容涵盖基础概念、核心操作、MQL5中数据库处理器的配置与实现。最后验证结果,并阐述该方法在优化与高效监控方面的优势。
    价格行为分析工具包开发(第19部分):ZigZag分析器 价格行为分析工具包开发(第19部分):ZigZag分析器
    每一位价格行为交易者都会手动使用趋势线来确认趋势,并找出潜在的转折或延续水平。在这个关于开发价格行为分析工具包的系列中,我们介绍一款专注于绘制倾斜趋势线的工具,以便于进行市场分析。该工具通过清晰地勾勒出有效价格行为评估所必需的关键趋势和水平,简化了交易者的流程。
    您应当知道的 MQL5 向导技术(第 53 部分):市场促进指数 您应当知道的 MQL5 向导技术(第 53 部分):市场促进指数
    市场促进指数是比尔·威廉姆斯(Bill Williams)的另一个指标,旨在衡量价格走势与成交量联动的效率。一如既往,我们将在由向导汇编信号类的范畴内分析该指标的各种形态,并为各种形态呈现多种测试报告和分析。