请观看如何免费下载自动交易
请在Telegram上找到我们!
加入我们粉丝页
有趣的脚本?
因此发布一个链接 -
让其他人评价
喜欢这个脚本? 在MetaTrader 5客户端尝试它
显示:
54
等级:
(4)
已发布:
\MQL5\Include\
MQL5自由职业者 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务

更新:

我对这个库进行了重大更新,我用它来优化我的专家顾问。这个版本是精简版,但你可以很容易地将其扩展到你可能想要自动化的日常任务中。例如,你可以在道具公司挑战失败后添加交易限制,或者在挑战成功或失败后于周一恢复交易。

代码末尾概述了该库的所有更改和新增内容。该框架非常灵活,可以根据您的具体需求进行调整,无论是为交易限制添加更复杂的逻辑、安排交易,还是根据优化结果对性能进行微调。

您可以根据日常任务对其进行进一步定制!


该库专为测试 MetaTrader 5 中的智能交易系统(EA)而设计,重点关注自营公司的交易要求。其目的是模拟交易环境,在这种环境下,交易者必须达到一定的盈利和亏损阈值才能通过公司的挑战。每当达到指定的盈利或亏损百分比时,EA 就会将账户余额重置为初始值,从而调整账户余额,模拟许多自营公司的规则。

以下是使用 BalanceReset.mqh 库的智能交易系统 (EA) 的完整结构。这种设置将余额重置逻辑直接集成到了 EA 中,同时通过#include 指令保持了干净利落的功能分离:


#include <BalanceReset.mqh>   // 包括余额重置库

//+------------------------------------------------------------------+
//| 专家初始化函数|
//+------------------------------------------------------------------+
int OnInit()
{
    InitBalance();  // 初始化起始余额
    return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
//| 专家勾选功能|
//+------------------------------------------------------------------+
void OnTick()
{
    CheckBalanceAndReset();  // 根据阈值检查和重置余额
}

//+------------------------------------------------------------------+
//| 专家去初始化函数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    PrintBalanceResetResults();  // 将天平重置结果输出到日志中
}


关键功能

  1. 可调节的盈亏阈值

    • 该库允许您在回溯测试过程中调整触发余额重置的盈亏阈值。可以使用输入参数更改这些阈值,从而更轻松地自定义测试条件。

    例如

input double profit_threshold = 8.0;  // 利润阈值,默认为 8
input double loss_threshold = -6.0;   // 损失阈值,默认为 -6


2. 初始余额初始化

  • 该函数存储测试开始时的初始账户余额。它仅在第一个刻度运行,以捕捉初始起始余额。

示例

void InitBalance()
{
    initial_balance = AccountInfoDouble(ACCOUNT_BALANCE);  // 存储初始余额
}


平衡重置逻辑

  • 程序库的核心是检查当前余额与初始余额,以计算盈利或亏损的百分比。如果盈利超过指定阈值(如 8%)或亏损超过阈值(如 -6%),余额将重置为初始值。
  • 利润重置: 当达到利润阈值时,TesterWithdrawal 函数用于提取多余金额,使余额恢复到初始值。
  • 损失重置: 当触发亏损阈值时,TesterDeposit 函数将余额恢复到初始值。

举例说明:

void CheckBalanceAndReset()
{
    double current_balance = AccountInfoDouble(ACCOUNT_BALANCE);
    if (initial_balance == 0) {
        initial_balance = current_balance; // 第一个刻度,存储初始余额
    }
    double profit_percentage = (current_balance - initial_balance) / initial_balance * 100.0;

    if (profit_percentage >= profit_threshold) {
        double withdrawal_amount = current_balance - initial_balance;
        if (TesterWithdrawal(withdrawal_amount)) {
            successful_resets++;
            ArrayResize(reset_times, ArraySize(reset_times) + 1);
            reset_times[ArraySize(reset_times) - 1] = TimeCurrent();
            Print("Profit reached. Balance has been reset to the initial value.");
        }
    }

    if (profit_percentage <= loss_threshold) {
        double deposit_amount = initial_balance - current_balance;
        if (TesterDeposit(deposit_amount)) {
            unsuccessful_resets++;
            ArrayResize(reset_times, ArraySize(reset_times) + 1);
            reset_times[ArraySize(reset_times) - 1] = TimeCurrent();
            Print("Loss reached. Balance has been reset to the initial value.");
        }
    }
}

