更新:
我对这个库进行了重大更新,我用它来优化我的专家顾问。这个版本是精简版,但你可以很容易地将其扩展到你可能想要自动化的日常任务中。例如,你可以在道具公司挑战失败后添加交易限制,或者在挑战成功或失败后于周一恢复交易。
代码末尾概述了该库的所有更改和新增内容。该框架非常灵活,可以根据您的具体需求进行调整,无论是为交易限制添加更复杂的逻辑、安排交易,还是根据优化结果对性能进行微调。
您可以根据日常任务对其进行进一步定制!
该库专为测试 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(); // 将天平重置结果输出到日志中 }
关键功能
-
可调节的盈亏阈值
- 该库允许您在回溯测试过程中调整触发余额重置的盈亏阈值。可以使用输入参数更改这些阈值,从而更轻松地自定义测试条件。
例如
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 V1.05 以历史人物 Giuseppe Tardio 命名,是专为 MetaTrader 5 设计的智能交易系统,采用三角套利策略。

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

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

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