4. 结果记录

  • 测试完成后,该功能将输出成功重置的次数(损益)以及每次重置之间的间隔天数。这有助于了解测试期间余额重置的频率。

示例

void PrintBalanceResetResults()
{
    PrintFormat("Number of successful profit resets: %d", successful_resets);
    PrintFormat("Number of successful loss resets: %d", unsuccessful_resets);
    
    for (int i = 1; i < ArraySize(reset_times); i++)
    {
        int days_between_resets = (reset_times[i] - reset_times[i-1]) / 86400; // 一天 86400 秒
        PrintFormat("Days between reset %d and reset %d: %d days", i, i + 1, days_between_resets);
    }
}


结论

该库有助于模拟符合常见自营交易公司要求的交易环境。通过在达到预定义的盈利和亏损阈值时重置余额,它允许交易者更有效地测试其策略,并根据自营交易公司的规则分析其 EA 的性能。


代码更改和添加说明:

与旧代码相比,新代码包含了多项增强功能和新增功能。以下是新增和修改内容的详细说明:

新输入参数:

  • max_loss 和 min_won :

input double max_loss = 1;   // 最大损耗
input double min_won = 1;    // 最小赢家


目的: 通过这些输入参数,您可以设置允许的最大亏损 ( max_loss ) 和所需的最小成功利润重置次数 ( min_won)。它们提供了对优化条件的更多控制。

附加变量:

  • reset_status[] :

string reset_status[]; // 用于存储每次重置状态的数组

用途: 添加一个数组,用于存储每次余额重置事件的状态("盈利重置 "或 "亏损重置")。

stopOptimization :

bool stopOptimization = false;

用途: 用于指示何时应根据某些条件停止优化的标志。

badResult(坏结果):

bool badResult = false; // 表示优化结果不佳的标志

用途: 将优化结果标记为不利的标志,可用于影响 OnTester() 中的结果。

CheckBalanceAndReset() 中的修改 :

  • 记录重置状态:

ArrayResize(reset_status, ArraySize(reset_status) + 1); // 调整数组大小,以记录重置状态
reset_status[ArraySize(reset_status) - 1] = "Profit reset"; // 记录状态

目的: 当发生利润重置时,状态将记录在 reset_status[] 数组中。

使用优化停止条件处理亏损重置:

if (TesterDeposit(deposit_amount))
{
    unsuccessful_resets++;  // 增加丢失重置失败的计数器
    // 记录重置时间和状态
    ArrayResize(reset_status, ArraySize(reset_status) + 1);
    reset_status[ArraySize(reset_status) - 1] = "Loss reset";
    {
        stopOptimization = true;
        CheckStopCondition();  // 检查是否应停止优化
    }
    PrintFormat("Loss reached. Balance has been reset to the initial value.");
}

目的: 在损失重置后,代码会递增 unsuccessful_resets,记录状态,将 stopOptimization 设为 true,并调用 CheckStopCondition() 来确定是否应停止优化。

新函数 CheckStopCondition() :

void CheckStopCondition()
{
    if(stopOptimization)
    {
        Print("Stopping current optimization pass");
        badResult = true;  // 将结果标记为坏
        TesterStop();
    }
}

目的: 该函数检查 stopOptimization 是否为 true,如果为 true,则将结果标记为坏,并使用 TesterStop() 停止当前优化过程。

新函数 OnTester() :

double OnTester()
{
    // 如果成功重置的次数少于最低要求或设置了 badResult
    if(successful_resets < min_won || badResult)
    {
        Print("Optimization failed: returning a highly unfavorable result.");
        // 返回一个非常不利的结果,以破坏优化传递
        return -999999;
    }

    // 计算成功重置与失败重置之间的差值
    int reset_difference = successful_resets - unsuccessful_resets;

    // 检查差值是否为负数
    if(reset_difference < 0)
    {
        Print("Negative difference between successful and unsuccessful resets. Returning a highly unfavorable result.");
        // 如果差值为负数,则返回非常不利的结果
        return -999999;
    }

    // 将差值输出到日志中
    PrintFormat("Difference between successful and unsuccessful resets: %d", reset_difference);

    // 将差值作为测试仪的结果返回
    return reset_difference;
}


目的: 该函数为优化过程提供了一个自定义标准。它会检查成功重置的次数是否满足最低要求,或者结果是否不佳。它会计算成功重置和不成功重置之间的差值,并返回该值,除非差值为负,在这种情况下,它会返回一个非常不利的结果,以影响优化器。


PrintBalanceResetResults() 中的 增强功能

// 输出每次重置的日期和间隔天数
for(int i = 1; i < ArraySize(reset_times); i++)
{
    // 计算两次重置之间的天数
    int days_between_resets = (reset_times[i] - reset_times[i-1]) / 86400; // 一天 86400 秒
    // 打印重置日期、状态以及它们之间的间隔天数
    PrintFormat("Reset %d: %s (%s), Reset %d: %s (%s), Days between: %d days",
                i, TimeToString(reset_times[i-1], TIME_DATE), reset_status[i-1],
                i + 1, TimeToString(reset_times[i], TIME_DATE), reset_status[i],
                days_between_resets);
}


目的: 该函数现在不仅输出重置次数,还详细列出了每个重置事件,包括日期、状态和重置间隔天数。这将提供更全面的重置活动日志。

变量初始化和使用:

  • 初始余额检查:

if(initial_balance == 0)
{
    initial_balance = current_balance;
}

目的: 确保初始余额在第一次跳转时设置正确。

利润百分比计算:

double profit_percentage = (current_balance - initial_balance) / initial_balance * 100.0;

用途: 计算相对于初始余额的利润或亏损百分比。


添加摘要:

  • 控制优化过程:

    • 代码现在包含根据特定条件停止优化过程的机制,如超过不成功重置的最大次数或未达到成功重置的最小次数。
  • 增强了日志记录和跟踪功能:

    • 在 PrintBalanceResetResults() 中增加了 reset_status[] 和详细日志,从而可以更好地跟踪重置事件及其结果。
  • 通过 OnTester() 与优化器集成:

    • 通过实施 OnTester(),脚本可将结果反馈给优化引擎,从而影响基于自定义标准的参数集选择。
这些更改增强了脚本的功能,在优化过程中更好地控制交易操作,更详细地记录事件,并能根据自定义标准影响优化过程。









由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/52163

TardioBot TardioBot

TardioBot V1.05 以历史人物 Giuseppe Tardio 命名,是专为 MetaTrader 5 设计的智能交易系统,采用三角套利策略。

Cincin EA Cincin EA

Cincin EA(v2.24)是一款适用于 MetaTrader 5 的自动交易系统,可对指定符号(如欧元兑美元)执行保守的随机交易,具有篮子管理、对冲和仓位控制等功能。

Manual Scalping With Keyboard Manual Scalping With Keyboard

使用键盘快捷键在 MT5 中手动剥头皮的轻量级工具

AdaptiveTrader Pro EA AdaptiveTrader Pro EA

这款适用于 MetaTrader 的智能交易系统(EA)利用 RSI、ATR 和移动平均线等技术指标组合来识别高概率交易机会。它配备了动态手数、跟踪止损和基于性能的调整功能,专为在波动的市场条件下优化交易决策和有效管理风险而量身定制。