commit 160c68da396a135d48fe7051002d2dc837bfcbda Author: gavindiaz Date: Mon Jul 6 03:32:12 2026 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dfb9b7c --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +optimizer/reports/ +optimizer/configs/ +reports/ +config/generated/ + +__pycache__/ +*.pyc + +# Machine-local MT5 auto-detection cache (Windows 路径,每台电脑不同) +config/.mt5_paths_cache.json diff --git a/MT5优化原理.md b/MT5优化原理.md new file mode 100644 index 0000000..4c7ccb3 --- /dev/null +++ b/MT5优化原理.md @@ -0,0 +1,133 @@ +MT5 优化需要 **INI + SET 两个文件配合工作**,加上 `terminal64.exe` 本身: + +### 三个核心文件 + +| 文件 | 作用 | 由谁生成 | +| ---------------------- | ------------------------------------------------------------ | ----------------------------------------------------------- | +| **INI** (`config.ini`) | 告诉 MT5 "做什么":EA路径、品种、周期、日期、优化模式/指标、前向测试模式、保证金/杠杆、报告输出、完成后关机等 | 我们的 `ea_batch_optimizer.generate_ini_for_ea()` 生成 | +| **SET** (`xxx.set`) | 告诉 EA "用哪些参数值哪些范围优化":每个输入参数标记是否优化 + 起始值/终止值/步进 | 我们的 `generate_ini_for_ea()` 从 JSON 的 `parameters` 生成 | +| **EX5** (EA本身) | 被测试的 EA 程序 | 用户放置在 MT5 的 `MQL5/Experts/` 下 | + +### INI 中的关键优化控制参数 + +```ini +[Tester] +Optimization=2 ; 优化模式:0禁用 1慢速完整 2快速遗传 3MarketWatch全部 +OptimizationCriterion=5 ; 优化指标:0余额 1盈利因子 2期望收益 3回撤 4恢复因子 5夏普 6自定义 7复合 +ForwardMode=0 ; 前向测试:0禁用 1二分之一 2三分之一 3四分之一 4自定义日期 +``` + +### SET 文件格式示例 + +```ini +Lots=0.10||0.10||0.10||0.10||N ; 固定参数 +TakeProfit=50||50||5||200||Y ; 优化参数:当前值||起始||步进||终止||是否优化 +``` + +### 所以整个链条是: + +``` +保存配置 (JSON) + ↓ +generate_ini_for_ea() + ├─→ 生成 SET 文件 → 写入 MT5数据目录/MQL5/Profiles/Tester/{ea_name}_optimization.set + └─→ 生成 INI 文件 → optimizer/configs/{ea_name}.ini + ↓ +启动 MT5: terminal64.exe /config:optimizer/configs/{ea_name}.ini + ↓ +MT5 读取 INI → 找到 Expert=xxx.ex5 和 ExpertParameters=xxx.set + ↓ +MT5 按 INI 的 Optimization / OptimizationCriterion / ForwardMode 执行遗传算法优化 + ↓ +结果保存为 {ea_name}_optimization.xml(优化报表)和可选的 {ea_name}_optimization.forward.xml(前向测试结果) +``` + + + +点击"保存配置"只生成 **1 个文件**: + +``` +gui.py: _save_ea_config() + ↓ + 生成/覆盖 → optimizer/configs/{ea_name}.json +``` + +**只写 JSON**,不写 SET 不写 INI。 + +### 三者的生成顺序(完整流程) + +``` +第1步:保存配置(gui.py _save_ea_config) + ↓ + optimizer/configs/{ea_name}.json ← 用户在 GUI 点"保存配置"时生成 + +第2步:运行优化(gui.py _run_mt5_optimize) + ↓ + ea_batch_optimizer.generate_ini_for_ea(ea_config) + ↓ + ├─→ 生成 SET文件 → MT5数据目录/MQL5/Profiles/Tester/{ea_name}_optimization.set + └─→ 生成 INI文件 → optimizer/configs/{ea_name}.ini + +第3步:启动MT5 + terminal64.exe /config:optimizer/configs/{ea_name}.ini + ↓ + MT5 读取 INI → 找到 ExpertParameters=xxx.set → 加载 SET 中的参数范围 + ↓ + 执行遗传算法优化 +``` + +### 三者关系 + +| 文件 | 生成时机 | 内容 | 用途 | +| -------- | ------------------ | ------------------------------------------------------------ | -------------------------------- | +| **JSON** | 用户点"保存配置" | EA参数定义(名称/类型/min/max/step/optimize标志)+ 回测配置(symbol/period/criterion等) | 配置持久化,用户可随时修改再保存 | +| **SET** | 用户点"运行优化"时 | 从 JSON 的 parameters 展开,生成 MT5 SET 格式(参数名、当前值、起始、步进、终止、是否优化) | 告诉 MT5 要优化哪些参数及其范围 | +| **INI** | 用户点"运行优化"时 | 从 JSON 的 test_config 读取所有配置(EA路径、品种、周期、日期、Optimization=2、OptimizationCriterion=5 等) | 告诉 MT5 做什么优化任务 | + +**SET 和 INI 都是从 JSON 衍生出来的**,JSON 是唯一的事实来源(single source of truth)。 + + + + + +理清楚这两个 SET 的来源和关系: + +### 两个 SET 的来源 + +| SET 来源 | 何时产生 | 怎么产生 | +| ------------------ | --------------------------------- | ------------------------------------------------------------ | +| **MT5 原生 SET** | GUI 启动时(或点"自动扫描MT5"时) | `_auto_load_ea_with_set` 从 `MT5/Profiles/Tester/GMarket_optimization.set` 读取 | +| **我们生成的 SET** | 点"运行优化"时 | `generate_ini_for_ea` 从 JSON 的 parameters 生成 | + +### 流程中的覆盖关系 + +``` +启动 GUI → _auto_load_ea_with_set() + ↓ +从 MT5 Profiles/Tester/ 读取 GMarket_optimization.set + ↓ +参数显示在参数配置表格(可修改) + ↓ +用户修改参数 → 点"保存配置" → 生成 JSON + ↓ +点"运行优化" → generate_ini_for_ea() + ↓ +生成新的 SET → 写入 MT5/Profiles/Tester/GMarket_optimization.set(覆盖原文件) + ↓ +MT5 读取 INI → ExpertParameters=GMarket_optimization.set(就是我们刚写入的那个) +``` + +### 结论:**是覆盖关系** + +- 启动时加载 MT5 原生 SET,只是为了**展示**现有参数供你查看/修改 +- 运行时生成的 SET 是**完整覆盖** MT5 Profiles/Tester/ 下的同名文件 +- MT5 加载的 SET 就是我们生成的那个 + +### 为什么不冲突? + +因为 SET 文件路径相同(都在 `MT5/Profiles/Tester/` 下),所以: +- 启动加载 → 读取旧 SET 展示 +- 优化运行 → 生成新 SET **覆盖**旧 SET +- MT5 执行 → 读到的就是最新生成的 SET + +本质上是同一个文件在 **读→改→写** 的循环中流转,JSON 是源头记录,SET 是 MT5 优化时实际使用的参数范围定义。 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..537c7b9 --- /dev/null +++ b/README.md @@ -0,0 +1,571 @@ +# MT5 EA 批量回测系统 + +基于 MetaTrader 5 的自动化批量回测工具,支持多EA、多交易品种、多时间周期的组合测试。 + +## 项目结构 + +``` +mt5_backtest/ +├── gui.py # 图形界面(统一入口,所有回测操作都在这里) +├── scripts/ +│ ├── ini_generator.py # 生成MT5配置文件 +│ ├── mt5_auto_runner.py # 自动运行回测 +│ ├── batch_executor.py # 批量执行器 +│ ├── result_parser.py # 解析HTM/XML报告 +│ └── report_generator.py # 生成汇总报告 +├── config/ # 配置文件目录 +├── reports/ # 回测报告输出目录 +├── logs/ # 日志目录 +└── README.md # 本文档 +``` + +## 核心原理 + +### 1. 配置生成阶段 (ini_generator.py) +- 读取配置文件 `config/ea_configs.yaml` +- 扫描 MT5 的 `MQL5/Experts` 目录获取 EA 列表 +- 根据配置的 EA品种、时间周期、参数组合生成 INI 配置文件 +- 每个 INI 文件对应一次回测任务 + +### 2. 自动执行阶段 (mt5_auto_runner.py) +- 通过命令行调用 MT5 终端: `terminal64.exe /config:xxx.ini` +- 监控回测进度,等待报告文件生成 +- 自动终止并重启 MT5 进程(可选) +- 复制生成的 HTM 报告到项目目录 + +### 3. 结果解析阶段 (result_parser.py) +- 读取 `reports/` 目录下的 HTM 报告文件 +- 自动检测文件编码(UTF-16-LE with BOM) +- 使用正则表达式提取关键指标 +- 支持中英文标签匹配 + +### 4. 报告生成阶段 (report_generator.py) +- 将解析结果导出为 Excel、CSV、HTML、Markdown 格式 +- 支持按盈利因子、胜率等指标排序 + +## 使用方式 + +### 方式一:图形界面(推荐) + +```bash +python gui.py +``` + +界面包含三个标签页: +- **回测配置**:选择 EA、交易品种、时间周期、回测日期等 +- **执行选项**:设置超时、跳过已完成的测试等 +- **报告查看**:查看已解析的回测结果,支持排序和导出CSV + +### 方式二:GUI(推荐,唯一入口) + +```bash +python gui.py +``` + +> 整个回测流程(生成 INI → 运行 → 解析 → 汇总)都在 GUI 后台线程完成, +> 进度实时显示在 "参数优化" 标签页的日志框。 +> YAML 仅作为可读的配置导出/快照(GUI "保存配置" 按钮),不参与运行时通信。 + +## 配置文件格式 + +配置文件 `config/ea_configs.yaml` 示例: + +```yaml +eas: + - name: GMarket + filename: GMarket.ex5 + set_file: GMarket_default.set # 可选,使用SET文件 + +backtest_settings: + symbols: ["EURUSD", "GBPUSD", "XAUUSD", "USDJPY"] + timeframes: ["M1", "M5", "M15", "H1"] + date_range: + from: "2026.01.01" + to: "2026.01.04" + model: 0 # 0=Every Tick, 1=OHLC, 4=Real Tick + execution_delay: 0 # 延迟设置 + deposit: 10000 # 初始保证金 + leverage: "1:100" # 杠杆 + replace_report: true # 覆盖已有报告 + shutdown_terminal: true + +mt5_settings: + terminal_path: "C:\\Program Files\\MetaTrader 5 IC Markets Global\\terminal64.exe" + data_dir: "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\..." + reports_dir: "reports" + ini_dir: "config/generated" + +execution: + timeout_per_test: 30 # 分钟 + skip_existing: true + kill_between: true # 测试间关闭MT5 +``` + +## 关键指标说明 + +| 指标 | 说明 | 评判标准 | +|------|------|----------| +| **profit_factor** | 盈利因子 = 毛利/毛损 | >1.5 优秀, >1.0 微利, <1.0 亏损 | +| **net_profit** | 总净盈利 | 越高越好 | +| **gross_profit** | 毛利(所有盈利交易总和) | 越高越好 | +| **gross_loss** | 毛损(所有亏损交易总和) | 越低越好 | +| **win_rate** | 胜率(盈利交易占比) | >60% 较好 | +| **total_trades** | 总交易次数 | 样本量参考 | +| **max_drawdown** | 最大回撤金额 | 越低越稳定 | +| **sharpe_ratio** | 夏普比率(风险收益比) | >1.0 较好, >2.0 优秀 | +| **recovery_factor** | 采收率 | >1.5 较好 | + +## 如何添加新的交易品种 + +### 方法一:通过 GUI 界面 +1. 打开 `python gui.py` +2. 切换到"回测配置"标签页 +3. 在"交易品种"区域勾选需要的品种 +4. 点击"保存配置" + +### 方法二:直接编辑配置文件 +编辑 `config/ea_configs.yaml`: + +```yaml +backtest_settings: + symbols: + - EURUSD + - GBPUSD + - XAUUSD # 添加新品种 + - USDJPY + - BTCUSD # 添加数字货币 +``` + +### 支持的交易品种类型 + +| 类型 | 示例 | +|------|------| +| 主流货币对 | EURUSD, GBPUSD, USDJPY, USDCHF | +| 商品货币 | AUDUSD, NZDUSD, USDCAD | +| 交叉货币 | EURGBP, EURJPY, GBPJPY | +| 贵金属 | XAUUSD, XAGUSD | +| 原油 | XBRUSD, XTIUSD | +| 数字货币 | BTCUSD, ETHUSD, LTCUSD | + +## 如何添加新的时间周期 + +编辑 `config/ea_configs.yaml`: + +```yaml +backtest_settings: + timeframes: + - M1 # 1分钟 + - M5 # 5分钟 + - M15 # 15分钟 + - M30 # 30分钟 + - H1 # 1小时 + - H4 # 4小时 + - D1 # 日线 + - W1 # 周线 +``` + +## 报告导出功能 + +```bash +# 导出排序后的CSV +python scripts/result_parser.py --results-dir reports --csv reports/results.csv --sort profit_factor + +# 可用排序字段 +# expert, symbol, period, net_profit, gross_profit, profit_factor +# total_trades, win_rate, max_drawdown, sharpe_ratio +``` + +## HTM 报告解析说明 + +MT5 生成的 HTM 报告采用特殊编码: +- 编码格式:UTF-16-LE with BOM +- 标签语言:中英混合 + +解析器会自动处理以下情况: +1. BOM 标记检测与跳过 +2. 中文字段名匹配(如"盈利因子"、"夏普比率") +3. 特殊格式数据提取(如 "92.46 (8.61%)") + +### 解析的完整字段列表 + +**测试信息 (test_info)**: +- expert: EA名称 +- symbol: 交易品种 +- period: 时间周期 +- company: 经纪商 +- currency: 货币 +- leverage: 杠杆 + +**性能指标 (metrics)**: +- initial_deposit: 初始入金 +- net_profit: 总净盈利 +- gross_profit: 毛利 +- gross_loss: 毛损 +- profit_factor: 盈利因子 +- expected_payoff: 预期收益 +- recovery_factor: 采收率 +- sharpe_ratio: 夏普比率 +- ahpr/ghpr: 几何/算术平均收益率 +- lr_correlation: LR相关性 +- lr_standard_error: LR标准误差 +- max_drawdown: 最大结余亏损 +- max_equity_drawdown: 最大净值亏损 +- absolute_drawdown: 绝对结余亏损 +- margin_level: 预付款维持率 +- total_trades: 交易总计 +- total_deals: 总成交 +- short_trades: 卖出交易 +- long_trades: 买入交易 +- winning_trades: 盈利交易 +- losing_trades: 亏损交易 +- win_rate: 胜率 +- max_profit_trade: 最大获利交易 +- max_loss_trade: 最大亏损交易 +- avg_profit_trade: 平均获利交易 +- avg_loss_trade: 平均亏损交易 +- longest_win_streak: 最大连胜 +- longest_lose_streak: 最大连败 +- avg_win_streak: 平均连胜 +- avg_lose_streak: 平均连败 +- min_hold_time/max_hold_time/avg_hold_time: 持仓时间 +- quality: 质量历史 +- bars: 柱数 +- quotes: 报价数 +- score: 分值 +- on_tester: OnTester结果 + +## EA参数优化系统 + +### 概述 + +EA参数优化系统用于自动寻找EA的最优参数组合,支持多种搜索策略。 + +### 目录结构 + +``` +optimizer/ +├── configs/ # EA配置文件目录 +│ ├── MA_Cross.json # 示例: MA交叉策略 (6参数, Grid搜索) +│ └── Grid_Pro.json # 示例: 网格策略 (8参数, 遗传算法) +├── set_files/ # 生成的SET参数文件 +│ └── {EA_NAME}/ +│ └── params_00000001.set ~ params_NNNNNNNN.set +├── reports/ # MT5测试报告 +├── results/ # 分析结果 +│ ├── {EA_NAME}_param_mapping.csv +│ └── optimization_report.txt +├── scripts/ # PowerShell脚本 +└── logs/ # 日志 +``` + +### EA配置文件格式 + +```json +{ + "ea_name": "MA Cross Scalper", + "ea_path": "Experts\\MA_Cross.ex5", + "description": "双MA交叉策略", + "search_strategy": "grid", + "optimization_criterion": "profit_factor", + "parameters": { + "FastMA_Period": { + "type": "int", + "default": 14, + "min": 5, + "max": 30, + "step": 1, + "description": "快速MA周期" + }, + "SlowMA_Period": { + "type": "int", + "default": 50, + "min": 20, + "max": 100, + "step": 5, + "description": "慢速MA周期", + "condition": ">FastMA_Period" + } + }, + "test_config": { + "symbol": "EURUSD", + "period": "H1", + "from_date": "2025.01.01", + "to_date": "2025.12.31", + "model": 1, + "deposit": 10000, + "leverage": "1:100" + }, + "walk_forward": { + "enabled": false + } +} +``` + +### 参数类型 + +| 类型 | 说明 | 示例 | +|------|------|------| +| int | 整数参数 | FastMA_Period: 5-30 | +| double | 浮点参数 | RiskPercent: 0.5-3.0 | +| bool | 布尔参数 | EnableMM: true/false | +| enum | 枚举参数 | TradingMode: BUY/SELL/BOTH | + +### 搜索策略选择 + +| 组合数 | 策略 | 说明 | +|--------|------|------| +| ≤10,000 | Grid Search | 暴力遍历,适合快速测试 | +| 10,001-500,000 | Latin Hypercube | 均匀采样,效率高 | +| >500,000 | Genetic Algorithm | 遗传算法,智能搜索 | + +### 使用方式 + +#### 方式一:图形界面 +```bash +python gui.py +``` +切换到"参数优化"标签页,可以: +- 查看EA配置列表 +- 生成SET文件 +- 运行优化测试 +- 分析优化结果 + +#### 方式二:命令行 +```bash +# 列出所有EA配置 +python optimizer_main.py list + +# 生成SET文件 +python optimizer_main.py generate --ea "MA Cross Scalper" + +# 分析结果 +python optimizer_main.py analyze --sort profit_factor +``` + +### 参数约束 + +在EA配置中使用 `condition` 字段定义参数约束: + +```json +"SlowMA_Period": { + "condition": ">FastMA_Period" +} +``` + +支持的运算符:`>`, `<`, `>=`, `<=`, `==`, `!=` + +### GUI优化面板功能 + +1. **列出EA配置** - 显示所有配置的参数数量、组合数、预估时间 +2. **生成SET文件** - 为每个参数组合创建.set文件 +3. **运行优化** - 生成PowerShell脚本,用户可手动执行 +4. **分析结果** - 解析报告,找出最优参数组合 + +### 输出文件 + +- `{EA_NAME}_param_mapping.csv` - 参数ID映射表 +- `optimization_report.txt` - 优化分析报告 +- `best_params.json` - 最优参数JSON + +## AI辅助参数优化工具 + +### 概述 + +`scan_set_prompt.py` 是一个命令行工具,用于扫描 MT5 的 SET 参数文件,生成带完整提示词的文本文件,方便发给 AI 讨论参数优化方案。 + +### 工作流程 + +``` +SET文件 → scan_set_prompt.py → AI提示词txt → AI生成优化JSON → 保存到optimizer/configs/ +``` + +### 使用方式 + +```bash +# 交互式选择模式 +python scripts/scan_set_prompt.py --interactive + +# 扫描单个SET文件 +python scripts/scan_set_prompt.py --file "C:\path\to\EA.set" + +# 扫描文件夹下所有SET文件 +python scripts/scan_set_prompt.py --folder "C:\path\to\Profiles\Tester" + +# 批量扫描多个SET文件 +python scripts/scan_set_prompt.py --batch a.set b.set c.set + +# 指定输出目录 +python scripts/scan_set_prompt.py --file "C:\path\to\EA.set" --output "C:\path\to\output" +``` + +### 交互式模式选项 + +``` +1. 扫描单个 SET 文件 +2. 扫描文件夹下所有 SET 文件 +3. 批量扫描多个 SET 文件 +4. 从剪贴板读取 SET 内容 +0. 退出 +``` + +### 生成的文件内容 + +生成的 `_optimization_prompt.txt` 包含: + +1. **基本信息** - EA名称、参数总数 +2. **参数详情表** - 所有参数的当前值、范围、步进 +3. **参数分析任务** - 引导 AI 分析哪些参数该优化、范围建议 +4. **完整JSON模板** - 符合 `optimizer/configs/*.json` 格式,包含: + - `ea_path` 自动做 ASCII 安全处理(支持中文名 EA) + - `parameters` 部分带优化建议注释 + - `test_config` 和 `walk_forward` 配置 + +### 输出示例 + +```json +{ + "ea_name": "GoldSniper_Pro_v2", + "ea_path": "MY-EA\\GoldSniper_Pro_v2.ex5", + "description": "Edited via GUI", + "search_strategy": "auto", + "parameters": { + "LotSize": { + "type": "double", + "default": 0.01, + "min": 0.01, + "max": 0.1, + "step": 0.001, + "optimize": true // AI根据策略分析填写 + } + }, + "test_config": {...}, + "walk_forward": {...} +} +``` + +### 注意事项 + +- SET 文件支持多种格式:我们的 `=val||min||step||max||Y` 格式、MT5 原生 ` ` 格式、布尔 `true/false` 格式 +- 自动检测文件编码(UTF-8、UTF-16-LE/BE) +- `ea_path` 使用双反斜杠 `\\`,中文 EA 名自动转换为 ASCII(如 `(EA)GoldSniper` → `EA_GoldSniper`) +- AI 生成的 JSON 可直接保存到 `optimizer/configs/` 目录使用 + +## 批量提取文件名工具 + +### 概述 + +`extract_filenames.py` 用于批量提取某个文件夹下所有文件名,支持子文件夹递归检索。 + +### 使用方式 + +```bash +python extract_filenames.py +``` + +交互式操作: +1. 输入要扫描的文件夹路径 +2. 选择是否包含子文件夹(默认包含) +3. 输入输出文件名(直接回车使用自动命名) + +### 输出文件命名规则 + +- 自动命名格式:`{源文件夹名}_filenames_{日期时间}.txt` +- 例如:`mt5_backtest_filenames_20260531_195723.txt` +- 文件保存在被扫描文件夹的**父目录** + +### 示例 + +``` +请输入文件夹路径: C:\Projects\MyEA +是否包含子文件夹? (y/n, 默认y): +输出文件名 (直接回车使用自动命名): + +正在扫描文件夹: C:\Projects\MyEA +模式: 包含子文件夹 (递归) +请稍候... + +完成! 共找到 128 个文件 +结果已保存到: C:\Projects\MyEA_filenames_20260531_195723.txt +``` + +## 未来可扩展方向 + +### 1. 自动化参数优化 +- 集成 OptParams 参数优化功能 +- 支持遗传算法、枚举等优化方法 +- 自动寻找最优参数组合 + +### 2. 多经纪商支持 +- 支持不同经纪商的配置切换 +- 账户资金和杠杆差异化设置 + +### 3. 实时监控面板 +- Web 界面实时显示回测进度 +- 推送通知(邮件/微信)回测完成提醒 + +### 4. 机器学习辅助 +- 使用历史数据训练预测模型 +- 辅助参数选择和优化方向建议 + +### 5. 云端分布式回测 +- 支持多台机器并行回测 +- 任务队列和负载均衡 + +### 6. 更丰富的报告分析 +- 资金曲线图表 +- 交易分布热力图 +- 月度/年化收益统计 + +### 7. 数据库存储 +- SQLite/PostgreSQL 存储历史回测结果 +- 支持历史对比和趋势分析 + +## 依赖环境 + +- Python 3.8+ +- MetaTrader 5 Terminal +- 依赖库: tkinter (GUI), yaml, openpyxl, beautifulsoup4, lxml + +## 项目结构 + +``` +mt5_backtest/ +├── gui.py # 图形界面(回测 + 优化,唯一入口) +├── scripts/ +│ ├── ini_generator.py # 生成MT5配置文件 +│ ├── mt5_auto_runner.py # 自动运行回测 +│ ├── batch_executor.py # 批量执行器 +│ ├── result_parser.py # 解析HTM/XML报告 +│ ├── report_generator.py # 生成汇总报告 +│ └── optimizer/ # EA优化系统 +│ ├── ea_config_parser.py # EA配置解析 +│ ├── smart_search.py # 搜索策略 +│ ├── parameter_constraint.py # 参数约束 +│ ├── analyze_results.py # 结果分析 +│ └── ea_batch_optimizer.py # 批量优化器 +├── config/ # 配置文件 +├── reports/ # 回测报告目录 +├── optimizer/ # 优化系统目录 +│ ├── configs/ # EA配置 +│ ├── set_files/ # SET文件 +│ ├── reports/ # 优化报告 +│ └── results/ # 分析结果 +└── logs/ # 日志目录 +``` + +## 常见问题 + +### Q: MT5 终端路径不正确 +修改 `config/ea_configs.yaml` 中的 `terminal_path` 为实际路径 + +### Q: 报告文件未生成 +1. 检查 MT5 是否正常启动 +2. 查看 `logs/batch_executor.log` 日志 +3. 确认 `data_dir` 配置正确 + +### Q: 中文显示乱码 +HTM 报告采用 UTF-16-LE 编码,result_parser.py 会自动处理,无需手动转换 + +## 许可证 + +MIT License \ No newline at end of file diff --git a/config/batch_template.ini b/config/batch_template.ini new file mode 100644 index 0000000..6c881e7 --- /dev/null +++ b/config/batch_template.ini @@ -0,0 +1,30 @@ +; MT5 Strategy Tester Configuration Template +; Save as your configuration file + +[Tester] +Expert= +ExpertParameters= +Symbol= +Period= +Model=0 +ExecutionMode=1 +Optimization=0 +OptimizationCriterion=6 +FromDate=2024.01.01 +ToDate=2024.12.31 +ForwardMode=0 +ForwardDate= +Report= +ReplaceReport=1 +ShutdownTerminal=1 +Deposit=10000 +Currency=USD +Leverage=1:100 +Visual=0 +ProfitInPips=0 + +; Expert settings (optional - use instead of ExpertParameters .set file) +; RSI_Period=14 +; Overbought=70 +; Oversold=30 +; Lot_Size=0.1 \ No newline at end of file diff --git a/config/ea_configs.yaml b/config/ea_configs.yaml new file mode 100644 index 0000000..87faf9b --- /dev/null +++ b/config/ea_configs.yaml @@ -0,0 +1,35 @@ +backtest_settings: + currency: USD + date_range: + from: 2018.01.01 + to: 2026.06.04 + deposit: 1000.0 + execution_delay: 100 + forward_date: '' + forward_mode: 2 + leverage: 1:500 + model: 0 + optimization: 0 + replace_report: true + shutdown_terminal: true + symbols: + - XAUUSD + timeframes: + - M5 + visual: 0 +eas: +- filename: MY-EA\without source code\The Gold Reaper MT5_4.3_fix.ex5 + name: The Gold Reaper MT5_4.3_fix +execution: + kill_between: true + skip_existing: true + timeout_per_test: 300000 +# mt5_settings: 路径支持占位符与自动检测(见 scripts/mt5_paths.py) +# {PROJECT_ROOT} → 项目根目录绝对路径(推荐,确保项目拷到任意位置都能跑) +# 留空字符串 → 启动时自动扫描常见位置(Program Files / %APPDATA%/MetaQuotes/Terminal) +# 绝对路径 → 直接使用(适配定制安装或便携版) +mt5_settings: + terminal_path: "" # 留空=自动检测; 或填 "C:\\Program Files\\MetaTrader 5 EXNESS\\terminal64.exe" + data_dir: "" # 留空=自动检测; 或填 "%APPDATA%\\MetaQuotes\\Terminal\\" + ini_dir: "{PROJECT_ROOT}/config/generated" + reports_dir: "{PROJECT_ROOT}/reports" diff --git a/config/results/execution_log.json b/config/results/execution_log.json new file mode 100644 index 0000000..f9661aa --- /dev/null +++ b/config/results/execution_log.json @@ -0,0 +1,14191 @@ +[ + { + "ini_file": "BlessingRebuildEA_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-28T20:46:23.663988", + "end_time": "2026-05-28T20:47:11.705929", + "duration_sec": 48.04125237464905, + "report_found": true, + "error": null + }, + { + "ini_file": "BlessingRebuildEA_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-28T20:51:44.530639", + "end_time": "2026-05-28T20:52:34.577323", + "duration_sec": 50.0429949760437, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BlessingRebuildEA_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T21:00:14.659259", + "end_time": "2026-05-28T21:00:24.687950", + "duration_sec": 10.022817373275757, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_EURUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-28T21:02:06.533552", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\GMarket_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T21:03:28.417638", + "end_time": "2026-05-28T21:03:36.466581", + "duration_sec": 8.041404008865356, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BlessingRebuildEA_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-28T21:03:41.142516", + "end_time": "2026-05-28T21:03:51.166802", + "duration_sec": 10.021262884140015, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BlessingRebuildEA_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T21:03:55.866405", + "end_time": "2026-05-28T21:04:13.908909", + "duration_sec": 18.03630828857422, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BlessingRebuildEA_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-28T21:04:18.677100", + "end_time": "2026-05-28T21:04:30.708062", + "duration_sec": 12.02742314338684, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BlessingRebuildEA_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T21:11:43.791544", + "end_time": "2026-05-28T21:11:53.818888", + "duration_sec": 10.024386167526245, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BlessingRebuildEA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_XAUUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-28T21:11:58.439257", + "end_time": "2026-05-28T21:12:06.486189", + "duration_sec": 8.042898178100586, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BlessingRebuildEA_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_EURUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-28T21:15:52.811802", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\BlessingRebuildEA_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_EURUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-28T21:15:58.230753", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\BlessingRebuildEA_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_EURUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-28T21:16:34.066139", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\BlessingRebuildEA_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T21:18:44.456775", + "end_time": "2026-05-28T21:23:10.634758", + "duration_sec": 266.17244267463684, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BlessingRebuildEA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_XAUUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-28T21:23:27.092263", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\BlessingRebuildEA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_XAUUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-28T21:23:30.533446", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\BlessingRebuildEA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_XAUUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-28T21:23:37.956929", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\BlessingRebuildEA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_XAUUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-28T21:23:59.000242", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\BlessingRebuildEA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T21:24:12.522481", + "end_time": "2026-05-28T21:25:10.599902", + "duration_sec": 58.07173275947571, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BlessingRebuildEA_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "(EA)EA_Price_Action_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-28T21:43:06.356624", + "end_time": "2026-05-28T21:43:10.387122", + "duration_sec": 4.029829502105713, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "(EA)GoldSniper_Pro_v2_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-28T21:43:15.016765", + "end_time": "2026-05-28T21:43:19.056715", + "duration_sec": 4.039950847625732, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "(EA)MultiConfluenceEAv6_BTCUSDT_15m_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-28T21:43:23.725223", + "end_time": "2026-05-28T21:43:27.767688", + "duration_sec": 4.0369343757629395, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_EA_Price_Action_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-28T21:46:12.405729", + "end_time": "2026-05-28T21:46:20.434018", + "duration_sec": 8.027780055999756, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_GoldSniper_Pro_v2_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-28T21:46:25.023474", + "end_time": "2026-05-28T21:46:29.052219", + "duration_sec": 4.02822208404541, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEAv6_BTCUSDT_15m_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-28T21:46:33.655150", + "end_time": "2026-05-28T21:46:37.676731", + "duration_sec": 4.021580934524536, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "BlessingRebuildEA_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T21:48:47.103814", + "end_time": "2026-05-28T21:49:07.137728", + "duration_sec": 20.031372785568237, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BlessingRebuildEA_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T21:49:11.828936", + "end_time": "2026-05-28T21:49:59.888667", + "duration_sec": 48.0520293712616, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BlessingRebuildEA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ExpertMAPSAR_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T21:50:04.543869", + "end_time": "2026-05-28T21:50:12.595278", + "duration_sec": 8.04047417640686, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ExpertMAPSAR_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "ExpertMAPSAR_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T21:50:17.524457", + "end_time": "2026-05-28T21:50:25.560766", + "duration_sec": 8.030300617218018, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ExpertMAPSAR_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_USDJPY_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-28T21:50:30.230910", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\BlessingRebuildEA_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_XAUUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-28T21:50:30.231922", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\BlessingRebuildEA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T21:50:30.234903", + "end_time": "2026-05-28T21:50:46.274099", + "duration_sec": 16.03176999092102, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T21:50:51.010926", + "end_time": "2026-05-28T21:51:01.042142", + "duration_sec": 10.026720762252808, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:02:28.410912", + "end_time": "2026-05-28T22:02:42.447670", + "duration_sec": 14.030231475830078, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:02:47.023097", + "end_time": "2026-05-28T22:02:57.061917", + "duration_sec": 10.034819602966309, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:03:01.748182", + "end_time": "2026-05-28T22:03:17.803411", + "duration_sec": 16.05271291732788, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:03:22.359841", + "end_time": "2026-05-28T22:03:30.410967", + "duration_sec": 8.045913696289062, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_USDJPY_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-28T22:03:35.114413", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\GMarket_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:03:35.119543", + "end_time": "2026-05-28T22:03:45.153859", + "duration_sec": 10.030060529708862, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_XAUUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-28T22:03:49.790120", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\GMarket_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:03:49.794879", + "end_time": "2026-05-28T22:04:03.839309", + "duration_sec": 14.039009809494019, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_BTCUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:04:08.703472", + "end_time": "2026-05-28T22:04:20.739398", + "duration_sec": 12.029354572296143, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_BTCUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_BTCUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:04:25.407906", + "end_time": "2026-05-28T22:04:35.435197", + "duration_sec": 10.02425217628479, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_BTCUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:09:38.977180", + "end_time": "2026-05-28T22:09:49.006185", + "duration_sec": 10.023998498916626, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:09:53.718578", + "end_time": "2026-05-28T22:10:01.761710", + "duration_sec": 8.03804349899292, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GMarket_XAUUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:10:06.335687", + "end_time": "2026-05-28T22:10:16.366874", + "duration_sec": 10.027513027191162, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "GMarket_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:10:21.023734", + "end_time": "2026-05-28T22:10:31.078680", + "duration_sec": 10.051396608352661, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:40:44.279312", + "end_time": "2026-05-28T22:41:06.327703", + "duration_sec": 22.044872283935547, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_AUDCHF_M1_default.ini", + "status": "failed", + "start_time": "2026-05-28T22:41:10.956130", + "end_time": "2026-05-28T22:52:39.431482", + "duration_sec": 688.4743342399597, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "GMarket_GBPUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-28T22:53:30.942055", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\GMarket_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:53:30.944591", + "end_time": "2026-05-28T22:53:50.983275", + "duration_sec": 20.035144329071045, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:53:55.757453", + "end_time": "2026-05-28T22:54:09.811161", + "duration_sec": 14.051702976226807, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:54:14.457712", + "end_time": "2026-05-28T22:54:24.499093", + "duration_sec": 10.036351442337036, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:54:29.132244", + "end_time": "2026-05-28T22:54:43.168240", + "duration_sec": 14.034988403320312, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:54:47.874886", + "end_time": "2026-05-28T22:55:13.922813", + "duration_sec": 26.045907974243164, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_BTCUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:55:18.502920", + "end_time": "2026-05-28T22:55:28.549552", + "duration_sec": 10.040929317474365, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_BTCUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_BTCUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-28T22:55:33.227538", + "end_time": "2026-05-28T22:55:47.280582", + "duration_sec": 14.046500205993652, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_BTCUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T08:37:17.859107", + "end_time": "2026-05-29T08:37:25.884304", + "duration_sec": 8.022184610366821, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-29T08:37:30.448107", + "end_time": "2026-05-29T08:37:38.492460", + "duration_sec": 8.042261123657227, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T08:37:43.151920", + "end_time": "2026-05-29T08:37:51.202943", + "duration_sec": 8.046512603759766, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-29T08:37:55.849455", + "end_time": "2026-05-29T08:38:03.890239", + "duration_sec": 8.036773920059204, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T08:38:08.548250", + "end_time": "2026-05-29T08:38:16.594649", + "duration_sec": 8.044403791427612, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-29T08:38:21.287378", + "end_time": "2026-05-29T08:38:31.318817", + "duration_sec": 10.027278900146484, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T08:38:36.013692", + "end_time": "2026-05-29T08:38:44.099793", + "duration_sec": 8.08349323272705, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-29T08:38:48.748315", + "end_time": "2026-05-29T08:38:56.794804", + "duration_sec": 8.043405055999756, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T10:19:48.004772", + "end_time": "2026-05-29T10:20:08.036136", + "duration_sec": 20.022748947143555, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BlessingRebuildEA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlessingRebuildEA_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T10:22:03.241747", + "end_time": "2026-05-29T10:22:05.287198", + "duration_sec": 2.043466329574585, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "ExpertMACD_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T10:22:09.920617", + "end_time": "2026-05-29T10:23:40.025539", + "duration_sec": 90.05607199668884, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ExpertMACD_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ExpertMAMA_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T10:23:44.643352", + "end_time": "2026-05-29T10:24:20.684631", + "duration_sec": 36.04022407531738, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ExpertMAMA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ExpertMAPSAR_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T10:24:24.974066", + "end_time": "2026-05-29T10:24:55.010720", + "duration_sec": 30.034651041030884, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ExpertMAPSAR_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ExpertMAPSARSizeOptimized_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T10:24:59.427106", + "end_time": "2026-05-29T10:25:31.484147", + "duration_sec": 32.04499864578247, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ExpertMAPSARSizeOptimized_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ChartInChart_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T10:25:35.831347", + "end_time": "2026-05-29T10:26:15.896656", + "duration_sec": 40.06430912017822, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ChartInChart_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "Controls_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T10:26:20.312059", + "end_time": "2026-05-29T10:26:52.353418", + "duration_sec": 32.03947710990906, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Controls_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "Correlation Matrix 3D_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T10:26:56.714375", + "end_time": "2026-05-29T10:30:48.824534", + "duration_sec": 232.10594058036804, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Correlation Matrix 3D_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "MACD Sample_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T10:30:53.338272", + "end_time": "2026-05-29T10:31:21.407925", + "duration_sec": 28.05185103416443, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\MACD Sample_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "Math 3D_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T10:31:25.792050", + "end_time": "2026-05-29T10:32:01.832648", + "duration_sec": 36.03706216812134, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Math 3D_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "Math 3D Morpher_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T10:32:06.256843", + "end_time": "2026-05-29T11:02:06.663651", + "duration_sec": 1800.405730009079, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "Moving Average_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:02:11.362399", + "end_time": "2026-05-29T11:02:49.411081", + "duration_sec": 38.03470420837402, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Moving Average_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlackCrows WhiteSoldiers CCI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:02:53.779711", + "end_time": "2026-05-29T11:03:07.818411", + "duration_sec": 14.036512613296509, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BlackCrows WhiteSoldiers CCI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlackCrows WhiteSoldiers MFI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:03:12.125599", + "end_time": "2026-05-29T11:03:26.156097", + "duration_sec": 14.0243821144104, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BlackCrows WhiteSoldiers MFI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlackCrows WhiteSoldiers RSI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:03:30.529378", + "end_time": "2026-05-29T11:03:58.582862", + "duration_sec": 28.048940896987915, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BlackCrows WhiteSoldiers RSI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BlackCrows WhiteSoldiers Stoch_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:04:02.998849", + "end_time": "2026-05-29T11:04:17.040856", + "duration_sec": 14.031439304351807, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BlackCrows WhiteSoldiers Stoch_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BullishBearish Engulfing CCI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:04:21.439284", + "end_time": "2026-05-29T11:04:39.489978", + "duration_sec": 18.03863286972046, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BullishBearish Engulfing CCI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BullishBearish Engulfing MFI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:04:43.839201", + "end_time": "2026-05-29T11:05:03.879030", + "duration_sec": 20.031301259994507, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BullishBearish Engulfing MFI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BullishBearish Engulfing RSI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:05:08.228085", + "end_time": "2026-05-29T11:05:24.250509", + "duration_sec": 16.018394708633423, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BullishBearish Engulfing RSI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BullishBearish Engulfing Stoch_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:05:28.580697", + "end_time": "2026-05-29T11:05:44.616511", + "duration_sec": 16.028127670288086, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BullishBearish Engulfing Stoch_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BullishBearish Harami CCI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:05:49.008986", + "end_time": "2026-05-29T11:06:13.071051", + "duration_sec": 24.048217058181763, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BullishBearish Harami CCI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BullishBearish Harami MFI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:06:17.448521", + "end_time": "2026-05-29T11:06:33.489374", + "duration_sec": 16.03512454032898, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BullishBearish Harami MFI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BullishBearish Harami RSI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:06:37.872514", + "end_time": "2026-05-29T11:06:55.896323", + "duration_sec": 18.01675271987915, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BullishBearish Harami RSI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BullishBearish Harami Stoch_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:07:00.265179", + "end_time": "2026-05-29T11:07:48.296240", + "duration_sec": 48.024176597595215, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BullishBearish Harami Stoch_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BullishBearish MeetingLines CCI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:07:52.694907", + "end_time": "2026-05-29T11:08:24.731901", + "duration_sec": 32.03396248817444, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BullishBearish MeetingLines CCI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BullishBearish MeetingLines MFI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:08:29.133562", + "end_time": "2026-05-29T11:09:21.176755", + "duration_sec": 52.04116415977478, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BullishBearish MeetingLines MFI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BullishBearish MeetingLines RSI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:09:25.563717", + "end_time": "2026-05-29T11:09:39.605360", + "duration_sec": 14.037243127822876, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BullishBearish MeetingLines RSI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BullishBearish MeetingLines Stoch_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:09:44.003739", + "end_time": "2026-05-29T11:09:58.040093", + "duration_sec": 14.03433871269226, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BullishBearish MeetingLines Stoch_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "DarkCloud PiercingLine CCI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:10:02.432088", + "end_time": "2026-05-29T11:17:00.710164", + "duration_sec": 418.2426013946533, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\DarkCloud PiercingLine CCI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "DarkCloud PiercingLine MFI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:17:05.398273", + "end_time": "2026-05-29T11:18:21.475593", + "duration_sec": 76.05781865119934, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\DarkCloud PiercingLine MFI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "DarkCloud PiercingLine RSI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:18:25.920965", + "end_time": "2026-05-29T11:18:47.976403", + "duration_sec": 22.04234743118286, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\DarkCloud PiercingLine RSI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "DarkCloud PiercingLine Stoch_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:18:52.328970", + "end_time": "2026-05-29T11:21:56.512464", + "duration_sec": 184.16288471221924, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\DarkCloud PiercingLine Stoch_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "HangingMan Hammer CCI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:22:01.098007", + "end_time": "2026-05-29T11:22:19.487541", + "duration_sec": 18.361716508865356, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\HangingMan Hammer CCI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "HangingMan Hammer MFI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:22:23.780181", + "end_time": "2026-05-29T11:22:39.822287", + "duration_sec": 16.0360004901886, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\HangingMan Hammer MFI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "HangingMan Hammer RSI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:22:44.170244", + "end_time": "2026-05-29T11:22:58.205884", + "duration_sec": 14.030437707901001, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\HangingMan Hammer RSI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "HangingMan Hammer Stoch_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:23:02.560868", + "end_time": "2026-05-29T11:23:18.609186", + "duration_sec": 16.04228925704956, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\HangingMan Hammer Stoch_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "MorningEvening StarDoji CCI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:23:22.939352", + "end_time": "2026-05-29T11:23:38.989747", + "duration_sec": 16.041459560394287, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\MorningEvening StarDoji CCI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "MorningEvening StarDoji MFI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:23:43.331976", + "end_time": "2026-05-29T11:23:57.367561", + "duration_sec": 14.032061100006104, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\MorningEvening StarDoji MFI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "MorningEvening StarDoji RSI_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:24:01.783657", + "end_time": "2026-05-29T11:24:29.831449", + "duration_sec": 28.03961968421936, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\MorningEvening StarDoji RSI_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "MorningEvening StarDoji Stoch_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:24:34.201966", + "end_time": "2026-05-29T11:24:54.237933", + "duration_sec": 20.029477834701538, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\MorningEvening StarDoji Stoch_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "Account Protector_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T11:24:58.631967", + "end_time": "2026-05-29T11:26:36.686389", + "duration_sec": 98.04806733131409, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Account Protector_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ApexScalper_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T11:26:41.220964", + "end_time": "2026-05-29T11:56:41.608523", + "duration_sec": 1800.3862640857697, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "BlessingRebuildEA_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T11:56:46.182458", + "end_time": "2026-05-29T12:26:46.545079", + "duration_sec": 1800.3605909347534, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "BPA Position Manager_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T12:26:51.141849", + "end_time": "2026-05-29T12:37:13.320865", + "duration_sec": 622.175434589386, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "CEZLSMA_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T12:37:17.912109", + "end_time": "2026-05-29T12:37:49.945492", + "duration_sec": 32.031254053115845, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CEZLSMA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T12:37:54.376679", + "end_time": "2026-05-29T12:38:16.423026", + "duration_sec": 22.037007331848145, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "CumulativeDeltaScalper_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T12:38:20.732343", + "end_time": "2026-05-29T13:08:21.192335", + "duration_sec": 1800.458972454071, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "DCSA_Main_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T13:08:25.823250", + "end_time": "2026-05-29T13:38:26.371829", + "duration_sec": 1800.547063589096, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "EA_Script_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T13:38:30.981271", + "end_time": "2026-05-29T14:08:31.454151", + "duration_sec": 1800.4707913398743, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "ForexShortBot_MT5_v6_3_PullbackContinuation_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T14:08:36.030066", + "end_time": "2026-05-29T14:38:36.464385", + "duration_sec": 1800.4289903640747, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "GMarket_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T14:38:40.962416", + "end_time": "2026-05-29T14:45:39.078052", + "duration_sec": 418.11156940460205, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GMarket_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GridMart_MVP_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T14:45:43.603548", + "end_time": "2026-05-29T14:49:09.685701", + "duration_sec": 206.0655860900879, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GridMart_MVP_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GridMaster Pro_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T14:49:14.078018", + "end_time": "2026-05-29T14:49:38.124751", + "duration_sec": 24.04210138320923, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GridMaster Pro_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "HarmonicTrendSniper_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T14:49:42.452609", + "end_time": "2026-05-29T14:49:58.494508", + "duration_sec": 16.03718662261963, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\HarmonicTrendSniper_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "LiquidityScalper_MT5_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T14:50:02.841443", + "end_time": "2026-05-29T14:50:22.877651", + "duration_sec": 20.031097888946533, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\LiquidityScalper_MT5_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "MyTradingBot_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T14:50:27.257653", + "end_time": "2026-05-29T14:50:47.290595", + "duration_sec": 20.02708601951599, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\MyTradingBot_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "Raavanan_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T14:50:51.624586", + "end_time": "2026-05-29T14:51:11.654281", + "duration_sec": 20.02616000175476, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Raavanan_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "RavanEA_MT5_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T14:51:16.012542", + "end_time": "2026-05-29T14:51:32.057779", + "duration_sec": 16.041736364364624, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\RavanEA_MT5_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "RB_Ouro_v4_4_Port_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T14:51:36.315424", + "end_time": "2026-05-29T14:52:30.353936", + "duration_sec": 54.034367084503174, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\RB_Ouro_v4_4_Port_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "renko2offline_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T14:52:34.780236", + "end_time": "2026-05-29T14:53:12.837860", + "duration_sec": 38.04714226722717, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\renko2offline_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "RoboScalper_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T14:53:17.214454", + "end_time": "2026-05-29T14:53:43.247432", + "duration_sec": 26.02844476699829, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\RoboScalper_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "RSI_Brothers_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T14:53:47.475275", + "end_time": "2026-05-29T14:55:07.536752", + "duration_sec": 80.05291652679443, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\RSI_Brothers_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "scalping entry m5_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T14:55:12.141184", + "end_time": "2026-05-29T15:01:18.279893", + "duration_sec": 366.1077661514282, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\scalping entry m5_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "Server酱微信推送_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T15:01:22.782489", + "end_time": "2026-05-29T15:01:26.804788", + "duration_sec": 4.021751642227173, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "Smart_Money_Order_Block_ChocEA_fix@forexfreezone_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T15:01:31.198696", + "end_time": "2026-05-29T15:31:31.630863", + "duration_sec": 1800.430671930313, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "STAR_v11.20_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T15:31:36.224296", + "end_time": "2026-05-29T15:57:34.688217", + "duration_sec": 1558.459904909134, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\STAR_v11.20_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "testbot_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T15:57:39.184312", + "end_time": "2026-05-29T15:57:47.220536", + "duration_sec": 8.035168886184692, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\testbot_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "TickChart_ExampleEA_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T15:57:51.512929", + "end_time": "2026-05-29T15:57:57.546360", + "duration_sec": 6.030827522277832, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TickChart_ExampleEA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "Trade_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T15:58:01.972936", + "end_time": "2026-05-29T15:58:10.006251", + "duration_sec": 8.022919416427612, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Trade_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "TRILLEX_10S_BASIC_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-29T15:58:14.343987", + "end_time": "2026-05-29T16:00:36.446493", + "duration_sec": 142.05902338027954, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TRILLEX_10S_BASIC_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "交易面板CONTROL PANEL PART 2汉化版-20260301213938-zdgpobx_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T16:00:40.937013", + "end_time": "2026-05-29T16:00:44.969994", + "duration_sec": 4.031964540481567, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "强弱面板Dashboard-ST_Index_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T16:00:49.294145", + "end_time": "2026-05-29T16:00:53.309957", + "duration_sec": 4.015812635421753, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "批量订单仪表盘_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T16:00:57.587424", + "end_time": "2026-05-29T16:01:01.610908", + "duration_sec": 4.021447420120239, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "高頻交易動量點燃策略EA_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T16:01:06.013074", + "end_time": "2026-05-29T16:01:10.033301", + "duration_sec": 4.018158197402954, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_EA_Price_Action_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T16:01:14.306910", + "end_time": "2026-05-29T16:01:18.331925", + "duration_sec": 4.025015830993652, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_GoldSniper_Pro_v2_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T16:01:22.624525", + "end_time": "2026-05-29T16:01:26.650290", + "duration_sec": 4.024739027023315, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEA_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T16:01:31.000893", + "end_time": "2026-05-29T16:01:35.032473", + "duration_sec": 4.03157901763916, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEAv6_BTCUSDT_15m_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T16:01:39.362997", + "end_time": "2026-05-29T16:01:43.385847", + "duration_sec": 4.021718263626099, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEAv6_ETHUSDT_1h_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T16:01:47.666789", + "end_time": "2026-05-29T16:01:51.689646", + "duration_sec": 4.021851062774658, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_Siam trading hedge_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T16:01:56.090788", + "end_time": "2026-05-29T16:02:00.114163", + "duration_sec": 4.022348880767822, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_TxngGoD_BETA_SNIPER_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-29T16:02:04.467198", + "end_time": "2026-05-29T16:02:08.487657", + "duration_sec": 4.01914381980896, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_XAUUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-29T16:02:12.774618", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\CorrelationHedge_EA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GMarket_XAUUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-29T16:02:12.784126", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\GMarket_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:05:32.430413", + "end_time": "2026-05-30T03:05:54.461488", + "duration_sec": 22.025426149368286, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:05:59.217192", + "end_time": "2026-05-30T03:06:15.257963", + "duration_sec": 16.038765907287598, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:06:19.627117", + "end_time": "2026-05-30T03:06:35.665652", + "duration_sec": 16.03254222869873, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_EURUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:06:40.042602", + "end_time": "2026-05-30T03:06:54.069365", + "duration_sec": 14.024747610092163, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_EURUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:06:58.470357", + "end_time": "2026-05-30T03:07:12.498195", + "duration_sec": 14.02380108833313, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "134016076_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:07:16.815906", + "end_time": "2026-05-30T03:07:34.866008", + "duration_sec": 18.047075033187866, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:07:39.357354", + "end_time": "2026-05-30T03:07:57.391311", + "duration_sec": 18.031949520111084, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "134016076_GBPUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:08:01.784179", + "end_time": "2026-05-30T03:08:33.855614", + "duration_sec": 32.06730389595032, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_GBPUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "134016076_GBPUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:08:38.322459", + "end_time": "2026-05-30T03:08:54.365656", + "duration_sec": 16.03893518447876, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_GBPUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "134016076_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:08:58.897468", + "end_time": "2026-05-30T03:09:16.940747", + "duration_sec": 18.038321018218994, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:09:21.424852", + "end_time": "2026-05-30T03:09:39.469559", + "duration_sec": 18.041600465774536, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:09:43.905594", + "end_time": "2026-05-30T03:10:03.931576", + "duration_sec": 20.024988889694214, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:10:08.368166", + "end_time": "2026-05-30T03:10:28.388048", + "duration_sec": 20.01630139350891, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDJPY_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:10:32.878722", + "end_time": "2026-05-30T03:10:48.911420", + "duration_sec": 16.030152559280396, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDJPY_M30_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:10:53.307497", + "end_time": "2026-05-30T03:11:17.340806", + "duration_sec": 24.027445554733276, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDCAD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:11:21.813656", + "end_time": "2026-05-30T03:11:55.854236", + "duration_sec": 34.036240100860596, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDCAD_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDCAD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:12:00.304755", + "end_time": "2026-05-30T03:12:16.346884", + "duration_sec": 16.03596782684326, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDCAD_M5_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDCAD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:12:20.779972", + "end_time": "2026-05-30T03:12:34.807214", + "duration_sec": 14.025696992874146, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDCAD_M15_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDCAD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:12:39.224052", + "end_time": "2026-05-30T03:12:53.270192", + "duration_sec": 14.042632341384888, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDCAD_M30_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDCAD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:12:57.747090", + "end_time": "2026-05-30T03:13:13.778348", + "duration_sec": 16.028614282608032, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDCAD_H1_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDCHF_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:13:18.229839", + "end_time": "2026-05-30T03:13:34.271324", + "duration_sec": 16.038522243499756, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDCHF_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDCHF_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:13:38.670698", + "end_time": "2026-05-30T03:13:52.709448", + "duration_sec": 14.035648822784424, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDCHF_M5_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDCHF_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:13:57.098915", + "end_time": "2026-05-30T03:14:15.146301", + "duration_sec": 18.04378914833069, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDCHF_M15_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDCHF_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:14:19.589921", + "end_time": "2026-05-30T03:14:37.633766", + "duration_sec": 18.038336038589478, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDCHF_M30_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDCHF_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:14:42.051839", + "end_time": "2026-05-30T03:15:04.080129", + "duration_sec": 22.02206063270569, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDCHF_H1_default.htm", + "error": null + }, + { + "ini_file": "134016076_AUDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:15:08.502189", + "end_time": "2026-05-30T03:15:24.515496", + "duration_sec": 16.01029920578003, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_AUDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_AUDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:15:28.798235", + "end_time": "2026-05-30T03:15:46.838540", + "duration_sec": 18.032785654067993, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_AUDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "134016076_AUDUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:15:51.245244", + "end_time": "2026-05-30T03:16:09.280178", + "duration_sec": 18.028295040130615, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_AUDUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "134016076_AUDUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:16:13.814727", + "end_time": "2026-05-30T03:16:31.855995", + "duration_sec": 18.037153959274292, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_AUDUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "134016076_AUDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:16:36.236641", + "end_time": "2026-05-30T03:16:54.268599", + "duration_sec": 18.027215480804443, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_AUDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "134016076_NZDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:16:58.645612", + "end_time": "2026-05-30T03:17:22.678386", + "duration_sec": 24.030839681625366, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_NZDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_NZDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:17:27.144084", + "end_time": "2026-05-30T03:17:43.190141", + "duration_sec": 16.02944040298462, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_NZDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "134016076_NZDUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:17:47.657643", + "end_time": "2026-05-30T03:18:01.690367", + "duration_sec": 14.027595043182373, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_NZDUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "134016076_NZDUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:18:06.139523", + "end_time": "2026-05-30T03:18:22.192263", + "duration_sec": 16.032000064849854, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_NZDUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "134016076_NZDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:18:26.648665", + "end_time": "2026-05-30T03:18:42.687228", + "duration_sec": 16.03400182723999, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_NZDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURGBP_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:18:47.139573", + "end_time": "2026-05-30T03:19:01.178911", + "duration_sec": 14.036623477935791, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_EURGBP_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:19:05.591700", + "end_time": "2026-05-30T03:19:21.625807", + "duration_sec": 16.03209638595581, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURGBP_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:19:26.077529", + "end_time": "2026-05-30T03:19:44.108272", + "duration_sec": 18.019986391067505, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_EURGBP_M15_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURGBP_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:19:48.485359", + "end_time": "2026-05-30T03:20:02.506273", + "duration_sec": 14.016854763031006, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_EURGBP_M30_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:20:06.953144", + "end_time": "2026-05-30T03:20:22.992605", + "duration_sec": 16.035316228866577, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:20:27.423214", + "end_time": "2026-05-30T03:20:51.465972", + "duration_sec": 24.04054832458496, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_EURJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:20:55.882032", + "end_time": "2026-05-30T03:21:17.919872", + "duration_sec": 22.03470492362976, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_EURJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:21:22.331460", + "end_time": "2026-05-30T03:21:48.368580", + "duration_sec": 26.033971071243286, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_EURJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURJPY_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:21:52.741430", + "end_time": "2026-05-30T03:22:16.778946", + "duration_sec": 24.031489849090576, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_EURJPY_M30_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:22:21.147213", + "end_time": "2026-05-30T03:22:43.178249", + "duration_sec": 22.026910543441772, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_EURJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "134016076_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:22:47.616429", + "end_time": "2026-05-30T03:23:11.655420", + "duration_sec": 24.03350853919983, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_GBPJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:23:16.168051", + "end_time": "2026-05-30T03:23:38.204065", + "duration_sec": 22.032856941223145, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_GBPJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "134016076_GBPJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:23:42.565875", + "end_time": "2026-05-30T03:24:04.613630", + "duration_sec": 22.040198802947998, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_GBPJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "134016076_GBPJPY_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:24:09.071316", + "end_time": "2026-05-30T03:24:35.132491", + "duration_sec": 26.059651851654053, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_GBPJPY_M30_default.htm", + "error": null + }, + { + "ini_file": "134016076_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:24:39.532610", + "end_time": "2026-05-30T03:25:05.567757", + "duration_sec": 26.03010845184326, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "134016076_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:25:10.087948", + "end_time": "2026-05-30T03:25:54.119886", + "duration_sec": 44.02662682533264, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:25:58.464692", + "end_time": "2026-05-30T03:26:42.515954", + "duration_sec": 44.04541492462158, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "134016076_XAUUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:26:46.910729", + "end_time": "2026-05-30T03:27:28.950278", + "duration_sec": 42.03441405296326, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "134016076_XAUUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:27:33.398871", + "end_time": "2026-05-30T03:28:17.442579", + "duration_sec": 44.03964161872864, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_XAUUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "134016076_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:28:21.792570", + "end_time": "2026-05-30T03:29:09.841252", + "duration_sec": 48.04262018203735, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "134016076_BTCUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:29:14.340397", + "end_time": "2026-05-30T03:30:18.384560", + "duration_sec": 64.04010224342346, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_BTCUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_BTCUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:30:22.792679", + "end_time": "2026-05-30T03:31:24.841743", + "duration_sec": 62.04653453826904, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_BTCUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "134016076_BTCUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:31:29.258015", + "end_time": "2026-05-30T03:32:37.305400", + "duration_sec": 68.04329228401184, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_BTCUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "134016076_BTCUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:32:41.794165", + "end_time": "2026-05-30T03:33:59.838583", + "duration_sec": 78.04032063484192, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_BTCUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "134016076_BTCUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:34:04.347732", + "end_time": "2026-05-30T03:35:10.392710", + "duration_sec": 66.04048752784729, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_BTCUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:35:14.698751", + "end_time": "2026-05-30T03:45:50.866327", + "duration_sec": 636.1647717952728, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:45:55.528991", + "end_time": "2026-05-30T03:56:17.699206", + "duration_sec": 622.1671011447906, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T03:56:22.391094", + "end_time": "2026-05-30T04:06:52.558683", + "duration_sec": 630.1528174877167, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T04:06:57.350636", + "end_time": "2026-05-30T04:17:27.513640", + "duration_sec": 630.1609959602356, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T04:17:32.280866", + "end_time": "2026-05-30T04:27:32.440863", + "duration_sec": 600.1556220054626, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T04:27:37.123927", + "end_time": "2026-05-30T04:38:11.305281", + "duration_sec": 634.1793110370636, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T04:38:16.145585", + "end_time": "2026-05-30T04:48:40.325736", + "duration_sec": 624.1762006282806, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_GBPUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T04:48:44.841115", + "end_time": "2026-05-30T04:59:05.015790", + "duration_sec": 620.1716785430908, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_GBPUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_GBPUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T04:59:09.582438", + "end_time": "2026-05-30T05:09:27.784918", + "duration_sec": 618.1997075080872, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_GBPUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T05:09:32.424028", + "end_time": "2026-05-30T05:19:52.623015", + "duration_sec": 620.1918089389801, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T05:19:57.291155", + "end_time": "2026-05-30T05:32:05.499817", + "duration_sec": 728.2037298679352, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T05:32:10.148991", + "end_time": "2026-05-30T05:44:18.368806", + "duration_sec": 728.2169544696808, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T05:44:22.976788", + "end_time": "2026-05-30T05:56:33.202370", + "duration_sec": 730.2191762924194, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDJPY_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T05:56:37.804998", + "end_time": "2026-05-30T06:09:16.026526", + "duration_sec": 758.2169940471649, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDJPY_M30_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T06:09:20.586971", + "end_time": "2026-05-30T06:21:32.873430", + "duration_sec": 732.2829763889313, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDCAD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T06:21:37.500410", + "end_time": "2026-05-30T06:31:33.668097", + "duration_sec": 596.1649911403656, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDCAD_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDCAD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T06:31:38.363693", + "end_time": "2026-05-30T06:41:34.534162", + "duration_sec": 596.1668448448181, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDCAD_M5_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDCAD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T06:41:39.193785", + "end_time": "2026-05-30T06:51:43.369981", + "duration_sec": 604.1699874401093, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDCAD_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDCAD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T06:51:47.920623", + "end_time": "2026-05-30T07:01:44.111098", + "duration_sec": 596.1813313961029, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDCAD_M30_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDCAD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T07:01:48.636347", + "end_time": "2026-05-30T07:11:46.810636", + "duration_sec": 598.1702802181244, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDCAD_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDCHF_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T07:11:51.446655", + "end_time": "2026-05-30T07:21:47.632370", + "duration_sec": 596.1831188201904, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDCHF_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDCHF_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T07:21:52.219415", + "end_time": "2026-05-30T07:31:50.396089", + "duration_sec": 598.172682762146, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDCHF_M5_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDCHF_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T07:31:55.007235", + "end_time": "2026-05-30T07:41:55.201526", + "duration_sec": 600.1912581920624, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDCHF_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDCHF_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T07:41:59.825917", + "end_time": "2026-05-30T07:51:54.070898", + "duration_sec": 594.2374954223633, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDCHF_M30_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDCHF_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T07:51:58.687616", + "end_time": "2026-05-30T08:01:54.843995", + "duration_sec": 596.153103351593, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDCHF_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_AUDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T08:01:59.443789", + "end_time": "2026-05-30T08:12:19.643397", + "duration_sec": 620.1965544223785, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_AUDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_AUDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T08:12:24.168608", + "end_time": "2026-05-30T08:22:40.345236", + "duration_sec": 616.1736567020416, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_AUDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_AUDUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T08:22:44.978494", + "end_time": "2026-05-30T08:32:59.197549", + "duration_sec": 614.2155404090881, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_AUDUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_AUDUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T08:33:03.820904", + "end_time": "2026-05-30T08:43:22.019714", + "duration_sec": 618.1937131881714, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_AUDUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_AUDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T08:43:26.675048", + "end_time": "2026-05-30T08:53:42.854685", + "duration_sec": 616.1731593608856, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_AUDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_NZDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T08:53:47.324897", + "end_time": "2026-05-30T09:03:45.497249", + "duration_sec": 598.1705374717712, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_NZDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_NZDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T09:03:50.134132", + "end_time": "2026-05-30T09:13:50.300119", + "duration_sec": 600.1619715690613, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_NZDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_NZDUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T09:13:54.953171", + "end_time": "2026-05-30T09:23:53.142280", + "duration_sec": 598.1852326393127, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_NZDUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_NZDUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T09:23:57.633644", + "end_time": "2026-05-30T09:33:55.806624", + "duration_sec": 598.1690900325775, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_NZDUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_NZDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T09:34:00.413819", + "end_time": "2026-05-30T09:43:58.643480", + "duration_sec": 598.2242193222046, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_NZDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURGBP_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T09:44:03.361255", + "end_time": "2026-05-30T09:54:01.536579", + "duration_sec": 598.1697421073914, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURGBP_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T09:54:06.160870", + "end_time": "2026-05-30T10:04:02.346377", + "duration_sec": 596.1819689273834, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURGBP_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T10:04:06.969474", + "end_time": "2026-05-30T10:14:05.156488", + "duration_sec": 598.1813924312592, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURGBP_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURGBP_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T10:14:09.753534", + "end_time": "2026-05-30T10:24:09.940417", + "duration_sec": 600.1811785697937, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURGBP_M30_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T10:24:14.516515", + "end_time": "2026-05-30T10:34:14.716669", + "duration_sec": 600.1909120082855, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T10:34:19.295400", + "end_time": "2026-05-30T10:46:23.494129", + "duration_sec": 724.1944735050201, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T10:46:28.137237", + "end_time": "2026-05-30T10:58:30.336839", + "duration_sec": 722.1955277919769, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T10:58:34.938284", + "end_time": "2026-05-30T11:10:41.145914", + "duration_sec": 726.201717376709, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURJPY_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T11:10:45.749503", + "end_time": "2026-05-30T11:29:52.088093", + "duration_sec": 1146.3335540294647, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURJPY_M30_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T11:29:56.626295", + "end_time": "2026-05-30T11:42:54.941442", + "duration_sec": 778.3121485710144, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T11:42:59.535207", + "end_time": "2026-05-30T11:55:53.758466", + "duration_sec": 774.2190198898315, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_GBPJPY_M5_default.ini", + "status": "failed", + "start_time": "2026-05-30T11:55:58.334325", + "end_time": "2026-05-30T12:25:58.867667", + "duration_sec": 1800.5300941467285, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_GBPJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T12:26:03.507638", + "end_time": "2026-05-30T12:38:59.733267", + "duration_sec": 776.2195470333099, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_GBPJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_GBPJPY_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T12:39:04.406972", + "end_time": "2026-05-30T12:52:02.631407", + "duration_sec": 778.2192032337189, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_GBPJPY_M30_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T12:52:07.272767", + "end_time": "2026-05-30T13:05:01.492196", + "duration_sec": 774.2161302566528, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:05:06.086869", + "end_time": "2026-05-30T13:05:34.126835", + "duration_sec": 28.036453008651733, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:05:38.518763", + "end_time": "2026-05-30T13:05:54.563259", + "duration_sec": 16.04144525527954, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_XAUUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:05:59.052597", + "end_time": "2026-05-30T13:06:23.095682", + "duration_sec": 24.04006814956665, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_XAUUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:06:27.491802", + "end_time": "2026-05-30T13:06:41.525020", + "duration_sec": 14.028175354003906, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_XAUUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:06:45.976958", + "end_time": "2026-05-30T13:06:58.011908", + "duration_sec": 12.030912637710571, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_BTCUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:07:02.361140", + "end_time": "2026-05-30T13:07:16.393646", + "duration_sec": 14.027859210968018, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_BTCUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_BTCUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:07:20.822347", + "end_time": "2026-05-30T13:07:50.883073", + "duration_sec": 30.052463054656982, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_BTCUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_BTCUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:07:55.348748", + "end_time": "2026-05-30T13:08:27.395403", + "duration_sec": 32.0381965637207, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_BTCUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_BTCUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:08:31.762390", + "end_time": "2026-05-30T13:09:01.825436", + "duration_sec": 30.058021783828735, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_BTCUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_BTCUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:09:06.213096", + "end_time": "2026-05-30T13:09:38.266144", + "duration_sec": 32.04724144935608, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_BTCUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:09:42.689943", + "end_time": "2026-05-30T13:09:50.720549", + "duration_sec": 8.026845216751099, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:09:55.189950", + "end_time": "2026-05-30T13:10:43.216125", + "duration_sec": 48.024160861968994, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:10:47.649925", + "end_time": "2026-05-30T13:10:57.706387", + "duration_sec": 10.044893264770508, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:11:02.083534", + "end_time": "2026-05-30T13:11:12.115718", + "duration_sec": 10.03060245513916, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:11:16.485945", + "end_time": "2026-05-30T13:11:26.524681", + "duration_sec": 10.034559726715088, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:11:31.005959", + "end_time": "2026-05-30T13:11:43.040274", + "duration_sec": 12.0303213596344, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:11:47.453784", + "end_time": "2026-05-30T13:11:55.486127", + "duration_sec": 8.02875804901123, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:11:59.773914", + "end_time": "2026-05-30T13:12:17.804531", + "duration_sec": 18.027374982833862, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:12:22.167905", + "end_time": "2026-05-30T13:12:34.216305", + "duration_sec": 12.043209552764893, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:12:38.562364", + "end_time": "2026-05-30T13:12:48.597056", + "duration_sec": 10.030682563781738, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:12:52.941542", + "end_time": "2026-05-30T13:13:02.974378", + "duration_sec": 10.028419494628906, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:13:07.398070", + "end_time": "2026-05-30T13:13:17.434382", + "duration_sec": 10.032783508300781, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:13:21.714951", + "end_time": "2026-05-30T13:13:33.757444", + "duration_sec": 12.036121845245361, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:13:38.074603", + "end_time": "2026-05-30T13:13:50.094322", + "duration_sec": 12.015553951263428, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M30_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:13:54.504725", + "end_time": "2026-05-30T13:14:06.521563", + "duration_sec": 12.014159440994263, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCAD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:14:10.857707", + "end_time": "2026-05-30T13:14:18.877293", + "duration_sec": 8.01206088066101, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCAD_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCAD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:14:23.332646", + "end_time": "2026-05-30T13:14:31.363137", + "duration_sec": 8.02467966079712, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCAD_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCAD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:14:35.733002", + "end_time": "2026-05-30T13:14:45.764189", + "duration_sec": 10.027074337005615, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCAD_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCAD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:14:50.165349", + "end_time": "2026-05-30T13:15:00.206382", + "duration_sec": 10.036493062973022, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCAD_M30_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCAD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:15:04.563248", + "end_time": "2026-05-30T13:15:14.593192", + "duration_sec": 10.024456024169922, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCAD_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:15:19.016858", + "end_time": "2026-05-30T13:15:33.058084", + "duration_sec": 14.036309003829956, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:15:37.531843", + "end_time": "2026-05-30T13:15:47.575062", + "duration_sec": 10.039916276931763, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:15:52.015041", + "end_time": "2026-05-30T13:16:14.049090", + "duration_sec": 22.03203010559082, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:16:18.461946", + "end_time": "2026-05-30T13:16:26.494049", + "duration_sec": 8.027449369430542, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_M30_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:16:30.844290", + "end_time": "2026-05-30T13:16:38.875850", + "duration_sec": 8.025997638702393, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_AUDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:16:43.245965", + "end_time": "2026-05-30T13:16:51.267365", + "duration_sec": 8.019009828567505, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_AUDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_AUDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:16:55.760787", + "end_time": "2026-05-30T13:17:03.819784", + "duration_sec": 8.054312467575073, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_AUDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_AUDUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:17:08.194550", + "end_time": "2026-05-30T13:17:18.209266", + "duration_sec": 10.012376070022583, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_AUDUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_AUDUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:17:22.596890", + "end_time": "2026-05-30T13:17:32.622215", + "duration_sec": 10.022870302200317, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_AUDUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_AUDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:17:37.042652", + "end_time": "2026-05-30T13:17:47.065532", + "duration_sec": 10.018347263336182, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_AUDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_NZDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:17:51.398518", + "end_time": "2026-05-30T13:18:21.420078", + "duration_sec": 30.019036293029785, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_NZDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_NZDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:18:25.850322", + "end_time": "2026-05-30T13:18:37.875783", + "duration_sec": 12.022422075271606, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_NZDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_NZDUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:18:42.287829", + "end_time": "2026-05-30T13:18:52.333322", + "duration_sec": 10.04005765914917, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_NZDUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_NZDUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:18:56.747662", + "end_time": "2026-05-30T13:19:14.776486", + "duration_sec": 18.02303433418274, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_NZDUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_NZDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:19:19.160550", + "end_time": "2026-05-30T13:19:37.202724", + "duration_sec": 18.037464380264282, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_NZDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURGBP_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:19:41.587407", + "end_time": "2026-05-30T13:19:51.628068", + "duration_sec": 10.038298606872559, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURGBP_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:19:56.126406", + "end_time": "2026-05-30T13:20:06.154615", + "duration_sec": 10.023675680160522, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURGBP_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:20:10.552091", + "end_time": "2026-05-30T13:20:20.592315", + "duration_sec": 10.035582780838013, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURGBP_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURGBP_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:20:25.062627", + "end_time": "2026-05-30T13:20:53.104757", + "duration_sec": 28.03640103340149, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURGBP_M30_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:20:57.530498", + "end_time": "2026-05-30T13:21:25.573351", + "duration_sec": 28.03932213783264, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:21:30.060483", + "end_time": "2026-05-30T13:22:50.114011", + "duration_sec": 80.04936194419861, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:22:54.744097", + "end_time": "2026-05-30T13:24:18.793888", + "duration_sec": 84.0466456413269, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:24:23.167111", + "end_time": "2026-05-30T13:24:33.203596", + "duration_sec": 10.034400939941406, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:24:37.562079", + "end_time": "2026-05-30T13:24:47.606471", + "duration_sec": 10.041364908218384, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_M30_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:24:51.848871", + "end_time": "2026-05-30T13:25:01.893163", + "duration_sec": 10.038468360900879, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:25:06.268934", + "end_time": "2026-05-30T13:25:18.301070", + "duration_sec": 12.030122518539429, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:25:22.701207", + "end_time": "2026-05-30T13:25:54.736677", + "duration_sec": 32.03345322608948, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:25:59.160937", + "end_time": "2026-05-30T13:26:15.209229", + "duration_sec": 16.04420828819275, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:26:19.616539", + "end_time": "2026-05-30T13:28:29.731585", + "duration_sec": 130.10770106315613, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_M30_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:28:34.393882", + "end_time": "2026-05-30T13:29:36.445996", + "duration_sec": 62.045525312423706, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:29:41.000839", + "end_time": "2026-05-30T13:30:21.056222", + "duration_sec": 40.04997968673706, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:30:25.473143", + "end_time": "2026-05-30T13:31:03.523166", + "duration_sec": 38.04593300819397, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:31:07.958992", + "end_time": "2026-05-30T13:31:54.005097", + "duration_sec": 46.04046630859375, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:31:58.507318", + "end_time": "2026-05-30T13:32:38.584108", + "duration_sec": 40.06971192359924, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:32:42.960689", + "end_time": "2026-05-30T13:33:21.006419", + "duration_sec": 38.04111695289612, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_BTCUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:33:25.466596", + "end_time": "2026-05-30T13:33:35.538231", + "duration_sec": 10.06705904006958, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_BTCUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_BTCUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:33:39.988557", + "end_time": "2026-05-30T13:33:50.025130", + "duration_sec": 10.035117387771606, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_BTCUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_BTCUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:33:54.521934", + "end_time": "2026-05-30T13:34:04.557338", + "duration_sec": 10.031698226928711, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_BTCUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_BTCUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:34:09.035550", + "end_time": "2026-05-30T13:35:23.098494", + "duration_sec": 74.05880737304688, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_BTCUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_BTCUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:35:27.584212", + "end_time": "2026-05-30T13:36:41.648176", + "duration_sec": 74.0537805557251, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_BTCUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:36:45.998834", + "end_time": "2026-05-30T13:36:56.055647", + "duration_sec": 10.04208755493164, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:37:00.454931", + "end_time": "2026-05-30T13:37:10.496009", + "duration_sec": 10.03673768043518, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:37:14.931503", + "end_time": "2026-05-30T13:37:24.968629", + "duration_sec": 10.028924465179443, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:37:29.402550", + "end_time": "2026-05-30T13:37:39.446113", + "duration_sec": 10.03850269317627, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:37:43.827814", + "end_time": "2026-05-30T13:37:53.872448", + "duration_sec": 10.039105415344238, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:37:58.259097", + "end_time": "2026-05-30T13:38:08.300045", + "duration_sec": 10.031643152236938, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:38:12.807355", + "end_time": "2026-05-30T13:38:24.851916", + "duration_sec": 12.03816819190979, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:38:29.214218", + "end_time": "2026-05-30T13:38:41.251132", + "duration_sec": 12.032897472381592, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:38:45.694968", + "end_time": "2026-05-30T13:38:55.733687", + "duration_sec": 10.034570455551147, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:39:00.147192", + "end_time": "2026-05-30T13:39:10.195004", + "duration_sec": 10.042071342468262, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:39:14.569784", + "end_time": "2026-05-30T13:39:26.635235", + "duration_sec": 12.057130098342896, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:39:31.040185", + "end_time": "2026-05-30T13:39:43.086545", + "duration_sec": 12.038785219192505, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:39:47.414707", + "end_time": "2026-05-30T13:39:57.434891", + "duration_sec": 10.015315771102905, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDJPY_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:40:01.842249", + "end_time": "2026-05-30T13:40:11.867600", + "duration_sec": 10.023345708847046, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDJPY_M30_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:40:16.317263", + "end_time": "2026-05-30T13:40:26.356015", + "duration_sec": 10.034105062484741, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDCAD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:40:30.861999", + "end_time": "2026-05-30T13:40:40.908670", + "duration_sec": 10.036803960800171, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDCAD_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDCAD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:40:45.357720", + "end_time": "2026-05-30T13:40:55.390349", + "duration_sec": 10.0274658203125, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDCAD_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDCAD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:40:59.828385", + "end_time": "2026-05-30T13:41:09.861881", + "duration_sec": 10.031473636627197, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDCAD_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDCAD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:41:14.265488", + "end_time": "2026-05-30T13:41:24.308691", + "duration_sec": 10.035697221755981, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDCAD_M30_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDCAD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:41:28.827126", + "end_time": "2026-05-30T13:41:38.876206", + "duration_sec": 10.039987087249756, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDCAD_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDCHF_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:41:43.300130", + "end_time": "2026-05-30T13:41:53.365053", + "duration_sec": 10.056676864624023, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDCHF_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDCHF_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:41:57.831881", + "end_time": "2026-05-30T13:42:07.860865", + "duration_sec": 10.024965286254883, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDCHF_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDCHF_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:42:12.265740", + "end_time": "2026-05-30T13:42:22.311693", + "duration_sec": 10.042239904403687, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDCHF_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDCHF_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:42:26.769036", + "end_time": "2026-05-30T13:42:36.822177", + "duration_sec": 10.045997619628906, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDCHF_M30_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDCHF_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:42:41.296064", + "end_time": "2026-05-30T13:42:51.338871", + "duration_sec": 10.039291620254517, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDCHF_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_AUDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:42:55.747409", + "end_time": "2026-05-30T13:43:07.809242", + "duration_sec": 12.049580335617065, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_AUDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_AUDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:43:12.191648", + "end_time": "2026-05-30T13:43:22.217108", + "duration_sec": 10.015236377716064, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_AUDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_AUDUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:43:26.620376", + "end_time": "2026-05-30T13:43:36.657013", + "duration_sec": 10.032114744186401, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_AUDUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_AUDUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:43:41.193142", + "end_time": "2026-05-30T13:43:53.242958", + "duration_sec": 12.040212392807007, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_AUDUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_AUDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:43:57.705709", + "end_time": "2026-05-30T13:44:07.733426", + "duration_sec": 10.022915840148926, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_AUDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_NZDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:44:12.043264", + "end_time": "2026-05-30T13:44:22.095010", + "duration_sec": 10.039010286331177, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_NZDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_NZDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:44:26.463280", + "end_time": "2026-05-30T13:44:38.508801", + "duration_sec": 12.036190509796143, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_NZDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_NZDUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:44:42.968356", + "end_time": "2026-05-30T13:44:53.033107", + "duration_sec": 10.053945302963257, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_NZDUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_NZDUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:44:57.489889", + "end_time": "2026-05-30T13:45:07.524449", + "duration_sec": 10.03035306930542, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_NZDUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_NZDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:45:11.869193", + "end_time": "2026-05-30T13:45:23.905824", + "duration_sec": 12.031230211257935, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_NZDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURGBP_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:45:28.272755", + "end_time": "2026-05-30T13:45:40.314677", + "duration_sec": 12.034871816635132, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURGBP_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:45:44.733171", + "end_time": "2026-05-30T13:45:56.780818", + "duration_sec": 12.038779497146606, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURGBP_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:46:01.302826", + "end_time": "2026-05-30T13:46:13.344691", + "duration_sec": 12.039138078689575, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURGBP_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURGBP_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:46:17.726231", + "end_time": "2026-05-30T13:46:29.771037", + "duration_sec": 12.038633823394775, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURGBP_M30_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:46:34.221072", + "end_time": "2026-05-30T13:46:46.246781", + "duration_sec": 12.021986961364746, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:46:50.627661", + "end_time": "2026-05-30T13:47:04.670697", + "duration_sec": 14.031885862350464, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:47:09.008760", + "end_time": "2026-05-30T13:47:23.030622", + "duration_sec": 14.014151573181152, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:47:27.508638", + "end_time": "2026-05-30T13:47:41.562391", + "duration_sec": 14.047104597091675, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURJPY_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:47:45.944389", + "end_time": "2026-05-30T13:47:57.987315", + "duration_sec": 12.040313243865967, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURJPY_M30_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:48:02.381445", + "end_time": "2026-05-30T13:48:14.417654", + "duration_sec": 12.03287124633789, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:48:18.829217", + "end_time": "2026-05-30T13:48:34.885436", + "duration_sec": 16.040797472000122, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:48:39.338449", + "end_time": "2026-05-30T13:48:53.384630", + "duration_sec": 14.04065752029419, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:48:57.802927", + "end_time": "2026-05-30T13:49:11.845917", + "duration_sec": 14.037434816360474, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPJPY_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:49:16.242598", + "end_time": "2026-05-30T13:49:30.277112", + "duration_sec": 14.030978441238403, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPJPY_M30_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:49:34.741695", + "end_time": "2026-05-30T13:49:46.787431", + "duration_sec": 12.04062032699585, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:49:51.291256", + "end_time": "2026-05-30T13:50:03.339665", + "duration_sec": 12.044725179672241, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:50:07.738286", + "end_time": "2026-05-30T13:50:19.774960", + "duration_sec": 12.032901048660278, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_XAUUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:50:24.207874", + "end_time": "2026-05-30T13:50:36.246360", + "duration_sec": 12.032924890518188, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_XAUUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:50:40.673695", + "end_time": "2026-05-30T13:50:54.692695", + "duration_sec": 14.016085386276245, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_XAUUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:50:59.063973", + "end_time": "2026-05-30T13:51:09.099843", + "duration_sec": 10.030072689056396, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_BTCUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:51:13.506248", + "end_time": "2026-05-30T13:51:27.535320", + "duration_sec": 14.025275230407715, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_BTCUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_BTCUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:51:31.991329", + "end_time": "2026-05-30T13:51:44.025912", + "duration_sec": 12.028871059417725, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_BTCUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_BTCUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:51:48.447917", + "end_time": "2026-05-30T13:52:04.493059", + "duration_sec": 16.041064500808716, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_BTCUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_BTCUSD_M30_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:52:08.949618", + "end_time": "2026-05-30T13:52:22.995505", + "duration_sec": 14.039961576461792, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_BTCUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_BTCUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T13:52:27.467624", + "end_time": "2026-05-30T13:52:39.498573", + "duration_sec": 12.029910564422607, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_BTCUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "4 SECODS (1)_EURUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-30T13:52:43.936669", + "end_time": "2026-05-30T14:22:45.006725", + "duration_sec": 1801.0700566768646, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "4 SECODS (1)_EURUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-05-30T14:22:49.876709", + "end_time": "2026-05-30T14:52:50.661244", + "duration_sec": 1800.7825152873993, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "4 SECODS (1)_EURUSD_M15_default.ini", + "status": "failed", + "start_time": "2026-05-30T14:52:55.477151", + "end_time": "2026-05-30T15:22:56.371806", + "duration_sec": 1800.8935384750366, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "4 SECODS (1)_EURUSD_M30_default.ini", + "status": "failed", + "start_time": "2026-05-30T15:23:01.287245", + "end_time": "2026-05-30T15:53:02.201845", + "duration_sec": 1800.9135913848877, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "4 SECODS (1)_EURUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-05-30T15:53:07.110359", + "end_time": "2026-05-30T16:23:07.907895", + "duration_sec": 1800.7975361347198, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "4 SECODS (1)_GBPUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-30T16:23:12.717161", + "end_time": "2026-05-30T16:53:13.612502", + "duration_sec": 1800.8953411579132, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "4 SECODS (1)_GBPUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-05-30T16:53:18.454661", + "end_time": "2026-05-30T17:23:19.361293", + "duration_sec": 1800.9016225337982, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "4 SECODS (1)_GBPUSD_M15_default.ini", + "status": "failed", + "start_time": "2026-05-30T17:23:24.250383", + "end_time": "2026-05-30T17:53:25.695106", + "duration_sec": 1801.4428970813751, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "4 SECODS (1)_GBPUSD_M30_default.ini", + "status": "failed", + "start_time": "2026-05-30T17:53:30.564798", + "end_time": "2026-05-30T17:59:42.780657", + "duration_sec": 372.21098828315735, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "4 SECODS (1)_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-30T17:59:47.447411", + "end_time": "2026-05-30T18:01:05.549334", + "duration_sec": 78.06314969062805, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\4 SECODS (1)_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.281945", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURUSD_M5_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.285952", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURUSD_M15_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.289320", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_EURUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURUSD_M30_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.293174", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_EURUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURUSD_H1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.298156", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "134016076_GBPUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.303354", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_GBPUSD_M5_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.306330", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "134016076_GBPUSD_M15_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.310667", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_GBPUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "134016076_GBPUSD_M30_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.316212", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_GBPUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "134016076_GBPUSD_H1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.321629", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDJPY_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.329015", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDJPY_M5_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.333398", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDJPY_M15_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.338039", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_USDJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDJPY_M30_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.342779", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_USDJPY_M30_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDJPY_H1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.346520", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "134016076_XAUUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.352850", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_XAUUSD_M5_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.356627", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "134016076_XAUUSD_M15_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.362771", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "134016076_XAUUSD_M30_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.369309", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_XAUUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "134016076_XAUUSD_H1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.375487", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\134016076_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.380998", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURUSD_M5_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.385509", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURUSD_M15_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.392219", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_EURUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURUSD_M30_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.396732", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_EURUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURUSD_H1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.403244", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_GBPUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.408299", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_GBPUSD_M5_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.413336", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_GBPUSD_M15_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.419323", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_GBPUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_GBPUSD_M30_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.425206", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_GBPUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_GBPUSD_H1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.430240", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDJPY_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.434696", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDJPY_M5_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.440330", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDJPY_M15_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.446879", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_USDJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDJPY_M30_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.451385", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_USDJPY_M30_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDJPY_H1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.457037", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_XAUUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.463081", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_XAUUSD_M5_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.469130", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_XAUUSD_M15_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.474798", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_XAUUSD_M30_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.480499", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_XAUUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_XAUUSD_H1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.485484", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\1EA Hedging Mania (1)_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.491596", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M5_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.496593", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M15_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.502754", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M30_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.508336", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_H1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.515339", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.522775", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M5_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.528846", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M15_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.534416", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M30_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.539002", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_H1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.545007", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.551655", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M5_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.561751", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M15_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.569929", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M30_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.575959", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M30_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_H1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.582790", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.588806", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M5_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.594953", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M15_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.601746", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M30_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.609825", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_H1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.617033", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.625543", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_M5_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.632068", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_M15_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.640407", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_EURUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_M30_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.645759", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_EURUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_H1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.651297", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.656787", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPUSD_M5_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.661341", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPUSD_M15_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.665904", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_GBPUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPUSD_M30_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.670598", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_GBPUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPUSD_H1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.675232", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDJPY_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.680466", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDJPY_M5_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.685569", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDJPY_M15_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.690684", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_USDJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDJPY_M30_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.695224", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_USDJPY_M30_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDJPY_H1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.701723", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_XAUUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.706280", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_XAUUSD_M5_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.712430", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_XAUUSD_M15_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.719162", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_XAUUSD_M30_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.724178", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_XAUUSD_M30_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_XAUUSD_H1_default.ini", + "status": "already_completed", + "start_time": "2026-05-30T19:34:11.729270", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-31T04:24:45.360293", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_M1_default.ini", + "status": "already_completed", + "start_time": "2026-05-31T04:25:39.429757", + "end_time": null, + "duration_sec": 0, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\010E047102812FC0C18890992854220E\\3CandleBreakoutEA @simpleforextools_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T04:28:14.056402", + "end_time": "2026-05-31T04:28:26.099609", + "duration_sec": 12.032966375350952, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-31T04:28:30.816952", + "end_time": "2026-05-31T04:28:42.845906", + "duration_sec": 12.023753881454468, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T04:44:59.739985", + "end_time": "2026-05-31T04:46:15.780020", + "duration_sec": 76.03734159469604, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T05:05:34.942667", + "end_time": "2026-05-31T05:09:23.103812", + "duration_sec": 228.15437531471252, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T08:39:02.587627", + "end_time": "2026-05-31T08:44:20.732465", + "duration_sec": 318.1367793083191, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-31T08:44:25.248985", + "end_time": "2026-05-31T08:44:49.288421", + "duration_sec": 24.03740644454956, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-31T08:44:53.765557", + "end_time": "2026-05-31T08:45:17.800969", + "duration_sec": 24.032410144805908, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-31T08:45:22.231820", + "end_time": "2026-05-31T08:45:44.270415", + "duration_sec": 22.035115957260132, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T08:45:48.575133", + "end_time": "2026-05-31T08:46:48.634800", + "duration_sec": 60.05451512336731, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "1EA Hedging Mania (1)_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-31T08:46:53.036432", + "end_time": "2026-05-31T08:47:21.097567", + "duration_sec": 28.060129165649414, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\1EA Hedging Mania (1)_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T08:49:50.730202", + "end_time": "2026-05-31T08:50:24.762533", + "duration_sec": 34.026782274246216, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-31T08:50:29.155761", + "end_time": "2026-05-31T08:52:31.221762", + "duration_sec": 122.06088876724243, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-31T08:52:35.603571", + "end_time": "2026-05-31T08:54:07.649018", + "duration_sec": 92.04343104362488, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-31T08:54:12.117992", + "end_time": "2026-05-31T09:06:30.338469", + "duration_sec": 738.213930606842, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-05-31T09:06:34.956017", + "end_time": "2026-05-31T09:36:35.441308", + "duration_sec": 1800.4813158512115, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-31T09:36:40.020333", + "end_time": "2026-05-31T09:36:52.057743", + "duration_sec": 12.031879901885986, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-31T09:36:56.420781", + "end_time": "2026-05-31T09:37:08.459649", + "duration_sec": 12.032225370407104, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-31T09:37:12.852629", + "end_time": "2026-05-31T09:37:50.893800", + "duration_sec": 38.0375816822052, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T09:37:55.350200", + "end_time": "2026-05-31T09:38:15.383775", + "duration_sec": 20.029561519622803, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-31T09:38:19.697074", + "end_time": "2026-05-31T09:38:37.737447", + "duration_sec": 18.034328937530518, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-31T09:38:42.098889", + "end_time": "2026-05-31T09:39:02.129609", + "duration_sec": 20.027169704437256, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-31T09:39:06.569371", + "end_time": "2026-05-31T09:39:40.614248", + "duration_sec": 34.038755655288696, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T09:39:45.024575", + "end_time": "2026-05-31T09:40:01.067541", + "duration_sec": 16.033952713012695, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_M5_default.ini", + "status": "completed", + "start_time": "2026-05-31T09:40:05.466812", + "end_time": "2026-05-31T09:40:23.498102", + "duration_sec": 18.027077436447144, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_M15_default.ini", + "status": "completed", + "start_time": "2026-05-31T09:40:27.869544", + "end_time": "2026-05-31T09:40:43.901653", + "duration_sec": 16.029856204986572, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_H1_default.ini", + "status": "completed", + "start_time": "2026-05-31T09:40:48.155820", + "end_time": "2026-05-31T09:43:34.223489", + "duration_sec": 166.0640516281128, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_USDCHF_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T09:43:38.860746", + "end_time": "2026-05-31T09:44:04.896934", + "duration_sec": 26.032092809677124, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-31T09:44:09.311551", + "end_time": "2026-05-31T09:44:33.335382", + "duration_sec": 24.02081274986267, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_M15_default.ini", + "status": "failed", + "start_time": "2026-05-31T09:44:37.616840", + "end_time": "2026-05-31T10:14:38.040832", + "duration_sec": 1800.422076702118, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:14:42.756729", + "end_time": "2026-05-31T10:18:42.865352", + "duration_sec": 240.10346174240112, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_EURJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:18:47.523537", + "end_time": "2026-05-31T10:19:19.561399", + "duration_sec": 32.03384613990784, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:19:23.965498", + "end_time": "2026-05-31T10:19:52.032021", + "duration_sec": 28.0648832321167, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:19:56.446338", + "end_time": "2026-05-31T10:20:26.501492", + "duration_sec": 30.050148010253906, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:20:30.848131", + "end_time": "2026-05-31T10:23:58.932089", + "duration_sec": 208.07990431785583, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:24:03.475737", + "end_time": "2026-05-31T10:24:17.524951", + "duration_sec": 14.040606021881104, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:24:21.976503", + "end_time": "2026-05-31T10:24:56.027493", + "duration_sec": 34.04591107368469, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:25:00.407663", + "end_time": "2026-05-31T10:37:00.620970", + "duration_sec": 720.2072620391846, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:37:05.269100", + "end_time": "2026-05-31T10:40:43.379455", + "duration_sec": 218.10432362556458, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\301230 (ATM) Alpha Tactical Machine - 1.24 Hedging_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:40:47.908627", + "end_time": "2026-05-31T10:41:32.015534", + "duration_sec": 44.08226442337036, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:41:36.450895", + "end_time": "2026-05-31T10:42:20.518347", + "duration_sec": 44.04914855957031, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:42:24.982997", + "end_time": "2026-05-31T10:42:47.022934", + "duration_sec": 22.037660598754883, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:42:51.460793", + "end_time": "2026-05-31T10:43:25.507440", + "duration_sec": 34.03807544708252, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:43:29.966233", + "end_time": "2026-05-31T10:44:28.033951", + "duration_sec": 58.03707480430603, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:44:32.522668", + "end_time": "2026-05-31T10:45:04.557438", + "duration_sec": 32.02887964248657, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:45:08.951424", + "end_time": "2026-05-31T10:45:57.012905", + "duration_sec": 48.05244588851929, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:46:01.363179", + "end_time": "2026-05-31T10:46:47.413666", + "duration_sec": 46.04214096069336, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:46:51.903242", + "end_time": "2026-05-31T10:48:07.981920", + "duration_sec": 76.04436182975769, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:48:12.330644", + "end_time": "2026-05-31T10:49:10.383182", + "duration_sec": 58.043524980545044, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:49:14.786122", + "end_time": "2026-05-31T10:50:12.830663", + "duration_sec": 58.03843593597412, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:50:17.332520", + "end_time": "2026-05-31T10:51:03.374140", + "duration_sec": 46.038140058517456, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDCHF_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:51:07.731205", + "end_time": "2026-05-31T10:51:41.788083", + "duration_sec": 34.031371116638184, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDCHF_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDCHF_M5_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:51:46.178043", + "end_time": "2026-05-31T10:52:16.221953", + "duration_sec": 30.03325867652893, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDCHF_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDCHF_M15_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:52:20.579971", + "end_time": "2026-05-31T10:52:42.623173", + "duration_sec": 22.036523580551147, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDCHF_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_USDCHF_H1_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:52:47.061334", + "end_time": "2026-05-31T10:53:13.094944", + "duration_sec": 26.03056526184082, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_USDCHF_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:53:17.523975", + "end_time": "2026-05-31T10:55:41.638296", + "duration_sec": 144.06771636009216, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:55:46.313488", + "end_time": "2026-05-31T10:57:06.362985", + "duration_sec": 80.04547166824341, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:57:10.843387", + "end_time": "2026-05-31T10:58:22.894879", + "duration_sec": 72.04747486114502, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_EURJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:58:27.323878", + "end_time": "2026-05-31T10:59:45.380479", + "duration_sec": 78.05354070663452, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_EURJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T10:59:49.824126", + "end_time": "2026-05-31T11:01:23.900031", + "duration_sec": 94.0526008605957, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-05-31T11:01:28.484061", + "end_time": "2026-05-31T11:02:34.543745", + "duration_sec": 66.05135655403137, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-05-31T11:02:39.010969", + "end_time": "2026-05-31T11:04:07.058791", + "duration_sec": 88.03853559494019, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-05-31T11:04:11.693695", + "end_time": "2026-05-31T11:05:31.757871", + "duration_sec": 80.05741453170776, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T11:05:36.200334", + "end_time": "2026-05-31T11:07:08.321025", + "duration_sec": 92.08060050010681, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-05-31T11:07:12.862870", + "end_time": "2026-05-31T11:08:00.948965", + "duration_sec": 48.06604814529419, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_XAUUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-05-31T11:08:05.276925", + "end_time": "2026-05-31T11:08:45.328610", + "duration_sec": 40.042036294937134, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "3CandleBreakoutEA @simpleforextools_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-05-31T11:08:49.799483", + "end_time": "2026-05-31T11:09:29.853845", + "duration_sec": 40.047643423080444, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\3CandleBreakoutEA @simpleforextools_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "134016076_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T19:42:26.032435", + "end_time": "2026-05-31T19:42:36.106004", + "duration_sec": 10.069407224655151, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T19:42:40.674967", + "end_time": "2026-05-31T19:42:48.714556", + "duration_sec": 8.036942958831787, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T19:42:53.128300", + "end_time": "2026-05-31T19:43:01.170889", + "duration_sec": 8.040988445281982, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "134016076_USDCAD_M1_default.ini", + "status": "completed", + "start_time": "2026-05-31T19:43:05.790914", + "end_time": "2026-05-31T19:43:13.830749", + "duration_sec": 8.03581190109253, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\134016076_USDCAD_M1_default.htm", + "error": null + }, + { + "ini_file": "Quantum Queen V3.52 EA_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-01T01:15:31.689594", + "end_time": "2026-06-01T01:16:27.735738", + "duration_sec": 56.03598189353943, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Quantum Queen V3.52 EA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "Quantum Queen V3.52 EA_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-01T01:16:32.542800", + "end_time": "2026-06-01T01:17:24.590228", + "duration_sec": 52.039894580841064, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Quantum Queen V3.52 EA_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "Quantum Queen V3.52 EA_XAUUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-01T01:17:29.289961", + "end_time": "2026-06-01T01:18:21.337168", + "duration_sec": 52.04069423675537, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Quantum Queen V3.52 EA_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "Quantum Queen V3.52 EA_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-01T01:18:26.074923", + "end_time": "2026-06-01T01:19:20.133005", + "duration_sec": 54.05208492279053, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Quantum Queen V3.52 EA_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "Reaper_EA_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-01T14:08:46.809397", + "end_time": "2026-06-01T14:11:34.903607", + "duration_sec": 168.0839548110962, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Reaper_EA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:41:50.528746", + "end_time": "2026-06-02T23:42:44.571730", + "duration_sec": 54.03545308113098, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:42:49.076000", + "end_time": "2026-06-02T23:43:35.155244", + "duration_sec": 46.071452379226685, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:43:39.621901", + "end_time": "2026-06-02T23:44:25.692490", + "duration_sec": 46.06504821777344, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:44:30.134259", + "end_time": "2026-06-02T23:45:16.215377", + "duration_sec": 46.078588008880615, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:45:20.704912", + "end_time": "2026-06-02T23:46:10.778746", + "duration_sec": 50.065969705581665, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:46:15.337758", + "end_time": "2026-06-02T23:47:07.394414", + "duration_sec": 52.045912981033325, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:47:11.906807", + "end_time": "2026-06-02T23:48:03.947623", + "duration_sec": 52.03874397277832, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:48:08.495388", + "end_time": "2026-06-02T23:48:58.568698", + "duration_sec": 50.06877374649048, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:49:03.120561", + "end_time": "2026-06-02T23:50:01.170443", + "duration_sec": 58.04632329940796, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:50:05.675457", + "end_time": "2026-06-02T23:51:05.723437", + "duration_sec": 60.04489588737488, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:51:10.247515", + "end_time": "2026-06-02T23:52:10.303564", + "duration_sec": 60.03977370262146, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:52:14.721214", + "end_time": "2026-06-02T23:53:14.763192", + "duration_sec": 60.03624749183655, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDCAD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:53:19.292376", + "end_time": "2026-06-02T23:53:59.363696", + "duration_sec": 40.064316511154175, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDCAD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDCAD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:54:03.807312", + "end_time": "2026-06-02T23:54:43.852061", + "duration_sec": 40.04131531715393, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDCAD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDCAD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:54:48.230800", + "end_time": "2026-06-02T23:55:28.278300", + "duration_sec": 40.037421464920044, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDCAD_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDCAD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:55:32.834068", + "end_time": "2026-06-02T23:56:12.896079", + "duration_sec": 40.053292989730835, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDCAD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDCHF_M1_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:56:17.776886", + "end_time": "2026-06-02T23:56:57.818164", + "duration_sec": 40.03303408622742, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDCHF_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDCHF_M5_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:57:02.285305", + "end_time": "2026-06-02T23:57:42.348531", + "duration_sec": 40.038384199142456, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDCHF_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDCHF_M15_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:57:46.738442", + "end_time": "2026-06-02T23:58:26.771003", + "duration_sec": 40.02689075469971, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDCHF_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDCHF_H1_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:58:31.302203", + "end_time": "2026-06-02T23:59:13.370353", + "duration_sec": 42.06060791015625, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDCHF_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_AUDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-02T23:59:17.807265", + "end_time": "2026-06-02T23:59:59.875478", + "duration_sec": 42.06309485435486, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_AUDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_AUDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:00:04.537918", + "end_time": "2026-06-03T00:00:44.585316", + "duration_sec": 40.03740882873535, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_AUDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_AUDUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:00:49.175333", + "end_time": "2026-06-03T00:01:29.254793", + "duration_sec": 40.066168546676636, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_AUDUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_AUDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:01:33.749737", + "end_time": "2026-06-03T00:02:13.888187", + "duration_sec": 40.13287043571472, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_AUDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_NZDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:02:18.327901", + "end_time": "2026-06-03T00:02:58.377792", + "duration_sec": 40.03417730331421, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_NZDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_NZDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:03:02.914356", + "end_time": "2026-06-03T00:03:42.956493", + "duration_sec": 40.0371298789978, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_NZDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_NZDUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:03:47.411530", + "end_time": "2026-06-03T00:04:27.468258", + "duration_sec": 40.046894550323486, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_NZDUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_NZDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:04:32.096419", + "end_time": "2026-06-03T00:05:12.129649", + "duration_sec": 40.02681517601013, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_NZDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURGBP_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:05:16.622397", + "end_time": "2026-06-03T00:06:04.668379", + "duration_sec": 48.040409564971924, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURGBP_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:06:09.019500", + "end_time": "2026-06-03T00:06:55.069653", + "duration_sec": 46.041661739349365, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURGBP_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:06:59.580977", + "end_time": "2026-06-03T00:07:47.627835", + "duration_sec": 48.04054403305054, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURGBP_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:07:52.230283", + "end_time": "2026-06-03T00:08:38.274252", + "duration_sec": 46.041319847106934, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:08:42.679525", + "end_time": "2026-06-03T00:10:10.773223", + "duration_sec": 88.0887279510498, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:10:15.539402", + "end_time": "2026-06-03T00:11:43.619361", + "duration_sec": 88.06815600395203, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:11:48.127821", + "end_time": "2026-06-03T00:13:16.184782", + "duration_sec": 88.05291032791138, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:13:20.611989", + "end_time": "2026-06-03T00:14:46.665065", + "duration_sec": 86.04543018341064, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:14:51.215644", + "end_time": "2026-06-03T00:16:17.269421", + "duration_sec": 86.05070185661316, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:16:22.111281", + "end_time": "2026-06-03T00:17:48.154842", + "duration_sec": 86.03852820396423, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:17:52.811691", + "end_time": "2026-06-03T00:19:16.863373", + "duration_sec": 84.04637932777405, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:19:21.443613", + "end_time": "2026-06-03T00:20:47.502438", + "duration_sec": 86.05350089073181, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_AUDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:20:52.025023", + "end_time": "2026-06-03T00:22:12.140896", + "duration_sec": 80.10581636428833, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_AUDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_AUDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:22:16.596784", + "end_time": "2026-06-03T00:23:36.652523", + "duration_sec": 80.05121493339539, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_AUDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_AUDJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:23:41.377947", + "end_time": "2026-06-03T00:25:01.442987", + "duration_sec": 80.05495762825012, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_AUDJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_AUDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:25:06.030585", + "end_time": "2026-06-03T00:26:26.113543", + "duration_sec": 80.07557225227356, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_AUDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:26:30.683435", + "end_time": "2026-06-03T00:27:38.758208", + "duration_sec": 68.07084822654724, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:27:43.312171", + "end_time": "2026-06-03T00:28:51.366718", + "duration_sec": 68.04683041572571, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURAUD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:28:55.904562", + "end_time": "2026-06-03T00:30:05.961909", + "duration_sec": 70.05069327354431, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURAUD_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:30:10.436541", + "end_time": "2026-06-03T00:31:20.497400", + "duration_sec": 70.0555968284607, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:31:24.980801", + "end_time": "2026-06-03T00:32:41.063046", + "duration_sec": 76.07743120193481, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:32:45.526619", + "end_time": "2026-06-03T00:34:01.613902", + "duration_sec": 76.0801613330841, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPAUD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:34:06.077830", + "end_time": "2026-06-03T00:35:20.127188", + "duration_sec": 74.04614400863647, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPAUD_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:35:24.757003", + "end_time": "2026-06-03T00:36:40.822243", + "duration_sec": 76.05797410011292, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:36:45.506715", + "end_time": "2026-06-03T00:38:03.571511", + "duration_sec": 78.06117939949036, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:38:07.947545", + "end_time": "2026-06-03T00:39:28.023275", + "duration_sec": 80.07021474838257, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_XAUUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:39:32.561072", + "end_time": "2026-06-03T00:40:52.640883", + "duration_sec": 80.05957818031311, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:40:57.212671", + "end_time": "2026-06-03T00:42:17.289393", + "duration_sec": 80.07065916061401, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_XAGUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:42:21.864531", + "end_time": "2026-06-03T00:43:21.909330", + "duration_sec": 60.0372633934021, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_XAGUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_XAGUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:43:26.354209", + "end_time": "2026-06-03T00:44:26.411930", + "duration_sec": 60.053667068481445, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_XAGUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_XAGUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:44:31.030705", + "end_time": "2026-06-03T00:45:31.076855", + "duration_sec": 60.0418496131897, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_XAGUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_XAGUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:45:35.586479", + "end_time": "2026-06-03T00:46:35.629606", + "duration_sec": 60.036914110183716, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_XAGUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_BTCUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:46:40.119321", + "end_time": "2026-06-03T00:50:14.214129", + "duration_sec": 214.09126734733582, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_BTCUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_BTCUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:50:18.728071", + "end_time": "2026-06-03T00:53:56.881694", + "duration_sec": 218.14804553985596, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_BTCUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_BTCUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:54:01.491357", + "end_time": "2026-06-03T00:57:39.609977", + "duration_sec": 218.10670137405396, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_BTCUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_BTCUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T00:57:44.100126", + "end_time": "2026-06-03T01:01:20.199260", + "duration_sec": 216.08976817131042, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_BTCUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_ETHUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:01:24.694311", + "end_time": "2026-06-03T01:06:02.807918", + "duration_sec": 278.1103005409241, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_ETHUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_ETHUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:06:07.309328", + "end_time": "2026-06-03T01:10:05.472855", + "duration_sec": 238.1610209941864, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_ETHUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_ETHUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:10:10.104774", + "end_time": "2026-06-03T01:14:02.291634", + "duration_sec": 232.18016290664673, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_ETHUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_ETHUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:14:06.744270", + "end_time": "2026-06-03T01:18:00.868024", + "duration_sec": 234.1181881427765, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_ETHUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_US30_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:18:05.432661", + "end_time": "2026-06-03T01:21:43.607973", + "duration_sec": 218.16928577423096, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_US30_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_US30_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:21:48.114317", + "end_time": "2026-06-03T01:23:04.159136", + "duration_sec": 76.04178476333618, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_US30_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_US30_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:23:08.665450", + "end_time": "2026-06-03T01:24:24.736467", + "duration_sec": 76.06468510627747, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_US30_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_US30_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:24:29.327770", + "end_time": "2026-06-03T01:25:45.381174", + "duration_sec": 76.05081629753113, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_US30_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_US500_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:25:49.972807", + "end_time": "2026-06-03T01:27:10.049973", + "duration_sec": 80.0709228515625, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_US500_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_US500_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:27:14.618972", + "end_time": "2026-06-03T01:28:14.673892", + "duration_sec": 60.05173635482788, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_US500_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_US500_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:28:19.222883", + "end_time": "2026-06-03T01:29:17.266690", + "duration_sec": 58.04041028022766, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_US500_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_US500_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:29:21.839611", + "end_time": "2026-06-03T01:30:21.891373", + "duration_sec": 60.04628825187683, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_US500_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USTEC_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:30:26.323478", + "end_time": "2026-06-03T01:33:14.417999", + "duration_sec": 168.08901262283325, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USTEC_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USTEC_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:33:18.922186", + "end_time": "2026-06-03T01:35:41.007018", + "duration_sec": 142.07722926139832, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USTEC_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USTEC_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:35:45.496506", + "end_time": "2026-06-03T01:38:07.628475", + "duration_sec": 142.12544965744019, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USTEC_M15_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USTEC_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:38:12.232236", + "end_time": "2026-06-03T01:40:34.347599", + "duration_sec": 142.1104748249054, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USTEC_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:40:38.865565", + "end_time": "2026-06-03T01:40:50.923129", + "duration_sec": 12.051812171936035, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:40:55.442856", + "end_time": "2026-06-03T01:41:27.477067", + "duration_sec": 32.03154468536377, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:41:31.978227", + "end_time": "2026-06-03T01:42:06.013207", + "duration_sec": 34.03003191947937, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:42:10.574452", + "end_time": "2026-06-03T01:42:42.621565", + "duration_sec": 32.04202127456665, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:42:47.024270", + "end_time": "2026-06-03T01:42:59.063591", + "duration_sec": 12.03029203414917, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:43:03.631890", + "end_time": "2026-06-03T01:43:37.693568", + "duration_sec": 34.053746461868286, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:43:42.235593", + "end_time": "2026-06-03T01:44:16.271158", + "duration_sec": 34.03054594993591, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:44:20.856154", + "end_time": "2026-06-03T01:44:56.899915", + "duration_sec": 36.0355179309845, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:45:01.401190", + "end_time": "2026-06-03T01:45:13.440946", + "duration_sec": 12.02957558631897, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:45:17.878736", + "end_time": "2026-06-03T01:45:53.944054", + "duration_sec": 36.05676007270813, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:45:58.503507", + "end_time": "2026-06-03T01:46:34.543198", + "duration_sec": 36.031683921813965, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:46:39.131305", + "end_time": "2026-06-03T01:47:15.159553", + "duration_sec": 36.02352738380432, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDCAD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:47:19.607682", + "end_time": "2026-06-03T01:47:31.645025", + "duration_sec": 12.029513359069824, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDCAD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDCAD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:47:36.315529", + "end_time": "2026-06-03T01:48:10.363349", + "duration_sec": 34.03710675239563, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDCAD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDCAD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:48:14.907030", + "end_time": "2026-06-03T01:48:48.993592", + "duration_sec": 34.07925891876221, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDCAD_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDCAD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:48:53.487963", + "end_time": "2026-06-03T01:49:25.547276", + "duration_sec": 32.04805016517639, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDCAD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDCHF_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:49:30.063499", + "end_time": "2026-06-03T01:49:42.101172", + "duration_sec": 12.024559736251831, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDCHF_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDCHF_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:49:46.654327", + "end_time": "2026-06-03T01:50:20.703608", + "duration_sec": 34.041006088256836, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDCHF_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDCHF_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:50:25.152578", + "end_time": "2026-06-03T01:50:59.198111", + "duration_sec": 34.039934158325195, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDCHF_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDCHF_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:51:03.623971", + "end_time": "2026-06-03T01:51:35.665597", + "duration_sec": 32.03953814506531, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDCHF_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_AUDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:51:40.091078", + "end_time": "2026-06-03T01:51:52.117586", + "duration_sec": 12.014549732208252, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_AUDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_AUDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:51:56.721980", + "end_time": "2026-06-03T01:52:30.768895", + "duration_sec": 34.03888154029846, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_AUDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_AUDUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:52:35.225552", + "end_time": "2026-06-03T01:53:09.286828", + "duration_sec": 34.05567240715027, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_AUDUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_AUDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:53:13.755539", + "end_time": "2026-06-03T01:53:47.784705", + "duration_sec": 34.01955699920654, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_AUDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_NZDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:53:52.223935", + "end_time": "2026-06-03T01:54:04.257306", + "duration_sec": 12.025505065917969, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_NZDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_NZDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:54:08.862145", + "end_time": "2026-06-03T01:54:42.920950", + "duration_sec": 34.04391431808472, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_NZDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_NZDUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:54:47.320273", + "end_time": "2026-06-03T01:55:21.374180", + "duration_sec": 34.04740500450134, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_NZDUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_NZDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:55:25.837895", + "end_time": "2026-06-03T01:55:59.875400", + "duration_sec": 34.03284287452698, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_NZDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURGBP_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:56:04.313541", + "end_time": "2026-06-03T01:56:18.354457", + "duration_sec": 14.032329797744751, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURGBP_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:56:22.982559", + "end_time": "2026-06-03T01:56:57.022888", + "duration_sec": 34.03409385681152, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURGBP_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:57:01.442555", + "end_time": "2026-06-03T01:57:37.476787", + "duration_sec": 36.030739068984985, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURGBP_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:57:41.944923", + "end_time": "2026-06-03T01:58:15.985205", + "duration_sec": 34.03627133369446, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:58:20.515066", + "end_time": "2026-06-03T01:58:36.562109", + "duration_sec": 16.0383722782135, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:58:41.164118", + "end_time": "2026-06-03T01:59:29.206928", + "duration_sec": 48.03618884086609, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T01:59:33.723092", + "end_time": "2026-06-03T02:00:21.774407", + "duration_sec": 48.04167294502258, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:00:26.348697", + "end_time": "2026-06-03T02:01:14.397130", + "duration_sec": 48.03206992149353, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:01:18.993939", + "end_time": "2026-06-03T02:01:33.067737", + "duration_sec": 14.065998315811157, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:01:37.422037", + "end_time": "2026-06-03T02:02:25.505607", + "duration_sec": 48.0744731426239, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:02:30.028179", + "end_time": "2026-06-03T02:03:20.073664", + "duration_sec": 50.03813362121582, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:03:24.555620", + "end_time": "2026-06-03T02:04:12.592779", + "duration_sec": 48.0342481136322, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_AUDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:04:17.160392", + "end_time": "2026-06-03T02:04:29.221063", + "duration_sec": 12.054593801498413, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_AUDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_AUDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:04:33.712816", + "end_time": "2026-06-03T02:05:19.752678", + "duration_sec": 46.03620171546936, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_AUDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_AUDJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:05:24.482361", + "end_time": "2026-06-03T02:06:08.537856", + "duration_sec": 44.051493644714355, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_AUDJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_AUDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:06:13.166669", + "end_time": "2026-06-03T02:06:57.207364", + "duration_sec": 44.03265452384949, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_AUDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:07:01.692875", + "end_time": "2026-06-03T02:07:15.730003", + "duration_sec": 14.029709339141846, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:07:20.216402", + "end_time": "2026-06-03T02:08:02.259302", + "duration_sec": 42.037866830825806, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURAUD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:08:06.753026", + "end_time": "2026-06-03T02:08:50.801408", + "duration_sec": 44.03994536399841, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURAUD_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:08:55.279298", + "end_time": "2026-06-03T02:09:37.318622", + "duration_sec": 42.032368421554565, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:09:41.822502", + "end_time": "2026-06-03T02:09:55.862551", + "duration_sec": 14.032618522644043, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:10:00.278722", + "end_time": "2026-06-03T02:10:46.340332", + "duration_sec": 46.05140519142151, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPAUD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:10:50.803027", + "end_time": "2026-06-03T02:11:34.850220", + "duration_sec": 44.03959321975708, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPAUD_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:11:39.489232", + "end_time": "2026-06-03T02:12:21.523404", + "duration_sec": 42.0236279964447, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:12:26.039013", + "end_time": "2026-06-03T02:13:28.117886", + "duration_sec": 62.07072901725769, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:13:32.545232", + "end_time": "2026-06-03T02:14:24.602730", + "duration_sec": 52.04902911186218, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAUUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:14:29.092456", + "end_time": "2026-06-03T02:15:17.151180", + "duration_sec": 48.05044102668762, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:15:21.760432", + "end_time": "2026-06-03T02:16:09.809138", + "duration_sec": 48.04075598716736, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAGUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:16:14.204032", + "end_time": "2026-06-03T02:17:08.268244", + "duration_sec": 54.05042767524719, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAGUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAGUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:17:12.655414", + "end_time": "2026-06-03T02:17:52.719897", + "duration_sec": 40.054577350616455, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAGUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAGUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:17:57.165010", + "end_time": "2026-06-03T02:18:35.233057", + "duration_sec": 38.06336760520935, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAGUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAGUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:18:39.994147", + "end_time": "2026-06-03T02:19:18.043496", + "duration_sec": 38.04012656211853, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAGUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_BTCUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:19:22.499178", + "end_time": "2026-06-03T02:19:44.542457", + "duration_sec": 22.03234624862671, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_BTCUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_BTCUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:19:48.981872", + "end_time": "2026-06-03T02:21:35.057732", + "duration_sec": 106.07185983657837, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_BTCUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_BTCUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:21:39.634828", + "end_time": "2026-06-03T02:23:23.707719", + "duration_sec": 104.05836296081543, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_BTCUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_BTCUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:23:28.280893", + "end_time": "2026-06-03T02:25:12.354603", + "duration_sec": 104.06762742996216, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_BTCUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_ETHUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:25:16.758205", + "end_time": "2026-06-03T02:25:36.793839", + "duration_sec": 20.02682113647461, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_ETHUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_ETHUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:25:41.261780", + "end_time": "2026-06-03T02:27:37.372086", + "duration_sec": 116.10009694099426, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_ETHUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_ETHUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:27:41.980212", + "end_time": "2026-06-03T02:29:36.054348", + "duration_sec": 114.0671181678772, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_ETHUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_ETHUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:29:40.464943", + "end_time": "2026-06-03T02:31:38.565218", + "duration_sec": 118.09094905853271, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_ETHUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_US30_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:31:43.116433", + "end_time": "2026-06-03T02:32:43.189704", + "duration_sec": 60.053505182266235, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_US30_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_US30_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:32:47.698799", + "end_time": "2026-06-03T02:33:35.767825", + "duration_sec": 48.06091260910034, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_US30_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_US30_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:33:40.299445", + "end_time": "2026-06-03T02:34:24.338051", + "duration_sec": 44.033608198165894, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_US30_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_US30_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:34:28.831368", + "end_time": "2026-06-03T02:35:12.916349", + "duration_sec": 44.07781219482422, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_US30_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_US500_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:35:17.281976", + "end_time": "2026-06-03T02:35:31.335280", + "duration_sec": 14.039658308029175, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_US500_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_US500_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:35:35.817739", + "end_time": "2026-06-03T02:36:17.900390", + "duration_sec": 42.06835079193115, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_US500_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_US500_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:36:22.456510", + "end_time": "2026-06-03T02:37:02.506152", + "duration_sec": 40.04153847694397, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_US500_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_US500_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:37:06.983121", + "end_time": "2026-06-03T02:37:47.025675", + "duration_sec": 40.03377342224121, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_US500_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USTEC_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:37:51.513593", + "end_time": "2026-06-03T02:38:09.570880", + "duration_sec": 18.045583486557007, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USTEC_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USTEC_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:38:14.116232", + "end_time": "2026-06-03T02:39:24.186332", + "duration_sec": 70.05546021461487, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USTEC_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USTEC_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:39:28.646243", + "end_time": "2026-06-03T02:40:40.706699", + "duration_sec": 72.05416941642761, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USTEC_M15_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USTEC_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:40:45.172912", + "end_time": "2026-06-03T02:41:51.230607", + "duration_sec": 66.04748868942261, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USTEC_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:41:55.784217", + "end_time": "2026-06-03T02:44:15.858777", + "duration_sec": 140.07068395614624, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:44:20.464557", + "end_time": "2026-06-03T02:46:40.580495", + "duration_sec": 140.11188054084778, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:46:45.080459", + "end_time": "2026-06-03T02:49:07.151591", + "duration_sec": 142.06436967849731, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:49:11.610742", + "end_time": "2026-06-03T02:51:33.697938", + "duration_sec": 142.08268857002258, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:51:38.247071", + "end_time": "2026-06-03T02:54:32.366639", + "duration_sec": 174.10824251174927, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:54:36.823928", + "end_time": "2026-06-03T02:57:28.935936", + "duration_sec": 172.10799741744995, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_GBPUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T02:57:33.420381", + "end_time": "2026-06-03T03:00:25.527623", + "duration_sec": 172.104722738266, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_GBPUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:00:30.133522", + "end_time": "2026-06-03T03:03:24.230525", + "duration_sec": 174.09296941757202, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:03:28.837016", + "end_time": "2026-06-03T03:06:58.926369", + "duration_sec": 210.08224177360535, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:07:03.324683", + "end_time": "2026-06-03T03:10:39.445914", + "duration_sec": 216.1171932220459, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_USDJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:10:43.970067", + "end_time": "2026-06-03T03:14:12.073621", + "duration_sec": 208.1006314754486, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_USDJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:14:16.548527", + "end_time": "2026-06-03T03:17:50.651051", + "duration_sec": 214.09167742729187, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_USDCAD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:17:55.130873", + "end_time": "2026-06-03T03:20:05.202977", + "duration_sec": 130.06893181800842, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_USDCAD_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_USDCAD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:20:10.043307", + "end_time": "2026-06-03T03:22:20.121700", + "duration_sec": 130.07587480545044, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_USDCAD_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_USDCAD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:22:24.595104", + "end_time": "2026-06-03T03:24:34.668843", + "duration_sec": 130.06652116775513, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_USDCAD_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_USDCAD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:24:39.232770", + "end_time": "2026-06-03T03:26:49.317919", + "duration_sec": 130.0765061378479, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_USDCAD_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_USDCHF_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:26:53.758347", + "end_time": "2026-06-03T03:29:01.820574", + "duration_sec": 128.06015419960022, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_USDCHF_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_USDCHF_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:29:06.335381", + "end_time": "2026-06-03T03:31:12.428163", + "duration_sec": 126.08754658699036, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_USDCHF_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_USDCHF_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:31:16.975973", + "end_time": "2026-06-03T03:33:25.071996", + "duration_sec": 128.08986473083496, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_USDCHF_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_USDCHF_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:33:29.576214", + "end_time": "2026-06-03T03:35:37.675924", + "duration_sec": 128.09315752983093, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_USDCHF_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_AUDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:35:42.261884", + "end_time": "2026-06-03T03:37:48.327506", + "duration_sec": 126.05831050872803, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_AUDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_AUDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:37:52.715338", + "end_time": "2026-06-03T03:39:58.800430", + "duration_sec": 126.07904553413391, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_AUDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_AUDUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:40:03.441961", + "end_time": "2026-06-03T03:42:09.528002", + "duration_sec": 126.07886600494385, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_AUDUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_AUDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:42:14.059464", + "end_time": "2026-06-03T03:44:22.138900", + "duration_sec": 128.07814931869507, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_AUDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_NZDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:44:26.761162", + "end_time": "2026-06-03T03:46:34.896873", + "duration_sec": 128.12845134735107, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_NZDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_NZDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:46:39.356322", + "end_time": "2026-06-03T03:48:47.427504", + "duration_sec": 128.06403970718384, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_NZDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_NZDUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:48:52.140100", + "end_time": "2026-06-03T03:51:02.219841", + "duration_sec": 130.07369446754456, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_NZDUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_NZDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:51:06.582124", + "end_time": "2026-06-03T03:53:14.671116", + "duration_sec": 128.08077478408813, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_NZDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURGBP_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:53:19.201187", + "end_time": "2026-06-03T03:55:35.290055", + "duration_sec": 136.08273267745972, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURGBP_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:55:39.973373", + "end_time": "2026-06-03T03:57:56.090856", + "duration_sec": 136.11160898208618, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURGBP_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T03:58:00.529489", + "end_time": "2026-06-03T04:00:16.615114", + "duration_sec": 136.08157873153687, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURGBP_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T04:00:21.136025", + "end_time": "2026-06-03T04:02:37.209126", + "duration_sec": 136.06686162948608, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T04:02:41.735532", + "end_time": "2026-06-03T04:07:41.890840", + "duration_sec": 300.1522943973541, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T04:07:46.430227", + "end_time": "2026-06-03T04:12:44.584460", + "duration_sec": 298.14914560317993, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T04:12:49.073746", + "end_time": "2026-06-03T04:17:47.231986", + "duration_sec": 298.1500823497772, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T04:17:51.709499", + "end_time": "2026-06-03T04:22:53.821359", + "duration_sec": 302.1072509288788, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T04:22:58.336665", + "end_time": "2026-06-03T04:28:00.476961", + "duration_sec": 302.13006687164307, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_GBPJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T04:28:05.051092", + "end_time": "2026-06-03T04:33:07.179529", + "duration_sec": 302.11758303642273, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_GBPJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_GBPJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T04:33:11.604537", + "end_time": "2026-06-03T04:38:11.792705", + "duration_sec": 300.18463587760925, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_GBPJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T04:38:16.485957", + "end_time": "2026-06-03T04:43:20.646841", + "duration_sec": 304.15595293045044, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_AUDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T04:43:25.264194", + "end_time": "2026-06-03T04:47:49.373277", + "duration_sec": 264.1050057411194, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_AUDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_AUDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T04:47:53.967645", + "end_time": "2026-06-03T04:52:20.092364", + "duration_sec": 266.11897110939026, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_AUDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_AUDJPY_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T04:52:24.533099", + "end_time": "2026-06-03T04:56:52.672524", + "duration_sec": 268.13514971733093, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_AUDJPY_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_AUDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T04:56:57.106885", + "end_time": "2026-06-03T05:01:19.233956", + "duration_sec": 262.12426114082336, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_AUDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T05:01:23.657769", + "end_time": "2026-06-03T05:05:15.770401", + "duration_sec": 232.1030559539795, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T05:05:20.337050", + "end_time": "2026-06-03T05:09:12.505207", + "duration_sec": 232.1624357700348, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURAUD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T05:09:16.918933", + "end_time": "2026-06-03T05:13:07.030880", + "duration_sec": 230.1073513031006, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURAUD_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T05:13:11.528204", + "end_time": "2026-06-03T05:17:03.639417", + "duration_sec": 232.10773706436157, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_GBPAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T05:17:08.030433", + "end_time": "2026-06-03T05:21:28.151055", + "duration_sec": 260.116149187088, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_GBPAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_GBPAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T05:21:32.592886", + "end_time": "2026-06-03T05:25:52.712901", + "duration_sec": 260.1175696849823, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_GBPAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_GBPAUD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T05:25:57.143457", + "end_time": "2026-06-03T05:30:17.354767", + "duration_sec": 260.20563435554504, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_GBPAUD_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_GBPAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T05:30:21.858511", + "end_time": "2026-06-03T05:34:43.995057", + "duration_sec": 262.12917971611023, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_GBPAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T05:34:48.404553", + "end_time": "2026-06-03T05:40:42.590095", + "duration_sec": 354.175644159317, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T05:40:47.046470", + "end_time": "2026-06-03T05:46:41.214700", + "duration_sec": 354.16064739227295, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_XAUUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T05:46:45.753383", + "end_time": "2026-06-03T05:52:39.894657", + "duration_sec": 354.1338906288147, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T05:52:44.402991", + "end_time": "2026-06-03T05:58:40.584027", + "duration_sec": 356.17000555992126, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_XAGUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T05:58:44.979325", + "end_time": "2026-06-03T06:02:19.098955", + "duration_sec": 214.11701226234436, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_XAGUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_XAGUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T06:02:23.487792", + "end_time": "2026-06-03T06:05:57.596052", + "duration_sec": 214.09308338165283, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_XAGUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_XAGUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T06:06:01.998841", + "end_time": "2026-06-03T06:09:36.144869", + "duration_sec": 214.13785815238953, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_XAGUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_XAGUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T06:09:40.576276", + "end_time": "2026-06-03T06:13:16.716065", + "duration_sec": 216.1330325603485, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_XAGUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_BTCUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T06:13:21.223224", + "end_time": "2026-06-03T06:31:51.654276", + "duration_sec": 1110.4275546073914, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_BTCUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_BTCUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T06:31:56.206866", + "end_time": "2026-06-03T06:50:28.677768", + "duration_sec": 1112.465871810913, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_BTCUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_BTCUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T06:50:33.289253", + "end_time": "2026-06-03T07:09:05.758418", + "duration_sec": 1112.464034795761, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_BTCUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_BTCUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T07:09:10.294818", + "end_time": "2026-06-03T07:27:46.758883", + "duration_sec": 1116.4613330364227, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_BTCUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_ETHUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T07:27:51.221317", + "end_time": "2026-06-03T07:47:33.651490", + "duration_sec": 1182.425000667572, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_ETHUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_ETHUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T07:47:38.189601", + "end_time": "2026-06-03T08:07:18.803618", + "duration_sec": 1180.6093842983246, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_ETHUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_ETHUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T08:07:23.234830", + "end_time": "2026-06-03T08:27:01.795369", + "duration_sec": 1178.5542080402374, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_ETHUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_ETHUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T08:27:06.205067", + "end_time": "2026-06-03T08:46:50.660870", + "duration_sec": 1184.4513502120972, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_ETHUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_US30_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T08:46:55.078090", + "end_time": "2026-06-03T08:51:57.189604", + "duration_sec": 302.1054091453552, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_US30_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_US30_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T08:52:01.640525", + "end_time": "2026-06-03T08:57:03.862992", + "duration_sec": 302.21846532821655, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_US30_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_US30_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T08:57:08.313323", + "end_time": "2026-06-03T09:02:12.487907", + "duration_sec": 304.1709747314453, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_US30_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_US30_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T09:02:16.979196", + "end_time": "2026-06-03T09:07:21.123953", + "duration_sec": 304.1427390575409, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_US30_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_US500_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T09:07:25.642201", + "end_time": "2026-06-03T09:11:13.748245", + "duration_sec": 228.0987205505371, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_US500_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_US500_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T09:11:18.274475", + "end_time": "2026-06-03T09:15:06.475666", + "duration_sec": 228.19607973098755, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_US500_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_US500_M15_default.ini", + "status": "completed", + "start_time": "2026-06-03T09:15:10.922459", + "end_time": "2026-06-03T09:19:01.035916", + "duration_sec": 230.10150122642517, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_US500_M15_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_US500_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T09:19:05.485919", + "end_time": "2026-06-03T09:22:53.573531", + "duration_sec": 228.08010149002075, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_US500_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_USTEC_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T09:22:57.997324", + "end_time": "2026-06-03T09:36:48.264874", + "duration_sec": 830.2533650398254, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_USTEC_M1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_USTEC_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T09:36:52.771728", + "end_time": "2026-06-03T09:47:20.979098", + "duration_sec": 628.1942467689514, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_USTEC_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:35:47.676812", + "end_time": "2026-06-03T16:36:01.937616", + "duration_sec": 14.254371643066406, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:36:06.450414", + "end_time": "2026-06-03T16:36:20.481713", + "duration_sec": 14.026750564575195, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:36:25.081142", + "end_time": "2026-06-03T16:36:39.099556", + "duration_sec": 14.016889572143555, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:36:43.604407", + "end_time": "2026-06-03T16:36:59.647410", + "duration_sec": 16.0365948677063, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:37:04.140393", + "end_time": "2026-06-03T16:37:28.190881", + "duration_sec": 24.042218446731567, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:37:32.865354", + "end_time": "2026-06-03T16:37:56.896658", + "duration_sec": 24.027034759521484, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:38:01.330866", + "end_time": "2026-06-03T16:38:17.375578", + "duration_sec": 16.03529453277588, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:38:21.938751", + "end_time": "2026-06-03T16:38:33.985445", + "duration_sec": 12.038225889205933, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:38:38.470791", + "end_time": "2026-06-03T16:38:54.512131", + "duration_sec": 16.024458169937134, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:38:59.152469", + "end_time": "2026-06-03T16:39:15.191447", + "duration_sec": 16.03389883041382, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:39:19.585336", + "end_time": "2026-06-03T16:39:37.645220", + "duration_sec": 18.047163248062134, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:39:42.209753", + "end_time": "2026-06-03T16:39:58.247338", + "duration_sec": 16.031331777572632, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:40:02.758667", + "end_time": "2026-06-03T16:40:32.790790", + "duration_sec": 30.028209447860718, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:40:37.337536", + "end_time": "2026-06-03T16:41:07.401769", + "duration_sec": 30.054945945739746, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:41:12.077137", + "end_time": "2026-06-03T16:41:42.100924", + "duration_sec": 30.020411252975464, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:41:46.778567", + "end_time": "2026-06-03T16:42:18.825521", + "duration_sec": 32.04501295089722, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:42:23.362918", + "end_time": "2026-06-03T16:44:49.438166", + "duration_sec": 146.0715253353119, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "BPA Position Manager_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:44:53.930307", + "end_time": "2026-06-03T16:45:55.983012", + "duration_sec": 62.04808807373047, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\BPA Position Manager_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:46:00.679068", + "end_time": "2026-06-03T16:46:10.716662", + "duration_sec": 10.028412342071533, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:46:15.190940", + "end_time": "2026-06-03T16:46:25.214554", + "duration_sec": 10.021088600158691, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:46:29.777413", + "end_time": "2026-06-03T16:46:39.800418", + "duration_sec": 10.018975496292114, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:46:44.285905", + "end_time": "2026-06-03T16:46:54.340367", + "duration_sec": 10.039010763168335, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:46:58.845632", + "end_time": "2026-06-03T16:47:08.867273", + "duration_sec": 10.015621662139893, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:47:13.443579", + "end_time": "2026-06-03T16:47:23.482380", + "duration_sec": 10.036968469619751, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:47:28.009754", + "end_time": "2026-06-03T16:47:36.045007", + "duration_sec": 8.024715423583984, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:47:40.563478", + "end_time": "2026-06-03T16:47:48.633264", + "duration_sec": 8.064919233322144, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:47:53.366036", + "end_time": "2026-06-03T16:48:01.387680", + "duration_sec": 8.019352674484253, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:48:05.897643", + "end_time": "2026-06-03T16:48:15.928518", + "duration_sec": 10.025733709335327, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:48:20.381938", + "end_time": "2026-06-03T16:48:30.413770", + "duration_sec": 10.025316953659058, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:48:34.894461", + "end_time": "2026-06-03T16:48:44.930768", + "duration_sec": 10.02344012260437, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:48:49.570157", + "end_time": "2026-06-03T16:49:27.599592", + "duration_sec": 38.02792286872864, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:49:32.157642", + "end_time": "2026-06-03T16:49:58.208145", + "duration_sec": 26.044182062149048, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:50:02.745304", + "end_time": "2026-06-03T16:50:32.779749", + "duration_sec": 30.029398918151855, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:50:37.413014", + "end_time": "2026-06-03T16:50:53.456345", + "duration_sec": 16.037654876708984, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:50:58.027342", + "end_time": "2026-06-03T16:51:20.076233", + "duration_sec": 22.04388689994812, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:51:24.621205", + "end_time": "2026-06-03T16:51:42.663687", + "duration_sec": 18.03531765937805, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:51:47.178657", + "end_time": "2026-06-03T16:51:55.237133", + "duration_sec": 8.053718328475952, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:51:59.794496", + "end_time": "2026-06-03T16:52:07.825581", + "duration_sec": 8.026121616363525, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:52:12.255868", + "end_time": "2026-06-03T16:52:34.291357", + "duration_sec": 22.020099401474, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:52:38.879123", + "end_time": "2026-06-03T16:53:12.926871", + "duration_sec": 34.043575286865234, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:53:17.399546", + "end_time": "2026-06-03T16:55:05.476750", + "duration_sec": 108.0689845085144, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:55:10.064007", + "end_time": "2026-06-03T16:56:18.125253", + "duration_sec": 68.0561294555664, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:56:22.647866", + "end_time": "2026-06-03T16:56:36.684467", + "duration_sec": 14.02623987197876, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:56:41.280427", + "end_time": "2026-06-03T16:56:53.317187", + "duration_sec": 12.029380321502686, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:56:57.923689", + "end_time": "2026-06-03T16:57:13.976672", + "duration_sec": 16.035441875457764, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:57:18.595679", + "end_time": "2026-06-03T16:57:34.625117", + "duration_sec": 16.023982524871826, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:57:39.393003", + "end_time": "2026-06-03T16:58:07.439849", + "duration_sec": 28.04413342475891, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:58:12.025283", + "end_time": "2026-06-03T16:58:40.063100", + "duration_sec": 28.033759117126465, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldSniper_Pro_v2_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:58:44.645395", + "end_time": "2026-06-03T16:59:08.690581", + "duration_sec": 24.042460441589355, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldSniper_Pro_v2_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldSniper_Pro_v2_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:59:13.209040", + "end_time": "2026-06-03T16:59:41.241835", + "duration_sec": 28.031065702438354, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldSniper_Pro_v2_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldSniper_Pro_v2_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T16:59:45.752941", + "end_time": "2026-06-03T17:00:11.797571", + "duration_sec": 26.04311513900757, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldSniper_Pro_v2_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldSniper_Pro_v2_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:00:16.378099", + "end_time": "2026-06-03T17:00:46.404222", + "duration_sec": 30.022904634475708, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldSniper_Pro_v2_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldSniper_Pro_v2_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:00:50.977767", + "end_time": "2026-06-03T17:01:29.036938", + "duration_sec": 38.051356077194214, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldSniper_Pro_v2_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldSniper_Pro_v2_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:01:33.616166", + "end_time": "2026-06-03T17:02:11.639671", + "duration_sec": 38.01618719100952, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldSniper_Pro_v2_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldStorm_Pro_EA_V1_20_UP_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:02:16.127396", + "end_time": "2026-06-03T17:02:26.173684", + "duration_sec": 10.041605949401855, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldStorm_Pro_EA_V1_20_UP_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldStorm_Pro_EA_V1_20_UP_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:02:30.777548", + "end_time": "2026-06-03T17:02:40.822442", + "duration_sec": 10.040219783782959, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldStorm_Pro_EA_V1_20_UP_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldStorm_Pro_EA_V1_20_UP_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:02:45.442718", + "end_time": "2026-06-03T17:02:55.499482", + "duration_sec": 10.042745351791382, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldStorm_Pro_EA_V1_20_UP_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldStorm_Pro_EA_V1_20_UP_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:03:00.289280", + "end_time": "2026-06-03T17:03:12.327615", + "duration_sec": 12.033311605453491, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldStorm_Pro_EA_V1_20_UP_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldStorm_Pro_EA_V1_20_UP_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:03:16.968358", + "end_time": "2026-06-03T17:03:29.012012", + "duration_sec": 12.033026695251465, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldStorm_Pro_EA_V1_20_UP_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldStorm_Pro_EA_V1_20_UP_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:03:33.872686", + "end_time": "2026-06-03T17:03:45.909120", + "duration_sec": 12.026946544647217, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldStorm_Pro_EA_V1_20_UP_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldVWAPReversion_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:03:50.510856", + "end_time": "2026-06-03T17:04:06.544199", + "duration_sec": 16.029842376708984, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldVWAPReversion_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldVWAPReversion_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:04:11.123093", + "end_time": "2026-06-03T17:04:29.159380", + "duration_sec": 18.02882480621338, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldVWAPReversion_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldVWAPReversion_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:04:33.659575", + "end_time": "2026-06-03T17:04:51.705423", + "duration_sec": 18.041061639785767, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldVWAPReversion_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldVWAPReversion_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:04:56.079280", + "end_time": "2026-06-03T17:05:16.129376", + "duration_sec": 20.04646611213684, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldVWAPReversion_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldVWAPReversion_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:05:20.689614", + "end_time": "2026-06-03T17:06:06.759075", + "duration_sec": 46.062360525131226, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldVWAPReversion_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldVWAPReversion_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:06:11.349166", + "end_time": "2026-06-03T17:07:09.384916", + "duration_sec": 58.02240347862244, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldVWAPReversion_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "LiquidityScalper_MT5_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:07:14.049972", + "end_time": "2026-06-03T17:07:22.079961", + "duration_sec": 8.025930166244507, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\LiquidityScalper_MT5_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "LiquidityScalper_MT5_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:07:26.568498", + "end_time": "2026-06-03T17:07:34.601125", + "duration_sec": 8.028974533081055, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\LiquidityScalper_MT5_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "LiquidityScalper_MT5_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:07:39.181254", + "end_time": "2026-06-03T17:07:49.230088", + "duration_sec": 10.041724681854248, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\LiquidityScalper_MT5_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "LiquidityScalper_MT5_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:07:53.782854", + "end_time": "2026-06-03T17:08:01.820441", + "duration_sec": 8.031875371932983, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\LiquidityScalper_MT5_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "LiquidityScalper_MT5_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:08:06.435874", + "end_time": "2026-06-03T17:08:16.474024", + "duration_sec": 10.030184745788574, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\LiquidityScalper_MT5_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "LiquidityScalper_MT5_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:08:21.001638", + "end_time": "2026-06-03T17:08:31.039987", + "duration_sec": 10.03581714630127, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\LiquidityScalper_MT5_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "MT5 to Telegram_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:08:35.725805", + "end_time": "2026-06-03T17:08:43.753764", + "duration_sec": 8.024940729141235, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\MT5 to Telegram_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "MT5 to Telegram_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:08:48.257706", + "end_time": "2026-06-03T17:08:56.295032", + "duration_sec": 8.03133749961853, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\MT5 to Telegram_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "MT5 to Telegram_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:09:00.683218", + "end_time": "2026-06-03T17:09:08.716033", + "duration_sec": 8.025279998779297, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\MT5 to Telegram_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "MT5 to Telegram_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:09:13.386473", + "end_time": "2026-06-03T17:09:25.424394", + "duration_sec": 12.033390283584595, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\MT5 to Telegram_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "MT5 to Telegram_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:09:30.016870", + "end_time": "2026-06-03T17:09:40.047594", + "duration_sec": 10.02807092666626, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\MT5 to Telegram_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "MT5 to Telegram_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:09:44.461899", + "end_time": "2026-06-03T17:09:52.494632", + "duration_sec": 8.024131059646606, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\MT5 to Telegram_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "SA_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:09:57.030925", + "end_time": "2026-06-03T17:10:05.052168", + "duration_sec": 8.01338005065918, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\SA_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "SA_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:10:09.737351", + "end_time": "2026-06-03T17:10:19.766192", + "duration_sec": 10.024749040603638, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\SA_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "SA_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:10:24.332665", + "end_time": "2026-06-03T17:10:34.344752", + "duration_sec": 10.008658647537231, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\SA_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "SA_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:10:38.868068", + "end_time": "2026-06-03T17:10:48.917848", + "duration_sec": 10.039694547653198, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\SA_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "SA_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:10:53.586817", + "end_time": "2026-06-03T17:11:05.613897", + "duration_sec": 12.02498459815979, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\SA_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "SA_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:11:10.140207", + "end_time": "2026-06-03T17:11:22.161711", + "duration_sec": 12.017589807510376, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\SA_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "Thanos V1.0_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:11:26.807564", + "end_time": "2026-06-03T17:11:36.840633", + "duration_sec": 10.027045965194702, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Thanos V1.0_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "Thanos V1.0_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:11:41.523874", + "end_time": "2026-06-03T17:11:51.550553", + "duration_sec": 10.02011775970459, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Thanos V1.0_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "Thanos V1.0_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:11:56.126196", + "end_time": "2026-06-03T17:12:06.153799", + "duration_sec": 10.021447658538818, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Thanos V1.0_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "Thanos V1.0_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:12:10.819501", + "end_time": "2026-06-03T17:12:22.887153", + "duration_sec": 12.06148624420166, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Thanos V1.0_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "Thanos V1.0_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:12:27.445795", + "end_time": "2026-06-03T17:12:37.473309", + "duration_sec": 10.023981809616089, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Thanos V1.0_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "Thanos V1.0_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:12:41.880379", + "end_time": "2026-06-03T17:12:51.916804", + "duration_sec": 10.029560089111328, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\Thanos V1.0_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "TxngGoD_BETA_SNIPER_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:12:56.462057", + "end_time": "2026-06-03T17:13:46.523424", + "duration_sec": 50.045692443847656, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TxngGoD_BETA_SNIPER_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "TxngGoD_BETA_SNIPER_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:13:51.111809", + "end_time": "2026-06-03T17:14:35.159294", + "duration_sec": 44.0390191078186, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TxngGoD_BETA_SNIPER_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "TxngGoD_BETA_SNIPER_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:14:39.785721", + "end_time": "2026-06-03T17:15:29.815505", + "duration_sec": 50.02171444892883, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TxngGoD_BETA_SNIPER_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "TxngGoD_BETA_SNIPER_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:15:34.479067", + "end_time": "2026-06-03T17:16:58.536854", + "duration_sec": 84.04840087890625, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TxngGoD_BETA_SNIPER_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "TxngGoD_BETA_SNIPER_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:17:03.146417", + "end_time": "2026-06-03T17:19:51.254730", + "duration_sec": 168.09594821929932, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TxngGoD_BETA_SNIPER_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "TxngGoD_BETA_SNIPER_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:19:56.296807", + "end_time": "2026-06-03T17:22:36.367067", + "duration_sec": 160.06217670440674, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TxngGoD_BETA_SNIPER_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "XU XARDFX49_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:22:41.120905", + "end_time": "2026-06-03T17:22:49.185286", + "duration_sec": 8.05562424659729, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\XU XARDFX49_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "XU XARDFX49_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:22:53.890130", + "end_time": "2026-06-03T17:23:01.924263", + "duration_sec": 8.028331279754639, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\XU XARDFX49_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "XU XARDFX49_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:23:06.671150", + "end_time": "2026-06-03T17:23:16.692634", + "duration_sec": 10.016969203948975, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\XU XARDFX49_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "XU XARDFX49_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:23:21.362998", + "end_time": "2026-06-03T17:23:31.391270", + "duration_sec": 10.019721746444702, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\XU XARDFX49_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "XU XARDFX49_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:23:36.042615", + "end_time": "2026-06-03T17:23:46.089977", + "duration_sec": 10.041289567947388, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\XU XARDFX49_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "XU XARDFX49_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T17:23:50.799045", + "end_time": "2026-06-03T17:24:00.827853", + "duration_sec": 10.02523946762085, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\XU XARDFX49_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "_EA_BPA Position Manager_EURUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:24:05.481474", + "end_time": "2026-06-03T17:24:09.503173", + "duration_sec": 4.017686128616333, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_BPA Position Manager_EURUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:24:14.138523", + "end_time": "2026-06-03T17:24:18.166723", + "duration_sec": 4.024553537368774, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_BPA Position Manager_EURGBP_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:24:22.799606", + "end_time": "2026-06-03T17:24:28.837820", + "duration_sec": 6.033999681472778, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_BPA Position Manager_EURGBP_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:24:33.285654", + "end_time": "2026-06-03T17:24:39.314293", + "duration_sec": 6.027615308761597, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_BPA Position Manager_XAUUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:24:44.008205", + "end_time": "2026-06-03T17:24:50.053435", + "duration_sec": 6.037963151931763, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_BPA Position Manager_XAUUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:24:54.676515", + "end_time": "2026-06-03T17:24:58.689207", + "duration_sec": 4.0094544887542725, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_CorrelationHedge_EA_EURUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:25:03.213555", + "end_time": "2026-06-03T17:25:07.237784", + "duration_sec": 4.0182623863220215, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_CorrelationHedge_EA_EURUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:25:11.687996", + "end_time": "2026-06-03T17:25:17.706847", + "duration_sec": 6.014782428741455, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_CorrelationHedge_EA_EURGBP_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:25:22.225189", + "end_time": "2026-06-03T17:25:28.238710", + "duration_sec": 6.010126352310181, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_CorrelationHedge_EA_EURGBP_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:25:32.666377", + "end_time": "2026-06-03T17:25:38.681427", + "duration_sec": 6.010111093521118, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_CorrelationHedge_EA_XAUUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:25:43.219153", + "end_time": "2026-06-03T17:25:49.241957", + "duration_sec": 6.0167272090911865, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_CorrelationHedge_EA_XAUUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:25:53.877625", + "end_time": "2026-06-03T17:25:59.901095", + "duration_sec": 6.017428874969482, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_GoldSniper_Pro_v2_EURUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:26:04.581605", + "end_time": "2026-06-03T17:26:10.609121", + "duration_sec": 6.020748853683472, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_GoldSniper_Pro_v2_EURUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:26:15.241864", + "end_time": "2026-06-03T17:26:21.271792", + "duration_sec": 6.024811267852783, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_GoldSniper_Pro_v2_EURGBP_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:26:25.941359", + "end_time": "2026-06-03T17:26:31.962006", + "duration_sec": 6.015772342681885, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_GoldSniper_Pro_v2_EURGBP_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:26:36.683353", + "end_time": "2026-06-03T17:26:42.710260", + "duration_sec": 6.019902944564819, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_GoldSniper_Pro_v2_XAUUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:26:47.399795", + "end_time": "2026-06-03T17:26:53.427466", + "duration_sec": 6.024080038070679, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_GoldSniper_Pro_v2_XAUUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:26:58.173469", + "end_time": "2026-06-03T17:27:04.198370", + "duration_sec": 6.022010803222656, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_HarmonicTrendSniper_EURUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:27:08.686298", + "end_time": "2026-06-03T17:27:12.711870", + "duration_sec": 4.02304482460022, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_HarmonicTrendSniper_EURUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:27:17.207608", + "end_time": "2026-06-03T17:27:23.261855", + "duration_sec": 6.046851634979248, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_HarmonicTrendSniper_EURGBP_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:27:27.684664", + "end_time": "2026-06-03T17:27:31.722091", + "duration_sec": 4.031843662261963, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_HarmonicTrendSniper_EURGBP_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:27:36.162909", + "end_time": "2026-06-03T17:27:40.186002", + "duration_sec": 4.0150861740112305, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_HarmonicTrendSniper_XAUUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:27:44.792450", + "end_time": "2026-06-03T17:27:50.807926", + "duration_sec": 6.008090972900391, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_HarmonicTrendSniper_XAUUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:27:55.491350", + "end_time": "2026-06-03T17:28:01.507614", + "duration_sec": 6.010737895965576, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_LiquidityScalper_MT5_EURUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:28:06.273966", + "end_time": "2026-06-03T17:28:12.290442", + "duration_sec": 6.010493516921997, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_LiquidityScalper_MT5_EURUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:28:16.847675", + "end_time": "2026-06-03T17:28:22.858204", + "duration_sec": 6.007760524749756, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_LiquidityScalper_MT5_EURGBP_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:28:27.475659", + "end_time": "2026-06-03T17:28:33.492195", + "duration_sec": 6.011441230773926, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_LiquidityScalper_MT5_EURGBP_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:28:38.362314", + "end_time": "2026-06-03T17:28:44.390991", + "duration_sec": 6.0229151248931885, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_LiquidityScalper_MT5_XAUUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:28:49.013768", + "end_time": "2026-06-03T17:28:55.041628", + "duration_sec": 6.021674871444702, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_LiquidityScalper_MT5_XAUUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:28:59.650071", + "end_time": "2026-06-03T17:29:03.676650", + "duration_sec": 4.024029731750488, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEA_EURUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:29:08.154402", + "end_time": "2026-06-03T17:29:14.196236", + "duration_sec": 6.0381128787994385, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEA_EURUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:29:18.642463", + "end_time": "2026-06-03T17:29:24.687915", + "duration_sec": 6.039921998977661, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEA_EURGBP_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:29:29.280582", + "end_time": "2026-06-03T17:29:33.323234", + "duration_sec": 4.037473678588867, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEA_EURGBP_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:29:37.855385", + "end_time": "2026-06-03T17:29:43.885321", + "duration_sec": 6.027318239212036, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEA_XAUUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:29:48.491638", + "end_time": "2026-06-03T17:29:54.527344", + "duration_sec": 6.031042814254761, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEA_XAUUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:29:59.124570", + "end_time": "2026-06-03T17:30:05.159015", + "duration_sec": 6.026536703109741, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEAv6_BTCUSDT_15m_EURUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:30:09.856705", + "end_time": "2026-06-03T17:30:13.885265", + "duration_sec": 4.0224010944366455, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEAv6_BTCUSDT_15m_EURUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:30:18.655527", + "end_time": "2026-06-03T17:30:24.681101", + "duration_sec": 6.019367694854736, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEAv6_BTCUSDT_15m_EURGBP_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:30:29.275618", + "end_time": "2026-06-03T17:30:35.288281", + "duration_sec": 6.008690357208252, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEAv6_BTCUSDT_15m_EURGBP_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:30:39.966888", + "end_time": "2026-06-03T17:30:43.980444", + "duration_sec": 4.011009454727173, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEAv6_BTCUSDT_15m_XAUUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:30:48.432959", + "end_time": "2026-06-03T17:30:54.452424", + "duration_sec": 6.013206243515015, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEAv6_BTCUSDT_15m_XAUUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:30:59.015979", + "end_time": "2026-06-03T17:31:03.033469", + "duration_sec": 4.01290225982666, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_RavanEA_MT5_EURUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:31:07.508451", + "end_time": "2026-06-03T17:31:11.526525", + "duration_sec": 4.013005256652832, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_RavanEA_MT5_EURUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:31:16.186960", + "end_time": "2026-06-03T17:31:22.204826", + "duration_sec": 6.0127832889556885, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_RavanEA_MT5_EURGBP_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:31:26.864793", + "end_time": "2026-06-03T17:31:32.906326", + "duration_sec": 6.032380819320679, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_RavanEA_MT5_EURGBP_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:31:37.610546", + "end_time": "2026-06-03T17:31:43.649830", + "duration_sec": 6.036340236663818, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_RavanEA_MT5_XAUUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:31:48.560284", + "end_time": "2026-06-03T17:31:54.582519", + "duration_sec": 6.018030405044556, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_RavanEA_MT5_XAUUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:31:59.320146", + "end_time": "2026-06-03T17:32:05.346690", + "duration_sec": 6.020024299621582, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_RSI_Brothers_EURUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:32:09.929302", + "end_time": "2026-06-03T17:32:15.966772", + "duration_sec": 6.033409118652344, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_RSI_Brothers_EURUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:32:20.663444", + "end_time": "2026-06-03T17:32:26.690878", + "duration_sec": 6.020193815231323, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_RSI_Brothers_EURGBP_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:32:31.349075", + "end_time": "2026-06-03T17:32:35.373306", + "duration_sec": 4.021223068237305, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_RSI_Brothers_EURGBP_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:32:39.860871", + "end_time": "2026-06-03T17:32:43.906943", + "duration_sec": 4.039464712142944, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_RSI_Brothers_XAUUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:32:48.390379", + "end_time": "2026-06-03T17:32:52.422263", + "duration_sec": 4.025274753570557, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_RSI_Brothers_XAUUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:32:57.063576", + "end_time": "2026-06-03T17:33:01.087674", + "duration_sec": 4.019311904907227, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_Siam trading hedge_EURUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:33:05.739987", + "end_time": "2026-06-03T17:33:11.767433", + "duration_sec": 6.020505905151367, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_Siam trading hedge_EURUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:33:16.309280", + "end_time": "2026-06-03T17:33:20.319584", + "duration_sec": 4.007787704467773, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_Siam trading hedge_EURGBP_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:33:24.791800", + "end_time": "2026-06-03T17:33:30.815384", + "duration_sec": 6.01788854598999, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_Siam trading hedge_EURGBP_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:33:35.330571", + "end_time": "2026-06-03T17:33:39.354719", + "duration_sec": 4.018136501312256, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_Siam trading hedge_XAUUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:33:43.815516", + "end_time": "2026-06-03T17:33:49.827379", + "duration_sec": 6.008552312850952, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_Siam trading hedge_XAUUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:33:54.390028", + "end_time": "2026-06-03T17:33:58.407172", + "duration_sec": 4.01167106628418, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_TxngGoD_BETA_SNIPER_EURUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:34:03.020823", + "end_time": "2026-06-03T17:34:09.035545", + "duration_sec": 6.009021997451782, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_TxngGoD_BETA_SNIPER_EURUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:34:13.753847", + "end_time": "2026-06-03T17:34:19.788771", + "duration_sec": 6.032306671142578, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_TxngGoD_BETA_SNIPER_EURGBP_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:34:24.491267", + "end_time": "2026-06-03T17:34:30.525144", + "duration_sec": 6.027159929275513, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_TxngGoD_BETA_SNIPER_EURGBP_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:34:35.133466", + "end_time": "2026-06-03T17:34:41.157427", + "duration_sec": 6.017436265945435, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_TxngGoD_BETA_SNIPER_XAUUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:34:45.755498", + "end_time": "2026-06-03T17:34:49.785180", + "duration_sec": 4.026250123977661, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_TxngGoD_BETA_SNIPER_XAUUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-03T17:34:54.278368", + "end_time": "2026-06-03T17:34:58.336427", + "duration_sec": 4.0544891357421875, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "TopBottomEA_EURUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-06-03T21:05:52.367302", + "end_time": "2026-06-03T21:05:54.396324", + "duration_sec": 2.025416374206543, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "TopBottomEA_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T21:05:59.020933", + "end_time": "2026-06-03T21:06:29.052833", + "duration_sec": 30.024360179901123, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TopBottomEA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "TopBottomEA_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T21:08:33.484726", + "end_time": "2026-06-03T21:08:59.512591", + "duration_sec": 26.024264574050903, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TopBottomEA_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "TopBottomEA_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T21:09:04.081819", + "end_time": "2026-06-03T21:09:26.129279", + "duration_sec": 22.04083824157715, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TopBottomEA_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "TopBottomEA_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T21:15:22.837293", + "end_time": "2026-06-03T21:15:34.862316", + "duration_sec": 12.020010471343994, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TopBottomEA_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "TopBottomEA_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T21:15:39.581577", + "end_time": "2026-06-03T21:15:49.630241", + "duration_sec": 10.044377088546753, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TopBottomEA_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "TopBottomEA_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T21:15:54.370106", + "end_time": "2026-06-03T21:16:06.415095", + "duration_sec": 12.038879632949829, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TopBottomEA_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "TopBottomEA_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T21:16:11.155735", + "end_time": "2026-06-03T21:16:21.217753", + "duration_sec": 10.052227258682251, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TopBottomEA_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "TopBottomEA_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T21:16:25.760721", + "end_time": "2026-06-03T21:16:39.790077", + "duration_sec": 14.02065372467041, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TopBottomEA_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "TopBottomEA_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T21:16:44.525505", + "end_time": "2026-06-03T21:16:54.568407", + "duration_sec": 10.036231756210327, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TopBottomEA_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "TopBottomEA_USDCAD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T21:16:59.164206", + "end_time": "2026-06-03T21:17:09.207275", + "duration_sec": 10.032296180725098, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\TopBottomEA_USDCAD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T21:20:31.317139", + "end_time": "2026-06-03T21:20:39.361607", + "duration_sec": 8.039998531341553, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T21:20:43.902899", + "end_time": "2026-06-03T21:20:49.940688", + "duration_sec": 6.034778833389282, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T21:20:54.502233", + "end_time": "2026-06-03T21:21:04.538450", + "duration_sec": 10.029586791992188, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T21:21:09.153960", + "end_time": "2026-06-03T21:21:17.183757", + "duration_sec": 8.023954391479492, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T21:21:21.787770", + "end_time": "2026-06-03T21:21:35.823570", + "duration_sec": 14.028496503829956, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T21:21:40.439114", + "end_time": "2026-06-03T21:21:48.473712", + "duration_sec": 8.030432939529419, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T23:55:26.430912", + "end_time": "2026-06-03T23:56:42.481364", + "duration_sec": 76.04920601844788, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-03T23:56:47.114285", + "end_time": "2026-06-03T23:58:15.166875", + "duration_sec": 88.04728055000305, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-03T23:58:19.700765", + "end_time": "2026-06-03T23:59:05.733275", + "duration_sec": 46.02950119972229, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-03T23:59:10.045006", + "end_time": "2026-06-04T00:00:00.080628", + "duration_sec": 50.03239107131958, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:00:04.515306", + "end_time": "2026-06-04T00:00:58.550371", + "duration_sec": 54.0320565700531, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:01:02.870055", + "end_time": "2026-06-04T00:01:54.907541", + "duration_sec": 52.03234934806824, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:01:59.291556", + "end_time": "2026-06-04T00:02:55.333219", + "duration_sec": 56.034236431121826, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:02:59.684010", + "end_time": "2026-06-04T00:03:55.721426", + "duration_sec": 56.030383586883545, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:04:00.096270", + "end_time": "2026-06-04T00:04:56.142782", + "duration_sec": 56.04235124588013, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDCAD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:05:00.412736", + "end_time": "2026-06-04T00:05:36.449386", + "duration_sec": 36.03121376037598, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDCAD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDCAD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:05:40.813980", + "end_time": "2026-06-04T00:06:18.851476", + "duration_sec": 38.031800746917725, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDCAD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDCAD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:06:23.207167", + "end_time": "2026-06-04T00:07:01.243975", + "duration_sec": 38.030136823654175, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDCAD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDCHF_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:07:05.499515", + "end_time": "2026-06-04T00:07:47.540272", + "duration_sec": 42.03444838523865, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDCHF_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDCHF_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:07:51.744389", + "end_time": "2026-06-04T00:08:33.794652", + "duration_sec": 42.04659652709961, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDCHF_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USDCHF_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:08:38.177775", + "end_time": "2026-06-04T00:09:20.223740", + "duration_sec": 42.038408041000366, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USDCHF_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_AUDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:09:24.481253", + "end_time": "2026-06-04T00:10:10.514598", + "duration_sec": 46.03073692321777, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_AUDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_AUDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:10:14.883791", + "end_time": "2026-06-04T00:11:02.929680", + "duration_sec": 48.039260149002075, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_AUDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_AUDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:11:07.306851", + "end_time": "2026-06-04T00:11:53.346228", + "duration_sec": 46.03543996810913, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_AUDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_NZDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:11:57.734024", + "end_time": "2026-06-04T00:12:39.781655", + "duration_sec": 42.04011058807373, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_NZDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_NZDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:12:44.045102", + "end_time": "2026-06-04T00:13:26.082900", + "duration_sec": 42.03088450431824, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_NZDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_NZDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:13:30.369705", + "end_time": "2026-06-04T00:14:12.392676", + "duration_sec": 42.01963806152344, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_NZDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURGBP_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:14:16.740915", + "end_time": "2026-06-04T00:15:02.779329", + "duration_sec": 46.03535723686218, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURGBP_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:15:07.184368", + "end_time": "2026-06-04T00:15:53.216088", + "duration_sec": 46.02971267700195, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:15:57.602125", + "end_time": "2026-06-04T00:16:51.650372", + "duration_sec": 54.03572726249695, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:16:55.997220", + "end_time": "2026-06-04T00:18:18.041505", + "duration_sec": 82.03826332092285, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:18:22.447231", + "end_time": "2026-06-04T00:19:44.492300", + "duration_sec": 82.04188227653503, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:19:48.831426", + "end_time": "2026-06-04T00:21:10.890729", + "duration_sec": 82.05526280403137, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:21:15.201857", + "end_time": "2026-06-04T00:22:37.259415", + "duration_sec": 82.05308127403259, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:22:41.621718", + "end_time": "2026-06-04T00:24:03.664172", + "duration_sec": 82.041823387146, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:24:08.027898", + "end_time": "2026-06-04T00:25:30.074827", + "duration_sec": 82.04040217399597, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_AUDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:25:34.378781", + "end_time": "2026-06-04T00:26:56.426467", + "duration_sec": 82.04464673995972, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_AUDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_AUDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:27:00.842514", + "end_time": "2026-06-04T00:28:24.901562", + "duration_sec": 84.05338954925537, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_AUDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_AUDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:28:29.157119", + "end_time": "2026-06-04T00:29:51.199290", + "duration_sec": 82.03765606880188, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_AUDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:29:55.604672", + "end_time": "2026-06-04T00:31:03.673983", + "duration_sec": 68.06448268890381, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:31:08.075391", + "end_time": "2026-06-04T00:32:16.122050", + "duration_sec": 68.04050993919373, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_EURAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:32:20.591191", + "end_time": "2026-06-04T00:33:28.628069", + "duration_sec": 68.0341112613678, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_EURAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:33:33.038151", + "end_time": "2026-06-04T00:34:49.081975", + "duration_sec": 76.0398199558258, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:34:53.437527", + "end_time": "2026-06-04T00:36:09.496770", + "duration_sec": 76.05670833587646, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_GBPAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:36:13.926704", + "end_time": "2026-06-04T00:37:29.976731", + "duration_sec": 76.04561161994934, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_GBPAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:37:34.340055", + "end_time": "2026-06-04T00:39:14.396778", + "duration_sec": 100.05125308036804, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:39:18.907065", + "end_time": "2026-06-04T00:41:02.957582", + "duration_sec": 104.04637956619263, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:41:07.485948", + "end_time": "2026-06-04T00:42:49.550966", + "duration_sec": 102.06146836280823, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_XAGUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:42:53.951382", + "end_time": "2026-06-04T00:44:11.997966", + "duration_sec": 78.0444073677063, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_XAGUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_XAGUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:44:16.405479", + "end_time": "2026-06-04T00:45:36.449095", + "duration_sec": 80.03915357589722, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_XAGUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_XAGUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:45:40.797392", + "end_time": "2026-06-04T00:47:04.840074", + "duration_sec": 84.03843092918396, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_XAGUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_BTCUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:47:09.138165", + "end_time": "2026-06-04T00:50:37.213646", + "duration_sec": 208.07109451293945, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_BTCUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_BTCUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:50:41.711382", + "end_time": "2026-06-04T00:54:09.831739", + "duration_sec": 208.11681199073792, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_BTCUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_BTCUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:54:14.365366", + "end_time": "2026-06-04T00:57:42.433350", + "duration_sec": 208.06404399871826, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_BTCUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_ETHUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T00:57:46.816225", + "end_time": "2026-06-04T01:01:18.889983", + "duration_sec": 212.07120966911316, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_ETHUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_ETHUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:01:23.481707", + "end_time": "2026-06-04T01:07:27.633059", + "duration_sec": 364.14631032943726, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_ETHUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_ETHUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:07:32.155110", + "end_time": "2026-06-04T01:11:06.254132", + "duration_sec": 214.0959632396698, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_ETHUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_US30_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:11:10.749851", + "end_time": "2026-06-04T01:12:28.805313", + "duration_sec": 78.05087423324585, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_US30_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_US30_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:12:33.152243", + "end_time": "2026-06-04T01:13:57.199494", + "duration_sec": 84.04321694374084, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_US30_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_US30_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:14:01.630452", + "end_time": "2026-06-04T01:15:19.690287", + "duration_sec": 78.0522096157074, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_US30_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_US500_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:15:24.123975", + "end_time": "2026-06-04T01:16:18.164111", + "duration_sec": 54.03457832336426, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_US500_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_US500_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:16:22.452698", + "end_time": "2026-06-04T01:17:16.494309", + "duration_sec": 54.03705811500549, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_US500_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_US500_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:17:20.828207", + "end_time": "2026-06-04T01:18:16.875240", + "duration_sec": 56.04456639289856, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_US500_H1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USTEC_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:18:21.300803", + "end_time": "2026-06-04T01:20:45.393192", + "duration_sec": 144.08652925491333, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USTEC_M1_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USTEC_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:20:49.735430", + "end_time": "2026-06-04T01:23:13.800215", + "duration_sec": 144.0597596168518, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USTEC_M5_default.htm", + "error": null + }, + { + "ini_file": "AsianSessionBreakout_USTEC_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:23:18.340072", + "end_time": "2026-06-04T01:25:44.411414", + "duration_sec": 146.0672504901886, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\AsianSessionBreakout_USTEC_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:25:48.944744", + "end_time": "2026-06-04T01:26:38.994889", + "duration_sec": 50.038742780685425, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:26:43.312990", + "end_time": "2026-06-04T01:27:17.369197", + "duration_sec": 34.047860860824585, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:27:21.815839", + "end_time": "2026-06-04T01:27:51.863802", + "duration_sec": 30.04328989982605, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:27:56.202680", + "end_time": "2026-06-04T01:28:48.255861", + "duration_sec": 52.0452446937561, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:28:52.670785", + "end_time": "2026-06-04T01:29:28.714771", + "duration_sec": 36.03730082511902, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:29:32.988906", + "end_time": "2026-06-04T01:30:07.028377", + "duration_sec": 34.03410792350769, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:30:11.245187", + "end_time": "2026-06-04T01:31:03.312714", + "duration_sec": 52.05351114273071, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:31:07.779248", + "end_time": "2026-06-04T01:31:43.829977", + "duration_sec": 36.04559588432312, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:31:48.223688", + "end_time": "2026-06-04T01:32:22.260019", + "duration_sec": 34.03178668022156, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDCAD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:32:26.687767", + "end_time": "2026-06-04T01:33:16.726872", + "duration_sec": 50.034579277038574, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDCAD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDCAD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:33:21.209355", + "end_time": "2026-06-04T01:33:59.251638", + "duration_sec": 38.03626608848572, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDCAD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDCAD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:34:03.540195", + "end_time": "2026-06-04T01:34:39.571040", + "duration_sec": 36.024306297302246, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDCAD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDCHF_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:34:43.976556", + "end_time": "2026-06-04T01:35:38.038095", + "duration_sec": 54.04982852935791, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDCHF_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDCHF_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:35:42.466956", + "end_time": "2026-06-04T01:36:16.514914", + "duration_sec": 34.04311490058899, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDCHF_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USDCHF_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:36:20.788466", + "end_time": "2026-06-04T01:36:52.831617", + "duration_sec": 32.036121129989624, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USDCHF_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_AUDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:36:57.166116", + "end_time": "2026-06-04T01:37:49.207299", + "duration_sec": 52.035714864730835, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_AUDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_AUDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:37:53.591216", + "end_time": "2026-06-04T01:38:27.626979", + "duration_sec": 34.02921652793884, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_AUDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_AUDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:38:31.995417", + "end_time": "2026-06-04T01:39:04.042620", + "duration_sec": 32.04061508178711, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_AUDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_NZDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:39:08.376212", + "end_time": "2026-06-04T01:39:58.414604", + "duration_sec": 50.031378746032715, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_NZDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_NZDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:40:02.765540", + "end_time": "2026-06-04T01:40:36.815676", + "duration_sec": 34.04373097419739, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_NZDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_NZDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:40:41.124596", + "end_time": "2026-06-04T01:41:13.156948", + "duration_sec": 32.02606797218323, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_NZDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURGBP_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:41:17.402167", + "end_time": "2026-06-04T01:42:07.441190", + "duration_sec": 50.033860206604004, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURGBP_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:42:11.916397", + "end_time": "2026-06-04T01:42:45.964656", + "duration_sec": 34.04168081283569, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:42:50.296114", + "end_time": "2026-06-04T01:43:24.330771", + "duration_sec": 34.026082038879395, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:43:28.705686", + "end_time": "2026-06-04T01:44:28.753771", + "duration_sec": 60.04376292228699, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:44:33.199313", + "end_time": "2026-06-04T01:45:19.266474", + "duration_sec": 46.06026482582092, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:45:23.553225", + "end_time": "2026-06-04T01:46:07.602859", + "duration_sec": 44.03909420967102, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:46:11.951258", + "end_time": "2026-06-04T01:47:12.004180", + "duration_sec": 60.04525279998779, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:47:16.420030", + "end_time": "2026-06-04T01:48:02.472727", + "duration_sec": 46.04723620414734, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:48:06.892584", + "end_time": "2026-06-04T01:48:50.937516", + "duration_sec": 44.04111695289612, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_AUDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:48:55.365555", + "end_time": "2026-06-04T01:49:55.411281", + "duration_sec": 60.03934144973755, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_AUDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_AUDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:49:59.837234", + "end_time": "2026-06-04T01:50:43.894691", + "duration_sec": 44.04768109321594, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_AUDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_AUDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:50:48.311569", + "end_time": "2026-06-04T01:51:32.381673", + "duration_sec": 44.06310057640076, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_AUDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:51:36.869116", + "end_time": "2026-06-04T01:52:32.920230", + "duration_sec": 56.04562044143677, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:52:37.291366", + "end_time": "2026-06-04T01:53:19.350070", + "duration_sec": 42.05091118812561, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_EURAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:53:23.651369", + "end_time": "2026-06-04T01:54:05.696563", + "duration_sec": 42.03841757774353, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_EURAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:54:10.047261", + "end_time": "2026-06-04T01:55:08.099479", + "duration_sec": 58.04418873786926, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:55:12.533894", + "end_time": "2026-06-04T01:55:58.580849", + "duration_sec": 46.04081583023071, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_GBPAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:56:03.004086", + "end_time": "2026-06-04T01:56:47.051138", + "duration_sec": 44.04094648361206, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_GBPAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:56:51.495750", + "end_time": "2026-06-04T01:57:57.539426", + "duration_sec": 66.03664469718933, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:58:01.948154", + "end_time": "2026-06-04T01:58:58.006316", + "duration_sec": 56.04953408241272, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T01:59:02.444656", + "end_time": "2026-06-04T01:59:56.498372", + "duration_sec": 54.04869604110718, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAGUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:00:00.878008", + "end_time": "2026-06-04T02:01:00.925602", + "duration_sec": 60.04157471656799, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAGUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAGUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:01:05.291369", + "end_time": "2026-06-04T02:01:53.345180", + "duration_sec": 48.044148206710815, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAGUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_XAGUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:01:57.594862", + "end_time": "2026-06-04T02:02:43.635179", + "duration_sec": 46.032923460006714, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_XAGUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_BTCUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:02:48.035585", + "end_time": "2026-06-04T02:03:00.081000", + "duration_sec": 12.036758661270142, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_BTCUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_BTCUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:03:04.448962", + "end_time": "2026-06-04T02:04:46.503806", + "duration_sec": 102.04911041259766, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_BTCUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_BTCUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:04:50.972436", + "end_time": "2026-06-04T02:06:29.026433", + "duration_sec": 98.04995489120483, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_BTCUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_ETHUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:06:33.554731", + "end_time": "2026-06-04T02:06:45.588977", + "duration_sec": 12.027696371078491, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_ETHUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_ETHUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:06:49.942018", + "end_time": "2026-06-04T02:08:35.999956", + "duration_sec": 106.0534119606018, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_ETHUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_ETHUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:08:40.468847", + "end_time": "2026-06-04T02:10:24.527926", + "duration_sec": 104.05605483055115, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_ETHUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_US30_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:10:29.051521", + "end_time": "2026-06-04T02:11:29.104579", + "duration_sec": 60.040650367736816, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_US30_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_US30_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:11:33.512548", + "end_time": "2026-06-04T02:12:21.565255", + "duration_sec": 48.044827699661255, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_US30_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_US30_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:12:25.875567", + "end_time": "2026-06-04T02:13:09.922331", + "duration_sec": 44.03753113746643, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_US30_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_US500_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:13:14.290239", + "end_time": "2026-06-04T02:14:08.338184", + "duration_sec": 54.04058623313904, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_US500_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_US500_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:14:12.763051", + "end_time": "2026-06-04T02:14:50.807783", + "duration_sec": 38.03616952896118, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_US500_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_US500_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:14:55.192305", + "end_time": "2026-06-04T02:15:31.235511", + "duration_sec": 36.034971475601196, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_US500_H1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USTEC_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:15:35.612272", + "end_time": "2026-06-04T02:16:53.665247", + "duration_sec": 78.04303503036499, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USTEC_M1_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USTEC_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:16:58.233447", + "end_time": "2026-06-04T02:18:08.290112", + "duration_sec": 70.04763007164001, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USTEC_M5_default.htm", + "error": null + }, + { + "ini_file": "ATR_NN_USTEC_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:18:12.745278", + "end_time": "2026-06-04T02:19:18.790029", + "duration_sec": 66.03719234466553, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\ATR_NN_USTEC_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:19:23.139524", + "end_time": "2026-06-04T02:19:41.180877", + "duration_sec": 18.037286281585693, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:19:45.552237", + "end_time": "2026-06-04T02:20:03.586922", + "duration_sec": 18.030664682388306, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:20:07.960529", + "end_time": "2026-06-04T02:20:26.002226", + "duration_sec": 18.03612732887268, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:20:30.220817", + "end_time": "2026-06-04T02:20:48.249210", + "duration_sec": 18.02572202682495, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:20:52.622305", + "end_time": "2026-06-04T02:21:10.667515", + "duration_sec": 18.03965950012207, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:21:14.974592", + "end_time": "2026-06-04T02:21:33.002960", + "duration_sec": 18.025842428207397, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:21:37.375281", + "end_time": "2026-06-04T02:21:55.412115", + "duration_sec": 18.030306100845337, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:21:59.788244", + "end_time": "2026-06-04T02:22:17.820994", + "duration_sec": 18.027723789215088, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:22:22.184391", + "end_time": "2026-06-04T02:22:40.222367", + "duration_sec": 18.032386779785156, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_USDCAD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:22:44.553349", + "end_time": "2026-06-04T02:23:00.587923", + "duration_sec": 16.029125452041626, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_USDCAD_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_USDCAD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:23:04.940690", + "end_time": "2026-06-04T02:23:22.976160", + "duration_sec": 18.025171518325806, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_USDCAD_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_USDCAD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:23:27.326474", + "end_time": "2026-06-04T02:23:45.347825", + "duration_sec": 18.01488494873047, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_USDCAD_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_USDCHF_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:23:49.607453", + "end_time": "2026-06-04T02:24:07.635114", + "duration_sec": 18.018138885498047, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_USDCHF_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_USDCHF_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:24:11.973930", + "end_time": "2026-06-04T02:24:30.014182", + "duration_sec": 18.02333950996399, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_USDCHF_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_USDCHF_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:24:34.264332", + "end_time": "2026-06-04T02:24:52.305258", + "duration_sec": 18.034579038619995, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_USDCHF_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_AUDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:24:56.573649", + "end_time": "2026-06-04T02:25:14.605029", + "duration_sec": 18.027859687805176, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_AUDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_AUDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:25:18.984689", + "end_time": "2026-06-04T02:25:37.014670", + "duration_sec": 18.026923179626465, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_AUDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_AUDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:25:41.358315", + "end_time": "2026-06-04T02:25:59.392259", + "duration_sec": 18.02790069580078, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_AUDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_NZDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:26:03.613905", + "end_time": "2026-06-04T02:26:21.652287", + "duration_sec": 18.031203746795654, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_NZDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_NZDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:26:25.963642", + "end_time": "2026-06-04T02:26:43.997064", + "duration_sec": 18.02820634841919, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_NZDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_NZDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:26:48.315538", + "end_time": "2026-06-04T02:27:06.353285", + "duration_sec": 18.032149076461792, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_NZDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_EURGBP_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:27:10.597926", + "end_time": "2026-06-04T02:27:30.632268", + "duration_sec": 20.027812480926514, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_EURGBP_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:27:35.069346", + "end_time": "2026-06-04T02:27:55.121074", + "duration_sec": 20.039583444595337, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:27:59.425679", + "end_time": "2026-06-04T02:28:17.460232", + "duration_sec": 18.027223825454712, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_EURJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:28:21.813753", + "end_time": "2026-06-04T02:28:41.835403", + "duration_sec": 20.01706290245056, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_EURJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_EURJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:28:46.063728", + "end_time": "2026-06-04T02:29:06.083223", + "duration_sec": 20.014312267303467, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_EURJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_EURJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:29:10.352350", + "end_time": "2026-06-04T02:29:30.384494", + "duration_sec": 20.028106212615967, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_EURJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:29:34.755557", + "end_time": "2026-06-04T02:29:54.795939", + "duration_sec": 20.03525161743164, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_GBPJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:29:59.165167", + "end_time": "2026-06-04T02:30:19.204936", + "duration_sec": 20.033194541931152, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_GBPJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:30:23.543833", + "end_time": "2026-06-04T02:30:45.611649", + "duration_sec": 22.059598207473755, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_AUDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:30:49.962579", + "end_time": "2026-06-04T02:31:10.000508", + "duration_sec": 20.03035807609558, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_AUDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_AUDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:31:14.229000", + "end_time": "2026-06-04T02:31:34.278980", + "duration_sec": 20.04481792449951, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_AUDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_AUDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:31:38.654652", + "end_time": "2026-06-04T02:31:58.685811", + "duration_sec": 20.02624821662903, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_AUDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_EURAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:32:03.020924", + "end_time": "2026-06-04T02:32:23.063054", + "duration_sec": 20.03626251220703, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_EURAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_EURAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:32:27.419557", + "end_time": "2026-06-04T02:32:47.464643", + "duration_sec": 20.035867929458618, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_EURAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_EURAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:32:51.772461", + "end_time": "2026-06-04T02:33:09.805612", + "duration_sec": 18.029144287109375, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_EURAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_GBPAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:33:14.176652", + "end_time": "2026-06-04T02:33:34.202999", + "duration_sec": 20.02209973335266, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_GBPAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_GBPAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:33:38.551410", + "end_time": "2026-06-04T02:33:58.571722", + "duration_sec": 20.01625657081604, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_GBPAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_GBPAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:34:02.878762", + "end_time": "2026-06-04T02:34:22.901656", + "duration_sec": 20.01979374885559, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_GBPAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:34:27.216180", + "end_time": "2026-06-04T02:34:45.259845", + "duration_sec": 18.035002946853638, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:34:49.624221", + "end_time": "2026-06-04T02:35:07.654552", + "duration_sec": 18.0237398147583, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:35:11.952252", + "end_time": "2026-06-04T02:35:27.987172", + "duration_sec": 16.029293537139893, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_XAGUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:35:32.381150", + "end_time": "2026-06-04T02:35:50.409567", + "duration_sec": 18.024070739746094, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_XAGUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_XAGUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:35:54.656841", + "end_time": "2026-06-04T02:36:10.684748", + "duration_sec": 16.02355456352234, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_XAGUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_XAGUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:36:15.019272", + "end_time": "2026-06-04T02:36:31.048089", + "duration_sec": 16.02303147315979, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_XAGUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_BTCUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:36:35.459371", + "end_time": "2026-06-04T02:37:03.501655", + "duration_sec": 28.03714895248413, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_BTCUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_BTCUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:37:07.842049", + "end_time": "2026-06-04T02:37:35.876296", + "duration_sec": 28.02895998954773, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_BTCUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_BTCUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:37:40.288214", + "end_time": "2026-06-04T02:38:08.325218", + "duration_sec": 28.032947778701782, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_BTCUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_ETHUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:38:12.694558", + "end_time": "2026-06-04T02:38:40.727333", + "duration_sec": 28.029123067855835, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_ETHUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_ETHUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:38:45.015623", + "end_time": "2026-06-04T02:39:13.059488", + "duration_sec": 28.037167072296143, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_ETHUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_ETHUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:39:17.453607", + "end_time": "2026-06-04T02:39:45.478517", + "duration_sec": 28.017704010009766, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_ETHUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_US30_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:39:49.880418", + "end_time": "2026-06-04T02:40:09.915797", + "duration_sec": 20.029468297958374, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_US30_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_US30_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:40:14.217262", + "end_time": "2026-06-04T02:40:34.256442", + "duration_sec": 20.03381633758545, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_US30_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_US30_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:40:38.543741", + "end_time": "2026-06-04T02:40:58.588533", + "duration_sec": 20.038657903671265, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_US30_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_US500_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:41:02.885444", + "end_time": "2026-06-04T02:41:20.912585", + "duration_sec": 18.023105144500732, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_US500_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_US500_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:41:25.311710", + "end_time": "2026-06-04T02:41:45.358165", + "duration_sec": 20.03779411315918, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_US500_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_US500_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:41:49.663942", + "end_time": "2026-06-04T02:42:07.691819", + "duration_sec": 18.023343086242676, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_US500_H1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_USTEC_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:42:12.053780", + "end_time": "2026-06-04T02:42:36.085039", + "duration_sec": 24.026228189468384, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_USTEC_M1_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_USTEC_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:42:40.332608", + "end_time": "2026-06-04T02:43:04.375574", + "duration_sec": 24.03647232055664, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_USTEC_M5_default.htm", + "error": null + }, + { + "ini_file": "CorrelationHedge_EA_USTEC_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:43:08.682402", + "end_time": "2026-06-04T02:43:32.713249", + "duration_sec": 24.026321411132812, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\CorrelationHedge_EA_USTEC_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:43:37.001109", + "end_time": "2026-06-04T02:43:45.033453", + "duration_sec": 8.026366949081421, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:43:49.355901", + "end_time": "2026-06-04T02:43:57.396925", + "duration_sec": 8.037005424499512, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:44:01.733625", + "end_time": "2026-06-04T02:44:11.747150", + "duration_sec": 10.010507583618164, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:44:16.068249", + "end_time": "2026-06-04T02:44:28.089574", + "duration_sec": 12.01268720626831, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:44:32.419239", + "end_time": "2026-06-04T02:44:42.453237", + "duration_sec": 10.02882170677185, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:44:46.653607", + "end_time": "2026-06-04T02:44:56.675980", + "duration_sec": 10.016332864761353, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:45:00.960206", + "end_time": "2026-06-04T02:45:10.991036", + "duration_sec": 10.02466893196106, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:45:15.392971", + "end_time": "2026-06-04T02:45:25.441875", + "duration_sec": 10.040305376052856, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:45:29.798263", + "end_time": "2026-06-04T02:45:41.835791", + "duration_sec": 12.030489683151245, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_USDCAD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:45:46.147808", + "end_time": "2026-06-04T02:45:54.182186", + "duration_sec": 8.028319120407104, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_USDCAD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_USDCAD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:45:58.529529", + "end_time": "2026-06-04T02:46:10.565287", + "duration_sec": 12.027896404266357, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_USDCAD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_USDCAD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:46:14.812907", + "end_time": "2026-06-04T02:46:22.836773", + "duration_sec": 8.021884679794312, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_USDCAD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_USDCHF_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:46:27.197143", + "end_time": "2026-06-04T02:46:35.225956", + "duration_sec": 8.025804996490479, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_USDCHF_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_USDCHF_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:46:39.612523", + "end_time": "2026-06-04T02:46:47.647292", + "duration_sec": 8.024361610412598, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_USDCHF_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_USDCHF_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:46:51.991779", + "end_time": "2026-06-04T02:47:02.024401", + "duration_sec": 10.024655103683472, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_USDCHF_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_AUDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:47:06.335858", + "end_time": "2026-06-04T02:47:14.362688", + "duration_sec": 8.020255327224731, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_AUDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_AUDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:47:18.617488", + "end_time": "2026-06-04T02:47:26.645984", + "duration_sec": 8.024479866027832, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_AUDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_AUDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:47:30.968636", + "end_time": "2026-06-04T02:47:40.990010", + "duration_sec": 10.015357255935669, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_AUDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_NZDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:47:45.255342", + "end_time": "2026-06-04T02:47:53.275014", + "duration_sec": 8.012597799301147, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_NZDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_NZDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:47:57.636000", + "end_time": "2026-06-04T02:48:05.657334", + "duration_sec": 8.012296676635742, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_NZDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_NZDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:48:09.962916", + "end_time": "2026-06-04T02:48:19.987315", + "duration_sec": 10.015078067779541, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_NZDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_EURGBP_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:48:24.300114", + "end_time": "2026-06-04T02:48:36.329838", + "duration_sec": 12.025190830230713, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_EURGBP_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:48:40.679418", + "end_time": "2026-06-04T02:48:52.724087", + "duration_sec": 12.03970456123352, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:48:56.998006", + "end_time": "2026-06-04T02:49:11.048575", + "duration_sec": 14.045738220214844, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_EURJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:49:15.346154", + "end_time": "2026-06-04T02:49:29.380172", + "duration_sec": 14.028492450714111, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_EURJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_EURJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:49:33.791831", + "end_time": "2026-06-04T02:49:51.829769", + "duration_sec": 18.030437469482422, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_EURJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_EURJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:49:56.155471", + "end_time": "2026-06-04T02:50:12.188949", + "duration_sec": 16.028419733047485, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_EURJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:50:16.550217", + "end_time": "2026-06-04T02:50:32.579762", + "duration_sec": 16.020458936691284, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_GBPJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:50:36.876093", + "end_time": "2026-06-04T02:50:52.901767", + "duration_sec": 16.022183656692505, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_GBPJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:50:57.279210", + "end_time": "2026-06-04T02:51:15.312875", + "duration_sec": 18.021880388259888, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_AUDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:51:19.726585", + "end_time": "2026-06-04T02:51:33.767610", + "duration_sec": 14.031471252441406, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_AUDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_AUDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:51:38.101746", + "end_time": "2026-06-04T02:51:54.139650", + "duration_sec": 16.03182315826416, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_AUDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_AUDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:51:58.394153", + "end_time": "2026-06-04T02:52:16.414456", + "duration_sec": 18.014398336410522, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_AUDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_EURAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:52:20.645124", + "end_time": "2026-06-04T02:52:34.679026", + "duration_sec": 14.028372287750244, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_EURAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_EURAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:52:38.994762", + "end_time": "2026-06-04T02:52:53.016779", + "duration_sec": 14.01667308807373, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_EURAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_EURAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:52:57.341436", + "end_time": "2026-06-04T02:53:13.376667", + "duration_sec": 16.029151678085327, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_EURAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_GBPAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:53:17.790970", + "end_time": "2026-06-04T02:53:33.834878", + "duration_sec": 16.038691759109497, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_GBPAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_GBPAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:53:38.077857", + "end_time": "2026-06-04T02:53:54.115857", + "duration_sec": 16.028828144073486, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_GBPAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_GBPAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:53:58.374702", + "end_time": "2026-06-04T02:54:16.401885", + "duration_sec": 18.02097797393799, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_GBPAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:54:20.717165", + "end_time": "2026-06-04T02:54:34.756014", + "duration_sec": 14.027878999710083, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:54:39.097521", + "end_time": "2026-06-04T02:54:53.137185", + "duration_sec": 14.03312611579895, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:54:57.474094", + "end_time": "2026-06-04T02:55:11.499714", + "duration_sec": 14.02260446548462, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_XAGUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:55:15.881274", + "end_time": "2026-06-04T02:55:25.920636", + "duration_sec": 10.031698942184448, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_XAGUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_XAGUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:55:30.291902", + "end_time": "2026-06-04T02:55:44.328234", + "duration_sec": 14.030311584472656, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_XAGUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_XAGUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:55:48.544648", + "end_time": "2026-06-04T02:56:00.569507", + "duration_sec": 12.021768808364868, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_XAGUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_BTCUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:56:04.824933", + "end_time": "2026-06-04T02:56:34.853967", + "duration_sec": 30.016310691833496, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_BTCUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_BTCUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:56:39.202782", + "end_time": "2026-06-04T02:57:07.237093", + "duration_sec": 28.0272114276886, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_BTCUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_BTCUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:57:11.458923", + "end_time": "2026-06-04T02:57:37.494988", + "duration_sec": 26.031931400299072, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_BTCUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_ETHUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:57:41.916751", + "end_time": "2026-06-04T02:58:13.970760", + "duration_sec": 32.0340142250061, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_ETHUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_ETHUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:58:18.310007", + "end_time": "2026-06-04T02:58:46.346811", + "duration_sec": 28.029228448867798, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_ETHUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_ETHUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:58:50.745058", + "end_time": "2026-06-04T02:59:16.781344", + "duration_sec": 26.03192377090454, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_ETHUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_US30_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:59:21.083183", + "end_time": "2026-06-04T02:59:31.112687", + "duration_sec": 10.024250507354736, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_US30_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_US30_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:59:35.399129", + "end_time": "2026-06-04T02:59:45.427506", + "duration_sec": 10.021714448928833, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_US30_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_US30_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T02:59:49.715615", + "end_time": "2026-06-04T02:59:59.763823", + "duration_sec": 10.043007850646973, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_US30_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_US500_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:00:04.094500", + "end_time": "2026-06-04T03:00:14.123862", + "duration_sec": 10.02537488937378, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_US500_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_US500_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:00:18.467225", + "end_time": "2026-06-04T03:00:26.497047", + "duration_sec": 8.024452447891235, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_US500_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_US500_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:00:30.851563", + "end_time": "2026-06-04T03:00:38.882328", + "duration_sec": 8.026615381240845, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_US500_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_USTEC_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:00:43.196078", + "end_time": "2026-06-04T03:00:55.220111", + "duration_sec": 12.021023273468018, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_USTEC_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_USTEC_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:00:59.529981", + "end_time": "2026-06-04T03:01:11.551787", + "duration_sec": 12.015603303909302, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_USTEC_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Bande_di_bollinger_USTEC_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:01:15.931511", + "end_time": "2026-06-04T03:01:27.952764", + "duration_sec": 12.018828868865967, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Bande_di_bollinger_USTEC_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:01:32.304017", + "end_time": "2026-06-04T03:04:44.371401", + "duration_sec": 192.06191968917847, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:04:48.861949", + "end_time": "2026-06-04T03:08:00.945237", + "duration_sec": 192.0768461227417, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:08:05.539185", + "end_time": "2026-06-04T03:11:15.688564", + "duration_sec": 190.14481210708618, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:11:20.196227", + "end_time": "2026-06-04T03:15:24.275257", + "duration_sec": 244.07750511169434, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:15:28.667170", + "end_time": "2026-06-04T03:19:36.763600", + "duration_sec": 248.08743381500244, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:19:41.148075", + "end_time": "2026-06-04T03:23:45.264746", + "duration_sec": 244.11121487617493, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:23:49.751780", + "end_time": "2026-06-04T03:28:25.842537", + "duration_sec": 276.0860319137573, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:28:30.374353", + "end_time": "2026-06-04T03:33:04.479052", + "duration_sec": 274.098566532135, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:33:09.012881", + "end_time": "2026-06-04T03:37:41.113111", + "duration_sec": 272.09720849990845, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_USDCAD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:37:45.482969", + "end_time": "2026-06-04T03:40:31.548567", + "duration_sec": 166.06057405471802, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_USDCAD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_USDCAD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:40:36.054946", + "end_time": "2026-06-04T03:43:22.151010", + "duration_sec": 166.0883686542511, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_USDCAD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_USDCAD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:43:26.858853", + "end_time": "2026-06-04T03:46:12.917905", + "duration_sec": 166.05507731437683, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_USDCAD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_USDCHF_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:46:17.464425", + "end_time": "2026-06-04T03:49:11.533303", + "duration_sec": 174.06132125854492, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_USDCHF_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_USDCHF_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:49:16.018389", + "end_time": "2026-06-04T03:52:10.096334", + "duration_sec": 174.07003164291382, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_USDCHF_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_USDCHF_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:52:14.604334", + "end_time": "2026-06-04T03:55:08.687662", + "duration_sec": 174.07725620269775, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_USDCHF_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_AUDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:55:13.271708", + "end_time": "2026-06-04T03:58:37.350161", + "duration_sec": 204.0716211795807, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_AUDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_AUDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T03:58:41.897052", + "end_time": "2026-06-04T04:02:05.984655", + "duration_sec": 204.07315611839294, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_AUDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_AUDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T04:02:10.452647", + "end_time": "2026-06-04T04:05:34.529137", + "duration_sec": 204.0680112838745, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_AUDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_NZDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T04:05:39.017022", + "end_time": "2026-06-04T04:08:35.087604", + "duration_sec": 176.06477117538452, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_NZDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_NZDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T04:08:39.578415", + "end_time": "2026-06-04T04:11:41.676518", + "duration_sec": 182.08816504478455, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_NZDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_NZDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T04:11:46.130803", + "end_time": "2026-06-04T04:14:42.202443", + "duration_sec": 176.0676131248474, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_NZDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_EURGBP_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T04:14:46.765633", + "end_time": "2026-06-04T04:17:50.836052", + "duration_sec": 184.06603837013245, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_EURGBP_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T04:17:55.268221", + "end_time": "2026-06-04T04:20:57.335531", + "duration_sec": 182.06076169013977, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T04:21:01.792762", + "end_time": "2026-06-04T04:24:03.866381", + "duration_sec": 182.06955480575562, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_EURJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T04:24:08.375343", + "end_time": "2026-06-04T04:30:44.538250", + "duration_sec": 396.1547691822052, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_EURJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_EURJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T04:30:49.033756", + "end_time": "2026-06-04T04:37:23.158955", + "duration_sec": 394.1186442375183, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_EURJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_EURJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T04:37:27.542302", + "end_time": "2026-06-04T04:43:59.675337", + "duration_sec": 392.13000440597534, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_EURJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T04:44:04.258695", + "end_time": "2026-06-04T04:50:46.392170", + "duration_sec": 402.124876499176, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_GBPJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T04:50:50.966506", + "end_time": "2026-06-04T04:57:35.090722", + "duration_sec": 404.1196575164795, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_GBPJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T04:57:39.597883", + "end_time": "2026-06-04T05:04:21.728065", + "duration_sec": 402.1228098869324, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_AUDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T05:04:26.228302", + "end_time": "2026-06-04T05:10:58.365338", + "duration_sec": 392.12540888786316, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_AUDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_AUDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T05:11:02.903839", + "end_time": "2026-06-04T05:17:27.040020", + "duration_sec": 384.1306354999542, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_AUDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_AUDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T05:17:31.634914", + "end_time": "2026-06-04T05:23:57.758977", + "duration_sec": 386.1185007095337, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_AUDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_EURAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T05:24:02.281297", + "end_time": "2026-06-04T05:29:24.384258", + "duration_sec": 322.09855580329895, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_EURAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_EURAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T05:29:28.965271", + "end_time": "2026-06-04T05:34:49.069883", + "duration_sec": 320.1000552177429, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_EURAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_EURAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T05:34:53.643799", + "end_time": "2026-06-04T05:40:13.751964", + "duration_sec": 320.1066460609436, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_EURAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_GBPAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T05:40:18.249891", + "end_time": "2026-06-04T05:46:32.376923", + "duration_sec": 374.11284852027893, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_GBPAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_GBPAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T05:46:36.774174", + "end_time": "2026-06-04T05:52:48.881780", + "duration_sec": 372.1025581359863, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_GBPAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_GBPAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T05:52:53.449620", + "end_time": "2026-06-04T05:59:07.577695", + "duration_sec": 374.1210255622864, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_GBPAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T05:59:12.181166", + "end_time": "2026-06-04T06:10:34.386210", + "duration_sec": 682.1978631019592, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T06:10:38.900938", + "end_time": "2026-06-04T06:22:11.110214", + "duration_sec": 692.1985449790955, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T06:22:15.566165", + "end_time": "2026-06-04T06:33:33.759651", + "duration_sec": 678.187780380249, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_XAGUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T06:33:38.191095", + "end_time": "2026-06-04T06:41:40.353471", + "duration_sec": 482.1582350730896, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_XAGUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_XAGUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T06:41:44.897516", + "end_time": "2026-06-04T06:49:43.052511", + "duration_sec": 478.14719009399414, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_XAGUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_XAGUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T06:49:47.472072", + "end_time": "2026-06-04T06:57:45.616803", + "duration_sec": 478.14070200920105, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_XAGUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_BTCUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T06:57:50.108954", + "end_time": "2026-06-04T07:24:00.534847", + "duration_sec": 1570.4228508472443, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_BTCUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_BTCUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T07:24:05.005571", + "end_time": "2026-06-04T07:50:05.441190", + "duration_sec": 1560.428962945938, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_BTCUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_BTCUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T07:50:09.964232", + "end_time": "2026-06-04T08:16:28.357746", + "duration_sec": 1578.3837916851044, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_BTCUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_ETHUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T08:16:32.896460", + "end_time": "2026-06-04T08:43:31.330923", + "duration_sec": 1618.4278638362885, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_ETHUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_ETHUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T08:43:35.921307", + "end_time": "2026-06-04T09:10:36.345616", + "duration_sec": 1620.4177408218384, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_ETHUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_ETHUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T09:10:40.910137", + "end_time": "2026-06-04T09:37:41.367575", + "duration_sec": 1620.4520490169525, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_ETHUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_US30_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T09:37:45.914700", + "end_time": "2026-06-04T09:45:28.133506", + "duration_sec": 462.2126123905182, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_US30_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_US30_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T09:45:32.693031", + "end_time": "2026-06-04T09:53:16.863985", + "duration_sec": 464.1678593158722, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_US30_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_US30_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T09:53:21.391077", + "end_time": "2026-06-04T10:00:59.549401", + "duration_sec": 458.1556782722473, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_US30_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_US500_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T10:01:04.137972", + "end_time": "2026-06-04T10:06:24.279360", + "duration_sec": 320.1377019882202, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_US500_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_US500_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T10:06:28.754534", + "end_time": "2026-06-04T10:11:46.942526", + "duration_sec": 318.1805877685547, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_US500_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_US500_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T10:11:51.509752", + "end_time": "2026-06-04T10:17:11.682003", + "duration_sec": 320.1660966873169, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_US500_H1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_USTEC_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T10:17:16.083553", + "end_time": "2026-06-04T10:33:16.411829", + "duration_sec": 960.3250243663788, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_USTEC_M1_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_USTEC_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T10:33:21.037682", + "end_time": "2026-06-04T10:44:41.323042", + "duration_sec": 680.2812855243683, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_USTEC_M5_default.htm", + "error": null + }, + { + "ini_file": "EA_Price_Action_USTEC_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T10:44:45.860731", + "end_time": "2026-06-04T10:45:07.895427", + "duration_sec": 22.030917406082153, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\EA_Price_Action_USTEC_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T10:45:12.260383", + "end_time": "2026-06-04T10:45:58.308508", + "duration_sec": 46.03798460960388, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T10:46:02.694108", + "end_time": "2026-06-04T10:47:00.732931", + "duration_sec": 58.03271985054016, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T10:47:05.163376", + "end_time": "2026-06-04T10:48:43.254599", + "duration_sec": 98.07657933235168, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T10:48:47.804325", + "end_time": "2026-06-04T10:50:19.865354", + "duration_sec": 92.05048608779907, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T10:50:24.383119", + "end_time": "2026-06-04T10:51:56.465370", + "duration_sec": 92.07973074913025, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T10:52:00.873782", + "end_time": "2026-06-04T10:53:32.921009", + "duration_sec": 92.04314661026001, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T10:53:37.463912", + "end_time": "2026-06-04T10:55:21.560228", + "duration_sec": 104.08967304229736, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T10:55:26.119816", + "end_time": "2026-06-04T10:58:32.245332", + "duration_sec": 186.11975526809692, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T10:58:36.791853", + "end_time": "2026-06-04T11:02:04.932747", + "duration_sec": 208.13783955574036, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_USDCAD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:02:09.534338", + "end_time": "2026-06-04T11:03:13.593050", + "duration_sec": 64.05570197105408, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_USDCAD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_USDCAD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:03:18.112398", + "end_time": "2026-06-04T11:04:22.159053", + "duration_sec": 64.04345273971558, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_USDCAD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_USDCAD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:04:26.540217", + "end_time": "2026-06-04T11:05:30.578760", + "duration_sec": 64.03336930274963, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_USDCAD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_USDCHF_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:05:34.948995", + "end_time": "2026-06-04T11:06:45.008535", + "duration_sec": 70.05480194091797, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_USDCHF_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_USDCHF_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:06:49.435166", + "end_time": "2026-06-04T11:08:57.531720", + "duration_sec": 128.09221148490906, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_USDCHF_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_USDCHF_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:09:02.112148", + "end_time": "2026-06-04T11:10:08.169422", + "duration_sec": 66.05163908004761, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_USDCHF_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_AUDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:10:12.646362", + "end_time": "2026-06-04T11:12:34.728781", + "duration_sec": 142.08038687705994, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_AUDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_AUDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:12:39.282917", + "end_time": "2026-06-04T11:15:35.401861", + "duration_sec": 176.11589431762695, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_AUDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_AUDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:15:39.949162", + "end_time": "2026-06-04T11:19:10.082979", + "duration_sec": 210.12760472297668, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_AUDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_NZDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:19:14.639778", + "end_time": "2026-06-04T11:22:18.765686", + "duration_sec": 184.12281250953674, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_NZDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_NZDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:22:23.420314", + "end_time": "2026-06-04T11:25:29.549052", + "duration_sec": 186.12357783317566, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_NZDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_NZDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:25:33.951854", + "end_time": "2026-06-04T11:28:42.083428", + "duration_sec": 188.12550520896912, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_NZDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_EURGBP_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:28:46.620397", + "end_time": "2026-06-04T11:32:00.757644", + "duration_sec": 194.12758350372314, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_EURGBP_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:32:05.229388", + "end_time": "2026-06-04T11:34:59.332444", + "duration_sec": 174.09976172447205, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:35:03.886652", + "end_time": "2026-06-04T11:36:41.961791", + "duration_sec": 98.0691249370575, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_EURJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:36:46.591386", + "end_time": "2026-06-04T11:40:22.716641", + "duration_sec": 216.1186981201172, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_EURJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_EURJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:40:27.301831", + "end_time": "2026-06-04T11:47:17.563550", + "duration_sec": 410.25404930114746, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_EURJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_EURJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:47:22.126338", + "end_time": "2026-06-04T11:49:46.209246", + "duration_sec": 144.0739231109619, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_EURJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:49:50.740424", + "end_time": "2026-06-04T11:52:18.810803", + "duration_sec": 148.0663800239563, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_GBPJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:52:23.276734", + "end_time": "2026-06-04T11:54:49.346037", + "duration_sec": 146.0651786327362, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_GBPJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:54:54.003848", + "end_time": "2026-06-04T11:57:22.082650", + "duration_sec": 148.0706844329834, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_AUDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:57:26.582056", + "end_time": "2026-06-04T11:59:48.653608", + "duration_sec": 142.06388568878174, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_AUDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_AUDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T11:59:53.195601", + "end_time": "2026-06-04T12:02:13.297946", + "duration_sec": 140.09889101982117, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_AUDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_AUDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T12:02:17.871421", + "end_time": "2026-06-04T12:04:37.949722", + "duration_sec": 140.07127213478088, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_AUDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_EURAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T12:04:42.537458", + "end_time": "2026-06-04T12:06:42.623702", + "duration_sec": 120.07973837852478, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_EURAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_EURAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T12:06:47.133631", + "end_time": "2026-06-04T12:08:45.221175", + "duration_sec": 118.08296704292297, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_EURAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_EURAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T12:08:49.762200", + "end_time": "2026-06-04T12:10:49.872203", + "duration_sec": 120.10521125793457, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_EURAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_GBPAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T12:10:54.484382", + "end_time": "2026-06-04T12:13:14.559318", + "duration_sec": 140.0692572593689, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_GBPAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_GBPAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T12:13:19.086694", + "end_time": "2026-06-04T12:15:37.162681", + "duration_sec": 138.06784462928772, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_GBPAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_GBPAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T12:15:41.688189", + "end_time": "2026-06-04T12:18:01.754209", + "duration_sec": 140.06235718727112, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_GBPAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T12:18:06.323027", + "end_time": "2026-06-04T12:22:00.411655", + "duration_sec": 234.08495163917542, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T12:22:04.990563", + "end_time": "2026-06-04T12:26:00.132177", + "duration_sec": 235.13819360733032, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T12:26:04.686458", + "end_time": "2026-06-04T12:30:04.786700", + "duration_sec": 240.09133863449097, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_XAGUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T12:30:09.270558", + "end_time": "2026-06-04T12:32:53.354813", + "duration_sec": 164.07741928100586, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_XAGUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_XAGUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T12:32:57.896759", + "end_time": "2026-06-04T12:35:42.023699", + "duration_sec": 164.11953854560852, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_XAGUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_XAGUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T12:35:46.597676", + "end_time": "2026-06-04T12:38:30.681916", + "duration_sec": 164.07666516304016, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_XAGUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_BTCUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T12:38:35.313456", + "end_time": "2026-06-04T12:47:35.495205", + "duration_sec": 540.1747632026672, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_BTCUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_BTCUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T12:47:39.956726", + "end_time": "2026-06-04T12:56:38.158329", + "duration_sec": 538.1971747875214, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_BTCUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_BTCUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T12:56:42.638402", + "end_time": "2026-06-04T13:05:40.827202", + "duration_sec": 538.1836342811584, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_BTCUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_ETHUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T13:05:45.485268", + "end_time": "2026-06-04T13:14:47.697415", + "duration_sec": 542.2072591781616, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_ETHUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_ETHUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T13:14:52.178677", + "end_time": "2026-06-04T13:23:50.410440", + "duration_sec": 538.2242133617401, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_ETHUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_ETHUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T13:23:54.897792", + "end_time": "2026-06-04T13:32:57.156848", + "duration_sec": 542.2504816055298, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_ETHUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_US30_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T13:33:01.762678", + "end_time": "2026-06-04T13:35:45.868651", + "duration_sec": 164.10358428955078, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_US30_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_US30_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T13:35:50.449599", + "end_time": "2026-06-04T13:38:34.530955", + "duration_sec": 164.0743854045868, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_US30_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_US30_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T13:38:39.075888", + "end_time": "2026-06-04T13:41:25.206061", + "duration_sec": 166.1235191822052, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_US30_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_US500_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T13:41:29.765983", + "end_time": "2026-06-04T13:43:25.824573", + "duration_sec": 116.05732226371765, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_US500_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_US500_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T13:43:30.389527", + "end_time": "2026-06-04T13:45:24.455673", + "duration_sec": 114.05792188644409, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_US500_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_US500_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T13:45:28.982973", + "end_time": "2026-06-04T13:47:27.051316", + "duration_sec": 118.0600528717041, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_US500_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_USTEC_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T13:47:31.568523", + "end_time": "2026-06-04T13:53:01.701274", + "duration_sec": 330.1276042461395, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_USTEC_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_USTEC_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T13:53:06.252668", + "end_time": "2026-06-04T13:58:42.381083", + "duration_sec": 336.1231336593628, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_USTEC_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldFlowProfile_USTEC_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T13:58:46.986537", + "end_time": "2026-06-04T14:04:19.097452", + "duration_sec": 332.1057813167572, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldFlowProfile_USTEC_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:04:23.627603", + "end_time": "2026-06-04T14:05:01.668742", + "duration_sec": 38.03560209274292, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:05:06.019482", + "end_time": "2026-06-04T14:05:44.086698", + "duration_sec": 38.063140869140625, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:05:48.398284", + "end_time": "2026-06-04T14:06:26.442263", + "duration_sec": 38.036192655563354, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:06:30.872579", + "end_time": "2026-06-04T14:07:16.903771", + "duration_sec": 46.02564978599548, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_GBPUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:07:21.312910", + "end_time": "2026-06-04T14:08:13.373946", + "duration_sec": 52.05035066604614, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_GBPUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:08:17.802379", + "end_time": "2026-06-04T14:09:03.848536", + "duration_sec": 46.04272985458374, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:09:08.253956", + "end_time": "2026-06-04T14:10:00.288743", + "duration_sec": 52.031758069992065, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_USDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:10:04.662757", + "end_time": "2026-06-04T14:10:54.711424", + "duration_sec": 50.040539026260376, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_USDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:10:59.151688", + "end_time": "2026-06-04T14:11:49.193476", + "duration_sec": 50.034608125686646, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_USDCAD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:11:53.737877", + "end_time": "2026-06-04T14:12:27.781598", + "duration_sec": 34.03427743911743, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_USDCAD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_USDCAD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:12:32.146398", + "end_time": "2026-06-04T14:13:06.188275", + "duration_sec": 34.03115725517273, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_USDCAD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_USDCAD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:13:10.517409", + "end_time": "2026-06-04T14:13:44.546245", + "duration_sec": 34.02280282974243, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_USDCAD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_USDCHF_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:13:48.812368", + "end_time": "2026-06-04T14:14:24.848545", + "duration_sec": 36.03331899642944, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_USDCHF_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_USDCHF_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:14:29.298017", + "end_time": "2026-06-04T14:15:03.337640", + "duration_sec": 34.033995628356934, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_USDCHF_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_USDCHF_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:15:07.795133", + "end_time": "2026-06-04T14:15:43.840237", + "duration_sec": 36.03911232948303, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_USDCHF_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_AUDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:15:48.262228", + "end_time": "2026-06-04T14:16:28.309079", + "duration_sec": 40.042067766189575, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_AUDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_AUDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:16:32.810499", + "end_time": "2026-06-04T14:17:12.872580", + "duration_sec": 40.03716230392456, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_AUDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_AUDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:17:17.301067", + "end_time": "2026-06-04T14:17:57.349675", + "duration_sec": 40.036070108413696, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_AUDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_NZDUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:18:01.782183", + "end_time": "2026-06-04T14:18:39.827060", + "duration_sec": 38.03878307342529, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_NZDUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_NZDUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:18:44.276883", + "end_time": "2026-06-04T14:19:20.312264", + "duration_sec": 36.03202033042908, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_NZDUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_NZDUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:19:24.669879", + "end_time": "2026-06-04T14:20:00.745028", + "duration_sec": 36.06863451004028, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_NZDUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURGBP_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:20:05.159060", + "end_time": "2026-06-04T14:20:47.228643", + "duration_sec": 42.063395500183105, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURGBP_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURGBP_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:20:51.727456", + "end_time": "2026-06-04T14:21:31.773327", + "duration_sec": 40.040823459625244, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURGBP_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURGBP_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:21:36.134910", + "end_time": "2026-06-04T14:22:16.163472", + "duration_sec": 40.02265024185181, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURGBP_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:22:20.565594", + "end_time": "2026-06-04T14:23:36.615186", + "duration_sec": 76.04566287994385, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:23:41.200613", + "end_time": "2026-06-04T14:24:57.299644", + "duration_sec": 76.08945369720459, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:25:01.734907", + "end_time": "2026-06-04T14:26:17.832722", + "duration_sec": 76.0918219089508, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_GBPJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:26:22.234154", + "end_time": "2026-06-04T14:27:42.315872", + "duration_sec": 80.07646536827087, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_GBPJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_GBPJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:27:46.716420", + "end_time": "2026-06-04T14:29:04.809943", + "duration_sec": 78.08781433105469, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_GBPJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_GBPJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:29:09.245077", + "end_time": "2026-06-04T14:30:29.337812", + "duration_sec": 80.08877348899841, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_GBPJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_AUDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:30:33.735740", + "end_time": "2026-06-04T14:31:53.786855", + "duration_sec": 80.04163932800293, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_AUDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_AUDJPY_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:31:58.400408", + "end_time": "2026-06-04T14:33:14.461853", + "duration_sec": 76.05142450332642, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_AUDJPY_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_AUDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:33:18.884743", + "end_time": "2026-06-04T14:34:34.952360", + "duration_sec": 76.05954813957214, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_AUDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:34:39.383965", + "end_time": "2026-06-04T14:35:45.427343", + "duration_sec": 66.0377550125122, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:35:49.806233", + "end_time": "2026-06-04T14:36:53.894470", + "duration_sec": 64.08381748199463, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:36:58.426095", + "end_time": "2026-06-04T14:38:06.466667", + "duration_sec": 68.0365161895752, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_GBPAUD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:38:10.916781", + "end_time": "2026-06-04T14:39:24.973224", + "duration_sec": 74.05150890350342, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_GBPAUD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_GBPAUD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:39:29.434894", + "end_time": "2026-06-04T14:40:41.489709", + "duration_sec": 72.04970169067383, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_GBPAUD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_GBPAUD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:40:45.848613", + "end_time": "2026-06-04T14:42:07.889807", + "duration_sec": 82.03874087333679, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_GBPAUD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:42:12.366314", + "end_time": "2026-06-04T14:44:06.455825", + "duration_sec": 114.08002758026123, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:44:10.926060", + "end_time": "2026-06-04T14:46:05.040195", + "duration_sec": 114.10659885406494, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_XAUUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:46:09.602487", + "end_time": "2026-06-04T14:48:03.667600", + "duration_sec": 114.06010293960571, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_XAGUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:48:08.281143", + "end_time": "2026-06-04T14:49:30.359234", + "duration_sec": 82.06394958496094, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_XAGUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_XAGUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:49:34.849611", + "end_time": "2026-06-04T14:50:56.898081", + "duration_sec": 82.04384684562683, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_XAGUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_XAGUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:51:01.262437", + "end_time": "2026-06-04T14:52:23.321586", + "duration_sec": 82.05345392227173, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_XAGUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_BTCUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:52:27.701145", + "end_time": "2026-06-04T14:59:51.932600", + "duration_sec": 444.2263629436493, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_BTCUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_BTCUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T14:59:56.404721", + "end_time": "2026-06-04T15:08:20.677484", + "duration_sec": 504.2602849006653, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_BTCUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_BTCUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T15:08:25.354532", + "end_time": "2026-06-04T15:17:01.644567", + "duration_sec": 516.2840542793274, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_BTCUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_ETHUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T15:17:06.166375", + "end_time": "2026-06-04T15:20:28.295243", + "duration_sec": 202.12395763397217, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_ETHUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_ETHUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T15:20:32.937773", + "end_time": "2026-06-04T15:20:50.975349", + "duration_sec": 18.031973600387573, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_ETHUSD_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_ETHUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T15:20:55.443194", + "end_time": "2026-06-04T15:21:09.488952", + "duration_sec": 14.039612770080566, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_ETHUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_US30_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T15:21:13.967598", + "end_time": "2026-06-04T15:23:16.061653", + "duration_sec": 122.08701968193054, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_US30_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_US30_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T15:23:20.724300", + "end_time": "2026-06-04T15:26:04.825107", + "duration_sec": 164.09626293182373, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_US30_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_US30_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T15:26:09.482594", + "end_time": "2026-06-04T15:28:05.576529", + "duration_sec": 116.08684825897217, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_US30_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_US500_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T15:28:10.274842", + "end_time": "2026-06-04T15:28:38.328480", + "duration_sec": 28.04609990119934, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_US500_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_US500_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T15:28:42.713732", + "end_time": "2026-06-04T15:29:02.751717", + "duration_sec": 20.031883001327515, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_US500_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_US500_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T15:29:07.175837", + "end_time": "2026-06-04T15:29:21.215409", + "duration_sec": 14.035344123840332, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_US500_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_USTEC_M1_default.ini", + "status": "completed", + "start_time": "2026-06-04T15:29:25.723355", + "end_time": "2026-06-04T15:29:43.766638", + "duration_sec": 18.039904594421387, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_USTEC_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_USTEC_M5_default.ini", + "status": "completed", + "start_time": "2026-06-04T15:29:48.254232", + "end_time": "2026-06-04T15:30:06.306245", + "duration_sec": 18.043821811676025, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_USTEC_M5_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_USTEC_H1_default.ini", + "status": "completed", + "start_time": "2026-06-04T15:30:10.832023", + "end_time": "2026-06-04T15:30:28.892563", + "duration_sec": 18.054497480392456, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_USTEC_H1_default.htm", + "error": null + }, + { + "ini_file": "_EA_CorrelationHedge_EA_EURUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-06-07T18:31:29.663491", + "end_time": "2026-06-07T18:31:33.683209", + "duration_sec": 4.0197179317474365, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEA_EURUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-06-07T18:31:38.113183", + "end_time": "2026-06-07T18:31:42.142293", + "duration_sec": 4.026554346084595, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_CorrelationHedge_EA_EURUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-06-07T18:33:00.666578", + "end_time": "2026-06-07T18:33:04.692067", + "duration_sec": 4.02446722984314, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "_EA_MultiConfluenceEA_EURUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-06-07T18:33:09.231965", + "end_time": "2026-06-07T18:33:13.258677", + "duration_sec": 4.0256874561309814, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "FG_ScalpingPro_EA_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-07T18:34:50.502083", + "end_time": "2026-06-07T18:34:58.551257", + "duration_sec": 8.043393611907959, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\FG_ScalpingPro_EA_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-07T20:19:11.616483", + "end_time": "2026-06-07T20:19:21.638879", + "duration_sec": 10.019647121429443, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_EURUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-07T20:19:26.197102", + "end_time": "2026-06-07T20:19:34.225804", + "duration_sec": 8.023231744766235, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_EURUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_GBPUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-07T20:19:38.582127", + "end_time": "2026-06-07T20:19:44.625221", + "duration_sec": 6.034843444824219, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_GBPUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_GBPUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-07T20:19:49.068439", + "end_time": "2026-06-07T20:19:55.097608", + "duration_sec": 6.023593902587891, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_GBPUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_USDJPY_M1_default.ini", + "status": "completed", + "start_time": "2026-06-07T20:19:59.512762", + "end_time": "2026-06-07T20:20:05.551312", + "duration_sec": 6.032845497131348, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_USDJPY_M1_default.htm", + "error": null + }, + { + "ini_file": "GoldScalperPro_USDJPY_H1_default.ini", + "status": "completed", + "start_time": "2026-06-07T20:20:09.909832", + "end_time": "2026-06-07T20:20:15.965346", + "duration_sec": 6.05070948600769, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\GoldScalperPro_USDJPY_H1_default.htm", + "error": null + }, + { + "ini_file": "The Gold Reaper MT5_4.3_fix_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-06-12T23:55:50.067745", + "end_time": "2026-06-13T00:25:51.611278", + "duration_sec": 1801.5383846759796, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "The Gold Reaper MT5_4.3_fix_XAUUSD_M1_default.ini", + "status": "failed", + "start_time": "2026-06-13T00:35:18.239718", + "end_time": "2026-06-13T01:05:19.069898", + "duration_sec": 1800.8301799297333, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "The Gold Reaper MT5_4.3_fix_XAUUSD_M15_default.ini", + "status": "failed", + "start_time": "2026-06-13T01:05:23.919157", + "end_time": "2026-06-13T01:35:24.760659", + "duration_sec": 1800.8415019512177, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "The Gold Reaper MT5_4.3_fix_XAUUSD_H1_default.ini", + "status": "failed", + "start_time": "2026-06-13T01:35:29.614109", + "end_time": "2026-06-13T02:05:30.306866", + "duration_sec": 1800.6912739276886, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "The Gold Reaper MT5_4.3_fix_XAUUSD_M1_default.ini", + "status": "completed", + "start_time": "2026-06-13T03:10:54.134191", + "end_time": "2026-06-13T03:11:10.169268", + "duration_sec": 16.029616594314575, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\The Gold Reaper MT5_4.3_fix_XAUUSD_M1_default.htm", + "error": null + }, + { + "ini_file": "The Gold Reaper MT5_4.3_fix_XAUUSD_M15_default.ini", + "status": "completed", + "start_time": "2026-06-13T03:11:14.835934", + "end_time": "2026-06-13T03:11:28.874931", + "duration_sec": 14.034974575042725, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\The Gold Reaper MT5_4.3_fix_XAUUSD_M15_default.htm", + "error": null + }, + { + "ini_file": "The Gold Reaper MT5_4.3_fix_XAUUSD_H1_default.ini", + "status": "completed", + "start_time": "2026-06-13T03:11:33.365802", + "end_time": "2026-06-13T03:11:47.394602", + "duration_sec": 14.02658200263977, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\The Gold Reaper MT5_4.3_fix_XAUUSD_H1_default.htm", + "error": null + }, + { + "ini_file": "The Gold Reaper MT5_4.3_fix_XAUUSD_M5_default.ini", + "status": "failed", + "start_time": "2026-06-13T03:30:25.169894", + "end_time": "2026-06-13T03:31:25.236940", + "duration_sec": 60.064802169799805, + "report_found": false, + "report_path": null, + "error": null + }, + { + "ini_file": "The Gold Reaper MT5_4.3_fix_XAUUSD_M5_default.ini", + "status": "completed", + "start_time": "2026-06-13T03:35:15.574488", + "end_time": "2026-06-13T07:59:14.849937", + "duration_sec": 15839.265969991684, + "report_found": true, + "report_path": "C:\\Users\\Administrator\\Desktop\\mt5_backtest\\reports\\The Gold Reaper MT5_4.3_fix_XAUUSD_M5_default.htm", + "error": null + } +] \ No newline at end of file diff --git a/dist/README.md b/dist/README.md new file mode 100644 index 0000000..5b31120 --- /dev/null +++ b/dist/README.md @@ -0,0 +1,29 @@ +# dist/ +本目录存放**离线安装用**的 Python wheel 包。 +配合 `offline_install.bat` 在没有 PyPI 网络的机器上安装依赖。 + +## 用法 +1. 把整个 `dist/` 目录拷到目标机器(与 `offline_install.bat` 同级) +2. 目标机器上需先安装 **Python 3.12.x**(wheel 是 cp312 编译的,其它版本不通用) +3. 双击运行 `offline_install.bat` + +## 包含的包(仅本项目实际用到) + +| 包 | 用途 | +| ---------------- | --------------------------------- | +| MetaTrader5 | MT5 官方 Python 绑定 | +| pandas | 回测报告数据处理 | +| pyyaml | `config/ea_configs.yaml` 解析 | +| openpyxl | 导出 Excel 报告 | +| beautifulsoup4 | 解析 MT5 HTML 报告 | +| numpy | pandas/MetaTrader5 依赖 | +| python-dateutil | pandas 依赖 | +| six | python-dateutil 依赖 | +| soupsieve | beautifulsoup4 依赖 | +| typing-extensions| beautifulsoup4 依赖 | +| et-xmlfile | openpyxl 依赖 | +| tzdata | pandas 时区数据 | + +> 共 12 个 wheel,本机 `pip download -d dist` 打包约 23 MB。 +> 如果 `dist/` 体积过大,需要按需精简可只保留: +> `metatrader5 / pandas / pyyaml / openpyxl / beautifulsoup4 / numpy / python-dateutil / soupsieve / typing-extensions / et-xmlfile / tzdata`(去掉 `six`,新版已可选)。 diff --git a/dist/beautifulsoup4-4.15.0-py3-none-any.whl b/dist/beautifulsoup4-4.15.0-py3-none-any.whl new file mode 100644 index 0000000..a3b6ba3 Binary files /dev/null and b/dist/beautifulsoup4-4.15.0-py3-none-any.whl differ diff --git a/dist/et_xmlfile-2.0.0-py3-none-any.whl b/dist/et_xmlfile-2.0.0-py3-none-any.whl new file mode 100644 index 0000000..52a7eec Binary files /dev/null and b/dist/et_xmlfile-2.0.0-py3-none-any.whl differ diff --git a/dist/metatrader5-5.0.5735-cp312-cp312-win_amd64.whl b/dist/metatrader5-5.0.5735-cp312-cp312-win_amd64.whl new file mode 100644 index 0000000..59e29b3 Binary files /dev/null and b/dist/metatrader5-5.0.5735-cp312-cp312-win_amd64.whl differ diff --git a/dist/numpy-2.5.1-cp312-cp312-win_amd64.whl b/dist/numpy-2.5.1-cp312-cp312-win_amd64.whl new file mode 100644 index 0000000..30b1ce2 Binary files /dev/null and b/dist/numpy-2.5.1-cp312-cp312-win_amd64.whl differ diff --git a/dist/openpyxl-3.1.5-py2.py3-none-any.whl b/dist/openpyxl-3.1.5-py2.py3-none-any.whl new file mode 100644 index 0000000..e1dccd4 Binary files /dev/null and b/dist/openpyxl-3.1.5-py2.py3-none-any.whl differ diff --git a/dist/pandas-3.0.3-cp312-cp312-win_amd64.whl b/dist/pandas-3.0.3-cp312-cp312-win_amd64.whl new file mode 100644 index 0000000..a8b6619 Binary files /dev/null and b/dist/pandas-3.0.3-cp312-cp312-win_amd64.whl differ diff --git a/dist/python_dateutil-2.9.0.post0-py2.py3-none-any.whl b/dist/python_dateutil-2.9.0.post0-py2.py3-none-any.whl new file mode 100644 index 0000000..b9a14e1 Binary files /dev/null and b/dist/python_dateutil-2.9.0.post0-py2.py3-none-any.whl differ diff --git a/dist/pyyaml-6.0.3-cp312-cp312-win_amd64.whl b/dist/pyyaml-6.0.3-cp312-cp312-win_amd64.whl new file mode 100644 index 0000000..6378b65 Binary files /dev/null and b/dist/pyyaml-6.0.3-cp312-cp312-win_amd64.whl differ diff --git a/dist/six-1.17.0-py2.py3-none-any.whl b/dist/six-1.17.0-py2.py3-none-any.whl new file mode 100644 index 0000000..c506fd0 Binary files /dev/null and b/dist/six-1.17.0-py2.py3-none-any.whl differ diff --git a/dist/soupsieve-2.8.4-py3-none-any.whl b/dist/soupsieve-2.8.4-py3-none-any.whl new file mode 100644 index 0000000..6284127 Binary files /dev/null and b/dist/soupsieve-2.8.4-py3-none-any.whl differ diff --git a/dist/typing_extensions-4.16.0-py3-none-any.whl b/dist/typing_extensions-4.16.0-py3-none-any.whl new file mode 100644 index 0000000..9f9aae6 Binary files /dev/null and b/dist/typing_extensions-4.16.0-py3-none-any.whl differ diff --git a/dist/tzdata-2026.2-py2.py3-none-any.whl b/dist/tzdata-2026.2-py2.py3-none-any.whl new file mode 100644 index 0000000..7e03653 Binary files /dev/null and b/dist/tzdata-2026.2-py2.py3-none-any.whl differ diff --git a/docs/MT5_OPTIMIZATION_GUIDE.md b/docs/MT5_OPTIMIZATION_GUIDE.md new file mode 100644 index 0000000..df489a9 --- /dev/null +++ b/docs/MT5_OPTIMIZATION_GUIDE.md @@ -0,0 +1,255 @@ +# MT5 EA 参数优化自动化教程 + +## 概述 + +本教程介绍如何使用Python自动化控制MetaTrader 5 (MT5)的策略测试器进行EA参数优化。 + +## 核心发现 + +### MT5 SET文件格式(关键) + +MT5的SET文件不仅存储参数值,还存储**优化范围和优化标志**。 + +格式:`参数名=当前值||起始值||步长||结束值||优化标志` + +- `Y` = 启用优化(MT5会遍历此参数的start→stop范围) +- `N` = 不优化(使用当前值运行单次回测) + +**示例:** +```ini +TakeProfit=50||30||10||70||Y ; 优化:从30到70,步长10 +Stoploss=1000||1000||100||1000||N ; 不优化:固定1000 +Lots=0.1||0.01||0.01||1.0||Y ; 优化:从0.01到1.0,步长0.01 +``` + +### INI配置文件格式 + +```ini +[Tester] +Expert=MY-EA\\GMarket.ex5 +ExpertParameters=GMarket_optimization.set ; SET文件名(放在MQL5\Profiles\Tester目录) +Symbol=XAUUSD +Period=M1 +Model=0 ; 0=Every Tick, 1=1分钟OHLC, 2=仅开盘价, 3=数学计算, 4=真实Tick +ExecutionMode=-1 ; -1=随机延迟, 0=无延迟, >0=固定延迟(ms) +Optimization=2 ; 0=禁用, 1=慢速完整算法, 2=快速遗传算法 3=Market Watch所有符号 +OptimizationCriterion=1 ; 优化指标 (0-7) +FromDate=2026.01.01 +ToDate=2026.01.04 +ForwardMode=0 ; 0=禁用, 1=1/2期间, 2=1/3期间, 3=1/4期间, 4=自定义 +Deposit=10000 +Currency=USD +Leverage=1:100 +Report=GMarket_optimization ; 报告文件名 +ReplaceReport=true +ShutdownTerminal=true ; 优化完成后关闭MT5 +Visual=0 ; 0=禁用可视化, 1=启用可视化 +``` + +#### 常用参数说明 + +| 参数 | 值 | 说明 | +|------|-----|------| +| Model | 0 | Every Tick(精确) | +| Model | 1 | 1 minute OHLC(快速) | +| Model | 4 | Every tick based on real ticks | +| ExecutionMode | -1 | 随机延迟 | +| ExecutionMode | 0 | 无延迟 | +| ExecutionMode | 200 | 固定200ms延迟 | +| Optimization | 0 | 禁用优化 | +| Optimization | 1 | 慢速完整算法 | +| Optimization | 2 | 快速遗传算法 | + +## 优化指标对照表 + +| 值 | 含义 | +|---|---| +| 0 | 余额最大值 | +| 1 | 盈利因子最大值 | +| 2 | 期望收益最大值 | +| 3 | 回撤最小值 | +| 4 | 恢复因子最大值 | +| 5 | 夏普比率最大值 | +| 6 | 自定义 (OnTester函数) | +| 7 | 复合指标最大值 | + +## 文件位置 + +### SET文件必须放在MT5数据目录 + +``` +C:\Users\<用户名>\AppData\Roaming\MetaQuotes\Terminal\<实例ID>\MQL5\Profiles\Tester\ +``` + +例如: +``` +C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\010E047102812FC0C18890992854220E\MQL5\Profiles\Tester\ +``` + +### INI文件可以放在任意位置 + +通过命令行参数指定: +``` +terminal64.exe /config:C:\path\to\your\config.ini +``` + +## 完整Python示例 + +### 1. 生成SET和INI文件 + +```python +import os +from datetime import datetime + +MT5_TESTER_DIR = r"C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\010E047102812FC0C18890992854220E\MQL5\Profiles\Tester" +MT5_PATH = r"C:\Program Files\MetaTrader 5 IC Markets Global\terminal64.exe" + +def create_optimization_files(ea_name, ea_path, symbol, period, params, date_from, date_to, + model=0, execution_delay=-1, opt_criterion=1, deposit=10000, + leverage='1:100', currency='USD', visual=0): + """ + params格式: + { + 'param_name': { + 'value': 50, # 当前值 + 'start': 30, # 起始值 + 'step': 10, # 步长 + 'stop': 70, # 结束值 + 'optimize': True # 是否优化 + }, + ... + } + + model: 0=EveryTick, 1=1分钟OHLC, 2=仅开盘价, 4=真实Tick + execution_delay: -1=随机延迟, 0=无延迟, >0=固定延迟ms + opt_criterion: 0=余额, 1=盈利因子, 2=期望收益, 3=回撤, 4=恢复因子, 5=夏普比率, 7=复合指标 + """ + set_filename = f"{ea_name}_optimization.set" + set_path = os.path.join(MT5_TESTER_DIR, set_filename) + + # 生成SET文件 + set_lines = [ + '; saved automatically', + f'; {datetime.now()}', + '', + ] + for name, spec in params.items(): + flag = 'Y' if spec.get('optimize', False) else 'N' + v = spec['value'] + s = spec['start'] + step = spec['step'] + st = spec['stop'] + set_lines.append(f"{name}={v}||{s}||{step}||{st}||{flag}") + + with open(set_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(set_lines)) + + # 生成INI文件 + ini_path = os.path.join(MT5_TESTER_DIR, f"{ea_name}_{symbol}_{period}_optimization.ini") + ini_content = f"""[Tester] +Expert={ea_path} +ExpertParameters={set_filename} +Symbol={symbol} +Period={period} +Model={model} +ExecutionMode={execution_delay} +Optimization=2 +OptimizationCriterion={opt_criterion} +FromDate={date_from} +ToDate={date_to} +ForwardMode=0 +Deposit={deposit} +Currency={currency} +Leverage={leverage} +Report={ea_name}_optimization +ReplaceReport=true +ShutdownTerminal=true +Visual={visual} +""" + with open(ini_path, 'w', encoding='utf-8') as f: + f.write(ini_content) + + return ini_path, set_path + +def run_optimization(ini_path): + """启动MT5运行优化""" + import subprocess + subprocess.Popen([MT5_PATH, f"/config:{ini_path}"]) +``` + +### 2. 使用示例 + +```python +# 定义要优化的EA参数 +params = { + 'InpTakeProfit': {'value': 50, 'start': 30, 'step': 10, 'stop': 70, 'optimize': True}, + 'InpStopLoss': {'value': 100, 'start': 50, 'step': 25, 'stop': 200, 'optimize': True}, + 'InpLots': {'value': 0.1, 'start': 0.01, 'step': 0.01, 'stop': 1.0, 'optimize': True}, + 'InpMaxSpread': {'value': 3, 'start': 3, 'step': 1, 'stop': 10, 'optimize': False}, # 不优化 +} + +# 生成文件并运行(使用1分钟OHLC模式,200ms延迟) +ini_path, set_path = create_optimization_files( + ea_name='MyEA', + ea_path='MY-EA\\MyEA.ex5', + symbol='XAUUSD', + period='H1', + params=params, + date_from='2026.01.01', + date_to='2026.01.04', + model=1, # 1=1分钟OHLC快速模式 + execution_delay=200, # 200ms固定延迟 + opt_criterion=1, # 1=盈利因子最大化 + deposit=10000, + leverage='1:100' +) + +print(f"INI: {ini_path}") +print(f"SET: {set_path}") + +# 启动MT5优化 +run_optimization(ini_path) +``` + +## 常见问题 + +### Q: "no optimized parameter selected" 错误 + +原因:SET文件中所有参数的优化标志都是`N`。 + +解决:确保需要优化的参数设置为`||Y`。 + +### Q: "check parameter stop" 错误 + +原因:参数范围无效(如start==stop, step==0)。 + +解决:检查SET文件中该参数的值,或将`optimize`设为`False`。 + +### Q: EA文件找不到 + +原因:INI中Expert路径不正确。 + +解决:使用相对于MQL5\Experts目录的路径,如`MY-EA\\GMarket.ex5`。 + +### Q: MT5登录问题 + +原因:使用`/portable`参数会启动新的便携模式实例。 + +解决:不使用`/portable`参数,让MT5使用已登录的配置。 + +## 工作流程总结 + +1. **定义参数范围**:在Python中定义每个参数的value/start/step/stop和optimize标志 +2. **生成SET文件**:格式化后保存到MT5的`MQL5\Profiles\Tester`目录 +3. **生成INI文件**:配置优化参数,引用SET文件 +4. **启动MT5**:`terminal64.exe /config:ini路径` +5. **MT5自动运行优化**:使用遗传算法遍历参数组合 +6. **优化完成后自动关闭**:设置`ShutdownTerminal=true` + +## 注意事项 + +1. SET文件必须放在MT5数据目录的`MQL5\Profiles\Tester`文件夹 +2. INI文件可以放在任意位置,通过`/config:`参数指定 +3. 布尔参数通常不需要优化,设置为`||N` +4. 参数范围要合理,避免步长过大或过小 +5. 优化完成后查看`optimizer\results`目录下的结果文件 \ No newline at end of file diff --git a/extract_filenames.py b/extract_filenames.py new file mode 100644 index 0000000..ba1c181 --- /dev/null +++ b/extract_filenames.py @@ -0,0 +1,68 @@ +import os +from datetime import datetime + +def extract_filenames(): + print("=" * 50) + print("批量提取文件名工具") + print("=" * 50) + + folder_path = input("\n请输入文件夹路径: ").strip() + if not folder_path: + print("文件夹路径不能为空!") + return + + if not os.path.isdir(folder_path): + print(f"错误: 路径 '{folder_path}' 不存在或不是文件夹!") + return + + recursive = input("是否包含子文件夹? (y/n, 默认y): ").strip().lower() + if recursive == 'n': + recursive = False + else: + recursive = True + + output_filename = input("输出文件名 (直接回车使用自动命名): ").strip() + + print(f"\n正在扫描文件夹: {folder_path}") + if recursive: + print("模式: 包含子文件夹 (递归)") + else: + print("模式: 仅当前文件夹") + + print("请稍候...") + + filenames = [] + try: + for root, dirs, files in os.walk(folder_path): + for filename in files: + full_path = os.path.join(root, filename) + rel_path = os.path.relpath(full_path, folder_path) + filenames.append(rel_path) + + if not recursive: + break + + filenames.sort() + + folder_name = os.path.basename(os.path.abspath(folder_path)) + + if output_filename: + output_path = os.path.join(os.path.dirname(os.path.abspath(folder_path)), output_filename) + else: + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + output_filename = f"{folder_name}_filenames_{timestamp}.txt" + output_path = os.path.join(os.path.dirname(os.path.abspath(folder_path)), output_filename) + + with open(output_path, 'w', encoding='utf-8') as f: + for name in filenames: + f.write(name + '\n') + + print(f"\n完成! 共找到 {len(filenames)} 个文件") + print(f"结果已保存到: {output_path}") + + except Exception as e: + print(f"发生错误: {e}") + +if __name__ == "__main__": + extract_filenames() + input("\n按回车键退出...") \ No newline at end of file diff --git a/gui.py b/gui.py new file mode 100644 index 0000000..5c4e708 --- /dev/null +++ b/gui.py @@ -0,0 +1,2130 @@ +import os +import sys +import json +import time +import shutil +import threading +import datetime as _dt_mod +from datetime import datetime +import tkinter as tk +from tkinter import ttk, messagebox, filedialog +import yaml +import subprocess +import ctypes +import ctypes.wintypes + +sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'scripts')) +_IMPORT_ERRORS: list = [] +try: + from mt5_paths import resolve_mt5_settings + from ini_generator import INIGenerator + from mt5_auto_runner import MT5AutoRunner + from result_parser import ResultParser + from report_generator import ReportGenerator +except Exception as _e: + _IMPORT_ERRORS.append(repr(_e)) + sys.stderr.write(f"[IMPORT FAIL] {_e}\n") + resolve_mt5_settings = None # type: ignore + INIGenerator = None # type: ignore + MT5AutoRunner = None # type: ignore + ResultParser = None # type: ignore + ReportGenerator = None # type: ignore + + +def _gui_log(msg: str) -> None: + """输出到 stdout 同时也追加到 logs/gui_run.log。""" + print(f"[gui] {msg}", flush=True) + try: + os.makedirs("logs", exist_ok=True) + with open("logs/gui_run.log", "a", encoding="utf-8") as f: + f.write(f"[{datetime.now().strftime('%H:%M:%S')}] {msg}\n") + except Exception: + pass + + +def _now() -> str: + return datetime.now().strftime('%H:%M:%S') + + +_user32 = ctypes.windll.user32 +_kernel32 = ctypes.windll.kernel32 + +SW_MINIMIZE = 6 +SWP_NOMOVE = 0x0002 +SWP_NOSIZE = 0x0001 +SWP_NOACTIVATE = 0x0010 +SWP_NOZORDER = 0x0004 +SWP_FRAMECHANGED = 0x0020 + +_EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.wintypes.HWND, ctypes.wintypes.LPARAM) + + +def _mt5_startupinfo(): + si = subprocess.STARTUPINFO() + si.dwFlags |= subprocess.STARTF_USESHOWWINDOW + si.wShowWindow = 6 + return si + + +def _find_mt5_hwnds(pid, max_seconds=3.0): + hwnds = [] + deadline = time.time() + max_seconds + while time.time() < deadline and not hwnds: + def cb(hwnd, _lParam): + owner_pid = ctypes.wintypes.DWORD() + _user32.GetWindowThreadProcessId(hwnd, ctypes.byref(owner_pid)) + if owner_pid.value != pid or not _user32.IsWindowVisible(hwnd): + return True + length = _user32.GetWindowTextLengthW(hwnd) + if length <= 0: + hwnds.append(hwnd) + return True + buf = ctypes.create_unicode_buffer(length + 1) + _user32.GetWindowTextW(hwnd, buf, length + 1) + title = buf.value + if "MetaTrader" in title or "Strategy" in title or "Tester" in title: + hwnds.append(hwnd) + return True + _user32.EnumWindows(_EnumWindowsProc(cb), 0) + if not hwnds: + time.sleep(0.2) + return hwnds + + +def _minimize_mt5_windows(pid, max_seconds=20.0): + deadline = time.time() + max_seconds + while time.time() < deadline: + for hwnd in _find_mt5_hwnds(pid, max_seconds=0.5): + _user32.ShowWindow(hwnd, SW_MINIMIZE) + _user32.SetWindowPos( + hwnd, 0, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED, + ) + time.sleep(0.3) + + +def _clear_mt5_chart_workspace(data_dir): + if not data_dir: + return + charts_root = os.path.join(data_dir, "MQL5", "Profiles", "Charts") + if not os.path.isdir(charts_root): + return + for entry in os.listdir(charts_root): + profile_dir = os.path.join(charts_root, entry) + if not os.path.isdir(profile_dir): + continue + for fname in os.listdir(profile_dir): + if fname.startswith("chart") and fname.endswith(".chr"): + try: + os.remove(os.path.join(profile_dir, fname)) + except OSError: + pass + + +def _launch_mt5(mt5_path, ini_path, data_dir): + _clear_mt5_chart_workspace(data_dir) + process = subprocess.Popen( + [mt5_path, "/config:" + os.path.abspath(ini_path)], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + startupinfo=_mt5_startupinfo(), + ) + threading.Thread( + target=_minimize_mt5_windows, args=(process.pid,), daemon=True + ).start() + return process + + +class MT5BacktestGUI: + _CONFIG_FILE = "config/ea_configs.yaml" + + def __init__(self, root): + self.root = root + self.root.title("MT5 EA 批量回测工具") + self.root.geometry("900x2000") + + self.config = self._load_or_default_config() + self.scanned_eas = [] + self.opt_ea_paths = {} + self._scan_eas() + + self._create_widgets() + self._load_config_to_gui() + + def _load_or_default_config(self): + """已保存过配置就读 YAML;第一次用走默认(终端路径留空让用户填)。""" + if os.path.isfile(self._CONFIG_FILE): + try: + with open(self._CONFIG_FILE, "r", encoding="utf-8") as f: + saved = yaml.safe_load(f) or {} + default = self._load_default_config() + # 浅合并:saved 覆盖 default;缺失字段用 default 补全 + for k in ("backtest_settings", "mt5_settings", "execution"): + if k in saved: + default[k].update(saved[k]) + if "eas" in saved: + default["eas"] = saved["eas"] + # 占位符解析(仅做 {PROJECT_ROOT} 展开,无自动探测) + if resolve_mt5_settings: + default["mt5_settings"] = resolve_mt5_settings(default["mt5_settings"]) + _gui_log(f"已加载保存的配置: {self._CONFIG_FILE}") + return default + except Exception as e: + _gui_log(f"读配置失败 ({e}),使用默认") + return self._load_default_config() + + def _load_default_config(self): + return { + "eas": [], + "backtest_settings": { + "symbols": [ + "EURUSD", "GBPUSD", "USDJPY", "USDCHF", "AUDUSD", "USDCAD", "NZDUSD", + "GBPJPY", "EURJPY", "AUDJPY", "EURGBP", "EURAUD", "GBPAUD", + "XAUUSD", "XAGUSD", + "US30", "US500", "USTEC", + "BTCUSD", "ETHUSD" + ], + "timeframes": ["M1", "H1"], + "date_range": {"from": "2026.01.01", "to": "2026.01.04"}, + "model": 0, + "execution_delay": 0, + "deposit": 10000, + "leverage": "1:100", + "currency": "USD", + "visual": 0, + "replace_report": True, + "shutdown_terminal": True, + "optimization": 0, + "forward_mode": 0, + "forward_date": "" + }, + "mt5_settings": (resolve_mt5_settings({ + "terminal_path": "", + "data_dir": "", + "reports_dir": "{PROJECT_ROOT}/reports", + "ini_dir": "{PROJECT_ROOT}/config/generated", + }) if resolve_mt5_settings else { + "terminal_path": "", + "data_dir": "", + "reports_dir": "reports", + "ini_dir": os.path.join("config", "generated"), + }), + "execution": { + "timeout_per_test": 30, + "skip_existing": True, + "kill_between": True + } + } + + def _scan_eas(self): + data_dir = self.config["mt5_settings"]["data_dir"] + experts_dir = os.path.join(data_dir, "MQL5", "Experts") if data_dir else "" + self.scanned_eas = [] + if experts_dir and os.path.exists(experts_dir): + for root, dirs, files in os.walk(experts_dir): + for f in files: + if f.endswith('.ex5'): + rel_path = os.path.relpath(os.path.join(root, f), experts_dir) + self.scanned_eas.append(rel_path) + else: + print(f"[scan] MT5 Experts dir not found: {experts_dir!r} (data_dir={data_dir!r})") + + def _create_widgets(self): + notebook = ttk.Notebook(self.root) + notebook.pack(fill='both', expand=True, padx=5, pady=5) + + tab_basic = ttk.Frame(notebook) + tab_execution = ttk.Frame(notebook) + tab_reports = ttk.Frame(notebook) + tab_optimizer = ttk.Frame(notebook) + notebook.add(tab_basic, text="回测配置") + notebook.add(tab_execution, text="执行选项") + notebook.add(tab_reports, text="报告查看") + notebook.add(tab_optimizer, text="参数优化") + + self._create_basic_tab(tab_basic) + self._create_execution_tab(tab_execution) + self._create_reports_tab(tab_reports) + self._create_optimizer_tab(tab_optimizer) + self.notebook = notebook + + btn_frame = ttk.Frame(self.root) + btn_frame.pack(fill='x', padx=5, pady=5) + + ttk.Button(btn_frame, text="开始回测", command=self._on_start_backtest).pack(side='left', padx=5) + ttk.Button(btn_frame, text="保存配置", command=self._on_save_config).pack(side='left', padx=5) + ttk.Button(btn_frame, text="查看报告", command=self._on_view_reports).pack(side='left', padx=5) + ttk.Button(btn_frame, text="参数优化", command=self._on_start_optimizer).pack(side='left', padx=5) + ttk.Button(btn_frame, text="重新扫描EA", command=self._on_rescan_eas).pack(side='right', padx=5) + + def _create_basic_tab(self, parent): + main_frame = ttk.Frame(parent) + main_frame.pack(fill='both', expand=True) + + ea_frame = ttk.LabelFrame(main_frame, text="EA 选择 (勾选多选)") + ea_frame.pack(fill='x', padx=5, pady=5) + + ttk.Label(ea_frame, text="已扫描到 %d 个EA,勾选需要回测的EA" % len(self.scanned_eas)).pack(anchor='w', padx=5, pady=2) + + search_frame = ttk.Frame(ea_frame) + search_frame.pack(fill='x', padx=5, pady=2) + ttk.Label(search_frame, text="搜索:").pack(side='left', padx=2) + self.ea_search_var = tk.StringVar() + self.ea_search_var.trace('w', lambda *args: self._filter_ea_list()) + ea_search_entry = ttk.Entry(search_frame, textvariable=self.ea_search_var, width=30) + ea_search_entry.pack(side='left', padx=2) + ttk.Button(search_frame, text="清除", command=lambda: self.ea_search_var.set('')).pack(side='left', padx=2) + + container = ttk.Frame(ea_frame) + container.pack(fill='both', expand=True, padx=5, pady=5) + + canvas = tk.Canvas(container, height=120) + canvas.pack(side='left', fill='both', expand=True) + + scrollbar = ttk.Scrollbar(container, orient='vertical', command=canvas.yview) + scrollbar.pack(side='right', fill='y') + canvas['yscrollcommand'] = scrollbar.set + + cb_window = tk.Frame(canvas) + canvas.create_window((0, 0), window=cb_window, anchor='nw') + + self.ea_vars = {} + self.ea_cbs = {} + self._rebuild_ea_checkboxes(cb_window, canvas) + + cb_window.update_idletasks() + canvas.configure(scrollregion=canvas.bbox("all")) + + def on_mousewheel(event): + canvas.yview_scroll(int(-1 * (event.delta / 120)), "units") + canvas.bind("", on_mousewheel) + + btn_frame = ttk.Frame(ea_frame) + btn_frame.pack(anchor='w', padx=5, pady=2) + ttk.Button(btn_frame, text="全选", command=self._select_all_eas).pack(side='left', padx=2) + ttk.Button(btn_frame, text="取消", command=self._deselect_all_eas).pack(side='left', padx=2) + ttk.Button(btn_frame, text="反选", command=self._invert_eas).pack(side='left', padx=2) + + self._ea_canvas = canvas + self._ea_cb_window = cb_window + + sym_frame = ttk.LabelFrame(main_frame, text="交易品种") + sym_frame.pack(fill='x', padx=5, pady=5) + + self.symbol_vars = {} + for i, sym in enumerate([ + "EURUSD", "GBPUSD", "USDJPY", "USDCAD", "USDCHF", "AUDUSD", "NZDUSD", + "EURGBP", "EURJPY", "GBPJPY", "EURCHF", "AUDJPY", "EURAUD", "GBPAUD", + "EURCAD", "GBPCAD", "NZDJPY", "AUDCAD", "CADJPY", "CHFJPY", + "AUDCHF", "CADCHF", "NZDCHF", "XAUUSD", "XAGUSD", "XBRUSD", "XTIUSD", + "XNGUSD", "BTCUSD", "ETHUSD", "LTCUSD", + "USDCNH", "USDHKD", "USDCZK", "USDDKK", "USDHUF", "USDMXN", "USDPLN", + "USDTHB", "NOKJPY", "SEKJPY", "XRPUSD", "XLMUSD", + "AUS200", "CHINA50", "ES35", "STOXX50", "F40", "HK50", "IT40", "JP225", + "UK100", "US2000", "US30", "US500", "USTEC", "CA60", "NETH25", "SE30", + "SWI20", "CHINAH", "NOR25", "TecDE30" + ]): + var = tk.BooleanVar(value=sym in self.config["backtest_settings"]["symbols"]) + cb = ttk.Checkbutton(sym_frame, text=sym, variable=var) + cb.grid(row=i//10, column=i%10, sticky='w', padx=2, pady=1) + self.symbol_vars[sym] = var + + tf_frame = ttk.LabelFrame(main_frame, text="时间周期") + tf_frame.pack(fill='x', padx=5, pady=5) + + self.tf_vars = {} + for i, tf in enumerate(["M1", "M5", "M15", "M30", "H1", "H4", "D1", "W1"]): + var = tk.BooleanVar(value=tf in self.config["backtest_settings"]["timeframes"]) + cb = ttk.Checkbutton(tf_frame, text=tf, variable=var) + cb.grid(row=0, column=i, padx=3, pady=2) + self.tf_vars[tf] = var + + date_model_frame = ttk.Frame(main_frame) + date_model_frame.pack(fill='x', padx=5, pady=5) + + date_frame = ttk.LabelFrame(date_model_frame, text="回测日期") + date_frame.pack(side='left', fill='x', padx=5) + + ttk.Label(date_frame, text="开始:").grid(row=0, column=0, sticky='w', padx=5) + self.from_date = ttk.Entry(date_frame, width=12) + self.from_date.insert(0, self.config["backtest_settings"]["date_range"]["from"]) + self.from_date.grid(row=0, column=1, padx=5) + + ttk.Label(date_frame, text="结束:").grid(row=0, column=2, sticky='w', padx=5) + self.to_date = ttk.Entry(date_frame, width=12) + self.to_date.insert(0, self.config["backtest_settings"]["date_range"]["to"]) + self.to_date.grid(row=0, column=3, padx=5) + + forward_frame = ttk.LabelFrame(date_model_frame, text="Forward 前向测试") + forward_frame.pack(side='left', fill='x', padx=5) + + self.forward_var = tk.StringVar(value="No") + forward_values = ["No", "1/2", "1/3", "1/4", "Custom"] + ttk.Radiobutton(forward_frame, text="无 (No)", variable=self.forward_var, value="No").pack(anchor='w', padx=2) + ttk.Radiobutton(forward_frame, text="1/2", variable=self.forward_var, value="1/2").pack(anchor='w', padx=2) + ttk.Radiobutton(forward_frame, text="1/3", variable=self.forward_var, value="1/3").pack(anchor='w', padx=2) + ttk.Radiobutton(forward_frame, text="1/4", variable=self.forward_var, value="1/4").pack(anchor='w', padx=2) + + custom_row = ttk.Frame(forward_frame) + custom_row.pack(fill='x', padx=2, pady=2) + ttk.Radiobutton(custom_row, text="自定义:", variable=self.forward_var, value="Custom").pack(side='left', padx=2) + self.forward_custom_date = ttk.Entry(custom_row, width=12) + self.forward_custom_date.insert(0, self.config["backtest_settings"].get("forward_date", "")) + self.forward_custom_date.pack(side='left', padx=2) + ttk.Label(custom_row, text="(日期)").pack(side='left') + + model_frame = ttk.LabelFrame(date_model_frame, text="回测模式") + model_frame.pack(side='left', fill='x', padx=5) + + self.model_var = tk.IntVar(value=self.config["backtest_settings"]["model"]) + ttk.Radiobutton(model_frame, text="Every Tick (0)", variable=self.model_var, value=0).pack(anchor='w', padx=2) + ttk.Radiobutton(model_frame, text="1分钟OHLC (1)", variable=self.model_var, value=1).pack(anchor='w', padx=2) + ttk.Radiobutton(model_frame, text="真实Tick (4)", variable=self.model_var, value=4).pack(anchor='w', padx=2) + + delay_frame = ttk.LabelFrame(date_model_frame, text="执行延迟") + delay_frame.pack(side='left', fill='x', padx=5) + + self.delay_type = tk.IntVar(value=0) + ttk.Radiobutton(delay_frame, text="无延迟 (0)", variable=self.delay_type, value=0).pack(anchor='w', padx=2) + ttk.Radiobutton(delay_frame, text="随机延迟 (-1)", variable=self.delay_type, value=1).pack(anchor='w', padx=2) + delay_row = ttk.Frame(delay_frame) + delay_row.pack() + ttk.Radiobutton(delay_row, text="固定延迟:", variable=self.delay_type, value=2).pack(side='left', padx=2) + self.delay_value = ttk.Entry(delay_row, width=6) + self.delay_value.insert(0, "100") + self.delay_value.pack(side='left') + ttk.Label(delay_row, text="ms").pack(side='left') + + acct_frame = ttk.LabelFrame(date_model_frame, text="账户") + acct_frame.pack(side='left', fill='x', padx=5) + + ttk.Label(acct_frame, text="保证金:").pack(side='left', padx=2) + self.deposit = ttk.Entry(acct_frame, width=10) + self.deposit.insert(0, str(self.config["backtest_settings"]["deposit"])) + self.deposit.pack(side='left', padx=2) + ttk.Label(acct_frame, text="杠杆:").pack(side='left', padx=2) + self.leverage = ttk.Combobox(acct_frame, width=8, values=["1:10", "1:50", "1:100", "1:200", "1:500"]) + self.leverage.set(self.config["backtest_settings"]["leverage"]) + self.leverage.pack(side='left', padx=2) + ttk.Button(acct_frame, text="开始回测", command=self._on_start_backtest).pack(side='left', padx=5) + + def _create_execution_tab(self, parent): + exec_frame = ttk.LabelFrame(parent, text="执行设置") + exec_frame.pack(fill='x', padx=5, pady=10) + + ttk.Label(exec_frame, text="超时(分钟):").grid(row=0, column=0, sticky='w', padx=5, pady=3) + self.timeout = ttk.Entry(exec_frame, width=8) + self.timeout.insert(0, str(self.config["execution"]["timeout_per_test"])) + self.timeout.grid(row=0, column=1, sticky='w', padx=5, pady=3) + + self.skip_var = tk.BooleanVar(value=self.config["execution"]["skip_existing"]) + ttk.Checkbutton(exec_frame, text="跳过已完成的测试", variable=self.skip_var).grid(row=1, column=0, columnspan=2, sticky='w', padx=5, pady=3) + + self.kill_var = tk.BooleanVar(value=self.config["execution"]["kill_between"]) + ttk.Checkbutton(exec_frame, text="测试间关闭MT5进程", variable=self.kill_var).grid(row=2, column=0, columnspan=2, sticky='w', padx=5, pady=3) + + self.visual_var = tk.BooleanVar(value=self.config["backtest_settings"]["visual"] == 1) + ttk.Checkbutton(exec_frame, text="可视化模式(慢)", variable=self.visual_var).grid(row=3, column=0, columnspan=2, sticky='w', padx=5, pady=3) + + path_frame = ttk.LabelFrame(parent, text="路径设置") + path_frame.pack(fill='x', padx=5, pady=10) + + ttk.Label(path_frame, text="MT5终端 (terminal64.exe):").grid(row=0, column=0, sticky='w', padx=5, pady=3) + self.mt5_path = ttk.Entry(path_frame, width=50) + self.mt5_path.insert(0, self.config["mt5_settings"].get("terminal_path", "")) + self.mt5_path.grid(row=0, column=1, padx=5, pady=3, sticky='ew') + ttk.Button(path_frame, text="浏览...", command=self._browse_mt5).grid(row=0, column=2, padx=5) + + ttk.Label(path_frame, text="MT5数据目录 (含 MQL5/Experts 的那一层):").grid(row=1, column=0, sticky='w', padx=5, pady=3) + self.data_dir = ttk.Entry(path_frame, width=50) + self.data_dir.insert(0, self.config["mt5_settings"].get("data_dir", "")) + self.data_dir.grid(row=1, column=1, padx=5, pady=3, sticky='ew') + ttk.Button(path_frame, text="浏览...", command=self._browse_data).grid(row=1, column=2, padx=5) + + ttk.Label(path_frame, text="报告输出目录:").grid(row=2, column=0, sticky='w', padx=5, pady=3) + self.reports_dir = ttk.Entry(path_frame, width=50) + self.reports_dir.insert(0, self.config["mt5_settings"].get("reports_dir", "")) + self.reports_dir.grid(row=2, column=1, padx=5, pady=3, sticky='ew') + ttk.Button(path_frame, text="浏览...", command=self._browse_reports).grid(row=2, column=2, padx=5) + + path_hint = ttk.Label(path_frame, + text="提示: 数据目录 = File → 打开数据文件夹 (MT5 菜单里),里面要能看见 MQL5\\Experts 文件夹", + foreground='gray') + path_hint.grid(row=3, column=0, columnspan=3, sticky='w', padx=5, pady=(5, 0)) + + def _browse_mt5(self): + path = filedialog.askopenfilename( + title="选择 terminal64.exe", + filetypes=[("MT5 终端", "terminal64.exe"), ("所有文件", "*.*")], + initialdir=os.path.dirname(self.mt5_path.get()) if self.mt5_path.get() else None, + ) + if path: + self.mt5_path.delete(0, tk.END) + self.mt5_path.insert(0, path) + + def _browse_reports(self): + path = filedialog.askdirectory(initialdir=self.reports_dir.get()) + if path: + self.reports_dir.delete(0, tk.END) + self.reports_dir.insert(0, path) + + def _browse_data(self): + path = filedialog.askdirectory(initialdir=self.data_dir.get()) + if path: + self.data_dir.delete(0, tk.END) + self.data_dir.insert(0, path) + + def _select_all_eas(self): + for var in self.ea_vars.values(): + var.set(True) + + def _deselect_all_eas(self): + for var in self.ea_vars.values(): + var.set(False) + + def _invert_eas(self): + for var in self.ea_vars.values(): + var.set(not var.get()) + + def _rebuild_ea_checkboxes(self, cb_window, canvas): + for widget in cb_window.winfo_children(): + widget.destroy() + + search_text = self.ea_search_var.get().lower() + filtered_eas = [ea for ea in self.scanned_eas if search_text in os.path.basename(ea).lower()] + + self.ea_vars = {} + for i, ea in enumerate(filtered_eas): + var = tk.BooleanVar(value=False) + if ea in getattr(self, '_previous_ea_states', {}): + var.set(self._previous_ea_states[ea]) + cb = ttk.Checkbutton(cb_window, text=os.path.basename(ea), variable=var) + cb.grid(row=i // 4, column=i % 4, sticky='w', padx=5, pady=1) + self.ea_vars[ea] = var + + cb_window.update_idletasks() + if hasattr(self, '_ea_canvas'): + self._ea_canvas.configure(scrollregion=self._ea_canvas.bbox("all")) + + def _filter_ea_list(self): + self._previous_ea_states = {ea: var.get() for ea, var in self.ea_vars.items()} + if hasattr(self, '_ea_cb_window') and hasattr(self, '_ea_canvas'): + self._rebuild_ea_checkboxes(self._ea_cb_window, self._ea_canvas) + + def _get_selected_eas(self): + selected = [] + for ea, var in self.ea_vars.items(): + if var.get(): + ea_name = os.path.splitext(os.path.basename(ea))[0] + selected.append({"name": ea_name, "filename": ea}) + return selected + + def _on_rescan_eas(self): + self._scan_eas() + for ea, cb in list(self.ea_vars.items())[:]: + if ea not in self.scanned_eas: + del self.ea_vars[ea] + for i, ea in enumerate(self.scanned_eas): + if ea not in self.ea_vars: + var = tk.BooleanVar(value=False) + self.ea_vars[ea] = var + messagebox.showinfo("扫描完成", "扫描到 %d 个EA文件" % len(self.scanned_eas)) + + def _load_config_to_gui(self): + pass + + def _get_config(self): + symbols = [s for s, v in self.symbol_vars.items() if v.get()] + timeframes = [t for t, v in self.tf_vars.items() if v.get()] + + delay = self.delay_type.get() + if delay == 0: + execution_delay = 0 + elif delay == 1: + execution_delay = -1 + else: + try: + execution_delay = int(self.delay_value.get()) + except: + execution_delay = 0 + + forward = self.forward_var.get() + forward_mode_map = {"No": 0, "1/2": 1, "1/3": 2, "1/4": 3, "Custom": 4} + forward_mode = forward_mode_map.get(forward, 0) + forward_date = self.forward_custom_date.get() if forward == "Custom" else "" + + return { + "eas": self._get_selected_eas(), + "backtest_settings": { + "symbols": symbols, + "timeframes": timeframes, + "date_range": {"from": self.from_date.get(), "to": self.to_date.get()}, + "model": self.model_var.get(), + "execution_delay": execution_delay, + "deposit": float(self.deposit.get()), + "leverage": self.leverage.get(), + "currency": "USD", + "visual": 1 if self.visual_var.get() else 0, + "replace_report": True, + "shutdown_terminal": True, + "optimization": 0, + "forward_mode": forward_mode, + "forward_date": forward_date + }, + "mt5_settings": { + "terminal_path": self.mt5_path.get(), + "data_dir": self.data_dir.get(), + "reports_dir": self.reports_dir.get(), + "ini_dir": os.path.join(os.path.dirname(self.reports_dir.get()), "config", "generated"), + }, + "execution": { + "timeout_per_test": int(self.timeout.get()), + "skip_existing": self.skip_var.get(), + "kill_between": self.kill_var.get() + } + } + + def _on_save_config(self): + config = self._get_config() + os.makedirs("config", exist_ok=True) + with open("config/ea_configs.yaml", 'w', encoding='utf-8') as f: + yaml.dump(config, f, allow_unicode=True) + messagebox.showinfo("保存成功", "配置已保存到 config/ea_configs.yaml") + + def _on_start_backtest(self): + _gui_log("开始回测 button clicked") + if _IMPORT_ERRORS: + _gui_log(f"导入错误: {_IMPORT_ERRORS}") + messagebox.showerror("依赖缺失", f"导入失败: {_IMPORT_ERRORS[0]}\n请运行 pip install -r requirements.txt") + return + if not all([INIGenerator, MT5AutoRunner, ResultParser, ReportGenerator]): + messagebox.showerror("依赖缺失", "模块为 None(导入被吞)") + return + + config = self._get_config() + _gui_log(f"config keys: {list(config.keys())}, eas={len(config.get('eas',[]))}, sym={len(config['backtest_settings']['symbols'])}, tf={len(config['backtest_settings']['timeframes'])}") + + if not config["eas"]: + messagebox.showerror("错误", "请选择至少一个EA文件"); return + if not config["backtest_settings"]["symbols"]: + messagebox.showerror("错误", "请选择至少一个交易品种"); return + if not config["backtest_settings"]["timeframes"]: + messagebox.showerror("错误", "请选择至少一个时间周期"); return + + os.makedirs("logs", exist_ok=True) + + def _log(msg): + self.opt_log.insert('end', msg + "\n") + self.opt_log.see('end') + _gui_log(msg) + + def _run(): + try: + _log("=== 开始回测 ===") + generator = INIGenerator(config) + _log(f" INIGenerator OK, output_dir={generator.output_dir}") + ini_files = generator.generate_ini_files() + _log(f" 生成 INI: {len(ini_files)} 个") + + if not ini_files: + _log(" [ERR] 未生成任何 INI — 检查 EA 路径与 MT5 Experts 目录") + return + + runner = MT5AutoRunner(config) + reports_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "reports") + os.makedirs(reports_dir, exist_ok=True) + runner.reports_dir = reports_dir + _log(f" mt5_path={runner.mt5_path}") + _log(f" data_dir={runner.data_dir}") + _log(f" reports_dir={runner.reports_dir}") + _log(" 开始调用 MT5...(每个 EA/Symbol/TF 组合会启动一次 MT5 子进程,耐心等待)") + + results = runner.run_full_auto( + ini_files, + skip_if_exists=config["execution"].get("skip_existing", False), + ) + completed = sum(1 for r in results if r["status"] == "completed") + failed = [r for r in results if r["status"] not in ("completed", "already_completed")] + _log(f" 完成: {completed}/{len(results)}") + if failed: + _log(f" 失败: {len(failed)} 个") + for r in failed[:3]: + _log(f" - {r.get('ini_file','?')}: {r.get('error', r.get('status'))}") + + if completed > 0: + parser = ResultParser(reports_dir) + parsed = parser.parse_all_reports() + _log(f" 解析: {len(parsed)} 个报告") + if parsed: + rg = ReportGenerator(parsed) + rg.generate_excel(os.path.join(reports_dir, "batch_summary.xlsx")) + rg.generate_csv(os.path.join(reports_dir, "batch_summary.csv")) + rg.generate_markdown(os.path.join(reports_dir, "batch_summary.md")) + _log(f" 报告: {reports_dir}") + + _log("=== 全部完成 ===") + except Exception as e: + import traceback + tb = traceback.format_exc() + _log(f"[ERR] {e}") + _log(tb) + _gui_log(f"thread crashed: {e}\n{tb}") + + threading.Thread(target=_run, daemon=True).start() + + def _on_start_backtest_from_opt(self): + if not all([INIGenerator, MT5AutoRunner]): + messagebox.showerror("错误", "依赖未就绪,请检查 Python 环境") + return + ea_name = self.opt_ea_var.get() + if not ea_name: + messagebox.showwarning('警告', '请先选择一个EA') + return + symbol = self.opt_symbol.get() + period = self.opt_period.get() + from_date = self.opt_from_date.get() + to_date = self.opt_to_date.get() + model_str = self.opt_model.get() + model = int(model_str.split('(')[1].split(')')[0]) if '(' in model_str else 1 + + config = { + "eas": [{"name": ea_name, "filename": f"Experts\\{ea_name}.ex5"}], + "backtest_settings": { + "symbols": [symbol], + "timeframes": [period], + "date_range": {"from": from_date, "to": to_date}, + "model": model, + "execution_mode": 0, + "execution_delay": 0, + "deposit": 10000, + "leverage": "1:100", + "currency": "USD", + "visual": 0, + "replace_report": True, + "shutdown_terminal": True, + "optimization": 0, + "forward_mode": 0, + "forward_date": "", + }, + "mt5_settings": self.config["mt5_settings"], + "execution": self.config["execution"] + } + + os.makedirs("logs", exist_ok=True) + + def _run(): + try: + self.opt_log.insert('end', f"=== 单EA回测: {ea_name} ===\n") + self.opt_log.see('end') + generator = INIGenerator(config) + ini_files = generator.generate_ini_files() + self.opt_log.insert('end', f" 生成 INI: {len(ini_files)}\n") + runner = MT5AutoRunner(config) + runner.reports_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "reports") + os.makedirs(runner.reports_dir, exist_ok=True) + results = runner.run_full_auto(ini_files, skip_if_exists=False) + completed = sum(1 for r in results if r["status"] == "completed") + self.opt_log.insert('end', f" 完成: {completed}/{len(results)}\n") + self.opt_log.insert('end', "=== 完成 ===\n") + self.opt_log.see('end') + except Exception as e: + import traceback + self.opt_log.insert('end', f"[ERR] {e}\n{traceback.format_exc()}\n") + self.opt_log.see('end') + + threading.Thread(target=_run, daemon=True).start() + + def _on_view_reports(self): + path = self.reports_dir.get() + if os.path.exists(path): + subprocess.Popen(['explorer', path]) + else: + messagebox.showwarning("警告", "报告目录不存在") + + def _on_start_optimizer(self): + self.notebook.select(3) + + def _create_reports_tab(self, parent): + main_frame = ttk.Frame(parent) + main_frame.pack(fill='both', expand=True) + + control_frame = ttk.Frame(main_frame) + control_frame.pack(fill='x', padx=5, pady=5) + + ttk.Label(control_frame, text="报告目录:").pack(side='left', padx=5) + self.report_dir = ttk.Entry(control_frame, width=40) + self.report_dir.insert(0, self.config["mt5_settings"]["reports_dir"]) + self.report_dir.pack(side='left', padx=5) + ttk.Button(control_frame, text="浏览", command=self._browse_report_dir).pack(side='left', padx=5) + ttk.Button(control_frame, text="刷新", command=self._refresh_reports).pack(side='left', padx=5) + + search_frame = ttk.LabelFrame(main_frame, text="搜索和筛选") + search_frame.pack(fill='x', padx=5, pady=5) + + search_row = ttk.Frame(search_frame) + search_row.pack(fill='x', padx=5, pady=3) + + ttk.Label(search_row, text="搜索:").pack(side='left', padx=5) + self.search_var = tk.StringVar() + self.search_var.trace('w', lambda *args: self._apply_filter()) + search_entry = ttk.Entry(search_row, textvariable=self.search_var, width=20) + search_entry.pack(side='left', padx=5) + ttk.Button(search_row, text="清除", command=lambda: self.search_var.set('')).pack(side='left', padx=2) + + filter_row = ttk.Frame(search_frame) + filter_row.pack(fill='x', padx=5, pady=3) + + ttk.Label(filter_row, text="EA筛选:").pack(side='left', padx=5) + self.filter_ea_var = tk.StringVar(value='全部') + self.filter_ea_combo = ttk.Combobox(filter_row, textvariable=self.filter_ea_var, width=20, state='readonly') + self.filter_ea_combo.pack(side='left', padx=5) + self.filter_ea_combo.bind('<>', lambda e: self._apply_filter()) + + ttk.Label(filter_row, text="品种:").pack(side='left', padx=10) + self.filter_symbol_var = tk.StringVar(value='全部') + self.filter_symbol_combo = ttk.Combobox(filter_row, textvariable=self.filter_symbol_var, width=10, state='readonly') + self.filter_symbol_combo.pack(side='left', padx=5) + self.filter_symbol_combo.bind('<>', lambda e: self._apply_filter()) + + ttk.Label(filter_row, text="周期:").pack(side='left', padx=10) + self.filter_period_var = tk.StringVar(value='全部') + self.filter_period_combo = ttk.Combobox(filter_row, textvariable=self.filter_period_var, width=8, state='readonly') + self.filter_period_combo.pack(side='left', padx=5) + self.filter_period_combo.bind('<>', lambda e: self._apply_filter()) + + ttk.Button(filter_row, text="重置筛选", command=self._reset_filter).pack(side='left', padx=10) + + options_frame = ttk.LabelFrame(main_frame, text="排序选项") + options_frame.pack(fill='x', padx=5, pady=5) + + sort_row = ttk.Frame(options_frame) + sort_row.pack(anchor='w', padx=5, pady=3) + + ttk.Label(sort_row, text="排序字段:").pack(side='left', padx=5) + self.sort_field = ttk.Combobox(sort_row, width=15, values=[ + "profit_factor", "net_profit", "gross_profit", "win_rate", + "total_trades", "max_drawdown", "sharpe_ratio", "expert", "symbol", "period" + ]) + self.sort_field.set("profit_factor") + self.sort_field.pack(side='left', padx=5) + + self.sort_asc = tk.BooleanVar(value=False) + ttk.Radiobutton(sort_row, text="降序", variable=self.sort_asc, value=False).pack(side='left', padx=5) + ttk.Radiobutton(sort_row, text="升序", variable=self.sort_asc, value=True).pack(side='left', padx=5) + + ttk.Button(sort_row, text="应用排序", command=self._apply_filter).pack(side='left', padx=10) + + export_row = ttk.Frame(options_frame) + export_row.pack(fill='x', padx=5, pady=3) + + ttk.Label(export_row, text="导出CSV:").pack(side='left', padx=5) + self.csv_path_var = tk.StringVar() + self.csv_path = ttk.Entry(export_row, textvariable=self.csv_path_var, width=50, state='readonly') + self.csv_path.pack(side='left', padx=5, fill='x', expand=True) + ttk.Button(export_row, text="另存为...", command=self._export_csv_as).pack(side='left', padx=2) + ttk.Button(export_row, text="导出", command=self._export_csv).pack(side='left', padx=2) + + self.csv_export_dir = os.path.join(self.config["mt5_settings"]["reports_dir"], "exports") + self._update_csv_suggested_name() + + tree_frame = ttk.Frame(main_frame) + tree_frame.pack(fill='both', expand=True, padx=5, pady=5) + + columns = [ + "expert", "symbol", "period", "net_profit", "gross_profit", "gross_loss", + "profit_factor", "win_rate", "total_trades", "max_drawdown", "sharpe_ratio" + ] + self.report_tree = ttk.Treeview(tree_frame, columns=columns, show='headings', height=15, selectmode='extended') + + for col in columns: + self.report_tree.heading(col, text=col) + self.report_tree.column(col, width=100) + + scrollbar = ttk.Scrollbar(tree_frame, orient='vertical', command=self.report_tree.yview) + self.report_tree.configure(yscrollcommand=scrollbar.set) + + self.report_tree.pack(side='left', fill='both', expand=True) + scrollbar.pack(side='right', fill='y') + + self.report_tree.bind("", self._on_row_double_click) + self.report_tree.bind("", self._on_right_click) + + self.report_data = [] + self.tree_item_to_path = {} + self._create_context_menu() + self._refresh_reports() + + def _browse_report_dir(self): + path = filedialog.askdirectory(initialdir=self.report_dir.get()) + if path: + self.report_dir.delete(0, tk.END) + self.report_dir.insert(0, path) + self._refresh_reports() + + def _refresh_reports(self): + for item in self.report_tree.get_children(): + self.report_tree.delete(item) + + sys.path.insert(0, os.path.join(os.getcwd(), 'scripts')) + from result_parser import ResultParser + + reports_dir = self.report_dir.get() + if not os.path.exists(reports_dir): + return + + parser = ResultParser(reports_dir) + self.report_data = parser.parse_all_reports() + self._update_filter_options() + self._apply_filter() + + def _get_filtered_sorted_data(self): + if not self.report_data: + return [] + + search_text = self.search_var.get().lower() + filter_ea = self.filter_ea_var.get() + filter_symbol = self.filter_symbol_var.get() + filter_period = self.filter_period_var.get() + + filtered_data = [] + for r in self.report_data: + info = r.get("test_info", {}) + expert = info.get("expert", "") + symbol = info.get("symbol", "") + period = info.get("period", "") + + if search_text and search_text not in expert.lower() and search_text not in symbol.lower(): + continue + if filter_ea != '全部' and expert != filter_ea: + continue + if filter_symbol != '全部' and symbol != filter_symbol: + continue + if filter_period != '全部' and period != filter_period: + continue + + filtered_data.append(r) + + sort_by = self.sort_field.get() + reverse = not self.sort_asc.get() + + def _coerce_numeric(val): + if isinstance(val, bool): + return float(val) + if isinstance(val, (int, float)): + return float(val) + if val is None or val == "": + return 0.0 + try: + return float(str(val).replace(",", "")) + except (ValueError, TypeError): + return None + + def _to_str(val): + if val is None: + return "" + if isinstance(val, bool): + return "1" if val else "0" + if isinstance(val, (int, float)): + return str(val) + return str(val).lower() + + sort_as_number = False + for r in filtered_data: + metrics = r.get("metrics", {}) + if sort_by in metrics: + v = metrics[sort_by] + if isinstance(v, (int, float)) and not isinstance(v, bool): + sort_as_number = True + break + if isinstance(v, str) and v.strip(): + try: + float(v.replace(",", "")) + sort_as_number = True + break + except ValueError: + pass + if not sort_as_number: + for r in filtered_data: + test_info = r.get("test_info", {}) + if sort_by in test_info: + v = test_info[sort_by] + if isinstance(v, (int, float)) and not isinstance(v, bool): + sort_as_number = True + break + if isinstance(v, str) and v.strip(): + try: + float(v.replace(",", "")) + sort_as_number = True + break + except ValueError: + pass + + def get_sort_key(r): + metrics = r.get("metrics", {}) + test_info = r.get("test_info", {}) + if sort_as_number: + if sort_by in metrics: + n = _coerce_numeric(metrics[sort_by]) + if n is not None: + return n + if sort_by in test_info: + n = _coerce_numeric(test_info[sort_by]) + if n is not None: + return n + return 0.0 + else: + if sort_by in metrics: + return _to_str(metrics[sort_by]) + if sort_by in test_info: + return _to_str(test_info[sort_by]) + return "" + + return sorted(filtered_data, key=get_sort_key, reverse=reverse) + + def _apply_filter(self): + for item in self.report_tree.get_children(): + self.report_tree.delete(item) + self.tree_item_to_path = {} + + if not self.report_data: + return + + sorted_data = self._get_filtered_sorted_data() + if hasattr(self, 'csv_path_var'): + self._update_csv_suggested_name() + + for r in sorted_data: + info = r.get("test_info", {}) + metrics = r.get("metrics", {}) + + values = [ + info.get("expert", ""), + info.get("symbol", ""), + info.get("period", ""), + metrics.get("net_profit", ""), + metrics.get("gross_profit", ""), + metrics.get("gross_loss", ""), + metrics.get("profit_factor", ""), + metrics.get("win_rate", ""), + metrics.get("total_trades", ""), + metrics.get("max_drawdown", ""), + metrics.get("sharpe_ratio", "") + ] + iid = self.report_tree.insert("", "end", values=values) + self.tree_item_to_path[iid] = r.get("file_path", "") + + def _reset_filter(self): + self.search_var.set('') + self.filter_ea_var.set('全部') + self.filter_symbol_var.set('全部') + self.filter_period_var.set('全部') + self._apply_filter() + + def _update_filter_options(self): + ea_list = ['全部'] + symbol_list = ['全部'] + period_list = ['全部'] + + for r in self.report_data: + info = r.get("test_info", {}) + ea = info.get("expert", "") + symbol = info.get("symbol", "") + period = info.get("period", "") + if ea and ea not in ea_list: + ea_list.append(ea) + if symbol and symbol not in symbol_list: + symbol_list.append(symbol) + if period and period not in period_list: + period_list.append(period) + + self.filter_ea_combo['values'] = ea_list + self.filter_symbol_combo['values'] = symbol_list + self.filter_period_combo['values'] = period_list + + def _suggest_csv_filename(self): + import re + ts = time.strftime("%Y%m%d_%H%M%S") + parts = [] + ea = self.filter_ea_var.get() + if ea and ea != '全部': + parts.append(ea) + sym = self.filter_symbol_var.get() + if sym and sym != '全部': + parts.append(sym) + per = self.filter_period_var.get() + if per and per != '全部': + parts.append(per) + search = self.search_var.get().strip() + if search: + parts.append("q-" + search[:10]) + + cleaned = [] + for p in parts: + s = re.sub(r'[^\w\u4e00-\u9fff\-]', '_', p).strip('_') + if s: + cleaned.append(s) + sig = "_".join(cleaned) if cleaned else "all" + if len(sig) > 60: + sig = sig[:60].rstrip('_') + return f"results_{ts}_{sig}.csv" + + def _get_csv_export_dir(self): + base = self.csv_export_dir + try: + os.makedirs(base, exist_ok=True) + except Exception: + base = self.report_dir.get() + os.makedirs(base, exist_ok=True) + return base + + def _update_csv_suggested_name(self): + name = self._suggest_csv_filename() + self.csv_path_var.set(os.path.join(self._get_csv_export_dir(), name)) + + def _export_csv(self): + sys.path.insert(0, os.path.join(os.getcwd(), 'scripts')) + from result_parser import ResultParser + + reports_dir = self.report_dir.get() + + filtered_results = self._get_filtered_sorted_data() + if not filtered_results: + messagebox.showwarning("警告", "当前筛选条件下没有数据可导出") + return + + self._update_csv_suggested_name() + csv_path = self.csv_path_var.get() + target_dir = os.path.dirname(csv_path) or self._get_csv_export_dir() + os.makedirs(target_dir, exist_ok=True) + + if os.path.exists(csv_path): + if not messagebox.askyesno("文件已存在", f"目标文件已存在,是否覆盖?\n{csv_path}"): + return + + sort_by = self.sort_field.get() + reverse = not self.sort_asc.get() + + parser = ResultParser(reports_dir) + parser.export_to_csv(filtered_results, csv_path, sort_by=sort_by, reverse=reverse) + messagebox.showinfo("导出成功", f"已按当前筛选条件导出 {len(filtered_results)} 条记录到:\n{csv_path}") + self._update_csv_suggested_name() + + def _export_csv_as(self): + self._update_csv_suggested_name() + default_name = os.path.basename(self.csv_path_var.get()) + default_dir = os.path.dirname(self.csv_path_var.get()) or self._get_csv_export_dir() + os.makedirs(default_dir, exist_ok=True) + path = filedialog.asksaveasfilename( + title="导出 CSV", + defaultextension=".csv", + initialfile=default_name, + initialdir=default_dir, + filetypes=[("CSV 文件", "*.csv"), ("所有文件", "*.*")] + ) + if not path: + return + self.csv_path_var.set(path) + + def _on_row_double_click(self, event): + selection = self.report_tree.selection() + if not selection: + return + path = self.tree_item_to_path.get(selection[0], "") + if path and os.path.exists(path): + subprocess.Popen(['notepad', path]) + return + values = self.report_tree.item(selection[0])["values"] + label = f"{values[0]} {values[1]} {values[2]}" if len(values) >= 3 else "" + messagebox.showwarning("警告", f"未找到对应的报告文件: {label}") + + def _create_context_menu(self): + self.context_menu = tk.Menu(self.root, tearoff=0) + self.context_menu.add_command(label="打开报告", command=self._open_selected_report) + self.context_menu.add_command(label="打开所在目录", command=self._open_report_directory) + self.context_menu.add_separator() + self.context_menu.add_command(label="复制报告文字", command=self._copy_selected_reports_text) + self.context_menu.add_command(label="复制报告到...", command=self._copy_reports_to) + self.context_menu.add_command(label="删除选中报告", command=self._delete_selected_reports) + self.context_menu.add_separator() + self.context_menu.add_command(label="全选", command=lambda: self.report_tree.selection_set(self.report_tree.get_children())) + self.context_menu.add_command(label="取消选择", command=lambda: self.report_tree.selection_remove(self.report_tree.selection())) + + def _on_right_click(self, event): + self.context_menu.post(event.x_root, event.y_root) + + def _get_selected_report_paths(self): + selection = self.report_tree.selection() + if not selection: + return [] + paths = [] + for item in selection: + p = self.tree_item_to_path.get(item, "") + if p and os.path.exists(p): + paths.append(p) + return paths + + def _open_selected_report(self): + paths = self._get_selected_report_paths() + if not paths: + messagebox.showwarning("警告", "未找到报告文件") + return + for path in paths[:1]: + subprocess.Popen(['notepad', path]) + + def _open_report_directory(self): + selection = self.report_tree.selection() + if not selection: + return + path = self.tree_item_to_path.get(selection[0], "") + if path and os.path.exists(path): + os.startfile(os.path.dirname(path)) + return + values = self.report_tree.item(selection[0])["values"] + label = f"{values[0]} {values[1]} {values[2]}" if len(values) >= 3 else "" + messagebox.showwarning("警告", f"未找到对应的报告文件: {label}") + + def _copy_selected_reports_text(self): + selection = self.report_tree.selection() + if not selection: + messagebox.showwarning("警告", "请先选择要复制文字的报告") + return + + columns = list(self.report_tree["columns"]) + headers = [self.report_tree.heading(col, "text") or col for col in columns] + + rows = [] + for item in selection: + values = self.report_tree.item(item, "values") + rows.append([str(v) if v is not None else "" for v in values]) + + col_widths = [len(h) for h in headers] + for row in rows: + for i, cell in enumerate(row): + if i < len(col_widths): + col_widths[i] = max(col_widths[i], len(cell)) + + def _format_row(cells): + return " ".join(cells[i].ljust(col_widths[i]) for i in range(len(cells))) + + lines = [_format_row(headers), _format_row(["-" * w for w in col_widths])] + for row in rows: + lines.append(_format_row(row)) + + text = "\n".join(lines) + if len(selection) > 1: + text += f"\n\n(共 {len(selection)} 条报告)" + + try: + self.root.clipboard_clear() + self.root.clipboard_append(text) + self.root.update() + except Exception as e: + messagebox.showerror("错误", f"复制到剪贴板失败: {str(e)}") + return + + self.root.after(100, lambda: self._show_copy_toast(len(selection), len(text))) + + def _show_copy_toast(self, count, length): + try: + self.context_menu.unpost() + except Exception: + pass + if hasattr(self, "_copy_toast") and self._copy_toast is not None: + try: + self._copy_toast.destroy() + except Exception: + pass + toast = tk.Toplevel(self.root) + toast.overrideredirect(True) + toast.attributes("-topmost", True) + x = self.root.winfo_rootx() + self.root.winfo_width() // 2 - 100 + y = self.root.winfo_rooty() + self.root.winfo_height() // 2 - 25 + toast.geometry(f"200x50+{x}+{y}") + ttk.Label(toast, text=f"已复制 {count} 条报告文字\n(共 {length} 字符)", anchor="center", justify="center").pack(expand=True, fill='both') + self._copy_toast = toast + self.root.after(1500, lambda: self._destroy_copy_toast(toast)) + + def _destroy_copy_toast(self, toast): + try: + toast.destroy() + except Exception: + pass + if getattr(self, "_copy_toast", None) is toast: + self._copy_toast = None + + def _copy_reports_to(self): + paths = self._get_selected_report_paths() + if not paths: + messagebox.showwarning("警告", "请先选择要复制的报告") + return + + target_dir = filedialog.askdirectory(title="选择目标目录") + if not target_dir: + return + + import shutil + copied = 0 + for src in paths: + try: + filename = os.path.basename(src) + target = os.path.join(target_dir, filename) + shutil.copy2(src, target) + copied += 1 + except Exception as e: + messagebox.showerror("错误", f"复制失败: {str(e)}") + return + + messagebox.showinfo("成功", f"已复制 {copied} 个报告到: {target_dir}") + + def _delete_selected_reports(self): + paths = self._get_selected_report_paths() + if not paths: + messagebox.showwarning("警告", "请先选择要删除的报告") + return + + count = len(paths) + if messagebox.askyesno("确认删除", f"确定要删除选中的 {count} 个报告文件吗?\n此操作不可撤销。"): + deleted = 0 + for path in paths: + try: + os.remove(path) + deleted += 1 + except Exception as e: + messagebox.showerror("错误", f"删除失败: {str(e)}") + return + + messagebox.showinfo("成功", f"已删除 {deleted} 个报告") + self._refresh_reports() + + def _create_optimizer_tab(self, parent): + main_frame = ttk.Frame(parent) + main_frame.pack(fill='both', expand=True) + + opt_frame = ttk.LabelFrame(main_frame, text="EA 参数优化") + opt_frame.pack(fill='both', expand=True, padx=5, pady=5) + + top_row = ttk.Frame(opt_frame) + top_row.pack(fill='x', padx=5, pady=5) + + ttk.Label(top_row, text="优化目录:").pack(side='left', padx=5) + self.opt_dir = ttk.Entry(top_row, width=35) + self.opt_dir.insert(0, "optimizer") + self.opt_dir.pack(side='left', padx=5) + ttk.Button(top_row, text="浏览", command=self._browse_opt_dir).pack(side='left', padx=5) + + ea_row = ttk.Frame(opt_frame) + ea_row.pack(fill='x', padx=5, pady=5) + + ttk.Label(ea_row, text="选择EA:").pack(side='left', padx=5) + self.opt_ea_var = tk.StringVar() + self.opt_ea_combo = ttk.Combobox(ea_row, textvariable=self.opt_ea_var, width=35, state='readonly') + self.opt_ea_combo.pack(side='left', padx=5) + self.opt_ea_combo.bind('<>', self._on_ea_selected) + ttk.Button(ea_row, text="刷新EA列表", command=self._refresh_opt_ea_list).pack(side='left', padx=5) + ttk.Button(ea_row, text="自动扫描MT5", command=self._auto_scan_eas).pack(side='left', padx=5) + ttk.Button(ea_row, text="批量执行优化", command=self._run_batch_optimize).pack(side='left', padx=5) + + param_frame = ttk.LabelFrame(opt_frame, text="参数配置 (点击编辑)") + param_frame.pack(fill='both', expand=True, padx=5, pady=5) + + tree_scroll_y = ttk.Scrollbar(param_frame, orient='vertical') + tree_scroll_y.pack(side='right', fill='y') + tree_scroll_x = ttk.Scrollbar(param_frame, orient='horizontal') + tree_scroll_x.pack(side='bottom', fill='x') + + cols = ('param_name', 'param_type', 'default', 'min', 'max', 'step', 'optimize') + self.param_tree = ttk.Treeview(param_frame, columns=cols, show='headings', + yscrollcommand=tree_scroll_y.set, + xscrollcommand=tree_scroll_x.set, height=8) + tree_scroll_y.config(command=self.param_tree.yview) + tree_scroll_x.config(command=self.param_tree.xview) + + self.param_tree.heading('param_name', text='参数名') + self.param_tree.heading('param_type', text='类型') + self.param_tree.heading('default', text='默认值') + self.param_tree.heading('min', text='最小值') + self.param_tree.heading('max', text='最大值') + self.param_tree.heading('step', text='步进') + self.param_tree.heading('optimize', text='优化') + + self.param_tree.column('param_name', width=150, anchor='w') + self.param_tree.column('param_type', width=80, anchor='center') + self.param_tree.column('default', width=80, anchor='center') + self.param_tree.column('min', width=80, anchor='center') + self.param_tree.column('max', width=80, anchor='center') + self.param_tree.column('step', width=60, anchor='center') + self.param_tree.column('optimize', width=50, anchor='center') + + self.param_tree.pack(fill='both', expand=True) + self.param_tree.bind('', self._on_param_double_click) + + btn_frame = ttk.Frame(opt_frame) + btn_frame.pack(fill='x', padx=5, pady=5) + ttk.Button(btn_frame, text="添加参数", command=self._add_param).pack(side='left', padx=3) + ttk.Button(btn_frame, text="删除选中", command=self._del_param).pack(side='left', padx=3) + ttk.Button(btn_frame, text="保存配置", command=self._save_ea_config).pack(side='left', padx=3) + ttk.Button(btn_frame, text="加载SET文件", command=self._load_set_file).pack(side='left', padx=3) + ttk.Button(btn_frame, text="切换优化", command=self._toggle_param_optimize).pack(side='left', padx=3) + + test_frame = ttk.LabelFrame(opt_frame, text="回测配置") + test_frame.pack(fill='x', padx=5, pady=5) + + action_row = ttk.Frame(test_frame) + action_row.pack(fill='x', padx=5, pady=5) + ttk.Button(action_row, text="开始回测", command=self._on_start_backtest_from_opt).pack(side='left', padx=5) + + sym_row = ttk.Frame(test_frame) + sym_row.pack(fill='x', padx=5, pady=3) + ttk.Label(sym_row, text="品种:").pack(side='left', padx=5) + self.opt_symbol = ttk.Combobox(sym_row, width=12, values=['EURUSD', 'GBPUSD', 'USDJPY', 'USDCAD', 'USDCHF', 'AUDUSD', 'NZDUSD', 'EURGBP', 'EURJPY', 'GBPJPY', 'EURCHF', 'AUDJPY', 'EURAUD', 'GBPAUD', 'EURCAD', 'GBPCAD', 'XAUUSD', 'XAGUSD', 'XBRUSD', 'XTIUSD', 'BTCUSD', 'ETHUSD', 'LTCUSD', 'USDCNH', 'USDHKD', 'USDCZK', 'USDDKK', 'USDHUF', 'USDMXN', 'USDPLN', 'USDTHB', 'NOKJPY', 'SEKJPY', 'XRPUSD', 'XLMUSD', 'AUS200', 'CHINA50', 'ES35', 'STOXX50', 'F40', 'HK50', 'IT40', 'JP225', 'UK100', 'US2000', 'US30', 'US500', 'USTEC', 'CA60', 'NETH25', 'SE30', 'SWI20', 'CHINAH', 'NOR25', 'TecDE30']) + self.opt_symbol.set('XAUUSD') + self.opt_symbol.pack(side='left', padx=5) + + ttk.Label(sym_row, text="周期:").pack(side='left', padx=10) + self.opt_period = ttk.Combobox(sym_row, width=8, values=['M1', 'M5', 'M15', 'M30', 'H1', 'H4', 'D1', 'W1']) + self.opt_period.set('M1') + self.opt_period.pack(side='left', padx=5) + + ttk.Label(sym_row, text="模式:").pack(side='left', padx=10) + self.opt_model = ttk.Combobox(sym_row, width=18, values=['Every Tick (0)', '1分钟OHLC (1)', '仅开盘价 (2)', '数学计算 (3)', '真实Tick (4)']) + self.opt_model.set('1分钟OHLC (1)') + self.opt_model.pack(side='left', padx=5) + + delay_row = ttk.Frame(test_frame) + delay_row.pack(fill='x', padx=5, pady=3) + ttk.Label(delay_row, text="延迟:").pack(side='left', padx=5) + self.opt_delay_type = ttk.Combobox(delay_row, width=18, values=['无延迟 (0)', '随机延迟 (-1)', '固定延迟']) + self.opt_delay_type.set('无延迟 (0)') + self.opt_delay_type.pack(side='left', padx=5) + ttk.Label(delay_row, text="ms:").pack(side='left', padx=2) + self.opt_delay_value = ttk.Entry(delay_row, width=8) + self.opt_delay_value.insert(0, "200") + self.opt_delay_value.pack(side='left', padx=2) + + ttk.Label(delay_row, text="优化指标:").pack(side='left', padx=10) + self.opt_criterion = ttk.Combobox(delay_row, width=18, values=[ + '余额最大值 (0)', '盈利因子最大值 (1)', '期望收益 (2)', '回撤最小值 (3)', + '恢复因子 (4)', '夏普比率 (5)', '自定义 (6)', '复合指标 (7)']) + self.opt_criterion.set('盈利因子最大值 (1)') + self.opt_criterion.pack(side='left', padx=5) + + mode_row = ttk.Frame(test_frame) + mode_row.pack(fill='x', padx=5, pady=3) + ttk.Label(mode_row, text="优化模式:").pack(side='left', padx=5) + self.opt_optimization_mode = ttk.Combobox(mode_row, width=20, values=[ + '禁用 (0)', '慢速完整算法 (1)', '快速遗传算法 (2)', 'MarketWatch所有符号 (3)']) + self.opt_optimization_mode.set('快速遗传算法 (2)') + self.opt_optimization_mode.pack(side='left', padx=5) + + date_row = ttk.Frame(test_frame) + date_row.pack(fill='x', padx=5, pady=3) + ttk.Label(date_row, text="开始:").pack(side='left', padx=5) + self.opt_from_date = ttk.Entry(date_row, width=12) + self.opt_from_date.insert(0, "2026.01.01") + self.opt_from_date.pack(side='left', padx=5) + ttk.Label(date_row, text="结束:").pack(side='left', padx=10) + self.opt_to_date = ttk.Entry(date_row, width=12) + self.opt_to_date.insert(0, "2026.01.04") + self.opt_to_date.pack(side='left', padx=5) + + acct_row = ttk.Frame(test_frame) + acct_row.pack(fill='x', padx=5, pady=3) + ttk.Label(acct_row, text="保证金:").pack(side='left', padx=5) + self.opt_deposit = ttk.Entry(acct_row, width=10) + self.opt_deposit.insert(0, "10000") + self.opt_deposit.pack(side='left', padx=5) + ttk.Label(acct_row, text="杠杆:").pack(side='left', padx=10) + self.opt_leverage = ttk.Combobox(acct_row, width=8, values=["1:10", "1:50", "1:100", "1:200", "1:500"]) + self.opt_leverage.set("1:100") + self.opt_leverage.pack(side='left', padx=5) + + wf_frame = ttk.LabelFrame(test_frame, text="Walk-Forward 防过拟合") + wf_frame.pack(fill='x', padx=5, pady=5) + + wf_row1 = ttk.Frame(wf_frame) + wf_row1.pack(fill='x', padx=5, pady=3) + self.wf_enabled = tk.BooleanVar(value=False) + ttk.Checkbutton(wf_row1, text="启用Walk-Forward", variable=self.wf_enabled).pack(side='left', padx=5) + + ttk.Label(wf_row1, text="OOS比例:").pack(side='left', padx=5) + self.wf_mode = ttk.Combobox(wf_row1, width=12, values=['1/2 (50%)', '1/3 (33%)', '1/4 (25%)']) + self.wf_mode.set('1/3 (33%)') + self.wf_mode.pack(side='left', padx=5) + + self.wf_mode_map = {'1/2 (50%)': 1, '1/3 (33%)': 2, '1/4 (25%)': 3} + + action_frame = ttk.Frame(opt_frame) + action_frame.pack(fill='x', padx=5, pady=5) + ttk.Button(action_frame, text="运行优化", command=self._run_mt5_optimize).pack(side='left', padx=5) + ttk.Button(action_frame, text="分析结果", command=self._analyze_opt_results).pack(side='left', padx=5) + + self.opt_progress = ttk.Progressbar(action_frame, mode='determinate') + self.opt_progress.pack(side='left', fill='x', expand=True, padx=10) + + log_frame = ttk.LabelFrame(main_frame, text="执行日志") + log_frame.pack(fill='both', expand=True, padx=5, pady=5) + self.opt_log = tk.Text(log_frame, height=10, width=80) + self.opt_log.pack(fill='both', expand=True, padx=5, pady=5) + + self._refresh_opt_ea_list() + + def _browse_opt_dir(self): + path = filedialog.askdirectory(initialdir=self.opt_dir.get()) + if path: + self.opt_dir.delete(0, tk.END) + self.opt_dir.insert(0, path) + + def _refresh_opt_ea_list(self): + configs_dir = os.path.join(self.opt_dir.get(), 'configs') + if not os.path.exists(configs_dir): + self.opt_log.insert('end', f"配置目录不存在: {configs_dir}\n") + return + sys.path.insert(0, os.path.join(os.getcwd(), 'scripts', 'optimizer')) + from ea_config_parser import load_all_ea_configs + configs = load_all_ea_configs(configs_dir) + + installed_names = None + mt5_data = self.config.get('mt5_settings', {}).get('data_dir', '') + if mt5_data: + try: + from ea_auto_scanner import EAAutoScanner + scanner = EAAutoScanner(mt5_data) + experts = scanner.scan_experts() + if experts: + installed_names = {e['name'] for e in experts} + for e in experts: + self.opt_ea_paths[e['name']] = e['path'] + except Exception as e: + self.opt_log.insert('end', f"扫描MT5失败,跳过校验: {e}\n") + installed_names = None + + filtered_names = [] + removed_names = [] + for name in configs.keys(): + if installed_names is not None and name not in installed_names: + removed_names.append(name) + else: + filtered_names.append(name) + + if removed_names: + self.opt_log.insert('end', f"已过滤 {len(removed_names)} 个MT5中不存在的EA: {', '.join(removed_names)}\n") + for name in removed_names: + self.opt_log.insert('end', f" - {name}.json\n") + + configs = {k: configs[k] for k in filtered_names} + ea_names = list(configs.keys()) + self.opt_ea_combo['values'] = ea_names + if ea_names: + self.opt_ea_var.set(ea_names[0]) + self._load_ea_params(ea_names[0]) + self.opt_log.insert('end', f"已加载 {len(configs)} 个EA配置\n") + + def _auto_scan_eas(self): + mt5_data = self.config.get('mt5_settings', {}).get('data_dir', '') + if not mt5_data: + messagebox.showwarning('警告', '请先在回测配置中设置MT5数据目录') + return + sys.path.insert(0, os.path.join(os.getcwd(), 'scripts', 'optimizer')) + from ea_auto_scanner import EAAutoScanner + self.opt_log.insert('end', f"扫描MT5目录: {mt5_data}\n") + self.opt_log.update() + scanner = EAAutoScanner(mt5_data) + experts = scanner.scan_experts() + if not experts: + self.opt_log.insert('end', "未找到EA文件\n") + return + self.opt_log.insert('end', f"找到 {len(experts)} 个EA:\n") + self.opt_log.update() + + ea_list = [] + mt5_tester_dir = os.path.join(mt5_data, 'MQL5', 'Profiles', 'Tester') + + for ea_info in experts: + ea_name = ea_info['name'] + ea_list.append(ea_name) + self.opt_ea_paths[ea_name] = ea_info['path'] + + set_filename = ea_name + '_optimization.set' + set_path = os.path.join(mt5_tester_dir, set_filename) + if os.path.exists(set_path): + self.opt_log.insert('end', f" ✓ {ea_name} (有SET)\n") + else: + set_files = [f for f in os.listdir(mt5_tester_dir) if f.endswith('.set') and ea_name.lower() in f.lower().replace('.set', '')] + if set_files: + self.opt_log.insert('end', f" ~ {ea_name} (匹配: {set_files[0]})\n") + else: + self.opt_log.insert('end', f" - {ea_name}\n") + + self.opt_log.insert('end', f"\n共 {len(ea_list)} 个EA\n") + self.opt_log.update() + + self.opt_ea_combo['values'] = ea_list + if ea_list: + self.opt_ea_var.set(ea_list[0]) + self._auto_load_ea_with_set(mt5_data, ea_list[0]) + + def _auto_load_ea_with_set(self, mt5_data, ea_name): + for item in self.param_tree.get_children(): + self.param_tree.delete(item) + + mt5_tester_dir = os.path.join(mt5_data, 'MQL5', 'Profiles', 'Tester') + set_filename = ea_name + '_optimization.set' + set_path = os.path.join(mt5_tester_dir, set_filename) + + if not os.path.exists(set_path): + set_files = [f for f in os.listdir(mt5_tester_dir) if f.endswith('.set') and ea_name.lower() in f.lower().replace('.set', '')] + if set_files: + set_path = os.path.join(mt5_tester_dir, set_files[0]) + self.opt_log.insert('end', f"加载SET: {set_files[0]}\n") + + if os.path.exists(set_path): + params = self._parse_mt5_set_file(set_path) + for pname, pinfo in params.items(): + self.param_tree.insert('', 'end', values=( + pname, + pinfo.get('type', 'int'), + pinfo.get('default', 0), + pinfo.get('min', 0), + pinfo.get('max', 100), + pinfo.get('step', 1), + 'Y' if pinfo.get('optimize', True) else 'N' + )) + self.opt_log.insert('end', f"已加载 {len(params)} 个参数\n") + else: + self.opt_log.insert('end', f"无SET文件,请手动添加参数\n") + + def _on_ea_selected(self, event=None): + ea_name = self.opt_ea_var.get() + if ea_name: + mt5_data = self.config.get('mt5_settings', {}).get('data_dir', '') + self._auto_load_ea_with_set(mt5_data, ea_name) + + def _load_ea_params(self, ea_name): + for item in self.param_tree.get_children(): + self.param_tree.delete(item) + configs_dir = os.path.join(self.opt_dir.get(), 'configs') + sys.path.insert(0, os.path.join(os.getcwd(), 'scripts', 'optimizer')) + from ea_config_parser import load_ea_config + mt5_data = self.config.get('mt5_settings', {}).get('data_dir', '') + + config_path = os.path.join(configs_dir, ea_name + '.json') + if os.path.exists(config_path): + config = load_ea_config(config_path) + if config.parameters: + for pname, param in config.parameters.items(): + optimize = 'Y' if param.optimize else 'N' + self.param_tree.insert('', 'end', values=( + pname, param.param_type, param.default, param.min_value, param.max_value, param.step, optimize + )) + self.opt_log.insert('end', f"从配置加载 {len(config.parameters)} 个参数\n") + return + + self._auto_load_ea_with_set(mt5_data, ea_name) + + def _add_param(self): + self.param_tree.insert('', 'end', values=('NewParam', 'int', 0, 0, 100, 1, 'Y')) + + def _del_param(self): + sel = self.param_tree.selection() + if sel: + self.param_tree.delete(sel) + + def _toggle_param_optimize(self): + sel = self.param_tree.selection() + if sel: + cur = self.param_tree.item(sel[0], 'values') + new_opt = 'N' if cur[6] == 'Y' else 'Y' + self.param_tree.item(sel[0], values=(cur[0], cur[1], cur[2], cur[3], cur[4], cur[5], new_opt)) + + def _on_param_double_click(self, event): + item = self.param_tree.selection() + if not item: + return + col = self.param_tree.identify_column(event.x) + col_idx = int(col.replace('#', '')) - 1 + cols = ('param_name', 'param_type', 'default', 'min', 'max', 'step', 'optimize') + if col_idx < 2: + return + cur_vals = self.param_tree.item(item[0], 'values') + entry = ttk.Entry(self.param_tree) + entry.insert(0, cur_vals[col_idx]) + entry.select_clear() + entry.focus() + + def on_validate(): + new_val = entry.get() + new_vals = list(cur_vals) + new_vals[col_idx] = new_val + self.param_tree.item(item[0], values=new_vals) + entry.destroy() + entry.bind('', lambda e: on_validate()) + entry.bind('', lambda e: entry.destroy()) + entry.place(x=event.x, y=event.y, width=100) + + def _save_ea_config(self): + ea_name = self.opt_ea_var.get() + if not ea_name: + messagebox.showwarning('警告', '请先选择一个EA') + return + configs_dir = os.path.join(self.opt_dir.get(), 'configs') + os.makedirs(configs_dir, exist_ok=True) + params = {} + for item in self.param_tree.get_children(): + vals = self.param_tree.item(item, 'values') + pname, ptype, pdefault, pmin, pmax, pstep, poptimize = vals + if pname and pname != 'NewParam': + try: + default_val = float(pdefault) if pdefault else 0 + min_val = float(pmin) if pmin else 0 + max_val = float(pmax) if pmax else 100 + step_val = float(pstep) if pstep else 1 + except: + default_val, min_val, max_val, step_val = 0, 0, 100, 1 + params[pname] = { + 'type': ptype if ptype in ('int', 'double', 'bool') else 'int', + 'default': default_val, + 'min': min_val, + 'max': max_val, + 'step': step_val, + 'optimize': poptimize == 'Y' if poptimize else True + } + import json + config_path = os.path.join(configs_dir, ea_name + '.json') + config_data = { + 'ea_name': ea_name, + 'ea_path': self.opt_ea_paths.get(ea_name, f"MY-EA\\{ea_name}.ex5"), + 'description': 'Edited via GUI', + 'search_strategy': 'auto', + 'parameters': params, + 'test_config': { + 'symbol': self.opt_symbol.get().split()[0] if ' ' in self.opt_symbol.get() else self.opt_symbol.get(), + 'period': self.opt_period.get(), + 'from_date': self.opt_from_date.get(), + 'to_date': self.opt_to_date.get(), + 'model': int(self.opt_model.get().split('(')[1].split(')')[0]) if '(' in self.opt_model.get() else 1, + 'execution_delay': self._get_opt_execution_delay(), + 'optimization_mode': self._get_opt_optimization_mode(), + 'optimization_criterion': self._get_opt_optimization_criterion(), + 'deposit': int(self.opt_deposit.get()) if self.opt_deposit.get().isdigit() else 10000, + 'leverage': self.opt_leverage.get() + }, + 'walk_forward': { + 'enabled': self.wf_enabled.get(), + 'forward_mode': self.wf_mode_map.get(self.wf_mode.get(), 2) + } + } + with open(config_path, 'w', encoding='utf-8') as f: + json.dump(config_data, f, indent=4, ensure_ascii=False) + self.opt_log.insert('end', f"配置已保存: {config_path}\n") + + def _get_opt_execution_delay(self): + delay_type = self.opt_delay_type.get() + if '无延迟' in delay_type: + return 0 + elif '随机延迟' in delay_type: + return -1 + else: + try: + return int(self.opt_delay_value.get()) + except ValueError: + return 0 + + def _get_opt_optimization_mode(self): + mode_str = self.opt_optimization_mode.get() + if '(' in mode_str: + return int(mode_str.split('(')[1].split(')')[0]) + return 2 + + def _get_opt_optimization_criterion(self): + criterion_map = { + '余额最大值': 0, + '盈利因子最大值': 1, + '期望收益': 2, + '回撤最小值': 3, + '恢复因子': 4, + '夏普比率': 5, + '自定义': 6, + '复合指标': 7, + } + criterion_str = self.opt_criterion.get() + for key, val in criterion_map.items(): + if key in criterion_str: + return val + return 1 + + def _load_set_file(self): + ea_name = self.opt_ea_var.get() + if not ea_name: + messagebox.showwarning('警告', '请先选择一个EA') + return + file_path = filedialog.askopenfilename( + title='选择SET文件', + initialdir=os.path.join(self.opt_dir.get(), 'set_files'), + filetypes=[('SET files', '*.set'), ('All files', '*.*')] + ) + if not file_path or not os.path.exists(file_path): + return + self.opt_log.insert('end', f"加载SET文件: {file_path}\n") + for item in self.param_tree.get_children(): + self.param_tree.delete(item) + params = self._parse_set_file(file_path) + if params: + for pname, ptype, pval, min_val, max_val, step, optimize_flag in params: + self.param_tree.insert('', 'end', values=(pname, ptype, pval, 0, max_val, step, optimize_flag)) + self.opt_log.insert('end', f"成功导入 {len(params)} 个参数\n") + else: + self.opt_log.insert('end', f"解析SET文件失败或文件为空\n") + messagebox.showwarning('警告', '无法解析SET文件内容') + + def _parse_set_file(self, set_path): + params = [] + try: + with open(set_path, 'rb') as f: + raw = f.read() + if raw[:2] in (b'\xff\xfe', b'\xfe\xff'): + content = raw[2:].decode('utf-16-le', errors='ignore') + else: + content = raw.decode('utf-8', errors='ignore') + for line in content.split('\n'): + line = line.strip() + if not line or line.startswith(';') or line.startswith('#'): + continue + if '=' in line: + parts = line.split('=') + pname = parts[0].strip() + try: + values_str = parts[1].strip() if len(parts) > 1 else '' + values = [v.strip() for v in values_str.split('||')] + if values and values[0]: + first_val = values[0].lower() + if first_val == 'true': + pval = 1.0 + ptype = 'bool' + elif first_val == 'false': + pval = 0.0 + ptype = 'bool' + else: + pval = float(values[0]) + ptype = 'double' if pval != int(pval) or '.' in values[0] else 'int' + max_val_str = values[3] if len(values) > 3 else '' + if max_val_str.lower() == 'true': + max_val = 1.0 + elif max_val_str.lower() == 'false': + max_val = 0.0 + elif max_val_str: + max_val = float(max_val_str) + else: + max_val = max(abs(pval) * 10, 100) if pval != 0 else 100 + min_val = 0 + step = 0.01 if ptype == 'double' else 1 + optimize_flag = 'Y' if len(values) > 4 and values[4] == 'Y' else 'N' + params.append((pname, ptype, pval, min_val, max_val, step, optimize_flag)) + except: + pass + except Exception as e: + pass + return params + + def _parse_mt5_set_file(self, set_path): + params = {} + try: + with open(set_path, 'rb') as f: + raw = f.read() + if raw[:2] in (b'\xff\xfe', b'\xfe\xff'): + content = raw[2:].decode('utf-16-le', errors='ignore') + else: + content = raw.decode('utf-8', errors='ignore') + for line in content.split('\n'): + line = line.strip() + if not line or line.startswith(';') or line.startswith('#'): + continue + if '=' in line: + parts = line.split('=') + pname = parts[0].strip() + try: + values_str = parts[1].strip() if len(parts) > 1 else '' + values = [v.strip() for v in values_str.split('||')] + if values and values[0]: + first_val = values[0].lower() + if first_val == 'true': + pval = 1.0 + ptype = 'bool' + elif first_val == 'false': + pval = 0.0 + ptype = 'bool' + else: + pval = float(values[0]) + ptype = 'double' if pval != int(pval) or '.' in values[0] else 'int' + max_val_str = values[3] if len(values) > 3 else '' + if max_val_str.lower() == 'true': + max_val = 1.0 + elif max_val_str.lower() == 'false': + max_val = 0.0 + elif max_val_str: + max_val = float(max_val_str) + else: + max_val = max(abs(pval) * 10, 100) if pval != 0 else 100 + min_val_str = values[2] if len(values) > 2 else '' + if min_val_str.lower() == 'true': + min_val = 1.0 + elif min_val_str.lower() == 'false': + min_val = 0.0 + elif min_val_str: + min_val = float(min_val_str) + else: + min_val = 0 + step = 0.01 if ptype == 'double' else 1 + optimize_flag = values[4] == 'Y' if len(values) > 4 else True + params[pname] = { + 'type': ptype, + 'default': pval, + 'min': min_val, + 'max': max_val, + 'step': step, + 'optimize': optimize_flag + } + except: + pass + except Exception as e: + pass + return params + + def _run_mt5_optimize(self): + ea_name = self.opt_ea_var.get() + if not ea_name: + messagebox.showwarning('警告', '请先选择一个EA') + return + mt5_path = self.config.get('mt5_settings', {}).get('terminal_path', '') + if not mt5_path or not os.path.exists(mt5_path): + messagebox.showerror('错误', 'MT5终端路径无效') + return + sys.path.insert(0, os.path.join(os.getcwd(), 'scripts', 'optimizer')) + from ea_batch_optimizer import EABatchOptimizer + from ea_config_parser import load_ea_config + configs_dir = os.path.join(self.opt_dir.get(), 'configs') + config_path = os.path.join(configs_dir, ea_name + '.json') + if not os.path.exists(config_path): + messagebox.showerror('错误', '请先保存EA配置') + return + try: + config = load_ea_config(config_path) + optimizer = EABatchOptimizer(self.opt_dir.get()) + self.opt_log.insert('end', f"正在生成优化配置...\n") + self.opt_log.update() + ini_path = optimizer.generate_ini_for_ea(config, None) + self.opt_log.insert('end', f"INI: {ini_path}\n") + self.opt_log.update() + abs_ini_path = os.path.abspath(ini_path) + self.opt_log.insert('end', "正在启动MT5优化器...\n") + self.opt_log.update() + mt5_data_dir = self.config.get('mt5_settings', {}).get('data_dir', '') + _launch_mt5(mt5_path, abs_ini_path, mt5_data_dir) + self.opt_log.insert('end', "MT5已启动\n") + mode = self.opt_optimization_mode.get().split('(')[0] if '(' in self.opt_optimization_mode.get() else '遗传算法' + self.opt_log.insert('end', f"MT5优化器运行中({mode})\n") + self.opt_log.insert('end', "优化完成后点击'分析结果'查看\n") + except Exception as e: + self.opt_log.insert('end', f"错误: {str(e)}\n") + + def _run_batch_optimize(self): + mt5_path = self.config.get('mt5_settings', {}).get('terminal_path', '') + if not mt5_path or not os.path.exists(mt5_path): + messagebox.showerror('错误', 'MT5终端路径无效') + return + sys.path.insert(0, os.path.join(os.getcwd(), 'scripts', 'optimizer')) + from ea_batch_optimizer import EABatchOptimizer + from ea_config_parser import load_all_ea_configs + + configs_dir = os.path.join(self.opt_dir.get(), 'configs') + if not os.path.exists(configs_dir): + messagebox.showwarning('警告', '配置目录不存在') + return + + configs = load_all_ea_configs(configs_dir) + if not configs: + messagebox.showwarning('警告', '没有找到EA配置') + return + + result = messagebox.askyesno('确认', f'将对 {len(configs)} 个EA进行批量优化\n优化完成后自动进入下一个\n\n是否继续?') + if not result: + return + + self.opt_log.insert('end', f"开始批量优化,共 {len(configs)} 个EA\n") + self.opt_log.insert('end', "每个EA优化完成后会自动关闭MT5并启动下一个\n") + self.opt_log.update() + + optimizer = EABatchOptimizer(self.opt_dir.get()) + mt5_data_dir = self.config.get('mt5_settings', {}).get('data_dir', '') + reports_dir = os.path.join(self.opt_dir.get(), 'reports') + os.makedirs(reports_dir, exist_ok=True) + + for i, (ea_name, ea_config) in enumerate(configs.items(), 1): + self.opt_log.insert('end', f"\n[{i}/{len(configs)}] 优化: {ea_name}\n") + self.opt_log.update() + + try: + ini_path = optimizer.generate_ini_for_ea(ea_config, None) + abs_ini_path = os.path.abspath(ini_path) + self.opt_log.insert('end', f"启动MT5: {ea_name}\n") + self.opt_log.update() + + process = _launch_mt5(mt5_path, abs_ini_path, mt5_data_dir) + + xml_name = ea_name + '_optimization.xml' + xml_path = os.path.join(mt5_data_dir, xml_name) + + self.opt_log.insert('end', f"等待XML结果: {xml_path}\n") + self.opt_log.update() + + wait_timeout = 600 + start_time = time.time() + while time.time() - start_time < wait_timeout: + if os.path.exists(xml_path): + time.sleep(2) + try: + with open(xml_path, 'r', encoding='utf-8') as f: + if len(f.read()) > 100: + self.opt_log.insert('end', "结果XML已生成\n") + self.opt_log.update() + break + except: + pass + time.sleep(5) + + if process.poll() is not None: + if os.path.exists(xml_path): + self.opt_log.insert('end', "MT5已退出,结果文件存在\n") + self.opt_log.update() + break + self.opt_log.insert('end', "MT5已退出,等待结果文件...\n") + self.opt_log.update() + time.sleep(3) + if os.path.exists(xml_path): + break + + if process.poll() is None: + self.opt_log.insert('end', "正在关闭MT5...\n") + self.opt_log.update() + try: + process.terminate() + process.wait(timeout=5) + except: + pass + + dst_xml = os.path.join(reports_dir, ea_name, xml_name) + if os.path.exists(xml_path): + os.makedirs(os.path.dirname(dst_xml), exist_ok=True) + shutil.copy2(xml_path, dst_xml) + self.opt_log.insert('end', f"已保存结果: {dst_xml}\n") + + self.opt_log.insert('end', f"{ea_name} 优化完成\n") + self.opt_log.update() + + except Exception as e: + self.opt_log.insert('end', f"错误: {str(e)}\n") + + self.opt_log.insert('end', f"\n所有EA优化完成!\n") + self.opt_log.insert('end', "点击'分析结果'查看优化效果\n") + + def _analyze_opt_results(self): + ea_name = self.opt_ea_var.get() + sys.path.insert(0, os.path.join(os.getcwd(), 'scripts', 'optimizer')) + from ea_batch_optimizer import EABatchOptimizer + from analyze_results import ResultAnalyzer + optimizer = EABatchOptimizer(self.opt_dir.get()) + mt5_terminal_dir = self.config.get('mt5_settings', {}).get('data_dir', '') + + self.opt_log.insert('end', "正在分析结果...\n") + self.opt_log.update() + + results = [] + + if mt5_terminal_dir: + reports_dir = os.path.join(self.opt_dir.get(), 'reports', ea_name) + analyzer = ResultAnalyzer(reports_dir) + xml_path = analyzer.copy_xml_results_to_reports(mt5_terminal_dir, ea_name, reports_dir) + if xml_path: + self.opt_log.insert('end', f"从MT5复制结果: {xml_path}\n") + xml_results = analyzer.parse_mt5_xml_optimization(xml_path) + results.extend(xml_results) + self.opt_log.insert('end', f"解析到 {len(xml_results)} 条优化结果\n") + + if not results: + results = optimizer.analyze_results() + + if not results: + self.opt_log.insert('end', "未找到结果文件\n") + return + + self.opt_log.insert('end', f"共 {len(results)} 个结果\n") + criterion = self.opt_criterion.get() + + criterion_key_map = { + '余额最大值': 'net_profit', + '盈利因子最大值': 'profit_factor', + '期望收益': 'expected_payoff', + '回撤最小值': 'max_drawdown', + '恢复因子': 'recovery_factor', + '夏普比率': 'sharpe_ratio', + '自定义': 'custom', + '复合指标': 'result', + } + criterion_key = 'profit_factor' + for key, val in criterion_key_map.items(): + if key in criterion: + criterion_key = val + break + + filtered = [] + for r in results: + trades = r.get('total_trades', 0) + pf = r.get('profit_factor', 0) + if trades >= 1 and pf > 0: + filtered.append(r) + + if filtered: + filtered.sort(key=lambda x: x.get(criterion_key, 0), reverse=True) + best = filtered[0] + self.opt_log.insert('end', f"\n最优配置 ({criterion}):\n") + self.opt_log.insert('end', f" PF: {best.get('profit_factor', 0)}\n") + self.opt_log.insert('end', f" 净利润: {best.get('net_profit', 0)}\n") + self.opt_log.insert('end', f" 交易数: {best.get('total_trades', 0)}\n") + self.opt_log.insert('end', f" 最大回撤: {best.get('max_drawdown', 0)}\n") + self.opt_log.insert('end', f" 夏普比率: {best.get('sharpe_ratio', 0)}\n") + report_path = os.path.join(self.opt_dir.get(), 'results', f'{ea_name}_report.txt') + analyzer.generate_report(filtered[:10], report_path) + self.opt_log.insert('end', f"\n报告已保存: {report_path}\n") + else: + self.opt_log.insert('end', "没有符合条件的优化结果\n") + + self.opt_log.insert('end', "\n--- Walk-Forward 分析 ---\n") + configs_dir = os.path.join(self.opt_dir.get(), 'configs') + config_path = os.path.join(configs_dir, ea_name + '.json') + if os.path.exists(config_path): + with open(config_path, 'r', encoding='utf-8') as f: + import json + ea_cfg = json.load(f) + wf = ea_cfg.get('walk_forward', {}) + if wf.get('enabled'): + wf_result = analyzer.analyze_walk_forward(mt5_terminal_dir, ea_name, reports_dir) + is_pf = wf_result.get('in_sample', {}).get('profit_factor', 0) + oos_pf = wf_result.get('out_of_sample', {}).get('profit_factor', 0) + self.opt_log.insert('end', f"In-Sample PF: {is_pf}\n") + self.opt_log.insert('end', f"Out-of-Sample PF: {oos_pf}\n") + self.opt_log.insert('end', f"PF衰减: {wf_result.get('pf_decay', 'N/A')}%\n") + self.opt_log.insert('end', f"回撤增长: {wf_result.get('dd_increase', 'N/A')}%\n") + self.opt_log.insert('end', f"判定: {wf_result.get('verdict', 'Unknown')}\n") + else: + self.opt_log.insert('end', "未启用Walk-Forward,跳过分析\n") + else: + self.opt_log.insert('end', "无配置文件,跳过Walk-Forward分析\n") + + +def main(): + root = tk.Tk() + app = MT5BacktestGUI(root) + root.mainloop() + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/logs/batch_executor.log b/logs/batch_executor.log new file mode 100644 index 0000000..e69de29 diff --git a/mt5_symbols_specs.csv b/mt5_symbols_specs.csv new file mode 100644 index 0000000..9680c8d --- /dev/null +++ b/mt5_symbols_specs.csv @@ -0,0 +1,2550 @@ +,,,ۻ,֤,,,Сλ,,ֵ,ԼС,С,,,swap,ղswap,ģʽ,׼ģʽ +EURUSD,Euro vs US Dollar,EUR,USD,EUR,1.16423,1.16432,5,9,1,100000,0.01,200,0.01,-8.184,2.366,4,0 +GBPUSD,Great Britain Pound vs US Dollar,GBP,USD,GBP,1.34835,1.34844,5,9,1,100000,0.01,200,0.01,-3.301,-3.981,4,0 +USDCHF,US Dollar vs Swiss Franc,USD,CHF,USD,0.78167,0.78176,5,9,1.279164961,100000,0.01,200,0.01,5.741,-10.779,4,0 +USDJPY,US Dollar vs Japanese Yen,USD,JPY,USD,158.906,158.917,3,11,0.629259299,100000,0.01,200,0.01,10.074,-16.366,4,0 +USDCAD,US Dollar vs Canadian Dollar,USD,CAD,USD,1.38097,1.38107,5,10,0.72407626,100000,0.01,200,0.01,2.322,-8.661,4,0 +AUDUSD,Australian Dollar vs US Dollar,AUD,USD,AUD,0.71664,0.71673,5,9,1,100000,0.01,200,0.01,-1.808,-4.568,4,0 +AUDNZD,Australian Dollar vs New Zealand Dollar,AUD,NZD,AUD,1.21989,1.22004,5,15,0.58741,100000,0.01,100,0.01,4.544,-8.506,4,0 +AUDCAD,Australian Dollar vs Canadian Dollar,AUD,CAD,AUD,0.98964,0.98978,5,14,0.72407626,100000,0.01,100,0.01,4.259,-7.661,4,0 +AUDCHF,Australian Dollar vs Swiss Franc,AUD,CHF,AUD,0.56018,0.56031,5,13,1.279164961,100000,0.01,100,0.01,5.412,-8.488,4,0 +AUDJPY,Australian Dollar vs Japanese Yen,AUD,JPY,AUD,113.882,113.897,3,15,0.629259299,100000,0.01,100,0.01,10.121,-12.979,4,0 +CHFJPY,Swiss Franc vs Japanese Yen,CHF,JPY,CHF,203.277,203.295,3,18,0.629259299,100000,0.01,100,0.01,-6.723,1.917,4,0 +EURGBP,Euro vs Great Britain Pound,EUR,GBP,EUR,0.8634,0.86351,5,11,1.34835,100000,0.01,100,0.01,-6.752,1.628,4,0 +EURAUD,Euro vs Australian Dollar,EUR,AUD,EUR,1.62445,1.6246,5,15,0.71664,100000,0.01,100,0.01,-13.371,7.759,4,0 +EURJPY,Euro vs Japanese Yen,EUR,JPY,EUR,185.011,185.023,3,12,0.629259299,100000,0.01,100,0.01,4.698,-9.222,4,0 +EURCHF,Euro vs Swiss Franc,EUR,CHF,EUR,0.91007,0.91021,5,14,1.279164961,100000,0.01,100,0.01,2.519,-8.231,4,0 +EURNZD,Euro vs New Zealand Dollar,EUR,NZD,EUR,1.98178,1.98195,5,17,0.58741,100000,0.01,100,0.01,-5.396,-0.936,4,0 +EURCAD,Euro vs Canadian Dollar,EUR,CAD,EUR,1.60774,1.60788,5,14,0.72407626,100000,0.01,100,0.01,-3.337,-1.907,4,0 +GBPCHF,Great Britain Pound vs Swiss Franc,GBP,CHF,GBP,1.05399,1.05412,5,13,1.279164961,100000,0.01,100,0.01,6.118,-16.562,4,0 +GBPJPY,Great Britain Pound vs Japanese Yen,GBP,JPY,GBP,214.266,214.284,3,18,0.629259299,100000,0.01,100,0.01,14.272,-22.388,4,0 +CADCHF,Canadian Dollar vs Swiss Franc,CAD,CHF,CAD,0.56601,0.56613,5,12,1.279164961,100000,0.01,100,0.01,2.02,-5.29,4,0 +CADJPY,Canadian Dollar vs Japanese Yen,CAD,JPY,CAD,115.066,115.081,3,15,0.629259299,100000,0.01,100,0.01,3.314,-6.386,4,0 +GBPAUD,Great Britain Pound vs Australian Dollar,GBP,AUD,GBP,1.88136,1.8815,5,14,0.71664,100000,0.01,100,0.01,-8.287,-1.887,4,0 +GBPCAD,Great Britain Pound vs Canadian Dollar,GBP,CAD,GBP,1.862,1.86213,5,13,0.72407626,100000,0.01,100,0.01,3.198,-12.812,4,0 +GBPNZD,Great Britain Pound vs New Zealand Dollar,GBP,NZD,GBP,2.29519,2.29535,5,16,0.58741,100000,0.01,100,0.01,2.837,-14.293,4,0 +NZDCAD,New Zealand Dollar vs Canadian Dollar,NZD,CAD,NZD,0.8112,0.81133,5,13,0.72407626,100000,0.01,100,0.01,-1.077,-2.107,4,0 +NZDCHF,New Zealand Dollar vs Swiss Franc,NZD,CHF,NZD,0.45917,0.45929,5,12,1.279164961,100000,0.01,100,0.01,1.734,-4.666,4,0 +NZDJPY,New Zealand Dollar vs Japanese Yen,NZD,JPY,NZD,93.348,93.362,3,14,0.629259299,100000,0.01,100,0.01,3.153,-5.867,4,0 +NZDUSD,New Zealand Dollar vs US Dollar,NZD,USD,NZD,0.58741,0.58752,5,11,1,100000,0.01,100,0.01,-3.828,0.262,4,0 +USDSGD,US Dollar vs Singapore Dollar,USD,SGD,USD,1.27726,1.27741,5,15,0.782834016,100000,0.01,100,0.01,5.236,-12.414,4,0 +AUDSGD,Australian Dollar vs Singpore Dollar,AUD,SGD,AUD,0,0,5,0,0.782834016,100000,0.01,50,0.01,5.426,-10.724,4,0 +CHFSGD,Swiss Franc vs Singapore Dollar,CHF,SGD,CHF,0,0,5,0,0.782834016,100000,0.01,50,0.01,-10.549,1.751,4,0 +EURDKK,Euro vs Danish Korner,EUR,DKK,EUR,0,0,5,0,0.155801826,100000,0.01,50,0.01,-4.563,-21.823,4,0 +EURHKD,Euro vs Hong Kong Dollar,EUR,HKD,EUR,0,0,5,0,0.127634373,100000,0.01,50,0.01,-22.675,-9.985,4,5 +EURNOK,Euro vs Norwegian Krona,EUR,NOK,EUR,0,0,5,0,0.108221243,100000,0.01,50,0.01,-81.488,47.862,4,0 +EURPLN,Euro vs Polish Zloty,EUR,PLN,EUR,0,0,5,0,0.274830224,100000,0.01,50,0.01,-30.188,15.052,4,0 +EURSEK,Euro vs Swedish Kronor,EUR,SEK,EUR,0,0,5,0,0.107560769,100000,0.01,50,0.01,-22.57,-14.12,4,0 +EURSGD,Euro vs Singapore Dollar,EUR,SGD,EUR,0,0,5,0,0.782834016,100000,0.01,50,0.01,-0.737,-7.487,4,0 +EURTRY,Euro vs Turkish Lira,EUR,TRY,EUR,53.40197,53.54887,5,14690,0.021875419,100000,0.01,50,0.01,-5028.279333,4471.687333,3,5 +EURZAR,Euro vs South African Rand,EUR,ZAR,EUR,19.01903,19.0253,5,627,0.061196514,100000,0.01,50,0.01,-306.94,170.57,4,0 +GBPDKK,Great Britain Pound vs Danish Kroner,GBP,DKK,GBP,8.65402,8.65453,5,51,0.155801826,100000,0.01,50,0.01,27.797,-75.903,4,0 +GBPNOK,Great Britain Pound vs Norwegian Krona,GBP,NOK,GBP,12.45418,12.4596,5,542,0.108221243,100000,0.01,50,0.01,-45.713,-15.913,4,0 +GBPSEK,Great Britain Pound vs Swedish Kronor,GBP,SEK,GBP,12.52923,12.53611,5,688,0.107560769,100000,0.01,50,0.01,36.295,-103.375,4,0 +GBPSGD,Great Britain Pound vs Singapore Dollar,GBP,SGD,GBP,1.72225,1.72243,5,18,0.782834016,100000,0.01,50,0.01,7.318,-16.502,4,0 +GBPTRY,Great Britain Pound vs Turkish Lira,GBP,TRY,GBP,61.83189,62.00158,5,16969,0.021875419,100000,0.01,50,0.01,-5382.624,5141.064,3,5 +NOKJPY,Norwegian Kroner vs Japanese Yen,NOK,JPY,NOK,17.193,17.21,3,17,0.629259299,100000,0.01,50,0.01,1.448,-1.922,4,0 +NOKSEK,Norwegian Kroner vs Swedish Kronor,NOK,SEK,NOK,1.00557,1.0066,5,103,0.107560769,100000,0.01,50,0.01,4.886,-8.814,4,0 +SEKJPY,Swedish Kronor vs. Japanese Yen,SEK,JPY,SEK,17.088,17.107,3,19,0.629259299,100000,0.01,50,0.01,0.44616,-0.88384,4,0 +SGDJPY,Singapore Dollar vs. Japanese Yen,SGD,JPY,SGD,124.389,124.408,3,19,0.629259299,100000,0.01,50,0.01,-0.405,-3.91,4,0 +USDCNH,US Dollar vs Chinese Renminbi,USD,CNH,USD,6.78139,6.78154,5,15,0.147459132,100000,0.01,50,0.01,30.8,-64.51,4,5 +USDCZK,US Dollar vs Czech Republic Korunas,USD,CZK,USD,20.8474,20.8582,4,108,0.479427755,100000,0.01,50,0.01,-4.979,-8.079,4,0 +USDDKK,US Dollar vs Danish Kroner,USD,DKK,USD,6.41811,6.41841,5,30,0.155801826,100000,0.01,50,0.01,25.458,-48.692,4,0 +USDHKD,US Dollar vs Hong Kong Dollar,USD,HKD,USD,7.83469,7.83488,5,19,0.127634373,100000,0.01,50,0.01,17.584,-45.316,4,5 +USDHUF,US Dollar vs Hungarian Forints,USD,HUF,USD,306.91,307.036,3,126,0.325694707,100000,0.01,50,0.01,-25.996,15.784,4,0 +USDMXN,US Dollar vs Mexican Peso,USD,MXN,USD,17.27815,17.28123,5,308,0.057866251,100000,0.01,50,0.01,-246.747,83.423,4,0 +USDNOK,US Dollar vs Norwegian Kroner,USD,NOK,USD,9.23645,9.24033,5,388,0.108221243,100000,0.01,50,0.01,-28.227,-1.527,4,0 +USDPLN,US Dollar vs Polish Zlotys,USD,PLN,USD,3.63696,3.63861,5,165,0.274830224,100000,0.01,50,0.01,-8.477,-4.877,4,0 +USDSEK,US Dollar vs Swedish Kroner,USD,SEK,USD,9.29211,9.29707,5,496,0.107560769,100000,0.01,50,0.01,23.726,-56.074,4,0 +USDTHB,US Dollar vs Thai Baht,USD,THB,USD,32.45795,32.46205,5,410,0.030805202,100000,0.01,50,0.01,435.7,-786.3,4,0 +USDTRY,US Dollar vsTurkish Lira,USD,TRY,USD,45.7011,45.71341,5,1231,0.021875419,100000,0.01,50,0.01,-3852.82,3696.78,3,5 +USDZAR,US Dollar vs South African Rand,USD,ZAR,USD,16.33561,16.3408,5,519,0.061196514,100000,0.01,50,0.01,-190.743,70.947,4,0 +AUS200,Australia 200 Index,USD,AUD,AUD,8685.3,8686.5,2,120,0.0071664,1,0.1,250,0.1,-2.222,0.087,4,2 +CHINA50,FTSE China A50 Index,USD,USD,USD,15664.74,15669.24,2,450,0.01,1,0.1,250,0.1,-2.131,0.968,4,2 +ES35,Spain 35 Index,USD,EUR,EUR,18148.4,18154.4,2,600,0.0116423,1,0.1,250,0.1,-1.63,0.423,4,2 +STOXX50,EU Stocks 50 Index,USD,EUR,EUR,6088,6089,2,100,0.0116423,1,0.1,250,0.1,-1.095,-0.377,4,2 +F40,France 40 Index,USD,EUR,EUR,8184.2,8185.4,2,120,0.0116423,1,0.1,250,0.1,-1.482,-0.511,4,2 +HK50,Hong Kong 50 Index,USD,HKD,HKD,25464,25473,2,900,0.001276344,1,0.1,250,0.1,-5.096,-1.081,4,2 +IT40,Italy 40 Index,USD,EUR,EUR,49985,49995,2,1000,0.0116423,1,0.1,250,0.1,-4.441,1.153,4,2 +JP225,Japan 225 Index,USD,JPY,JPY,65239,65244,2,500,6.29259E-05,1,1,250,1,-9.015,-6.168,4,2 +UK100,UK 100 Index,USD,GBP,GBP,10443.8,10444.8,2,100,0.0134835,1,0.1,250,0.1,-2.487,-0.08,4,2 +US2000,US Small Cap 2000 Index,USD,USD,USD,2905.88,2906.3,2,42,0.01,1,1,250,1,-0.643,-0.043,4,2 +US30,US Wall Street 30 Index,USD,USD,USD,50957.5,50958.7,2,120,0.01,1,0.1,250,0.1,-11.373,-0.758,4,2 +US500,US SPX 500 Index,USD,USD,USD,7542.2,7542.7,2,50,0.01,1,0.1,250,0.1,-1.684,-0.112,4,2 +USTEC,US Tech 100 Index,USD,USD,USD,29898.3,29899.3,2,100,0.01,1,0.1,250,0.1,-6.638,-0.443,4,2 +XAGEUR,Silver vs Euro,XAG,EUR,XAG,66.663,66.704,3,41,1.16423,1000,0.01,100,0.01,-4.805,3.846,4,0 +XAGUSD,Silver vs US Dollar,XAG,USD,XAG,77.616,77.66,3,44,1,1000,0.01,100,0.01,-9.096,7.885,4,0 +XAUEUR,Gold vs Euro,XAU,EUR,XAU,3915.08,3915.33,2,25,1.16423,100,0.01,100,0.01,-28.242,22.599,4,0 +XAUUSD,Gold vs US Dollar,XAU,USD,XAU,4558.27,4558.48,2,21,1,100,0.01,100,0.01,-54.297,46.365,4,0 +XPDUSD,Palladium vs US Dollar,XPD,USD,XPD,1381.41,1389.42,2,801,1,100,0.01,100,0.01,-19.579,4.931,4,5 +XPTUSD,Platinum vs US Dollar,XPT,USD,XPT,1959.41,1967.25,2,784,1,100,0.01,100,0.01,-26.141,4.999,4,5 +XBRUSD,Brent Oil vs US Dollar,XBR,USD,XBR,98.58,98.59,2,1,1,100,0.5,50,0.5,18.846,-24.949,4,5 +XNGUSD,Natural Gas vs US Dollar,XNG,USD,XNG,2.881,2.882,4,10,1,10000,0.5,50,0.5,-52.022,38.146,4,5 +XTIUSD,Crude Oil vs US Dollar,XTI,USD,XTI,94.36,94.38,2,2,1,100,0.5,50,0.5,10.553,-14.732,4,5 +BTCUSD,Bitcoin (USD),USD,USD,USD,77391.87,77403.87,2,1200,0.01,1,0.01,10,0.01,-20,0,4,2 +BCHUSD,Bitcoin Cash US Dollar,USD,USD,USD,350.2,351.7,2,150,0.01,1,0.01,10,0.01,-20,0,4,2 +ETHUSD,Ethereum (USD),USD,USD,USD,2104.77,2107.67,2,290,0.01,1,0.01,10,0.01,-20,0,4,2 +LTCUSD,Litecoin US Dollar,USD,USD,USD,52.29,53.37,2,108,0.01,1,0.05,10,0.01,-20,0,4,2 +AAPL.NAS,Apple Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ADBE.NAS,Adobe Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +ADI.NAS,Analog Devices Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ADP.NAS,Automatic Data Processing Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMAT.NAS,Applied Materials Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMGN.NAS,Amgen Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMZN.NAS,Amazon.com Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AVGO.NAS,Broadcom Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BKNG.NAS,Booking Holdings Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +BIIB.NAS,Biogen Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CELG.NAS,Celgene Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-2.59,-2.41,4,2 +CHTR.NAS,Charter Communications Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CMCSA.NAS,Comcast Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CME.NAS,CME Group Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +COST.NAS,Costco Wholesale Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,3,2 +CRON.NAS,Cronos Group Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CSCO.NAS,Cisco Systems Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CSX.NAS,CSX Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CTSH.NAS,Cognizant Technology Solutions Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +EA.NAS,Electronic Arts Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +EBAY.NAS,eBay Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +EQIX.NAS,Equinix Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +FOX.NAS,Fox Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +FOXA.NAS,Fox Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +GILD.NAS,Gilead Sciences Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +GOOG.NAS,Alphabet Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +INTC.NAS,Intel Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,3,2 +INTU.NAS,Intuit Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +ISRG.NAS,Intuitive Surgical Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +KHC.NAS,Kraft Heinz Co/The CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MAR.NAS,Marriott International Inc/MD CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MDLZ.NAS,Mondelez International Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MSFT.NAS,Microsoft Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MU.NAS,Micron Technology Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +NFLX.NAS,Netflix Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +NVDA.NAS,NVIDIA Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +PEP.NAS,PepsiCo Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +PYPL.NAS,PayPal Holdings Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +QCOM.NAS,QUALCOMM Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +REGN.NAS,Regeneron Pharmaceuticals Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SBUX.NAS,Starbucks Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SHPG.NAS,Shire Plc ADR CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-2.59,-2.41,0,2 +TFCF.NAS,Twenty-First Century Fox (USD) B CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-2.59,-2.41,0,2 +TFCFA.NAS,Twenty-First Century Fox (USD) A CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-2.59,-2.41,0,2 +TLRY.NAS,Tilray Brands Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +TMUS.NAS,T-Mobile US Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +TSLA.NAS,Tesla Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +TXN.NAS,Texas Instruments Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +VRTX.NAS,Vertex Pharmaceuticals Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +ABBV.NYSE,AbbVie Inc CFD,USD,USD,USD,216.66,216.73,3,70,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ABT.NYSE,Abbott Laboratories CFD,USD,USD,USD,87.5,87.52,3,20,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ACB.NYSE,Aurora Cannabis Inc CFD,USD,USD,USD,3.47,3.48,2,1,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +AXP.NYSE,American Express Co CFD,USD,USD,USD,311.75,311.85,4,1000,0.0001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BA.NYSE,Boeing Co/The CFD,USD,USD,USD,218.63,218.66,3,30,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BAC.NYSE,Bank of America Corp CFD,USD,USD,USD,51.76,51.77,3,10,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BLK.NYSE,Blackrock Inc CFD,USD,USD,USD,1072.36,1072.66,3,300,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BMY.NYSE,Bristol-Myers Squibb Co CFD,USD,USD,USD,59.57,59.58,3,10,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +C.NYSE,Citigroup Inc CFD,USD,USD,USD,125.03,125.04,3,10,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CGC.NYSE,Canopy Growth Corp CFD,USD,USD,USD,1.04,1.05,2,1,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CVS.NYSE,CVS Health Corp CFD,USD,USD,USD,93.21,93.23,2,2,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CVX.NYSE,Chevron Corp CFD,USD,USD,USD,191.44,191.47,2,3,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +DD.NYSE,DuPont de Nemours Inc CFD,USD,USD,USD,48.09,48.11,2,2,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +DIS.NYSE,Walt Disney Co/The CFD,USD,USD,USD,103.11,103.12,2,1,0.01,1,0.1,1000,0.1,-5.88,0.98,3,2 +DWDP.NYSE,DowDuPont Inc CFD,USD,USD,USD,30.44,30.45,2,1,0.01,1,0.1,1000,0.1,-2.59,-2.39,4,2 +DOW.NYSE,Dow Inc CFD,USD,USD,USD,35.95,35.96,3,10,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GE.NYSE,General Electric Co CFD,USD,USD,USD,301.36,301.48,4,1200,0.0001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GS.NYSE,Goldman Sachs Group Inc/The CFD,USD,USD,USD,996.31,996.68,2,37,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +HD.NYSE,Home Depot Inc/The CFD,USD,USD,USD,312.71,312.78,2,7,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +HON.NYSE,Honeywell International Inc CFD,USD,USD,USD,227.7,227.74,2,4,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +IBM.NYSE,International Business Machines Corp CFD,USD,USD,USD,253.9,253.93,2,3,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +JNJ.NYSE,Johnson & Johnson CFD,USD,USD,USD,234.53,234.58,2,5,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +JPM.NYSE,JPMorgan Chase & Co CFD,USD,USD,USD,306.26,306.31,2,5,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +KO.NYSE,Coca-Cola Co/The CFD,USD,USD,USD,81.59,81.6,4,100,0.0001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LLY.NYSE,Eli Lilly & Co CFD,USD,USD,USD,1067.47,1067.66,2,19,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +LMT.NYSE,Lockheed Martin Corp CFD,USD,USD,USD,532.44,532.66,2,22,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MA.NYSE,Mastercard Inc CFD,USD,USD,USD,498.2,498.38,2,18,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MCD.NYSE,McDonald's Corp CFD,USD,USD,USD,282.16,282.26,2,10,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MMM.NYSE,3M Co CFD,USD,USD,USD,152.72,152.76,2,4,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MO.NYSE,Altria Group Inc CFD,USD,USD,USD,74.01,74.02,2,1,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MRK.NYSE,Merck & Co Inc CFD,USD,USD,USD,122.52,122.54,4,200,0.0001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MS.NYSE,Morgan Stanley CFD,USD,USD,USD,201.22,201.23,2,1,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +NKE.NYSE,NIKE Inc CFD,USD,USD,USD,44.56,44.57,2,1,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +ORCL.NYSE,Oracle Corp CFD,USD,USD,USD,192.04,192.1,2,6,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +PFE.NYSE,Pfizer Inc CFD,USD,USD,USD,25.97,25.98,2,1,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +PG.NYSE,Procter & Gamble Co/The CFD,USD,USD,USD,144.34,144.36,2,2,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +PM.NYSE,Philip Morris International Inc CFD,USD,USD,USD,189.11,189.19,2,8,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SLB.NYSE,SLB Ltd CFD,USD,USD,USD,57.29,57.3,2,1,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SPOT.NYSE,Spotify Technology SA CFD,USD,USD,USD,516.23,516.64,2,41,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +T.NYSE,AT&T Inc CFD,USD,USD,USD,25.31,25.32,2,1,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +TWX.NYSE,Time Warner CFD,USD,USD,USD,98.94,98.95,2,1,0.01,1,0.1,1000,0.1,-2.59,-2.39,4,2 +UNH.NYSE,UnitedHealth Group Inc CFD,USD,USD,USD,387.76,387.85,2,9,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +UNP.NYSE,Union Pacific Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +UPS.NYSE,United Parcel Service Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +USB.NYSE,US Bancorp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +V.NYSE,Visa Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +VZ.NYSE,Verizon Communications Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +WFC.NYSE,Wells Fargo & Co CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +XOM.NYSE,Exxon Mobil Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +XRPUSD,Ripple US Dollar,USD,USD,USD,1.3572,1.3576,4,4,0.0001,1,100,1000,0.01,-20,0,4,2 +XLMUSD,XLM vs US Dollar,USD,USD,USD,0.14792,0.15099,5,307,0.00001,1,100,1000,1,-20,0,4,2 +DBA.NYSE,Invesco DB Agriculture Fund CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +EEM.NYSE,iShares MSCI Emerging Markets ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +EWH.NYSE,iShares MSCI Hong Kong ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +EWW.NYSE,iShares MSCI Mexico ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,1,2 +EWZ.NYSE,iShares MSCI Brazil ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +FXI.NYSE,iShares China Large-Cap ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +GDX.NYSE,VanEck Gold Miners ETF/USA CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +GDXJ.NYSE,VanEck Junior Gold Miners ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +IEMG.NYSE,iShares Core MSCI Emerging Markets ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +LQD.NYSE,iShares iBoxx $ Investment Grade Corporate Bond ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MOO.NYSE,VanEck Agribusiness ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MJ.NYSE,Amplify Alternative Harvest ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +RSX.NYSE,VanEck Vectors Russia ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-2.59,-2.41,0,2 +SIL.NYSE,Global X Silver Miners ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +UNG.NYSE,United States Natural Gas Fund LP CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +URA.NYSE,Global X Uranium ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +USO.NYSE,United States Oil Fund LP CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,1,2 +VXX.NYSE,iPath S&P 500 VIX ST Futures ETN CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-2.59,-2.41,0,2 +VXXB.NYSE,iPath B S&P 500 VIX S/T Futs ETN,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-2.59,-2.41,0,2 +VYM.NYSE,Vanguard High Dividend Yield ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +XLE.NYSE,State Street Energy Select Sector SPDR ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +XLF.NYSE,State Street Financial Select Sector SPDR ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +XLI.NYSE,State Street Industrial Select Sector SPDR ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,1,2 +XLP.NYSE,State Street Consumer Staples Select Sector SPDR ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +XLU.NYSE,State Street Utilities Select Sector SPDR ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +XOP.NYSE,State Street SPDR S&P Oil & Gas Exploration & Production ETF CF,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,1,2 +QQQ.NAS,Invesco QQQ Trust Series 1 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +TLT.NAS,iShares 20+ Year Treasury Bond ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,474,0.1,-5.88,0.98,4,2 +XAUAUD,Gold vs Australian Dollar,XAU,AUD,XAU,6360.17,6360.56,2,39,0.71664,100,0.01,100,0.01,-87.841,78.314,4,0 +DEO.NYSE,Diageo PLC CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +NEE.NYSE,NextEra Energy Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMT.NYSE,American Tower Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +BABA.NYSE,Alibaba Group Holding Ltd CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +BRK-B.NYSE,Berkshire Hathaway Inc - B Shares CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +TMO.NYSE,Thermo Fisher Scientific Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +LYFT.NAS,Lyft Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +TM.NYSE,Toyota Motor Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +UBER.NYSE,Uber Technologies Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +PINS.NYSE,Pinterest Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CA60,Canada 60 Index,CAD,CAD,CAD,2014.77,2015.57,2,80,0.007240763,1,1,250,1,-0.139,0.114,4,2 +NETH25,Netherlands 25 Index,EUR,EUR,EUR,1051.92,1052.12,2,20,0.0116423,1,1,250,1,-0.093,0.024,4,2 +SE30,Sweden 30 Index,SEK,SEK,SEK,3140.17,3140.61,2,44,0.001075608,1,1,250,1,-0.263,0.06,4,2 +SWI20,Switzerland 20 Index,CHF,CHF,CHF,13475.7,13477.4,2,170,0.01279165,1,1,250,1,-0.412,-0.412,4,2 +CHINAH,Hong Kong China H-shares Index,HKD,HKD,HKD,8499.51,8502.51,2,300,0.001276344,1,1,250,1,-0.86,0.276,4,2 +SA40,South Africa 40 Index,ZAR,ZAR,ZAR,107055.7,107093.5,2,3780,0.000611965,1,1,250,1,-20.778,17,4,2 +NOR25,Norway 25 Index,NOK,NOK,NOK,1983.55,1984.45,2,90,0.001082212,1,1,250,1,-0.266,0.218,4,2 +TecDE30,Germany Tech 30 Index,EUR,EUR,EUR,4039.2,4047.2,2,800,0.0116423,1,1,250,1,-0.234,0.192,4,2 +MidDE60,Germany Mid 60 Index,EUR,EUR,EUR,28431.8,28467.2,2,3540,0.0116423,1,1,250,1,-1.88,-3.01,3,2 +ADS.ETR,adidas AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +ALV.ETR,Allianz SE CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +BAS.ETR,BASF SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +BAYN.ETR,Bayer AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +BMW.ETR,Bayerische Motoren Werke AG (Preference) CFD,EUR,EUR,EUR,0,0,2,0,0.0116423,1,1,1000,1,-4.18,-0.13,4,2 +BEI.ETR,Beiersdorf AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +CON.ETR,Continental AG CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +1COV.ETR,Covestro AG CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +DB1.ETR,Deutsche Boerse AG CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +DTE.ETR,Deutsche Telekom AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +EOAN.ETR,E.ON SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +FRE.ETR,Fresenius SE & Co KGaA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +FME.ETR,Fresenius Medical Care AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +HEI.ETR,Heidelberg Materials AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +HEN3.ETR,Henkel AG & Co KGaA CFD,EUR,EUR,EUR,0,0,2,0,0.0116423,1,1,1000,1,-4.18,-0.13,4,2 +IFX.ETR,Infineon Technologies AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +LHA.ETR,Deutsche Lufthansa AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +MRK.ETR,Merck & Co Inc CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +MUV2.ETR,Muenchener Rueckversicherungs-Gesellschaft AG in Muenchen CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +RWE.ETR,RWE AG CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +SAP.ETR,SAP SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +SIE.ETR,Siemens AG CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +VOW3.ETR,Volkswagen AG CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +VNA.ETR,Vonovia SE CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +ANA.MAD,Acciona SA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +ACX.MAD,Acerinox SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +ACS.MAD,ACS Actividades de Construccion y Servicios SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +AENA.MAD,Aena SME SA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +AMS.MAD,Amadeus IT Group SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +SAB.MAD,Banco de Sabadell SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +SAN.MAD,Banco Santander SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +BKT.MAD,Bankinter SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +BBVA.MAD,Banco Bilbao Vizcaya Argentaria SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +CABK.MAD,CaixaBank SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +CLNX.MAD,Cellnex Telecom SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +CIE.MAD,CIE Automotive SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +COL.MAD,Colonial SFL Socimi SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +ENG.MAD,Enagas SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +ELE.MAD,Endesa SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +FER.MAD,Ferrovial CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +GRF.MAD,Grifols SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +IBE.MAD,Iberdrola SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +ITX.MAD,Industria de Diseno Textil SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +IDR.MAD,Indra Sistemas SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +MAP.MAD,Mapfre SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +MEL.MAD,Melia Hotels International SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +MRL.MAD,Merlin Properties Socimi SA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +NTGY.MAD,Naturgy Energy Group SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +REP.MAD,Repsol SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +TRE.MAD,Tecnicas Reunidas SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +TEF.MAD,Telefonica SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +VIS.MAD,Viscofan SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +AC.PAR,Accor SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +AIR.PAR,Airbus SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +AI.PAR,Air Liquide SA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +ATO.PAR,Atos SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +CS.PAR,AXA SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +BNP.PAR,BNP Paribas SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +EN.PAR,Bouygues SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +CAP.PAR,Capgemini SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +CA.PAR,Carrefour SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +ACA.PAR,Credit Agricole SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +BN.PAR,Danone SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +DSY.PAR,Dassault Systemes SE CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +ENGI.PAR,Engie SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +EL.PAR,EssilorLuxottica SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +RMS.PAR,Hermes International SCA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +KER.PAR,Kering SA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +LR.PAR,Legrand SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +OR.PAR,L'Oreal SA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +MC.PAR,LVMH Moet Hennessy Louis Vuitton SE CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +ML.PAR,Moneylion Inc CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +ORA.PAR,Orange SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +RI.PAR,Pernod Ricard SA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +UG.PAR,Peugeot Invest CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +PUB.PAR,Publicis Groupe SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +RNO.PAR,Renault SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +SAF.PAR,Safran SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +SGO.PAR,Cie de Saint-Gobain SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +SAN.PAR,Sanofi SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +SU.PAR,Schneider Electric SE CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +GLE.PAR,Societe Generale SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +SW.PAR,Sodexo SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +FP.PAR,TotalEnergies (FR) CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +FR.PAR,Valeo SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +VIE.PAR,Veolia Environnement SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +DG.PAR,Vinci SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +VIV.PAR,Vivendi SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +AALB.AMS,Aalberts NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +ABN.AMS,ABN AMRO Bank NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +AGN.AMS,Aegon Ltd CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +AD.AMS,Koninklijke Ahold Delhaize NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +ASML.AMS,ASML Holding NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +ASRNL.AMS,ASR Nederland NV CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +HEIA.AMS,Heineken NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +INGA.AMS,ING Groep NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +DSM.AMS,DSM-FIRMENICH AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +KPN.AMS,Koninklijke KPN NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +NN.AMS,NN Group NV CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +PHIA.AMS,Koninklijke Philips NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +RAND.AMS,Randstad NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +URW.AMS,Unibail-Rodamco-Westfield CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +UNA.AMS,Unilever PLC (Amsterdam) CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +VPK.AMS,Koninklijke Vopak NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +WKL.AMS,Wolters Kluwer NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +III.LSE,3i Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +ADM.LSE,Admiral Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +AAL.LSE,Anglo American PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +ANTO.LSE,Antofagasta PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +ABF.LSE,Associated British Foods PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +AML.LSE,Aston Martin Lagonda Global Holdings PLC CFD,GBP,GBP,GBP,0,0,5,0,1.34835E-05,1,1,1000,1,-5.97,0.45,4,2 +AZN.LSE,AstraZeneca PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +AV.LSE,Aviva CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BA.LSE,Boeing Co/The CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BARC.LSE,Barclays PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BDEV.LSE,Barratt Developments CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BATS.LSE,British American Tobacco PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BKG.LSE,Berkeley Group Holdings PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BP.LSE,BP CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BLND.LSE,British Land Co PLC/The CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BTA.LSE,BT Group CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BNZL.LSE,Bunzl PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BRBY.LSE,Burberry Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +CNA.LSE,Centrica PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +CCH.LSE,Coca-Cola HBC AG CFD,GBP,GBP,GBP,0,0,5,0,1.34835E-05,1,1,1000,1,-5.97,0.45,4,2 +CPG.LSE,Compass Group PLC CFD,USD,USD,USD,0,0,4,0,0.0001,1,1,1000,1,-5.97,0.45,4,2 +CRH.LSE,CRH PLC CFD,GBP,GBP,GBP,0,0,5,0,1.34835E-05,1,1,1000,1,-5.97,0.45,4,2 +DCC.LSE,DCC PLC CFD,GBP,GBP,GBP,0,0,5,0,1.34835E-05,1,1,1000,1,-5.97,0.45,4,2 +DGE.LSE,Diageo PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +EZJ.LSE,easyJet PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +EXPN.LSE,Experian PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +FRES.LSE,Fresnillo PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +GLEN.LSE,Glencore PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +GSK.LSE,GSK PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +HLMA.LSE,Halma PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +HSBA.LSE,HSBC Holdings PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +IAG.LSE,IAMGOLD Corp CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +IMB.LSE,Imperial Brands PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +INF.LSE,Informa PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +ITRK.LSE,Intertek Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +ITV.LSE,ITV PLC CFD,GBP,GBP,GBP,0,0,5,0,1.34835E-05,1,1,1000,1,-5.97,0.45,4,2 +JMAT.LSE,Johnson Matthey PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,3,2 +KGF.LSE,Kingfisher PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +LAND.LSE,Land Securities Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +LGEN.LSE,Legal & General Group PLC CFD,GBP,GBP,GBP,0,0,5,0,1.34835E-05,1,1,1000,1,-5.97,0.45,4,2 +LLOY.LSE,Lloyds Banking Group PLC CFD,GBP,GBP,GBP,0,0,5,0,1.34835E-05,1,1,1000,1,-5.97,0.45,4,2 +LSE.LSE,London Stock Exchange CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +MKS.LSE,Marks & Spencer Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +MRO.LSE,Marathon Oil Corp CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +MNDI.LSE,Mondi PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +NG.LSE,National Grid CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +NXT.LSE,Next PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +OCDO.LSE,Ocado Group PLC CFD,GBP,GBP,GBP,0,0,5,0,1.34835E-05,1,1,1000,1,-5.97,0.45,4,2 +FLTR.LSE,Flutter Entertainment PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +PSON.LSE,Pearson PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +PSN.LSE,Persimmon PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +PRU.LSE,Prudential PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +RB.LSE,Reckitt Benckiser CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +REL.LSE,RELX PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +RTO.LSE,Rentokil Initial PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +RIO.LSE,Rio Tinto PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +RR.LSE,Rolls-Royce CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SGE.LSE,Sage Group PLC/The CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SBRY.LSE,J Sainsbury PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SDR.LSE,Schroders PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SMT.LSE,Scottish Mortgage Investment Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SGRO.LSE,Segro PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SVT.LSE,Severn Trent PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +RDSB.LSE,Shell PLC (GB) CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SN.LSE,Smith & Nephew CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SMIN.LSE,Smiths Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SKG.LSE,Smurfit Kappa Group Ltd/Ireland CFD,GBP,GBP,GBP,0,0,5,0,1.34835E-05,1,1,1000,1,-5.97,0.45,4,2 +STAN.LSE,Standard Chartered PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +STJ.LSE,St James's Place PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +TSCO.LSE,Tesco PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +ULVR.LSE,Unilever PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +UU.LSE,United Utilities CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +VOD.LSE,Vodafone Group PLC CFD,GBP,GBP,GBP,0,0,5,0,1.34835E-05,1,1,1000,1,-5.97,0.45,4,2 +WTB.LSE,Whitbread PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +WPP.LSE,WPP PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +DRI.ETR,Darden Restaurants Inc CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +ADV.ETR,Adtran Networks SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +AIXA.ETR,AIXTRON SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +NDA.ETR,Aurubis AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +BC8.ETR,Bechtle AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +GBF.ETR,Bilfinger SE CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +BNR.ETR,Brenntag SE CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +COK.ETR,CANCOM SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +AFX.ETR,Carl Zeiss Meditec AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +CBK.ETR,Commerzbank AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +COP.ETR,CompuGroup Medical SE & Co KgaA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,3,2 +DBK.ETR,Deutsche Bank AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +DWNI.ETR,Deutsche Wohnen SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +DEZ.ETR,Deutz AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +DRW8.ETR,Draegerwerk AG & Co KGaA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,3,2 +ZIL2.ETR,ElringKlinger AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +EVK.ETR,Evonik Industries AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +EVT.ETR,Evotec SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +FRA.ETR,Fraport AG Frankfurt Airport Services Worldwide CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +FNTN.ETR,Freenet AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +G1A.ETR,GEA Group AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +GFT.ETR,GFT Technologies SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +HNR1.ETR,Hannover Rueck SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +HOT.ETR,HOCHTIEF AG CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +BOSS.ETR,HUGO BOSS AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +SDF.ETR,K+S AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +KGX.ETR,KION Group AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +KCO.ETR,Kloeckner & Co SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +KRN.ETR,Krones AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +LXS.ETR,LANXESS AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +LIN.ETR,Linde Plc (DE) CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +M5Z.ETR,Manz AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +MTX.ETR,MTU Aero Engines AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +NEM.ETR,Nemetschek SE CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +NDX1.ETR,Nordex SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +PFV.ETR,Pfeiffer Vacuum Technology AG CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +PSM.ETR,ProSiebenSat.1 Media SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +QIA.ETR,QIAGEN NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +RHM.ETR,Rheinmetall AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +RHK.ETR,RHOEN-KLINIKUM AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +RRTL.ETR,RTL Group SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +SZG.ETR,Salzgitter AG CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +SRT.ETR,Sartorius AG Vz CFD,EUR,EUR,EUR,0,0,2,0,0.0116423,1,1,1000,1,-4.18,-0.13,4,2 +SGL.ETR,SGL Carbon SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +WAF.ETR,Siltronic AG CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +SZU.ETR,Suedzucker AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +SMHN.ETR,SUSS MicroTec SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +SY1.ETR,Symrise AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +TEG.ETR,TAG Immobilien AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +TLX.ETR,Talanx AG CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +O2D.ETR,Telefonica Deutschland Holding AG CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,1,2 +TKA.ETR,thyssenkrupp AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +UN01.ETR,Uniper AG CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +UTDI.ETR,United Internet AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +WCH.ETR,Wacker Chemie AG CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +ZAL.ETR,Zalando SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +AF.PAR,Air France-KLM CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +ALO.PAR,Alstom SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +AKE.PAR,Arkema SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +BOL.PAR,Bollore SE CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +BVI.PAR,Bureau Veritas SA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +CO.PAR,Casino Guichard Perrachon SA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +CDI.PAR,Christian Dior SE CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,3,2 +EDEN.PAR,Edenred SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +FGR.PAR,Eiffage SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +FNAC.PAR,Fnac Darty SA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +MMB.PAR,Lagardere SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +MAU.PAR,Etablissements Maurel et Prom SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +RCO.PAR,Remy Cointreau SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +HO.PAR,Thales SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +UBI.PAR,Ubisoft Entertainment SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +VK.PAR,Vallourec SACA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +VCT.PAR,Vicat SACA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +AKZA.AMS,Akzo Nobel NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +SBMO.AMS,SBM Offshore NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +TOM2.AMS,TomTom NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +AUTO.LSE,Auto Trader Group PLC CFD,GBP,GBP,GBP,0,0,5,0,1.34835E-05,1,1,1000,1,-5.97,0.45,4,2 +BHP.LSE,BHP Group Ltd CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +CPI.LSE,Capita PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +HMSO.LSE,Hammerson PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +HAS.LSE,Hays PLC CFD,GBP,GBP,GBP,0,0,5,0,1.34835E-05,1,1,1000,1,-5.97,0.45,4,2 +IMI.LSE,IMI PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +JUP.LSE,Jupiter Fund Management PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +EMG.LSE,Man Group PLC/Jersey CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SRP.LSE,Serco Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +TPK.LSE,Travis Perkins PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +TLW.LSE,Tullow Oil PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,3,2 +ICAD.PAR,ICADE CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +JCDX.PAR,JCDecaux CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +FPE3.ETR,Fuchs Petrolub AG CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +PAH3.ETR,Porsche Automobil Holding SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +FUR.AMS,Fugro NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +WHA.AMS,Wereldhave NV CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +MTS.MAD,ArcelorMittal (ES) CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +OMU.LSE,Old Mutual Ltd CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,3,2 +ECMPA.AMS,Eurocommercial Properties NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +AMD.NAS,Advanced Micro Devices Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AKAM.NAS,Akamai Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ALGN.NAS,Align Technology Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LNT.NAS,Alliant Energy Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AAL.NAS,American Airlines Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AEP.NAS,American Electric Power Co Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +APA.NAS,APA Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ADSK.NAS,Autodesk Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +CHRW.NAS,CH Robinson Worldwide Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CDNS.NAS,Cadence Design Systems Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CDW.NAS,CDW Corp/DE CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CINF.NAS,Cincinnati Financial Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CTAS.NAS,Cintas Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CPRT.NAS,Copart Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +AAP.NYSE,Advance Auto Parts Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AES.NYSE,AES Corp/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AFL.NYSE,Aflac Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +A.NYSE,Agilent Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +APD.NYSE,Air Products and Chemicals Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ALK.NYSE,Alaska Air Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ALB.NYSE,Albemarle Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ARE.NYSE,Alexandria Real Estate Equities Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ALLE.NYSE,Allegion plc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ALL.NYSE,Allstate Corp/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMCR.NYSE,Amcor PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AEE.NYSE,Ameren Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AIG.NYSE,American International Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AWK.NYSE,American Water Works Co Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMP.NYSE,Ameriprise Financial Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AME.NYSE,AMETEK Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +APH.NYSE,Amphenol Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AON.NYSE,Aon PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AOS.NYSE,A O Smith Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +APTV.NYSE,Aptiv PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ADM.NYSE,Archer-Daniels-Midland Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ANET.NYSE,Arista Networks Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AJG.NYSE,Arthur J Gallagher & Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AIZ.NYSE,Assurant Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ATO.NYSE,Atmos Energy Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AZO.NYSE,AutoZone Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +AVB.NYSE,AvalonBay Communities Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AVY.NYSE,Avery Dennison Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BLL.NYSE,Ball Corp,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-2.59,-2.41,0,2 +BAX.NYSE,Baxter International Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BBY.NYSE,Best Buy Co Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +BIO.NYSE,Bio-Rad Laboratories Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BWA.NYSE,BorgWarner Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BXP.NYSE,BXP Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BSX.NYSE,Boston Scientific Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BR.NYSE,Broadridge Financial Solutions Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +COF.NYSE,Capital One Financial Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CAH.NYSE,Cardinal Health Inc CFD,USD,USD,USD,200.03,200.07,3,40,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KMX.NYSE,CarMax Inc CFD,USD,USD,USD,40.1,40.12,3,20,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CCL.NYSE,Carnival Corp CFD,USD,USD,USD,25.97,25.98,3,10,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CARR.NYSE,Carrier Global Corp CFD,USD,USD,USD,63.11,63.13,3,20,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CAT.NYSE,Caterpillar Inc CFD,USD,USD,USD,880.46,880.68,3,220,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CBRE.NYSE,CBRE Group Inc CFD,USD,USD,USD,131.07,131.18,3,110,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CE.NYSE,Celanese Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CNC.NYSE,Centene Corp CFD,USD,USD,USD,59.01,59.03,3,20,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CNP.NYSE,CenterPoint Energy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CF.NYSE,CF Industries Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SCHW.NYSE,Charles Schwab Corp/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CMG.NYSE,Chipotle Mexican Grill Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CB.NYSE,Chubb Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CHD.NYSE,Church & Dwight Co Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CI.NYSE,Cigna Group/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CFG.NYSE,Citizens Financial Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CLX.NYSE,Clorox Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CMS.NYSE,CMS Energy Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CL.NYSE,Colgate-Palmolive Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CAG.NYSE,Conagra Brands Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +COP.NYSE,ConocoPhillips CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ED.NYSE,Consolidated Edison Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STZ.NYSE,Constellation Brands Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GLW.NYSE,Corning Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CTVA.NYSE,Corteva Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CCI.NYSE,Crown Castle Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CMI.NYSE,Cummins Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DHI.NYSE,DR Horton Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DHR.NYSE,Danaher Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DRI.NYSE,Darden Restaurants Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DVA.NYSE,DaVita Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DE.NYSE,Deere & Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BFB.NYSE,Brown-Forman Corp.,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-2.59,-2.41,4,2 +ACN.NYSE,Accenture PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BF/B.NYSE,Brown-Forman Corp CFD,USD,USD,USD,26.16,26.17,3,10,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DAL.NYSE,Delta Air Lines Inc CFD,USD,USD,USD,76.16,76.19,3,30,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XRAY.NAS,DENTSPLY SIRONA Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DVN.NYSE,Devon Energy Corp CFD,USD,USD,USD,47.28,47.29,3,10,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DXCM.NAS,Dexcom Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +FANG.NAS,Diamondback Energy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DLR.NYSE,Digital Realty Trust Inc CFD,USD,USD,USD,191.88,191.96,3,80,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DG.NYSE,Dollar General Corp CFD,USD,USD,USD,105.76,105.83,3,70,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DLTR.NAS,Dollar Tree Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +D.NYSE,Dominion Energy Inc CFD,USD,USD,USD,67.85,67.86,3,10,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DPZ.NYSE,Domino's Pizza Inc CFD,USD,USD,USD,316.22,316.44,3,220,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DOV.NYSE,Dover Corp CFD,USD,USD,USD,210.29,210.38,3,90,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DTE.NYSE,DTE Energy Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DUK.NYSE,Duke Energy Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DXC.NYSE,DXC Technology Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EMN.NYSE,Eastman Chemical Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ETN.NYSE,Eaton Corp PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ECL.NYSE,Ecolab Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EIX.NYSE,Edison International CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EW.NYSE,Edwards Lifesciences Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EMR.NYSE,Emerson Electric Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ENPH.NAS,Enphase Energy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ETR.NYSE,Entergy Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EOG.NYSE,EOG Resources Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EFX.NYSE,Equifax Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EQR.NYSE,Equity Residential CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ESS.NYSE,Essex Property Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EL.NYSE,Estee Lauder Cos Inc/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ES.NYSE,Eversource Energy CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EXC.NAS,Exelon Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EXPE.NAS,Expedia Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EXR.NYSE,Extra Space Storage Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FFIV.NAS,F5 Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FAST.NAS,Fastenal Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FRT.NYSE,Federal Realty Investment Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FDX.NYSE,FedEx Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +FIS.NYSE,Fidelity National Information Services Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FITB.NAS,Fifth Third Bancorp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FE.NYSE,FirstEnergy Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FISV.NAS,Fiserv Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FLS.NYSE,Flowserve Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FMC.NYSE,FMC Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +F.NYSE,Ford Motor Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FTNT.NAS,Fortinet Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +FTV.NYSE,Fortive Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FCX.NYSE,Freeport-McMoRan Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IT.NYSE,Gartner Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BEN.NYSE,Franklin Resources Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GD.NYSE,General Dynamics Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GIS.NYSE,General Mills Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GM.NYSE,General Motors Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GPC.NAS,Genuine Parts Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GL.NYSE,Globe Life Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GPN.NYSE,Global Payments Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GWW.NYSE,WW Grainger Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HAL.NYSE,Halliburton Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HIG.NYSE,Hartford Insurance Group Inc/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HAS.NAS,Hasbro Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HCA.NYSE,HCA Healthcare Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HSIC.NAS,Henry Schein Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HSY.NYSE,Hershey Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HPE.NYSE,Hewlett Packard Enterprise Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HLT.NYSE,Hilton Worldwide Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HRL.NYSE,Hormel Foods Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +HST.NAS,Host Hotels & Resorts Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HWM.NYSE,Howmet Aerospace Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HPQ.NYSE,HP Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +HUM.NYSE,Humana Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HBAN.NAS,Huntington Bancshares Inc/OH CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HII.NYSE,Huntington Ingalls Industries Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IEX.NYSE,IDEX Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IDXX.NAS,IDEXX Laboratories Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +ITW.NYSE,Illinois Tool Works Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ILMN.NAS,Illumina Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +INCY.NAS,Incyte Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +IR.NYSE,Ingersoll Rand Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ICE.NYSE,Intercontinental Exchange Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IP.NYSE,International Paper Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IFF.NYSE,International Flavors & Fragrances Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IVZ.NYSE,Invesco Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IPGP.NAS,IPG Photonics Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +NI.NYSE,NiSource Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IQV.NYSE,IQVIA Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IRM.NYSE,Iron Mountain Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +J.NYSE,Jacobs Solutions Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +JBHT.NAS,JB Hunt Transport Services Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SJM.NYSE,J M Smucker Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +JCI.NYSE,Johnson Controls International plc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KEY.NYSE,KeyCorp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KEYS.NYSE,Keysight Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KIM.NYSE,Kimco Realty Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KMI.NYSE,Kinder Morgan Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KLAC.NAS,KLA Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KR.NYSE,Kroger Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LB.NYSE,L Brands Inc.,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-2.59,-2.41,0,2 +LHX.NYSE,L3Harris Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LH.NYSE,Labcorp Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LRCX.NAS,Lam Research Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LW.NYSE,Lamb Weston Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LVS.NYSE,Las Vegas Sands Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LEG.NYSE,Leggett & Platt Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LDOS.NYSE,Leidos Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LEN.NYSE,Lennar Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LNC.NYSE,Lincoln National Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LYV.NYSE,Live Nation Entertainment Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +L.NYSE,Loews Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LOW.NYSE,Lowe's Cos Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LUMN.NYSE,Lumen Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LYB.NYSE,LyondellBasell Industries NV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MTB.NYSE,M&T Bank Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MPC.NYSE,Marathon Petroleum Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MLM.NYSE,Martin Marietta Materials Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MAS.NYSE,Masco Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MKC.NYSE,McCormick & Co Inc/MD CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MCK.NYSE,McKesson Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MDT.NYSE,Medtronic PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MET.NYSE,MetLife Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MTD.NYSE,Mettler-Toledo International Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MGM.NYSE,MGM Resorts International CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MCHP.NAS,Microchip Technology Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MAA.NYSE,Mid-America Apartment Communities Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MHK.NYSE,Mohawk Industries Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TAP.NYSE,Molson Coors Beverage Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MNST.NAS,Monster Beverage Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MCO.NYSE,Moody's Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MOS.NYSE,Mosaic Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MSI.NYSE,Motorola Solutions Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MSCI.NYSE,MSCI Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NDAQ.NAS,Nasdaq Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NTAP.NAS,NetApp Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +NWL.NAS,Newell Brands Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NEM.NYSE,Newmont Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NWSA.NAS,News Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NWS.NAS,News Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NSC.NYSE,Norfolk Southern Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NTRS.NAS,Northern Trust Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NOC.NYSE,Northrop Grumman Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NCLH.NYSE,Norwegian Cruise Line Holdings Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NOV.NYSE,NOV Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NRG.NYSE,NRG Energy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NUE.NYSE,Nucor Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NVR.NYSE,NVR Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ORLY.NAS,O'Reilly Automotive Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OXY.NYSE,Occidental Petroleum Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OMC.NYSE,Omnicom Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OKE.NYSE,ONEOK Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OTIS.NYSE,Otis Worldwide Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PCAR.NAS,PACCAR Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PKG.NYSE,Packaging Corp of America CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PH.NYSE,Parker-Hannifin Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PAYX.NAS,Paychex Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PAYC.NYSE,Paycom Software Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PNR.NYSE,Pentair PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PBCT.NAS,People's United Financial,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-2.59,-2.41,3,2 +PRGO.NYSE,Perrigo Co PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PSX.NYSE,Phillips 66 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PNW.NYSE,Pinnacle West Capital Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PNC.NYSE,PNC Financial Services Group Inc/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PPG.NYSE,PPG Industries Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PPL.NYSE,PPL Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PFG.NAS,Principal Financial Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PGR.NYSE,Progressive Corp/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PLD.NYSE,Prologis Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PRU.NYSE,Prudential Financial Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PEG.NYSE,Public Service Enterprise Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PSA.NYSE,Public Storage CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PHM.NYSE,PulteGroup Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PVH.NYSE,PVH Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PWR.NYSE,Quanta Services Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DGX.NYSE,Quest Diagnostics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RJF.NYSE,Raymond James Financial Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RYN.NYSE,Rayonier Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +O.NYSE,Realty Income Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +REG.NAS,Regency Centers Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RF.NYSE,Regions Financial Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RSG.NYSE,Republic Services Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RMD.NYSE,ResMed Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RHI.NYSE,Robert Half Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ROK.NYSE,Rockwell Automation Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ROL.NYSE,Rollins Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ROST.NAS,Ross Stores Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RCL.NYSE,Royal Caribbean Cruises Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SPGI.NYSE,S&P Global Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CRM.NYSE,Salesforce Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STX.NAS,Seagate Technology Holdings PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SRE.NYSE,Sempra CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NOW.NYSE,ServiceNow Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SPG.NYSE,Simon Property Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SLG.NYSE,SL Green Realty Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SNA.NYSE,Snap-on Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SO.NYSE,Southern Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LUV.NYSE,Southwest Airlines Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SWK.NYSE,Stanley Black & Decker Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STT.NYSE,State Street Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STE.NYSE,STERIS PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SYK.NYSE,Stryker Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SYF.NYSE,Synchrony Financial CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SYY.NYSE,Sysco Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TROW.NAS,T Rowe Price Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TPR.NYSE,Tapestry Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TGT.NYSE,Target Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TEL.NYSE,TE Connectivity PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FTI.NYSE,TechnipFMC PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TDY.NYSE,Teledyne Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TFX.NYSE,Teleflex Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TER.NAS,Teradyne Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TXT.NYSE,Textron Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TJX.NYSE,TJX Cos Inc/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TT.NYSE,Trane Technologies PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TDG.NYSE,TransDigm Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TRV.NYSE,Travelers Cos Inc/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TFC.NYSE,Truist Financial Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TYL.NYSE,Tyler Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TSN.NYSE,Tyson Foods Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UDR.NYSE,UDR Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ULTA.NAS,Ulta Beauty Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UAA.NYSE,Under Armour Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UA.NYSE,Under Armour Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UAL.NAS,United Airlines Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +URI.NYSE,United Rentals Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UHS.NYSE,Universal Health Services Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UNM.NYSE,Unum Group CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VLO.NYSE,Valero Energy Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VTR.NYSE,Ventas Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VRSN.NAS,VeriSign Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VFC.NYSE,VF Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VTRS.NAS,Viatris Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VNO.NYSE,Vornado Realty Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VMC.NYSE,Vulcan Materials Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WRB.NYSE,W R Berkley Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WAB.NYSE,Westinghouse Air Brake Technologies Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WM.NYSE,Waste Management Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WAT.NYSE,Waters Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WEC.NYSE,WEC Energy Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WELL.NYSE,Welltower Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WST.NYSE,West Pharmaceutical Services Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WU.NYSE,Western Union Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WY.NYSE,Weyerhaeuser Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WHR.NYSE,Whirlpool Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WMB.NYSE,Williams Cos Inc/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WLTW.NAS,Willis Towers Watson CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WYNN.NAS,Wynn Resorts Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XEL.NAS,Xcel Energy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XYL.NYSE,Xylem Inc/NY CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +YUM.NYSE,Yum! Brands Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ZBH.NYSE,Zimmer Biomet Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ZION.NAS,Zions Bancorp NA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ZTS.NYSE,Zoetis Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +JKHY.NAS,Jack Henry & Associates Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +LKQ.NAS,LKQ Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MKTX.NAS,MarketAxess Holdings Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +ODFL.NAS,Old Dominion Freight Line Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +POOL.NAS,Pool Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +QRVO.NAS,Qorvo Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +RDWR.NAS,Radware Ltd CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SBAC.NAS,SBA Communications Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SWKS.NAS,Skyworks Solutions Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SNPS.NAS,Synopsys Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,3,2 +TTWO.NAS,Take-Two Interactive Software Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +TSCO.NAS,Tractor Supply Co CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +TRMB.NAS,Trimble Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +VRSK.NAS,Verisk Analytics Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +ZBRA.NAS,Zebra Technologies Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SE.NYSE,Sea Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RTX.NYSE,RTX Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SNAP.NYSE,Snap Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SNOW.NYSE,Snowflake Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +SCCO.NYSE,Southern Copper Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CVNA.NYSE,Carvana Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BX.NYSE,Blackstone Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EPD.NYSE,Enterprise Products Partners LP CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TDOC.NYSE,Teladoc Health Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RKT.NYSE,Rocket Cos Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PANW.NYSE,Palo Alto Networks Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +W.NYSE,Wayfair Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KKR.NYSE,KKR & Co Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NET.NYSE,Cloudflare Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +YUMC.NYSE,Yum China Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MPLX.NYSE,MPLX LP CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PCG.NYSE,PG&E Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HUBS.NYSE,HubSpot Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EPAM.NYSE,EPAM Systems Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UI.NYSE,Ubiquiti Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GNRC.NYSE,Generac Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ET.NYSE,Energy Transfer LP CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TRU.NYSE,TransUnion CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HEI.NYSE,HEICO Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +INVH.NYSE,Invitation Homes Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SUI.NYSE,Sun Communities Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ALLY.NYSE,Ally Financial Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MKL.NYSE,Markel Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DT.NYSE,Dynatrace Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ESTC.NYSE,Elastic NV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +CRL.NYSE,Charles River Laboratories International Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GDDY.NYSE,GoDaddy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SAM.NYSE,Boston Beer Co Inc/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ELAN.NYSE,Elanco Animal Health Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FICO.NYSE,Fair Isaac Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SMG.NYSE,Scotts Miracle-Gro Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CCK.NYSE,Crown Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MOH.NYSE,Molina Healthcare Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BRO.NYSE,Brown & Brown Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WPC.NYSE,WP Carey Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TREX.NYSE,Trex Co Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EQH.NYSE,Equitable Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FDS.NYSE,FactSet Research Systems Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NLY.NYSE,Annaly Capital Management Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FNF.NYSE,Fidelity National Financial Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MTN.NYSE,Vail Resorts Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +APO.NYSE,Apollo Global Management Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WTRG.NYSE,Essential Utilities Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ELS.NYSE,Equity LifeStyle Properties Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BAH.NYSE,Booz Allen Hamilton Holding Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RPM.NYSE,RPM International Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LII.NYSE,Lennox International Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DAR.NYSE,Darling Ingredients Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WLK.NYSE,Westlake Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TTC.NYSE,Toro Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +BG.NYSE,Bunge Global SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BFAM.NYSE,Bright Horizons Family Solutions Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GWRE.NYSE,Guidewire Software Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CPT.NYSE,Camden Property Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LAD.NYSE,Lithia Motors Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RH.NYSE,RH CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TWLO.NYSE,Twilio Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ABNB.NAS,Airbnb Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AFRM.NAS,Affirm Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ALNY.NAS,Alnylam Pharmaceuticals Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +APPN.NAS,Appian Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BMRN.NAS,BioMarin Pharmaceutical Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +BSY.NAS,Bentley Systems Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BYND.NAS,Beyond Meat Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CG.NAS,Carlyle Group Inc/The CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CGNX.NAS,Cognex Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CRWD.NAS,Crowdstrike Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CSGP.NAS,CoStar Group Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CZR.NAS,Caesars Entertainment Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DBX.NAS,Dropbox Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DDOG.NAS,Datadog Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DKNG.NAS,DraftKings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DOCU.NAS,Docusign Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ENTG.NAS,Entegris Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +ERIE.NAS,Erie Indemnity Co CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +FIVE.NAS,Five Below Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FIVN.NAS,Five9 Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FSLR.NAS,First Solar Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FWONK.NAS,Liberty Media Corp-Liberty Formula One CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GDRX.NAS,GoodRx Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GLPI.NAS,Gaming and Leisure Properties Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IAC.NAS,IAC Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IBKR.NAS,Interactive Brokers Group Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +IEP.NAS,Icahn Enterprises LP CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KDP.NAS,Keurig Dr Pepper Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LBRDA.NAS,Liberty Broadband Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LBRDK.NAS,Liberty Broadband Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LOGI.NAS,Logitech International SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LPLA.NAS,LPL Financial Holdings Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MASI.NAS,Masimo Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MDB.NAS,MongoDB Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +MORN.NAS,Morningstar Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MPWR.NAS,Monolithic Power Systems Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MRNA.NAS,Moderna Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MTCH.NAS,Match Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NBIX.NAS,Neurocrine Biosciences Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +NDSN.NAS,Nordson Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +NTRA.NAS,Natera Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NVAX.NAS,Novavax Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OKTA.NAS,Okta Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +OLED.NAS,Universal Display Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +ON.NAS,ON Semiconductor Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +OPEN.NAS,Opendoor Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PCTY.NAS,Paylocity Holding Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PEGA.NAS,Pegasystems Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +PENN.NAS,Penn Entertainment Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +PLUG.NAS,Plug Power Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PODD.NAS,Insulet Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +PTC.NAS,PTC Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +PTON.NAS,Peloton Interactive Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RGEN.NAS,Repligen Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ROKU.NAS,Roku Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RPRX.NAS,Royalty Pharma PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RUN.NAS,Sunrun Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SIRI.NAS,Sirius XM Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SSNC.NAS,SS&C Technologies Holdings Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +TECH.NAS,Bio-Techne Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +TTD.NAS,Trade Desk Inc/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WDAY.NAS,Workday Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WMG.NAS,Warner Music Group Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +Z.NAS,Zillow Group Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +ZG.NAS,Zillow Group Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +ZM.NAS,Zoom Communications Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ZS.NAS,Zscaler Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +MUX.NYSE,McEwen Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.01,1000,0.01,-5.88,0.98,4,2 +CIG.NYSE,Cia Energetica de Minas Gerais CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1300,0.1,-5.88,0.98,4,2 +LYG.NYSE,Lloyds Banking Group PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TTI.NYSE,TETRA Technologies Inc CFD,USD,USD,USD,0,0,5,0,0.00001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ABEV.NYSE,Ambev SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BBAR.NYSE,Banco BBVA Argentina SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +KOS.NYSE,Kosmos Energy Ltd CFD,USD,USD,USD,0,0,5,0,0.00001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GNW.NYSE,Genworth Financial Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RIG.NYSE,Transocean Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NAT.NYSE,Nordic American Tankers Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +SAN.NYSE,Banco Santander SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WTI.NYSE,W&T Offshore Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NOK.NYSE,Nokia Oyj CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MITT.NYSE,TPG Mortgage Investment Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IVR.NYSE,Invesco Mortgage Capital Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MFA.NYSE,MFA Financial Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BBD.NYSE,Banco Bradesco SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SWN.NYSE,Southwestern Energy Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ITUB.NYSE,Itau Unibanco Holding SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HMY.NYSE,Harmony Gold Mining Co Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HLX.NYSE,Helix Energy Solutions Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EXK.NYSE,Endeavour Silver Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ARCO.NYSE,Arcos Dorados Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CRK.NYSE,Comstock Resources Inc CFD,USD,USD,USD,0,0,4,0,0.0001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GGB.NYSE,Gerdau SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GEO.NYSE,GEO Group Inc/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DHT.NYSE,DHT Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMRX.NYSE,Amneal Pharmaceuticals Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +AIV.NYSE,Apartment Investment and Management Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BKD.NYSE,Brookdale Senior Living Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PHK.NYSE,PIMCO High Income Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FSM.NYSE,Fortuna Mining Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CX.NYSE,Cemex SAB de CV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KGC.NYSE,Kinross Gold Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TWO.NYSE,Two Harbors Investment Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SBS.NYSE,Cia de Saneamento Basico do Estado de Sao Paulo SABESP CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AGRO.NYSE,Adecoagro SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PBI.NYSE,Pitney Bowes Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PBR.NYSE,Petroleo Brasileiro SA - Petrobras CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +COTY.NYSE,Coty Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BW.NYSE,Babcock & Wilcox Enterprises Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AM.NYSE,Antero Midstream Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ADT.NYSE,ADT Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UMC.NYSE,United Microelectronics Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NVGS.NYSE,Navigator Holdings Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BB.NYSE,BlackBerry Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CDE.NYSE,Coeur Mining Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GEL.NYSE,Genesis Energy LP CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BDJ.NYSE,BlackRock Enhanced Equity Dividend Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AROC.NYSE,Archrock Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TV.NYSE,Grupo Televisa SAB CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TWI.NYSE,Titan International Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CMRE.NYSE,Costamare Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +DNOW.NYSE,DNOW Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RYAM.NYSE,Rayonier Advanced Materials Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RRC.NYSE,Range Resources Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GFI.NYSE,Gold Fields Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AR.NYSE,Antero Resources Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +INN.NYSE,Summit Hotel Properties Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BCS.NYSE,Barclays PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RWT.NYSE,Redwood Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PUMP.NYSE,ProPetro Holding Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RPAI.NYSE,Retail Properties of America I,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-2.59,-2.41,0,2 +EGO.NYSE,Eldorado Gold Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FBP.NYSE,First BanCorp/Puerto Rico CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ESRT.NYSE,Empire State Realty Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FPI.NYSE,Farmland Partners Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TEVA.NYSE,Teva Pharmaceutical Industries Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LXP.NYSE,LXP Industrial Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LBRT.NYSE,Liberty Energy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HYLN.NYSE,Hyliion Holdings Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MGY.NYSE,Magnolia Oil & Gas Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HYT.NYSE,BlackRock Corporate High Yield Fund Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TALO.NYSE,Talos Energy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ARR.NYSE,ARMOUR Residential REIT Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CYH.NYSE,Community Health Systems Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DB.NYSE,Deutsche Bank AG CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ING.NYSE,ING Groep NV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SHO.NYSE,Sunstone Hotel Investors Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EC.NYSE,Ecopetrol SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CIM.NYSE,Chimera Investment Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BDN.NYSE,Brandywine Realty Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SCM.NYSE,Stellus Capital Investment Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CARS.NYSE,Cars.com Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CLDT.NYSE,Chatham Lodging Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SITC.NYSE,SITE Centers Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMX.NYSE,America Movil SAB de CV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MWA.NYSE,Mueller Water Products Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EVRI.NYSE,Everi Holdings Inc,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PBF.NYSE,PBF Energy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EDU.NYSE,New Oriental Education & Technology Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OI.NYSE,O-I Glass Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CNX.NYSE,CNX Resources Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +YEXT.NYSE,Yext Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KAR.NYSE,KAR Auction Services Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +VLRS.NYSE,Controladora Vuela Cia de Aviacion SAB de CV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +USAC.NYSE,USA Compression Partners LP CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IRT.NYSE,Independence Realty Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RLJ.NYSE,RLJ Lodging Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +M.NYSE,Macy's Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ABR.NYSE,Arbor Realty Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KRO.NYSE,Kronos Worldwide Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MUR.NYSE,Murphy Oil Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HTGC.NYSE,Hercules Capital Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AG.NYSE,First Majestic Silver Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UE.NYSE,Urban Edge Properties CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MANU.NYSE,Manchester United Plc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +SA.NYSE,Seabridge Gold Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +AMWL.NYSE,American Well Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CCJ.NYSE,Cameco Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TAK.NYSE,Takeda Pharmaceutical Co Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PDM.NYSE,Piedmont Realty Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SM.NYSE,SM Energy Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VST.NYSE,Vistra Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DBI.NYSE,Designer Brands Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EQT.NYSE,EQT Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CCU.NYSE,Cia Cervecerias Unidas SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CLF.NYSE,Cleveland-Cliffs Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TPC.NYSE,Tutor Perini Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STNG.NYSE,Scorpio Tankers Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VALE.NYSE,Vale SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PTY.NYSE,PIMCO Corporate & Income Opportunity Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SBSW.NYSE,Sibanye Stillwater Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +GPK.NYSE,Graphic Packaging Holding Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GNL.NYSE,Global Net Lease Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SRG.NYSE,Seritage Growth Properties CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +DX.NYSE,Dynex Capital Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +INFY.NYSE,Infosys Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GTN.NYSE,Gray Media Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CVI.NYSE,CVR Energy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AKR.NYSE,Acadia Realty Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EQNR.NYSE,Equinor ASA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SBH.NYSE,Sally Beauty Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TME.NYSE,Tencent Music Entertainment Group CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TECK.NYSE,Teck Resources Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TGNA.NYSE,TEGNA Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TROX.NYSE,Tronox Holdings PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BRX.NYSE,Brixmor Property Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KW.NYSE,Kennedy-Wilson Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CAL.NYSE,Caleres Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FSK.NYSE,FS KKR Capital Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MTW.NYSE,Manitowoc Co Inc/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PK.NYSE,Park Hotels & Resorts Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IMAX.NYSE,IMAX Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FLR.NYSE,Fluor Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OUT.NYSE,Outfront Media Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AU.NYSE,Anglogold Ashanti Plc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ATI.NYSE,ATI Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DK.NYSE,Delek US Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HRB.NYSE,H&R Block Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CNK.NYSE,Cinemark Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ORI.NYSE,Old Republic International Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RDN.NYSE,Radian Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EPRT.NYSE,Essential Properties Realty Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BOX.NYSE,Box Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +MTDR.NYSE,Matador Resources Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PEB.NYSE,Pebblebrook Hotel Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FLO.NYSE,Flowers Foods Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DAN.NYSE,Dana Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BSAC.NYSE,Banco Santander Chile CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STWD.NYSE,Starwood Property Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LEVI.NYSE,Levi Strauss & Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MD.NYSE,Pediatrix Medical Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CNO.NYSE,CNO Financial Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DDD.NYSE,3D Systems Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BE.NYSE,Bloom Energy Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HOME.NYSE,At Home Group Inc,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-2.59,-2.41,4,2 +MX.NYSE,Magnachip Semiconductor Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HP.NYSE,Helmerich & Payne Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ELF.NYSE,elf Beauty Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SKM.NYSE,SK Telecom Co Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HPP.NYSE,Hudson Pacific Properties Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NOMD.NYSE,Nomad Foods Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FCPT.NYSE,Four Corners Property Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CWEN.NYSE,Clearway Energy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HUN.NYSE,Huntsman Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ZTO.NYSE,ZTO Express Cayman Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CC.NYSE,Chemours Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PBA.NYSE,Pembina Pipeline Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GTY.NYSE,Getty Realty Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SPCE.NYSE,Virgin Galactic Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +HMC.NYSE,Honda Motor Co Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HSBC.NYSE,HSBC Holdings PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AXTA.NYSE,Axalta Coating Systems Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VIPS.NYSE,Vipshop Holdings Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AVTR.NYSE,Avantor Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +JEF.NYSE,Jefferies Financial Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AEO.NYSE,American Eagle Outfitters Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +HR.NYSE,Healthcare Realty Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CMC.NYSE,Commercial Metals Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BXMT.NYSE,Blackstone Mortgage Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TRGP.NYSE,Targa Resources Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AA.NYSE,Alcoa Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TMHC.NYSE,Taylor Morrison Home Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LRN.NYSE,Stride Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +JBGS.NYSE,JBG SMITH Properties CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DEI.NYSE,Douglas Emmett Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AAT.NYSE,American Assets Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ASAN.NYSE,Asana Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +AMH.NYSE,American Homes 4 Rent CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MMI.NYSE,Marcus & Millichap Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STAG.NYSE,STAG Industrial Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CUZ.NYSE,Cousins Properties Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UNFI.NYSE,United Natural Foods Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +ANF.NYSE,Abercrombie & Fitch Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +JMIA.NYSE,Jumia Technologies AG CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KBR.NYSE,KBR Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HGV.NYSE,Hilton Grand Vacations Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PLT.NYSE,Plantronics Inc,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-2.59,-2.41,4,2 +NIO.NYSE,NIO Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BTI.NYSE,British American Tobacco PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +USFD.NYSE,US Foods Holding Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OHI.NYSE,Omega Healthcare Investors Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NCR.NYSE,NCR CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ARMK.NYSE,Aramark CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GVA.NYSE,Granite Construction Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EPC.NYSE,Edgewell Personal Care Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CUBE.NYSE,CubeSmart CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +COLD.NYSE,Americold Realty Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TX.NYSE,Ternium SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OLN.NYSE,Olin Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TDC.NYSE,Teradata Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +YELP.NYSE,Yelp Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HOG.NYSE,Harley-Davidson Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NSA.NYSE,National Storage Affiliates Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MAIN.NYSE,Main Street Capital Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RMAX.NYSE,RE/MAX Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PD.NYSE,PagerDuty Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +UGI.NYSE,UGI Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KMT.NYSE,Kennametal Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VVI.NYSE,Viad Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +JOE.NYSE,St Joe Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PRG.NYSE,PROG Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HIW.NYSE,Highwoods Properties Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LTC.NYSE,LTC Properties Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BDC.NYSE,Belden Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HLF.NYSE,Herbalife Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BAM.NYSE,Brookfield Asset Management Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NNN.NYSE,NNN REIT Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BJ.NYSE,BJ's Wholesale Club Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LAZ.NYSE,Lazard Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FR.NYSE,First Industrial Realty Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AJRD.NYSE,Aerojet Rocketdyne Holdings Inc,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ENR.NYSE,Energizer Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RVLV.NYSE,Revolve Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GDOT.NYSE,Green Dot Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PAGS.NYSE,Pagseguro Digital Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ESNT.NYSE,Essent Group Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMRC.NYSE,Ameresco Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KBH.NYSE,KB Home CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EPR.NYSE,EPR Properties CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NYT.NYSE,New York Times Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SAH.NYSE,Sonic Automotive Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KNX.NYSE,Knight-Swift Transportation Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CPRI.NYSE,Capri Holdings Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +THC.NYSE,Tenet Healthcare Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ABM.NYSE,ABM Industries Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SCI.NYSE,Service Corp International/US CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NUS.NYSE,Nu Skin Enterprises Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +REXR.NYSE,Rexford Industrial Realty Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +JBL.NYSE,Jabil Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HASI.NYSE,HA Sustainable Infrastructure Capital Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BIP.NYSE,Brookfield Infrastructure Partners LP CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CIEN.NYSE,Ciena Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HXL.NYSE,Hexcel Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GEF.NYSE,Greif Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PFGC.NYSE,Performance Food Group Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FAF.NYSE,First American Financial Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DCI.NYSE,Donaldson Co Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UVV.NYSE,Universal Corp/VA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +TOL.NYSE,Toll Brothers Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AER.NYSE,AerCap Holdings NV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LPX.NYSE,Louisiana-Pacific Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TRNO.NYSE,Terreno Realty Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KSS.NYSE,Kohl's Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +XEC.NYSE,Cimarex Energy Co,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-2.59,-2.41,3,2 +BYD.NYSE,Boyd Gaming Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GMED.NYSE,Globus Medical Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BUD.NYSE,Anheuser-Busch InBev SA/NV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SON.NYSE,Sonoco Products Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BOOT.NYSE,Boot Barn Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ACM.NYSE,AECOM CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KRC.NYSE,Kilroy Realty Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ADC.NYSE,Agree Realty Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EAT.NYSE,Brinker International Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UHT.NYSE,Universal Health Realty Income Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ONTO.NYSE,Onto Innovation Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CUB.NYSE,Cubic Corp,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-2.59,-2.41,4,2 +YETI.NYSE,YETI Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ORA.NYSE,Ormat Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +R.NYSE,Ryder System Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SXT.NYSE,Sensient Technologies Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GKOS.NYSE,Glaukos Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BCO.NYSE,Brink's Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PAG.NYSE,Penske Automotive Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EHC.NYSE,Encompass Health Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DKS.NYSE,Dick's Sporting Goods Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +EBS.NYSE,Emergent BioSolutions Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CHWY.NYSE,Chewy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WGO.NYSE,Winnebago Industries Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CPA.NYSE,Copa Holdings SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PLNT.NYSE,Planet Fitness Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GIB.NYSE,CGI Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NSP.NYSE,Insperity Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +H.NYSE,Hyatt Hotels Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AIN.NYSE,Albany International Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WCC.NYSE,WESCO International Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NVS.NYSE,Novartis AG CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CHGG.NYSE,Chegg Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SPB.NYSE,Spectrum Brands Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DIN.NYSE,Dine Brands Global Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ASH.NYSE,Ashland Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +INGR.NYSE,Ingredion Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AN.NYSE,AutoNation Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LMND.NYSE,Lemonade Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DELL.NYSE,Dell Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +CRI.NYSE,Carter's Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MTH.NYSE,Meritage Homes Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ENS.NYSE,EnerSys CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NBR.NYSE,Nabors Industries Ltd CFD,USD,USD,USD,0,0,5,0,0.00001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ATHM.NYSE,Autohome Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +MTZ.NYSE,MasTec Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BMI.NYSE,Badger Meter Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DDS.NYSE,Dillard's Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BC.NYSE,Brunswick Corp/DE CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +U.NYSE,Unity Software Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IDA.NYSE,IDACORP Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +USNA.NYSE,USANA Health Sciences Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +QTWO.NYSE,Q2 Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ARW.NYSE,Arrow Electronics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HAE.NYSE,Haemonetics Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EME.NYSE,EMCOR Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SHAK.NYSE,Shake Shack Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AFG.NYSE,American Financial Group Inc/OH CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IBP.NYSE,Installed Building Products Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OSK.NYSE,Oshkosh Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SNX.NYSE,TD SYNNEX Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +COR.NYSE,Cencora Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RL.NYSE,Ralph Lauren Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RGA.NYSE,Reinsurance Group of America Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CNMD.NYSE,CONMED Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +THG.NYSE,Hanover Insurance Group Inc/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +THO.NYSE,Thor Industries Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PII.NYSE,Polaris Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FCN.NYSE,FTI Consulting Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MUSA.NYSE,Murphy USA Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AGCO.NYSE,AGCO Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EGP.NYSE,EastGroup Properties Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMG.NYSE,Affiliated Managers Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RS.NYSE,Reliance Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GPI.NYSE,Group 1 Automotive Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RNR.NYSE,RenaissanceRe Holdings Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AYI.NYSE,Acuity Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VAC.NYSE,Marriott Vacations Worldwide Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WSM.NYSE,Williams-Sonoma Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +JLL.NYSE,Jones Lang LaSalle Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LEA.NYSE,Lear Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MSGS.NYSE,Madison Square Garden Sports Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +HUBB.NYSE,Hubbell Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IIPR.NYSE,Innovative Industrial Properties Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +INSP.NYSE,Inspire Medical Systems Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WEX.NYSE,WEX Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MED.NYSE,Medifast Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FVRR.NYSE,Fiverr International Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VEEV.NYSE,Veeva Systems Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WSO.NYSE,Watsco Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PEN.NYSE,Penumbra Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ALX.NYSE,Alexander's Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RNG.NYSE,RingCentral Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BURL.NYSE,Burlington Stores Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +DECK.NYSE,Deckers Outdoor Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CHE.NYSE,Chemed Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GHC.NYSE,Graham Holdings Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MAN.NYSE,ManpowerGroup Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MAC.NYSE,Macerich Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TAL.NYSE,TAL Education Group CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SNDL.NAS,SNDL Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TNXP.NAS,Tonix Pharmaceuticals Holding Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TXMD.NAS,TherapeuticsMD Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +GERN.NAS,Geron Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +JFU.NAS,9F Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +VEON.NAS,VEON Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CRBP.NAS,Corbus Pharmaceuticals Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NBEV.NAS,New Age Beverages Corporation,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +NERV.NAS,Minerva Neurosciences Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VSTM.NAS,Verastem Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AGEN.NAS,Agenus Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ABUS.NAS,Arbutus Biopharma Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +RIGL.NAS,Rigel Pharmaceuticals Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +IFRX.NAS,InflaRx NV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OVID.NAS,Ovid therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CRNT.NAS,Ceragon Networks Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WATT.NAS,Energous Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +GNPX.NAS,Genprex Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MNKD.NAS,MannKind Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TRVG.NAS,Trivago NV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VRAY.NAS,ViewRay Inc,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OPK.NAS,OPKO Health Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CPRX.NAS,Catalyst Pharmaceuticals Inc CFD,USD,USD,USD,0,0,4,0,0.0001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NCMI.NAS,National CineMedia Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +IZEA.NAS,IZEA Worldwide Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VYGR.NAS,Voyager Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ARAY.NAS,Accuray Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LXRX.NAS,Lexicon Pharmaceuticals Inc CFD,USD,USD,USD,0,0,4,0,0.0001,1,0.1,1000,0.1,-5.88,0.98,3,2 +FRSX.NAS,Foresight Autonomous Holdings Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CERS.NAS,Cerus Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VKTX.NAS,Viking Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WIMI.NAS,WiMi Hologram Cloud Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +XNET.NAS,Xunlei Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +KNDI.NAS,Kandi Technologies Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PRQR.NAS,ProQR Therapeutics NV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VYNE.NAS,VYNE Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CNDT.NAS,Conduent Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PTEN.NAS,Patterson-UTI Energy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AYTU.NAS,Aytu BioPharma Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PGEN.NAS,Precigen Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BNGO.NAS,Bionano Genomics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +OCGN.NAS,Ocugen Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NNDM.NAS,Nano Dimension Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PSEC.NAS,Prospect Capital Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +HLIT.NAS,Harmonic Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +GEVO.NAS,Gevo Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +INO.NAS,Inovio Pharmaceuticals Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DTIL.NAS,Precision BioSciences Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +INSG.NAS,Inseego Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +GOSS.NAS,Gossamer Bio Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +PAA.NAS,Plains All American Pipeline LP CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CODX.NAS,Co-Diagnostics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EGAN.NAS,eGain Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FOLD.NAS,Amicus Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PBYI.NAS,Puma Biotechnology Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PAGP.NAS,Plains GP Holdings LP CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SY.NAS,So-Young International Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CRMD.NAS,CorMedix Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GOGO.NAS,Gogo Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DOYU.NAS,DouYu International Holdings Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GLAD.NAS,Gladstone Capital Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NMRK.NAS,Newmark Group Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +BCRX.NAS,BioCryst Pharmaceuticals Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +QIWI.NAS,QIWI plc,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +NDLS.NAS,Noodles & Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OSUR.NAS,OraSure Technologies Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +GLNG.NAS,Golar LNG Ltd CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +VRA.NAS,Vera Bradley Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +UNIT.NAS,Uniti Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CAMP.NAS,CAMP4 Therapeutics Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +CRIS.NAS,Curis Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +SVC.NAS,Service Properties Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GPRO.NAS,GoPro Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ALDX.NAS,Aldeyra Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FOSL.NAS,Fossil Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CWCO.NAS,Consolidated Water Co Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FCEL.NAS,FuelCell Energy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ERIC.NAS,Telefonaktiebolaget LM Ericsson CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WKHS.NAS,Workhorse Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +ALT.NAS,Altimmune Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LILA.NAS,Liberty Latin America Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CLNE.NAS,Clean Energy Fuels Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +EOLS.NAS,Evolus Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ATRA.NAS,Atara Biotherapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +ANGI.NAS,Angi Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NAVI.NAS,Navient Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CHRS.NAS,Coherus Oncology Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SSSS.NAS,SuRo Capital Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MITK.NAS,Mitek Systems Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SSRM.NAS,SSR Mining Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MOMO.NAS,Hello Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SABR.NAS,Sabre Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MVIS.NAS,MicroVision Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AVXL.NAS,Anavex Life Sciences Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +VIAV.NAS,Viavi Solutions Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MDIV.NAS,First Trust Multi-Asset Diversified Income Index Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OCUL.NAS,Ocular Therapeutix Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AGNC.NAS,AGNC Investment Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +XBIT.NAS,XBiotech Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SPWH.NAS,Sportsman's Warehouse Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IHRT.NAS,iHeartMedia Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SWBI.NAS,Smith & Wesson Brands Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +GT.NAS,Goodyear Tire & Rubber Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CAN.NAS,Canaan Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SBRA.NAS,Sabra Health Care REIT Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +FLEX.NAS,Flex Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SVMK.NAS,SVMK Inc,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-2.59,-2.41,4,2 +SLM.NAS,SLM Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ARCC.NAS,Ares Capital Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AXGN.NAS,Axogen Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NKTR.NAS,Nektar Therapeutics CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MCRB.NAS,Seres Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GOOD.NAS,Gladstone Commercial Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MLCO.NAS,Melco Resorts & Entertainment Ltd CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MAT.NAS,Mattel Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ACAD.NAS,ACADIA Pharmaceuticals Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +JBLU.NAS,JetBlue Airways Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +PCVX.NAS,Vaxcyte Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CLDX.NAS,Celldex Therapeutics Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +VREX.NAS,Varex Imaging Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CLSK.NAS,Cleanspark Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WEN.NAS,Wendy's Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NMIH.NAS,NMI Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LI.NAS,Li Auto Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +CYTK.NAS,Cytokinetics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SNDX.NAS,Syndax Pharmaceuticals Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EXEL.NAS,Exelixis Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +ILPT.NAS,Industrial Logistics Properties Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CDXS.NAS,Codexis Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +QFIN.NAS,Qfin Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +LBTYK.NAS,Liberty Global Ltd CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +LBTYA.NAS,Liberty Global Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SFM.NAS,Sprouts Farmers Market Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BLMN.NAS,Bloomin' Brands Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FLWS.NAS,1-800-Flowers.com Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ANDE.NAS,Andersons Inc/The CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +NTNX.NAS,Nutanix Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,3,2 +KTOS.NAS,Kratos Defense & Security Solutions Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GPRE.NAS,Green Plains Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TSEM.NAS,Tower Semiconductor Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VUZI.NAS,Vuzix Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SBGI.NAS,Sinclair Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +GIII.NAS,G-III Apparel Group Ltd CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MMYT.NAS,MakeMyTrip Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CHEF.NAS,Chefs' Warehouse Inc/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PACB.NAS,Pacific Biosciences of California Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +QURE.NAS,uniQure NV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SNSR.NAS,Global X Internet of Things ETF CFD,USD,USD,USD,0,0,4,0,0.0001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EH.NAS,EHang Holdings Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +SSTI.NAS,SoundThinking Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BLFS.NAS,BioLife Solutions Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STOK.NAS,Stoke Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GNTX.NAS,Gentex Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +NIU.NAS,Niu Technologies CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AY.NAS,Atlantica Yield PLC,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EVER.NAS,EverQuote Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GO.NAS,Grocery Outlet Holding Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BZUN.NAS,Baozun Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +URBN.NAS,Urban Outfitters Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TCOM.NAS,Trip.com Group Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XP.NAS,XP Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PFF.NAS,iShares Preferred and Income Securities ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RRGB.NAS,Red Robin Gourmet Burgers Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +TIGO.NAS,Millicom International Cellular SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ARCT.NAS,Arcturus Therapeutics Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FWONA.NAS,Liberty Media Corp-Liberty Formula One CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SONO.NAS,Sonos Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IRDM.NAS,Iridium Communications Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +EDIT.NAS,Editas Medicine Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SANM.NAS,Sanmina Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BLNK.NAS,Blink Charging Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SLGN.NAS,Silgan Holdings Inc,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +HALO.NAS,Halozyme Therapeutics Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CIBR.NAS,First Trust NASDAQ Cybersecurity ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AVT.NAS,Avnet Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HAIN.NAS,Hain Celestial Group Inc/The CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +PGNY.NAS,Progyny Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PLAY.NAS,Dave & Buster's Entertainment Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IONS.NAS,Ionis Pharmaceuticals Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CSIQ.NAS,Canadian Solar Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UPWK.NAS,Upwork Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RVMD.NAS,Revolution Medicines Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BHF.NAS,Brighthouse Financial Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VIR.NAS,Vir Biotechnology Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FROG.NAS,JFrog Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MARA.NAS,MARA Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FIZZ.NAS,National Beverage Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +LSCC.NAS,Lattice Semiconductor Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +WB.NAS,Weibo Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +MRVL.NAS,Marvell Technology Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +ISTB.NAS,iShares Core 1-5 Year USD Bond ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STLD.NAS,Steel Dynamics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VTIP.NAS,Vanguard Short-Term Inflation-Protected Securities ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +SFIX.NAS,Stitch Fix Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VCYT.NAS,Veracyte Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IUSB.NAS,iShares Core Universal USD Bond ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +INGN.NAS,Inogen Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TRIP.NAS,TripAdvisor Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SKYW.NAS,SkyWest Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +AXSM.NAS,Axsome Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UEIC.NAS,Universal Electronics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HTHT.NAS,H World Group Ltd CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,3,2 +LPSN.NAS,LivePerson Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +DOMO.NAS,Domo Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BBIO.NAS,Bridgebio Pharma Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CEVA.NAS,CEVA Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CAKE.NAS,Cheesecake Factory Inc/The CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SEIC.NAS,SEI Investments Co CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +YNDX.NAS,Yandex NV,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,3,2 +ARWR.NAS,Arrowhead Pharmaceuticals Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STNE.NAS,StoneCo Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SNEX.NAS,StoneX Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BRKR.NAS,Bruker Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +HQY.NAS,HealthEquity Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +IUSV.NAS,iShares Core S&P U.S. Value ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IDCC.NAS,InterDigital Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SMTC.NAS,Semtech Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,3,2 +PLCE.NAS,Children's Place Inc/The CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +EHTH.NAS,eHealth Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +IXUS.NAS,iShares Core MSCI Total International Stock ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SRPT.NAS,Sarepta Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MRCY.NAS,Mercury Systems Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CAR.NAS,Avis Budget Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SDGR.NAS,Schrodinger Inc/United States CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NTLA.NAS,Intellia Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RPD.NAS,Rapid7 Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FATE.NAS,Fate Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MCHI.NAS,iShares MSCI China ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +POWI.NAS,Power Integrations Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CROX.NAS,Crocs Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SHY.NAS,iShares 1-3 Year Treasury Bond ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +ALRM.NAS,Alarm.com Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CRUS.NAS,Cirrus Logic Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +OLLI.NAS,Ollie's Bargain Outlet Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ACMR.NAS,ACM Research Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TNDM.NAS,Tandem Diabetes Care Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LITE.NAS,Lumentum Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PZZA.NAS,Papa John's International Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +AAXJ.NAS,iShares MSCI All Country Asia ex Japan ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ITRI.NAS,Itron Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +IUSG.NAS,iShares Core S&P U.S. Growth ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LAMR.NAS,Lamar Advertising Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ACWI.NAS,iShares MSCI ACWI ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TXRH.NAS,Texas Roadhouse Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SKYY.NAS,First Trust Cloud Computing ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NTES.NAS,NetEase Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMBA.NAS,Ambarella Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +BILI.NAS,Bilibili Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CDLX.NAS,Cardlytics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EMB.NAS,iShares J.P. Morgan USD Emerging Markets Bond ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +JACK.NAS,Jack in the Box Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +RYAAY.NAS,Ryanair Holdings PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IEF.NAS,iShares 7-10 Year Treasury Bond ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BNTX.NAS,BioNTech SE CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AVAV.NAS,AeroVironment Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CHKP.NAS,Check Point Software Technologies Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DVY.NAS,iShares Select Dividend ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CRSP.NAS,CRISPR Therapeutics AG CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LECO.NAS,Lincoln Electric Holdings Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +VC.NAS,Visteon Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +QDEL.NAS,QuidelOrtho Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +NVCR.NAS,Novocure Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IRTC.NAS,IRhythm Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SYNA.NAS,Synaptics Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +PDD.NAS,PDD Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +APPF.NAS,Appfolio Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EEFT.NAS,Euronet Worldwide Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +NXST.NAS,Nexstar Media Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SLAB.NAS,Silicon Laboratories Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +JOUT.NAS,Johnson Outdoors Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IBB.NAS,iShares Biotechnology ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FRPT.NAS,Freshpet Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +JAZZ.NAS,Jazz Pharmaceuticals PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CBRL.NAS,Cracker Barrel Old Country Store Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +UTHR.NAS,United Therapeutics Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MKSI.NAS,MKS Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +NXPI.NAS,NXP Semiconductors NV CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CASY.NAS,Casey's General Stores Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +TEAM.NAS,Atlassian Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BIDU.NAS,Baidu Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TREE.NAS,LendingTree Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CHDN.NAS,Churchill Downs Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +NICE.NAS,Nice Ltd CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SMH.NAS,VanEck Semiconductor ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,1,2 +VONG.NAS,Vanguard Russell 1000 Growth ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SEDG.NAS,SolarEdge Technologies Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +WIX.NAS,Wix.com Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LULU.NAS,Lululemon Athletica Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CACC.NAS,Credit Acceptance Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SOXX.NAS,iShares Semiconductor ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MSTR.NAS,Strategy Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MELI.NAS,MercadoLibre Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +ADAUSD,Cardano (USD),USD,USD,USD,0.2425,0.2454,5,290,0.0001,10,100,1000,0.01,-20,0,4,2 +HOOD.NAS,Robinhood Markets Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XTZUSD,Tezos (USD),USD,USD,USD,0.3345,0.3395,5,500,0.0001,10,100,1000,0.01,-20,0,4,2 +DOGUSD,Dogecoin USD,USD,USD,USD,0.10145,0.10425,5,280,0.001,100,100,1000,0.01,-20,0,4,2 +UNIUSD,Uniswap (USD),USD,USD,USD,3.3985,3.4265,4,280,0.0001,1,100,1000,0.01,-20,0,4,2 +BNBUSD,Binance Coin (USD),USD,USD,USD,659.45,661.91,3,2460,0.001,1,0.01,10,0.01,-20,0,4,2 +DE40,Germany 40 Index,USD,EUR,EUR,25162.6,25163.1,2,50,0.0116423,1,0.1,250,0.1,-4.517,-1.556,4,2 +MidDE50,Germany Mid 50 Index,EUR,EUR,EUR,32145.2,32170.1,2,2490,0.0116423,1,1,250,1,-1.884,1.542,4,2 +DOTUSD,DOT vs US Dollar,USD,USD,USD,1.236,1.293,3,57,0.001,1,100,1000,1,-20,0,4,2 +LNKUSD,LNK vs US Dollar,USD,USD,USD,9.446,9.549,3,103,0.001,1,100,1000,1,-20,0,4,2 +MVRS.NAS,Meta Platforms Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MXL.NAS,MaxLinear Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +DBRG.NYSE,DigitalBridge Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XAUJPY,Gold vs Japanese Yen,XAU,JPY,XAU,724356,724401,0,45,0.629259299,100,0.01,100,0.01,-24.027,15.881,4,0 +XAUCHF,Gold vs Swiss Franc,XAU,CHF,XAU,3563.22,3563.48,2,26,1.279164961,100,0.01,100,0.01,-6.156,-1.357,4,0 +XAUGBP,Gold vs Great Britain Pound,XAU,GBP,XAU,3380.5,3380.71,2,21,1.34835,100,0.01,100,0.01,-40.941,35.769,4,0 +XAGAUD,Silver vs Australian Dollar,XAG,AUD,XAG,108.3,108.359,3,59,0.71664,1000,0.01,100,0.01,-14.777,13.183,4,0 +ADAG.NAS,Adagene Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +ADX.NYSE,Adams Diversified Equity Fund Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AHCO.NAS,AdaptHealth Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ADPT.NAS,Adaptive Biotechnologies Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ADUS.NAS,Addus HomeCare Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ADNT.NYSE,Adient PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ASIX.NYSE,AdvanSix Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WMS.NYSE,Advanced Drainage Systems Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ADV.NAS,Advantage Solutions Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AVK.NYSE,Advent Convertible and Income Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AEG.NYSE,Aegon Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AEHR.NAS,Aehr Test Systems CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMTX.NAS,Aemetis Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AFYA.NAS,Afya Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AEM.NYSE,Agnico Eagle Mines Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BIRD.NAS,Allbirds Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +AMR.NYSE,Alpha Metallurgical Resources Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ATEC.NAS,Alphatec Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ALPN.NAS,Alpine Immune Sciences Inc,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +PINE.NYSE,Alpine Income Property Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ALTG.NYSE,Alta Equipment Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ASTE.NAS,Astec Industries Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +ACLS.NAS,Axcelis Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AXS.NYSE,Axis Capital Holdings Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AXON.NAS,Axon Enterprise Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +BBW.NYSE,Build-A-Bear Workshop Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +CNHI.NYSE,CNH Industrial (US) CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CHI.NAS,Calamos Convertible Opportunities and Income Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CWT.NYSE,California Water Service Group CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STK.NYSE,Columbia Seligman Premium Technology Growth Fund Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CBU.NYSE,Community Financial System Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CW.NYSE,Curtiss-Wright Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CTKB.NAS,Cytek Biosciences Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FHN.NYSE,First Horizon Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GME.NYSE,GameStop Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GNK.NYSE,Genco Shipping & Trading Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GABC.NAS,German American Bancorp Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GSK.NYSE,GSK PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GRAB.NAS,Grab Holdings Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GRPN.NAS,Groupon Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GRWG.NAS,GrowGeneration Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KEN.NYSE,Kenon Holdings Ltd/Singapore CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +LXU.NYSE,LSB Industries Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LU.NYSE,Lufax Holding Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +MNDY.NAS,Monday.com Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PBT.NYSE,Permian Basin Royalty Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +RIVN.NAS,Rivian Automotive Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RBLX.NYSE,ROBLOX Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RKLB.NAS,Rocket Lab Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RCKT.NAS,Rocket Pharmaceuticals Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RY.NYSE,Royal Bank of Canada CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +SB.NYSE,Safe Bulkers Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SGA.NAS,Saga Communications Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SAR.NYSE,Saratoga Investment Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SOFI.NAS,SoFi Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TFSL.NAS,TFS Financial Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +TSBK.NAS,Timberland Bancorp Inc/WA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TKR.NYSE,Timken Co/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UPST.NAS,Upstart Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +URGN.NAS,UroGen Pharma Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +USIO.NAS,Usio Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VECO.NAS,Veeco Instruments Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +VET.NYSE,Vermilion Energy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VSCO.NYSE,Victoria's Secret & Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VNOM.NAS,Viper Energy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WERN.NAS,Werner Enterprises Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SOLUSD,Solana vs US Dollar,USD,USD,USD,85.812,85.944,4,1320,0.0001,1,1,100,0.01,-20,0,4,2 +AVXUSD,Avalanche vs US Dollar,USD,USD,USD,9.2875,9.3415,4,540,0.0001,1,100,1000,0.01,-20,0,4,2 +KSMUSD,Kusama vs US Dollar,USD,USD,USD,4.64,5.089,3,449,0.001,1,100,1000,0.01,-20,0,4,2 +ABEO.NAS,Abeona Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AWP.NYSE,abrdn Global Premier Properties Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ACP.NYSE,abrdn Income Credit Strategies Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +AOD.NYSE,abrdn Total Dynamic Dividend Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RERE.NYSE,ATRenew Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AIKI.NAS,Aikido Pharma Inc,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,0,2 +AIRS.NAS,AirSculpt Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AIRG.NAS,Airgain Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AKTX.NAS,Akari Therapeutics PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +AHG.NAS,Akso Health Group CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +ALG.NYSE,Alamo Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AGI.NYSE,Alamos Gold Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ACI.NYSE,Albertsons Cos Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ALC.NYSE,Alcon AG CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ALEC.NAS,Alector Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ALRS.NAS,Alerus Financial Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DOX.NAS,Amdocs Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AVD.NYSE,American Vanguard Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AX.NYSE,Axos Financial Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +BZFD.NAS,BuzzFeed Inc CFD,USD,USD,USD,0,0,4,0,0.0001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LAW.NYSE,CS Disco Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CALX.NYSE,Calix Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CWST.NAS,Casella Waste Systems Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CASS.NAS,Cass Information Systems Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CSTL.NAS,Castle Biosciences Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CTRM.NAS,Castor Maritime Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CATY.NAS,Cathay General Bancorp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CATO.NYSE,Cato Corp/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CVCO.NAS,Cavco Industries Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FUN.NYSE,Six Flags Entertainment Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CELC.NAS,Celcuity Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CLS.NYSE,Celestica Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CLBT.NAS,Cellebrite DI Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CLRB.NAS,Cellectar Biosciences Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +CELH.NAS,Celsius Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CELU.NAS,Celularity Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +CPAC.NYSE,Cementos Pacasmayo SAA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CENN.NAS,Cenntro Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CVE.NYSE,Cenovus Energy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CSR.NYSE,Centerspace CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +COIN.NAS,Coinbase Global Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +COUR.NYSE,Coursera Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CRSR.NAS,Corsair Gaming Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DAVE.NAS,Dave Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EEX.NYSE,Emerald Holding Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GAME.NAS,GameSquare Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +EVO.NAS,Evotec SE CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XGN.NAS,Exagen Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XCUR.NAS,Exicure Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +EXLS.NAS,ExlService Holdings Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +EXFY.NAS,Expensify Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EXPO.NAS,Exponent Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +XPRO.NYSE,Expro Group Holdings NV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RACE.NYSE,Ferrari NV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GSIT.NAS,GSI Technology Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LAND.NAS,Gladstone Land Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ICFI.NAS,ICF International Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +IHS.NYSE,IHS Holding Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SHEL.NYSE,Shell PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SHEN.NAS,Shenandoah Telecommunications Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FOUR.NYSE,Shift4 Payments Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SHG.NYSE,Shinhan Financial Group Co Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SHLS.NAS,Shoals Technologies Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SCVL.NAS,Shoe Carnival Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SHBI.NAS,Shore Bancshares Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SSTK.NYSE,Shutterstock Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SITM.NAS,SiTime Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BSRR.NAS,Sierra Bancorp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SIFY.NAS,Sify Technologies Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SGHT.NAS,Sight Sciences Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SIG.NYSE,Signet Jewelers Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SILC.NAS,Silicom Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SIMO.NAS,Silicon Motion Technology Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SAMG.NAS,Silvercrest Asset Management Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SMWB.NYSE,SimilarWeb Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SFNC.NAS,Simmons First National Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +STGW.NAS,Stagwell Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SLI.NYSE,Standard Lithium Ltd CFD,USD,USD,USD,0,0,4,0,0.0001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SMP.NYSE,Standard Motor Products Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SXI.NYSE,Standex International Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STN.NYSE,Stantec Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SBLK.NAS,Star Bulk Carriers Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SGU.NYSE,Star Group LP CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GASS.NAS,StealthGas Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +STLA.NYSE,Stellantis NV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STEM.NYSE,Stem Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STEP.NAS,StepStone Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SCL.NYSE,Stepan Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STXS.NYSE,Stereotaxis Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STRL.NAS,Sterling Infrastructure Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STVN.NYSE,Stevanato Group SpA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +THR.NYSE,Thermon Group Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TDUP.NAS,ThredUp Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +THRY.NAS,Thryv Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TDW.NYSE,Tidewater Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TINV.NYSE,Tiga Acquisition Corp,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TLYS.NYSE,Tilly's Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +UL.NYSE,Unilever PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VINP.NAS,Vinci Compass Investments Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BBIG.NAS,Vinco Ventures Inc,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,1,2 +VIOT.NAS,Viomi Technology Co Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IAU.NYSE,iShares Gold Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XLV.NYSE,State Street Health Care Select Sector SPDR ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XLK.NYSE,State Street Technology Select Sector SPDR ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XLY.NYSE,State Street Consumer Discretionary Select Sector SPDR ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BFH.NYSE,Bread Financial Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GRMN.NYSE,Garmin Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MBGn.ETR,Mercedes-Benz Group AG (DE) CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +P911.ETR,Dr Ing hc F Porsche AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +XWEL.NAS,XWELL Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +TXG.NAS,10X Genomics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WT.NYSE,WisdomTree Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CECO.NAS,CECO Environmental Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EGHT.NAS,8x8 Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FBIN.NYSE,Fortune Brands Home & Security CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EVRG.NAS,Evergy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +INDY.NAS,iShares India 50 ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,3,2 +YINN.NYSE,Direxion Daily FTSE China Bull 3X Shares ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-2.59,-2.41,4,2 +EWT.NYSE,iShares MSCI Taiwan Index Fund CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +EWC.NYSE,iShares MSCI Canada ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +EPHE.NYSE,iShares MSCI Philippines ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +EWY.NYSE,iShares MSCI South Korea Capped ETF CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +RVTY.NYSE,Revvity Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BGC.NAS,BGC Group Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +EG.NYSE,Everest Group Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ROP.NAS,Roper Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CDP.NYSE,COPT Defense Properties CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +COO.NAS,Cooper Cos Inc/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +DASH.NAS,DoorDash Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LIN.NAS,Linde PLC CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,3,2 +EXPD.NYSE,Expeditors International of Washington Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SYRE.NAS,Spyre Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RGS.NAS,Regis Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +TLPH.NAS,Talphera Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +ARQ.NAS,ARQ Inc. CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MTUS.NYSE,Metallus Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DOC.NYSE,Healthpeak Properties CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TRAW.NAS,Traws Pharma Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +OPM.PAR,Opmobility CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +ABCB.NYSE,Ameris Bancorp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +CPB.NAS,Campbell's Company/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GAP.NYSE,Gap Inc. CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +CURB.NYSE,Curbline Properties Corp. CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CBAN.NYSE,Colony Bankcorp Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PLTR.NAS,Palantir Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DPZ.NAS,Domino's Pizza Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TBCH.NAS,Turtle Beach Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XIFR.NYSE,NextEra Energy Partners LP CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SGI.NYSE,Tempur Sealy International Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TRI.NAS,Thomson Reuters Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +JBTM.NYSE,John Bean Technologies Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KLRS.NAS,"Kalaris Therapeutics Inc, CFD",USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +ICGIN.LSE,ICG PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SHOP.NAS,Shopify Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TVRD.NAS,Tvardi Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +B.NYSE,Barrick Gold Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +GTM.NAS,ZoomInfo Technologies Inc. Class A Common Stock CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KMB.NAS,Kimberly-Clark Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +BRSL.NYSE,Brightstar Lottery PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PSKY.NAS,Paramount Global CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,0,2 +POLUSD,Polygon Matic vs US Dollar,USD,USD,USD,0.0889,0.0943,5,540,0.001,100,1,100,0.01,-20,0,3,2 +BBT.NYSE,Beacon Financial Corp CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +ADAM.NAS,Adamas Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +Wheat_N6,Wheat -July 26 CFD,USD,USD,USD,646.55,647.7,2,115,0.04,4,1,200,1,0,0,4,2 +Sugar_N6,Sugar -July 26 CFD,USD,USD,USD,14.65,14.7,2,5,1,100,1,200,1,0,0,4,2 +EURBBL_M6,Euro Bobl -June 26 CFD,USD,EUR,EUR,0,0,2,0,1.16423,100,1,100,1,0,0,4,2 +EURSCA_M6,Euro Schatz -June 26 CFD,USD,EUR,EUR,0,0,2,0,1.16423,100,1,100,1,0,0,4,2 +UST10Y_M6,US T-Note 10 YR-June 26 CFD,USD,USD,USD,0,0,3,0,0.2,200,1,100,1,0,0,4,2 +UST10Y_U6,US T-Note 10 YR-September 26 CFD,USD,USD,USD,0,0,3,0,0.2,200,1,100,1,0,0,0,2 +UKGB_M6,UK Long Gilt -June 26 CFD,USD,GBP,GBP,0,0,2,0,1.34835,100,1,100,1,0,0,4,2 +UKGB_U6,UK Long Gilt -September 26 CFD,USD,GBP,GBP,87.76,87.79,2,3,1.34835,100,1,100,1,0,0,0,2 +ITB10Y_M6,Euro BTP Italian 10 YR -June 26 CFD,USD,EUR,EUR,118.41,118.46,2,5,1.16423,100,1,100,1,0,0,4,2 +Cocoa_N6,Cocoa -July 26 CFD,USD,USD,USD,3815,3822,0,7,1,1,1,200,1,0,0,4,2 +Cotton_N6,Cotton No 2 -July 26 CFD,USD,USD,USD,77.99,78.2,2,21,1,100,1,200,1,0,0,4,2 +Sbean_N6,Soybean -July 26 CFD,USD,USD,USD,1196.2,1198.05,2,185,0.04,4,1,200,1,0,0,4,2 +VIX_K6,Volatility Index - May 26 CFD,USD,USD,USD,19.29,19.37,2,8,0.01,1,1,250,1,0,0,3,2 +VIX_M6,Volatility Index - June 26 CFD,USD,USD,USD,18.93,19.13,2,20,0.01,1,1,250,1,0,0,4,2 +JGB10Y_M6,Japan JGB 10 YR -June 26 CFD,USD,JPY,JPY,128.42,128.48,2,6,0.006292593,100,1,100,1,0,0,4,2 +UST30Y_M6,US T-Bond 30 YR-June 26 CFD,USD,USD,USD,112.19,112.22,2,3,1,100,1,100,1,0,0,4,2 +UST30Y_U6,US T-Bond 30 YR-September 26 CFD,USD,USD,USD,111.69,111.72,2,3,1,100,1,100,1,0,0,0,2 +UST05Y_M6,US T-Note 5 YR-June 26 CFD,USD,USD,USD,107.16,107.176,3,16,0.2,200,1,100,1,0,0,4,2 +UST05Y_U6,US T-Note 5 YR-September 26 CFD,USD,USD,USD,107.051,107.067,3,16,0.2,200,1,100,1,0,0,0,2 +EURBND_M6,Euro Bund -June 26 CFD,USD,EUR,EUR,125.89,125.94,2,5,1.16423,100,1,100,1,0,0,4,2 +DXY_M6,US Dollar Index -June 26 CFD,USD,USD,USD,99.213,99.243,3,30,0.1,100,1,250,1,0,0,4,2 +Corn_N6,Corn -July 26 CFD,USD,USD,USD,463.19,464.07,2,88,0.04,4,1,200,1,0,0,4,2 +BRENT_M6,Crude Oil Brent -June 26 CFD,USD,USD,USD,108.26,108.35,2,9,1,100,1,200,1,0,0,0,2 +BRENT_N6,Crude Oil Brent -July 26 CFD,USD,USD,USD,98.35,98.4,2,5,1,100,1,200,1,0,0,4,2 +BRENT_Q6,Crude Oil Brent -August 26 CFD,USD,USD,USD,95.34,95.39,2,5,1,100,1,200,1,0,0,0,2 +WTI_N6,US Crude Oil -July 26 CFD,USD,USD,USD,97.02,97.04,2,2,1,100,1,200,1,0,0,4,2 +OJ_N6,Orange Juice -July 26 CFD,USD,USD,USD,166.29,167.01,2,72,0.2,20,1,200,1,0,0,4,2 +Coffee_N6,Coffee C -July 26 CFD,USD,USD,USD,271.45,271.75,2,30,0.1,10,1,200,1,0,0,4,2 +VHC.NAS,VirnetX Holding Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ETSY.NYSE,Etsy Inc CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +GCM26,Gold Futures - June26,USD,USD,USD,4558.83,4559.73,2,90,1,100,0.01,100,0.01,0,0,4,2 +GCQ26,Gold Futures - August26,USD,USD,USD,4556.6,4557.5,2,90,1,100,0.01,100,0.01,0,0,0,2 +TDAY.NYSE,USA Today Co Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OPTU.NYSE,"Optimum Communications, Inc CFD",USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AAPL.NAS-24,Apple Inc 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMD.NAS-24,Advanced Micro Devices Inc 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMZN.NAS-24,Amazon.com 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AVGO.NAS-24,Broadcom Ltd 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AXP.NYSE-24,American Express Co 24/5 CFD,USD,USD,USD,0,0,4,0,0.0001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BA.NYSE-24,Boeing Co/The 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BABA.NYSE-24,Alibaba Group Holding Ltd 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,3,2 +BIDU.NAS-24,Baidu Inc ADR Class A 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CAT.NYSE-24,Caterpillar Inc 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CLSK.NAS-24,CleanSpark Inc 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +COIN.NAS-24,Coinbase Global Inc 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CRM.NYSE-24,Salesforce Inc 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +CSCO.NAS-24,Cisco Systems 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +CVX.NYSE-24,Chevron Corp 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +DIS.NYSE-24,Walt Disney Co/The 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +F.NYSE-24,Ford Motor Co 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GILD.NAS-24,Gilead Sciences 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +GM.NYSE-24,General Motors Co 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GME.NYSE-24,GameStop Corp 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GOOG.NAS-24,Alphabet Inc C 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +GS.NYSE-24,Goldman Sachs Group Inc/The 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +HD.NYSE-24,Home Depot Inc/The 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +IBM.NYSE-24,International Business Machines Corp 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +INTC.NAS-24,Intel Corp 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +JNJ.NYSE-24,Johnson & Johnson 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +JPM.NYSE-24,JPMorgan Chase & Co 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +KO.NYSE-24,Coca-Cola Co/The 24/5 CFD,USD,USD,USD,0,0,4,0,0.0001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LLY.NYSE-24,Eli Lilly 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MA.NYSE-24,Mastercard 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MARA.NAS-24,Marathon Digital Holdings Inc 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MCD.NYSE-24,McDonald's Corp 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MMM.NYSE-24,3M Company 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MRK.NYSE-24,Merck and Co 24/5 CFD,USD,USD,USD,0,0,4,0,0.0001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MRNA.NAS-24,Moderna Inc. Common Stock 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MSFT.NAS-24,Microsoft Corp 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MSTR.NAS-24,MicroStrategy Inc 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +MU.NAS-24,Micron Technology Inc 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +NEM.NYSE-24,Newmont Corporation 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NFLX.NAS-24,Netflix 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +NIO.NYSE-24,NIO Inc. 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NKE.NYSE-24,Nike CL B 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +NVDA.NAS-24,NVIDIA Corp 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +ORCL.NYSE-24,Oracle 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +OXY.NYSE-24,Occidental Petroleum 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PDD.NAS-24,Pinduoduo Inc. 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +PFE.NYSE-24,Pfizer 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +PG.NYSE-24,Procter and Gamble 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +PLTR.NAS-24,Palantir Technologies Inc 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PTON.NAS-24,Peloton Interactive Inc. Class A Common Stock 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PYPL.NAS-24,Paypal Holdings Inc 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +QCOM.NAS-24,Qualcomm 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +QQQ.NAS-24,Invesco QQQ Trust ETF 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +RIVN.NAS-24,Rivian Automotive Inc. 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RKLB.NAS-24,Rocket Lab USA Inc 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SBUX.NAS-24,Starbucks Corp 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +SNAP.NYSE-24,Snap Inc. Class A Common Stock 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SNOW.NYSE-24,Snowflake Inc. Class A Common Stock 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +SOFI.NAS-24,SoFi Technologies 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +T.NYSE-24,AT&T Inc 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +TGT.NYSE-24,Target Corp 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TSLA.NAS-24,Tesla Motors 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +TSM.NYSE-24,Taiwan Semiconductor Mfg. Co. Ltd. 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +UAL.NAS-24,United Airlines Holdings 24/5 CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UBER.NYSE-24,Uber Technologies Inc 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +V.NYSE-24,Visa 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +VZ.NYSE-24,Verizon Communications Inc 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +XOM.NYSE-24,Exxon Mobil Corp 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +DRH.NAS,DiamondRock Hospitality Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WMT.NAS-24,Wal-Mart Stores 24/5 CFD,USD,USD,USD,0,0,2,0,0.01,1,0.1,1000,0.1,-5.88,0.98,4,2 +HTT.NYSE,High Templar Tech Limited CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +QS.NAS,QuantumScape Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OPLN.NYSE,OPENLANE CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AYV.PAR,Ayvens SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +RNTX.NAS,Rein Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +YDKG.NAS,Yueda Digital Holding CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LION.NYSE,Lionsgate Studios Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ABTC.NAS,American Bitcoin Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +STRZ.NAS,Starz Entertainment Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ACH.NYSE,Accendra Health Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MRSH.NYSE,Marsh & McLennan CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VISN.NAS,Vistance Netowrks Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IBIT.NAS,iShares Bitcoin Trust ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TQQQ.NAS,ProShares UltraPro QQQ CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TSLS.NAS,Direxion Daily TSLA Bear 1X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VXUS.NAS,Vanguard Total International Stock ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GFS.NAS,GLOBALFOUNDRIES Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RIOT.NAS,Riot Platforms Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RMBS.NAS,Rambus Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMLP.NYSE,Alerian MLP ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BITO.NYSE,ProShares Bitcoin ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DBP.NYSE,Invesco DB Precious Metals Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ELV.NYSE,Elevance Health Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HYG.NYSE,iShares iBoxx $ High Yield Corporate Bond ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IVV.NYSE,iShares Core S&P 500 ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IWM.NYSE,iShares Russell 2000 ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KVUE.NYSE,Kenvue Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OIH.NYSE,VanEck Oil Services ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PPA.NYSE,Invesco Aerospace & Defense ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RSP.NYSE,Invesco S&P 500 Equal Weight ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SCHD.NYSE,Schwab US Dividend Equity ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SCHX.NYSE,Schwab US Large-Cap ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SPY.NYSE,State Street SPDR S&P 500 ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VDE.NYSE,Vanguard Energy ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VEA.NYSE,Vanguard FTSE Developed Markets ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VOO.NYSE,Vanguard S&P 500 ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VTI.NYSE,Vanguard Total Stock Market ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XLRE.NYSE,State Street Real Estate Select Sector SPDR ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XYZ.NYSE,Block Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MPT.NYSE,Medical Properties Trust Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DCH.NYSE,Dauch Corporation CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +QTUM.NAS,Defiance Quantum ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FEP.NAS,First Trust Europe AlphaDEX Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ROBT.NAS,First Trust Nasdaq Artificial Intel and Robotics ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +QCLN.NAS,First Trust NASDAQ Clean Energy ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AIQ.NAS,Global X Artificial Intelligence & Technology ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DRIV.NAS,Global X Autonomous & Electric Vehicles ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BKCH.NAS,Global X Blockchain ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +QYLD.NAS,Global X NASDAQ 100 Covered Call ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BOTZ.NAS,Global X Robotics & Artificial Intelligence ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SOCL.NAS,Global X Social Media Index ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HERO.NAS,Global X Video Games & Esports ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PGJ.NAS,Invesco Golden Dragon China ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PHO.NAS,Invesco Water Resources ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ISHG.NAS,iShares 1?3 Year International Treasury Bond ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IEI.NAS,iShares 3?7 Year Treasury Bond ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ICLN.NAS,iShares Global Clean Energy ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MBB.NAS,iShares MBS ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ACWX.NAS,iShares MSCI ACWI ex US ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TUR.NAS,iShares MSCI Turkey ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IGSB.NAS,iShares Short-Term Corporate Bond ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BBH.NAS,Market Vectors Biotech ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PXI.NAS,PowerShares DWA Energy Momentum Portfolio CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KBWD.NAS,PowerShares KBW High Dividend Yield Financial Portfolio CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DAPP.NAS,VanEck Digital Transformation ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ANGL.NAS,VanEck Fallen Angel High Yield Bond ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ESPO.NAS,VanEck Vectors Video Gaming and eSports ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VGIT.NAS,Vanguard Intermediate Term Treasury ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VCIT.NAS,Vanguard Intermediate-Term Corporate Bond ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VMBS.NAS,Vanguard Mortgage-Backed Securities Index Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VCSH.NAS,Vanguard Short-Term Corporate Bond Index Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VGSH.NAS,Vanguard Short-Term Government Bond ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BND.NAS,Vanguard Total Bond Market Index Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BNDX.NAS,Vanguard Total International Bond ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WCLD.NAS,WisdomTree Cloud Computing Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BITQ.NYSE,Bitwise Crypto Industry Innovators ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BOND.NYSE,PIMCO Total Return Active Exchange-Traded Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CSPX.LSE,iShares Core S&P 500 UCITS ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.97,0.45,4,2 +USPY.LSE,L&G Cyber Security UCITS ETF USD Acc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.97,0.45,4,2 +PHAU.LSE,WisdomTree Physical Gold (USD) CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.97,0.45,4,2 +PHAG.LSE,WisdomTree Physical Silver (USD) CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.97,0.45,4,2 +AZN.NYSE,AstraZeneca PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XRN.NYSE,Global Medical REIT Inc,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CVSA.NYSE,Adtalem Global Education Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SHV.NYSE,iShares 0-1 Year Treasury Bond ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XXII.NAS,22nd Century Group Inc CFD CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FDMT.NAS,4D Molecular Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ACTG.NAS,Acacia Research Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ABOS.NAS,Acumen Pharmaceuticals Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +ACET.NAS,Adicet Bio Inc. CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AGMH.NAS,AGM Group Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ALGS.NAS,Aligos Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMRN.NAS,Amarin Corporation PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMCX.NAS,AMC Networks Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +APP.NAS,Applovin Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ACGL.NAS,Arch Capital Group Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ARM.NAS,ARM Holdings PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SPRY.NAS,ARS Pharmaceuticals Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ACNT.NAS,Ascent Industries Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ASML.NAS,ASML Holding NV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AACG.NAS,ATA Creativity Global CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AXTI.NAS,AXT Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RILY.NAS,B. Riley Financial Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BYU.NAS,BAIYU Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,0,2 +BKR.NAS,Baker Hughes Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BWIN.NAS,Baldwin Insurance Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TBBK.NAS,Bancorp Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BFC.NAS,Bank First Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BMRC.NAS,Bank of Marin Bancorp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BOTJ.NAS,Bank of the James CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OZK.NAS,Bank Ozk CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BWFG.NAS,Bankwell Financial Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BANR.NAS,Banner Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XAIR.NAS,Beyond Air Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BMBL.NAS,Bumble Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CCBG.NAS,Capital City Bank Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CRDF.NAS,Cardiff Oncology Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RNAC.NAS,Cartesian Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +COKE.NAS,Coca-Cola Consolidated Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CCEP.NAS,Coca-Cola Europacific Partners PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CLBK.NAS,Columbia Financial Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CMRC.NAS,Commerce.com Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CEG.NAS,Constellation Energy Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CRWS.NAS,Crown Crafts Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CUE.NAS,Cue Biopharma Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +BOOM.NAS,DMC Global Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DLTH.NAS,Duluth Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DUOL.NAS,Duolingo Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SATS.NAS,EchoStar Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EXE.NAS,Expand Energy Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FSLY.NAS,Fastly Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FLNT.NAS,Fluent Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FULT.NAS,Fulton Financial Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GAIA.NAS,Gaia Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GEHC.NAS,GE Healthcare Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GEN.NAS,Gen Digital Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HCKT.NAS,Hackett Group Inc/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HBIO.NAS,Harvard Bioscience Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HTZ.NAS,Hertz Global Holdings Inc. CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IMNN.NAS,Imunon Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LUNR.NAS,Intuitive Machines Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IQ.NAS,iQIYI Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +JD.NAS,JD.com Inc (USD) CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +JOYY.NAS,Joyy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +KOD.NAS,Kodiak Sciences Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +KRNT.NAS,Kornit Digital Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DNUT.NAS,Krispy Kreme Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LCID.NAS,Lucid Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LNAI.NAS,Lunai Bioworks Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +MGRC.NAS,McGrath RentCorp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MBWM.NAS,Mercantile Bank Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NKSH.NAS,National Bankshares Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NBIS.NAS,Nebius Group NV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NEO.NAS,Neogenomics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NRDS.NAS,NerdWallet Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NTGR.NAS,NETGEAR Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +QQQX.NAS,Nuveen NASDAQ 100 Dynamic Overwrite Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BPRN.NAS,Princeton Bancorp Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RBBN.NAS,Ribbon Communications Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RMBI.NAS,Richmond Mutual Bancorporation Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RGTI.NAS,Rigetti Computing Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RGLD.NAS,Royal Gold Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RUM.NAS,Rumble Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SBFG.NAS,SB Financial Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SLS.NAS,SELLAS Life Sciences Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SENS.NAS,Senseonics Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SOHU.NAS,Sohu.com Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SOLS.NAS,Solstice Advanced Materials Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SMCI.NAS,Super Micro Computer Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TBLA.NAS,Taboola.com Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GROW.NAS,US Global Investors Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +USAU.NAS,US Gold Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VSAT.NAS,Viasat Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VFS.NAS,Vinfast Auto Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VOD.NAS,Vodafone (US) CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WBD.NAS,Warner Bros Discovery Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WSBC.NAS,WesBanco Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WTW.NAS,Willis Towers Watson PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +WTFC.NAS,Wintrust Financial Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XRX.NAS,Xerox Holdings Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ACEL.NYSE,Accel Entertainment Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMC.NYSE,AMC Entertainment Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ASX.NYSE,ASE Technology Holding Co Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AVA.NYSE,Avista Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BGS.NYSE,B&G Foods Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BALL.NYSE,Ball Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BANC.NYSE,Banc of California Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BCH.NYSE,Banco de Chile CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BSBR.NYSE,Banco Santander Brasil SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BOH.NYSE,Bank of Hawaii Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BMO.NYSE,Bank of Montreal CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +BNS.NYSE,Bank of Nova Scotia CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +NTB.NYSE,Bank of NT Butterfield & Son Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BNED.NYSE,Barnes & Noble Education Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BBWI.NYSE,Bath & Body Works Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +BH.NYSE,Biglari Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BILL.NYSE,BILL Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BHK.NYSE,BlackRock Core Bond Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BTZ.NYSE,BlackRock Credit Allocation Income Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,0,2 +DSU.NYSE,BlackRock Debt Strategies Fund Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,0,2 +BGR.NYSE,BlackRock Energy and Resources Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CII.NYSE,Blackrock Enhanced Large Cap Core Fund Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FRA.NYSE,BlackRock Floating Rate Income Strategies Fund Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,0,2 +BP.NYSE,BP (US) CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BLDR.NYSE,Builders FirstSource Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AI.NYSE,C3.ai Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CM.NYSE,Canadian Imperial Bank of Commerce CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +CNI.NYSE,Canadian National Railway Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CNQ.NYSE,Canadian Natural Resources Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CP.NYSE,Canadian Pacific Kansas City Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CHPT.NYSE,ChargePoint Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CCO.NYSE,Clear Channel Outdoor Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KOF.NYSE,Coca-Cola Femsa SAB de CV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +COHR.NYSE,Coherent Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +COMP.NYSE,Compass Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CMPO.NYSE,CompoSecure Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,0,2 +CPNG.NYSE,Coupang Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +QBTS.NYSE,D-Wave Quantum Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BROS.NYSE,Dutch Bros Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KODK.NYSE,Eastman Kodak Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +E.NYSE,Eni SpA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ZGN.NYSE,Ermenegildo Zegna NV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FUBO.NYSE,FuboTV Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GEV.NYSE,GE Vernova Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GETY.NYSE,Getty Images Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GSBD.NYSE,Goldman Sachs BDC Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GRNT.NYSE,Granite Ridge Resources Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GRND.NYSE,Grindr Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +HHH.NYSE,Howard Hughes Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IAG.NYSE,IAMGOLD Corp (US) CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IBN.NYSE,ICICI Bank Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IONQ.NYSE,Ionq Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +JKS.NYSE,JinkoSolar Holding Co Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KN.NYSE,Knowles Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KOP.NYSE,Koppers Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +KEP.NYSE,Korea Electric Power Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +USA.NYSE,Liberty All Star Equity Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LUXE.NYSE,LuxExperience BV CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MBI.NYSE,MBIA Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MGF.NYSE,MFS Government Markets Income Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MUFG.NYSE,Mitsubishi UFJ Financial Group Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CAF.NYSE,Morgan Stanley China A Share Fund Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MSD.NYSE,Morgan Stanley Emerging Markets Debt Fund Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,0,2 +EDD.NYSE,Morgan Stanley Emerging Markets Domestic Debt Fund Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IIF.NYSE,Morgan Stanley India Investment Fund Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MYE.NYSE,Myers Industries Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NBHC.NYSE,National Bank Holdings Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NFG.NYSE,National Fuel Gas Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NGG.NYSE,National Grid (US) CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NTZ.NYSE,Natuzzi SpA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NXE.NYSE,NexGen Energy Ltd (US) CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NOAH.NYSE,Noah Holdings Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +OIS.NYSE,Oil States International Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PAAS.NYSE,Pan American Silver Corp (US) CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PSFE.NYSE,Paysafe Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RDDT.NYSE,Reddit Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RIO.NYSE,Rio Tinto (US) CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SAP.NYSE,SAP SE (USD) CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SKLZ.NYSE,Skillz Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SW.NYSE,Smurfit WestRock PLC CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SOLV.NYSE,Solventum Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SPHR.NYSE,Sphere Entertainment Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SU.NYSE,Suncor Energy Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TEO.NYSE,Telecom Argentina SA CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TPL.NYSE,Texas Pacific Land Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TKO.NYSE,TKO Group Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TEN.NYSE,Tsakos Energy Navigation Ltd CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VLTO.NYSE,Veralto Corp CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VRT.NYSE,Vertiv Holdings Co CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VICI.NYSE,VICI Properties Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XPEV.NYSE,Xpeng Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,3,2 +BMWG.ETR,Bayerische Motoren Werke AG (Preference) CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +CECG.ETR,Ceconomy AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +DTGGe.ETR,Daimler Truck Holding AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +DEQGn.ETR,Deutsche EuroShop AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +PBBG.ETR,Deutsche Pfandbriefbank AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +DHLn.ETR,DHL Group CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +DUEG.ETR,Duerr AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +FIEG.ETR,Fielmann Group AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +FTKn.ETR,flatexDEGIRO AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +HFGG.ETR,HelloFresh SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +HNKG.ETR,Henkel (Preferred Stock) CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +KTN.ETR,Kontron AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +NOEJ.ETR,Norma Group SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +PUMG.ETR,Puma SE CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +ENR1n.ETR,Siemens Energy AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +SHLG.ETR,Siemens Healthineers AG CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +TUI1n.ETR,TUI AG (DE) CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +VOWG.ETR,Volkswagen (Preference) CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +EUFI.PAR,Eurofins Scientific CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +FRVIA.PAR,Forvia CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +STLAM.PAR,Stellantis NV (FR) CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +STMPA.PAR,STMicroelectronics (FR) CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +TEPRF.PAR,Teleperformance CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +VANTI.PAR,Vantiva SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +REDE.MAD,Redeia Corporacion SA CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,4,2 +ABDN.LSE,Aberdeen Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +ASOS.LSE,ASOS PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BAB.LSE,Babcock International Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BIRG.LSE,Bank of Ireland Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BWY.LSE,Bellway PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +DEBS.LSE,boohoo group plc CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,0,2 +COSG.LSE,Costain Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +DOM.LSE,Domino's Pizza Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +DRX.LSE,Drax Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +ENT.LSE,Entain PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +FCIT.LSE,F&C Investment Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +FERG.LSE,Ferguson PLC (GBP) CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +FXPO.LSE,Ferrexpo PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +FRAS.LSE,Frasers Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +GRG.LSE,Greggs PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +GKP.LSE,Gulf Keystone Petroleum Ltd CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +HLN.LSE,HALEON PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +HBR.LSE,Harbour Energy PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +HIK.LSE,Hikma Pharmaceuticals PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +HOCM.LSE,Hochschild Mining PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +IHG4.LSE,InterContinental Hotels Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,0,2 +JD.LSE,JD Sports Fashion PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +MARS.LSE,Marston's PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +MTRO.LSE,Metro Bank Holdings PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +MCG.LSE,Mobico Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +NWG.LSE,Natwest Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +PLUSP.LSE,Plus500 Ltd CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +RMV.LSE,Rightmove PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SFOR.LSE,S4 Capital PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +TATE.LSE,Tate & Lyle PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +THG.LSE,THG PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +TTEF.LSE,TotalEnergies CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,0,2 +VTYV.LSE,Vistry Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +WEIR.LSE,Weir Group PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +GPGI.NYSE,CompoSecure Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TAPT.NYSE,MOLSON COORS BEVERAGE CO - B CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,0,2 +FLNA.NAS,Filana Therapeutics Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TE.PAR,Technip Energies NV CFD,EUR,EUR,EUR,0,0,4,0,0.000116423,1,1,1000,1,-4.18,-0.13,0,2 +SSE.LSE,SSE PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,3,2 +TW.LSE,TAYLOR WIMPEY PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +A2.IT,A2A SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +AMPF.IT,Amplifon SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +AZMT.IT,Azimut Holding SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +BMED.IT,Banca Mediolanum Spa CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +BMPS.IT,Banca Monte dei Paschi di Siena SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +BAMI.IT,Banco BPM SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +EMII.IT,BPER Banca SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +BCU.IT,Brunello Cucinelli SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +BZU.IT,Buzzi SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +CPRI.IT,Davide Campari CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +DIAS.IT,DiaSorin SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +ENEI.IT,Enel CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +ENI.IT,Eni SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +RACE.IT,Ferrari NV (IT) CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +FBK.IT,FinecoBank Banca Fineco SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +GASI.IT,Generali CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +HRA.IT,Hera SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +INWT.IT,Infrastrutture Wireless Italiane SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +ITPG.IT,Interpump Group SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,3,2 +ISP.IT,Intesa SanPaolo CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +IG.IT,Italgas SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +IVG.IT,Iveco Group NV CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +LDOF.IT,Leonardo SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +MDBI.IT,Mediobanca CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +MONC.IT,Moncler SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +NEXII.IT,Nexi SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +PIRC.IT,Pirelli & C SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +PST.IT,Poste Italiane SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +PRY.IT,Prysmian SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +RECI.IT,Recordati Industria Chimica e Farmaceutica SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +SPMI.IT,Saipem SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +SRG.IT,Snam SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +TLIT.IT,Telecom Italia SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +TENR.IT,Tenaris SA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +TRN.IT,Terna CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +CRDI.IT,UniCredit SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +UNPI.IT,Unipol Assicurazioni SpA CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-0.8,4,2 +AMS.SWX,ams-OSRAM AG CFD,CHF,CHF,CHF,0,0,3,0,0.001279165,1,1,1000,1,-2.1,-2.5,4,2 +NOVN.SWX,Novartis AG (CHF) CFD,CHF,CHF,CHF,0,0,3,0,0.001279165,1,1,1000,1,-2.1,-2.5,4,2 +RO.SWX,Roche Holding AG (CH) CFD,CHF,CHF,CHF,0,0,3,0,0.001279165,1,1,1000,1,-2.1,-2.5,4,2 +UBSG.SWX,UBS Group AG CFD,CHF,CHF,CHF,0,0,3,0,0.001279165,1,1,1000,1,-2.1,-2.5,4,2 +AIBG.IE,AIB Group plc CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-2.5,4,2 +BIRG.IE,Bank of Ireland (IE) CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-2.5,4,2 +GL9.IE,Glanbia PLC CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-2.5,4,2 +IR5B_u.IE,Irish Continental Group PLC CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-2.5,4,2 +KSP.IE,Kingspan Group PLC (IE) CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-2.5,4,2 +OGN.IE,Origin Enterprises PLC (IE) CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-2.5,4,2 +RYA.IE,Ryanair Holdings PLC (IE) CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-3.98,-2.5,4,2 +GENZ.NAS,VanEck Vectors ETF Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +P.NYSE,Everpure Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SOLT.NAS,2x Solana ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XRPT.NAS,2x XRP ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MSTX.NAS,Defiance Daily Target 2X Long MSTR ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +OKLL.NAS,Defiance Daily Target 2X Long OKLO ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AAPU.NAS,Direxion Daily AAPL Bull 2X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMUU.NAS,Direxion Daily AMD Bull 2X Shares ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMZU.NAS,Direxion Daily AMZN Bull 2X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AVL.NAS,Direxion Daily AVGO Bull 2X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BOEU.NAS,Direxion Daily BA Bull 2X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BRKU.NAS,Direxion Daily BRKB Bull 2X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GGLL.NAS,Direxion Daily GOOGL Bull 2X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ELIL.NAS,Direxion Daily LLY Bull 2X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +METU.NAS,Direxion Daily META Bull 2X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MSFU.NAS,Direxion Daily MSFT Bull 2X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MUU.NAS,Direxion Daily MU Bull 2X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NFXL.NAS,Direxion Daily NFLX Bull 2X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NVDU.NAS,Direxion Daily NVDA Bull 2X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PALU.NAS,Direxion Daily PANW Bull 2X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PLTU.NAS,Direxion Daily PLTR Bull 2X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TSMX.NAS,Direxion Daily TSM Bull 2X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XOMX.NAS,Direxion Daily XOM Bull 2X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TSL.NAS,GraniteShares 1.25x Long Tesla Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AAPB.NAS,GraniteShares 2x Long AAPL Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMDL.NAS,GraniteShares 2x Long AMD Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMZZ.NAS,GraniteShares 2x Long AMZN Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BABX.NAS,GraniteShares 2x Long BABA Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CONL.NAS,GraniteShares 2x Long COIN Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CRWL.NAS,GraniteShares 2x Long CRWD Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DLLL.NAS,GraniteShares 2x Long DELL Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +INTW.NAS,GraniteShares 2x Long INTC Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IONL.NAS,GraniteShares 2x Long IONQ Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LCDL.NAS,GraniteShares 2x Long LCID Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MRAL.NAS,GraniteShares 2x Long MARA Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +FBL.NAS,GraniteShares 2x Long META Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MVLL.NAS,GraniteShares 2x Long MRVL Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MSFL.NAS,GraniteShares 2x Long MSFT Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MSTP.NAS,GraniteShares 2x Long MSTR Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MULL.NAS,GraniteShares 2x Long MU Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PTIR.NAS,GraniteShares 2x Long PLTR Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +QCML.NAS,GraniteShares 2x Long QCOM Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RDTL.NAS,GraniteShares 2x Long RDDT Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +RVNL.NAS,GraniteShares 2x Long RIVN Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SMCL.NAS,GraniteShares 2x Long SMCI Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TSLR.NAS,GraniteShares 2x Long TSLA Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TSMU.NAS,GraniteShares 2x Long TSM Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +UBRL.NAS,GraniteShares 2x Long UBER Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +VRTL.NAS,GraniteShares 2x Long VRT Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NVYY.NAS,GraniteShares YieldBOOST NVDA ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TQQY.NAS,GraniteShares YieldBOOST QQQ ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TSYY.NAS,GraniteShares YieldBOOST TSLA ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +XBTY.NAS,GraniteShares YieldBOOST Bitcoin ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +YQQQ.NAS,YieldMax? YQQQ Short N100 Option Income Strategy ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AAPD.NAS,Direxion Daily AAPL Bear 1X Shares ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMDD.NAS,Direxion Daily AMD Bear 1X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AMZD.NAS,Direxion Daily AMZN Bear 1X Shares ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +AVS.NAS,Direxion Daily AVGO Bear 1X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +GGLS.NAS,Direxion Daily GOOGL Bear 1X Shares ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +METD.NAS,Direxion Daily META Bear 1X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MSFD.NAS,Direxion Daily MSFT Bear 1X Shares ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NFXS.NAS,Direxion Daily NFLX Bear 1X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NVDD.NAS,Direxion Daily NVDA Bear 1X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +PLTD.NAS,Direxion Daily PLTR Bear 1X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TSMZ.NAS,Direxion Daily TSM Bear 1X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CONI.NAS,GraniteShares 2x Short COIN Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +MSDD.NAS,GraniteShares 2x Short MSTR Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +NVD.NAS,GraniteShares 2x Short NVDA Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TSDD.NAS,GraniteShares 2x Short TSLA Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SQQQ.NAS,ProShares UltraPro Short QQQ CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +SARK.NAS,Tradr 2X Short Innovation Daily ETF CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EDC.NYSE,Direxion Daily MSCI Emerging Markets Bull 3x Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DRN.NYSE,Direxion Daily Real Estate Bull 3x Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +ETB.NYSE,Eaton Vance Tax-Managed Buy-Write Income Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EMF.NYSE,Templeton Emerging Markets Fund Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +TEI.NYSE,Templeton Emerging Markets Income Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +IDE.NYSE,Voya Infrastructure Industrials and Materials Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EDZ.NYSE,Direxion Daily MSCI Emerging Markets Bear 3X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DRV.NYSE,Direxion Daily Real Estate Bear 3X Shares CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BSL.NYSE,Blackstone Senior Floating Rate 2027 Term Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BGB.NYSE,Blackstone Strategic Credit 2027 Term Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +DBL.NYSE,DoubleLine Opportunistic Credit Fund CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +EFR.NYSE,Eaton Vance Senior Floating-Rate Trust CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BRAI.LSE,Blackrock American Income Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +CCJI.LSE,CC Japan Income & Growth Trust plc CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +CTUK.LSE,CT UK Capital & Income Investment Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +CHI.LSE,CT UK High Income Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +3LVO.LSE,GraniteShares 3x Long Vodafone Daily ETP CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +HHV.LSE,Hargreave Hale AIM VCT PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +AAIF.LSE,Aberdeen Asian Income Fund Ltd CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +AEI.LSE,Aberdeen Equity Income Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +ANII.LSE,Aberdeen New India Investments CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +AAS.LSE,abrdn Asia Focus PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +ALWA.LSE,Alliance Witan PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +AFLA.LSE,Artemis UK Future Leaders PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +AGT.LSE,AVI Global Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +AJOT.LSE,AVI Japan Opportunity Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BGCG.LSE,Baillie Gifford China Growth Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BGFD.LSE,Baillie Gifford Japan Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BGUK.LSE,Baillie Gifford UK Growth Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +USAB.LSE,Baillie Gifford US Growth Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BNKR.LSE,Bankers Investment Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BEMO.LSE,Barings Emerging Emea Opportunities PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BIOGW.LSE,Biotech Growth Trust PLC/The CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BERI.LSE,Blackrock Energy and Resources Income Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BRGE.LSE,Blackrock Greater Europe Investment Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BRLA.LSE,Blackrock Latin American Investment Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BASC.LSE,Brown Advisory US Smaller Companies PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BUT.LSE,Brunner Investment Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +CLDN.LSE,Caledonia Investments PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +CYNL.LSE,CQS Natural Resources Growth and Income PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +DIG.LSE,Dunedin Income Growth Investment Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +EGL.LSE,Ecofin Global Utilities and Infrastructure Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +EDIN.LSE,Edinburgh Investment Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +FAS.LSE,Fidelity Asian Values PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +FEV.LSE,Fidelity European Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +FGT.LSE,Finsbury Growth & Income Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +IEM.LSE,Impax Environmental Markets PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +IBT.LSE,International Biotechnology Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +IAD.LSE,Invesco Asia Dragon Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +BIPS.LSE,Invesco Bond Income Plus Ltd CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +IGET.LSE,Invesco Global Equity Income Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +JCGI.LSE,JPMorgan China Growth & Income PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +JEDT.LSE,Jpmorgan European Discovery Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +JEMI.LSE,JPmorgan Global Emerging Markets Income Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +LWDB.LSE,Law Debenture Corporation PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +LWI.LSE,Lowland Investment Company PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +MIDW.LSE,Mid Wynd International Investment Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +MNKS.LSE,Monks Investment Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +MONT.LSE,Montanaro European Smaller Companies Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +MTU.LSE,Montanaro UK Smaller Companies Investment Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +MUT.LSE,Murray Income Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +MYI.LSE,Murray International Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +PHI.LSE,Pacific Horizon Investment Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +PCFT.LSE,Polar Capital Global Financials Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +PCGH.LSE,Polar Capital Global Healthcare Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +ATRAS.LSE,Schroder Asian Total Return Investment Company PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SDP.LSE,Schroder Asiapacific Fund PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SCF.LSE,Schroder Income Growth Fund PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SOI.LSE,Schroder Oriental Income Fund Ltd CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SCP.LSE,Schroder UK Mid Cap Fund PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +INOV.LSE,Schroders Capital Global Innovation Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SAIN.LSE,Scottish American Investment Company PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SOST.LSE,Scottish Oriental Smaller Companies Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +SESTS.LSE,STS Global Income & Growth Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +TMPL.LSE,Temple Bar Investment Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +ESCT.LSE,TR European Growth Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +TRY.LSE,TR Property Investment Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +UEM.LSE,Utilico Emerging Markets Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +LNGA.LSE,WisdomTree Natural Gas 2x Daily Leveraged (USD) CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +WWH.LSE,Worldwide Healthcare Trust PLC CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +LCOC.LSE,WT Cocoa 2X Daily Leveraged CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +XSPS.LSE,Xtrackers S&P 500 Inverse Daily Swap UCITS ETF 1C CFD,GBP,GBP,GBP,0,0,4,0,0.000134835,1,1,1000,1,-5.97,0.45,4,2 +FABC.NAS,StableX Technologies Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +CHRN.NAS,Ekso Bionics Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +LKFT.AMS,Lakefront Biotherapeutics CFD,EUR,EUR,EUR,0,0,3,0,0.00116423,1,1,1000,1,-4.18,-0.13,4,2 +AGNT.NAS,eXp World Holdings Inc CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 +BNY.NYSE,Bank of New York Mellon Corp/The CFD,USD,USD,USD,0,0,3,0,0.001,1,0.1,1000,0.1,-5.88,0.98,4,2 diff --git a/offline_install.bat b/offline_install.bat new file mode 100644 index 0000000..5ed65c0 --- /dev/null +++ b/offline_install.bat @@ -0,0 +1,32 @@ +@echo off +REM 离线安装脚本 — 把项目拷到离线机器后运行此文件 +REM 要求: Python 3.12.x 已装, pip 已可用 +setlocal + +set PYTHON=python +%PYTHON% --version >nul 2>&1 +if errorlevel 1 ( + echo [ERR] python not in PATH + exit /b 1 +) + +echo === Installing offline wheels from dist\ === +pushd "%~dp0dist" +%PYTHON% -m pip install --no-index --find-links=. -r "..\requirements.txt" +set RC=%ERRORLEVEL% +popd + +if %RC% NEQ 0 ( + echo [ERR] pip install failed, code=%RC% + exit /b %RC% +) + +echo === Verifying imports === +%PYTHON% -c "import yaml, pandas, openpyxl, bs4, MetaTrader5; print('All deps OK')" +if errorlevel 1 ( + echo [WARN] Some imports failed. Check Python version matches wheel cp tag (this build is cp312 / Python 3.12). +) + +echo. +echo Done. +pause diff --git a/optimizer/scripts/run_GridMaster Pro.ps1 b/optimizer/scripts/run_GridMaster Pro.ps1 new file mode 100644 index 0000000..45db0d7 --- /dev/null +++ b/optimizer/scripts/run_GridMaster Pro.ps1 @@ -0,0 +1,29 @@ +# MT5 Batch Backtest Script +# Generated: 2026-05-29 04:13:50 + +$MT5Path = "C:\Program Files\MetaTrader 5 IC Markets Global\terminal64.exe" +$IniFile = "optimizer\configs\GridMaster Pro.ini" +$SetDir = "optimizer\set_files\GridMaster Pro" +$ReportDir = "optimizer\reports\GridMaster Pro" + +Write-Host 'Starting batch optimization for GridMaster Pro' + +$SetFiles = Get-ChildItem -Path $SetDir -Filter "params_*.set" +$Total = $SetFiles.Count +$Current = 0 + +foreach ($SetFile in $SetFiles) { + $Current++ + Write-Host "[$Current/$Total] Processing: $($SetFile.Name)" + + $IniContent = Get-Content $IniFile + $IniContent = $IniContent -replace "ExpertParameters=.*", "ExpertParameters=$($SetFile.FullName)" + $TempIni = Join-Path $env:TEMP "temp_$([guid]::NewGuid().ToString().Substring(0,8)).ini" + $IniContent | Set-Content $TempIni -Encoding UTF8 + + Start-Process -FilePath $MT5Path -ArgumentList "/portable","/config:$TempIni" -Wait + + Start-Sleep -Seconds 3 +} + +Write-Host 'Batch optimization completed for GridMaster Pro!' \ No newline at end of file diff --git a/optimizer_main.py b/optimizer_main.py new file mode 100644 index 0000000..7b1c835 --- /dev/null +++ b/optimizer_main.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python3 +import os +import sys +import argparse +import logging +from datetime import datetime + +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s' +) +logger = logging.getLogger(__name__) + +OPTIMIZER_DIR = os.path.join(os.path.dirname(__file__), 'scripts', 'optimizer') +sys.path.insert(0, OPTIMIZER_DIR) + +from ea_config_parser import load_all_ea_configs, load_ea_config +from smart_search import SmartSearch +from parameter_constraint import create_constraint_engine +from analyze_results import ResultAnalyzer +from ea_batch_optimizer import EABatchOptimizer + + +def setup_directories(base_dir): + dirs = ['configs', 'set_files', 'reports', 'results', 'scripts', 'logs'] + for d in dirs: + os.makedirs(os.path.join(base_dir, d), exist_ok=True) + + +def cmd_generate(args): + optimizer = EABatchOptimizer(args.base_dir) + configs = load_all_ea_configs(os.path.join(args.base_dir, 'configs')) + + if not configs: + logger.error('No EA configs found in ' + os.path.join(args.base_dir, 'configs')) + return + + for ea_name, config in configs.items(): + if args.ea and ea_name not in args.ea: + continue + logger.info('Processing: ' + ea_name) + optimizer.generate_set_files(config, max_samples=args.max_samples) + optimizer.generate_ini_for_ea(config, []) + + logger.info('Generation completed!') + + +def cmd_run(args): + optimizer = EABatchOptimizer(args.base_dir) + + if not args.ps_script: + logger.error('PowerShell script path required. Generate SET files first.') + return + + logger.info('Running PowerShell script: ' + args.ps_script) + try: + result = subprocess.run(['powershell', '-ExecutionPolicy', 'Bypass', '-File', args.ps_script], + capture_output=True, text=True) + logger.info(result.stdout) + if result.stderr: + logger.error(result.stderr) + except Exception as e: + logger.error('Error running script: ' + str(e)) + + +def cmd_analyze(args): + optimizer = EABatchOptimizer(args.base_dir) + analyzer = ResultAnalyzer(os.path.join(args.base_dir, 'reports')) + + results = analyzer.parse_all_reports() + + if not results: + logger.warning('No results found') + return + + logger.info('Total results: ' + str(len(results))) + + criterion = args.sort or 'profit_factor' + best = analyzer.find_optimal_params(results, criterion=criterion) + + output_path = os.path.join(args.base_dir, 'results', 'optimization_report.txt') + analyzer.generate_report(best, output_path) + + logger.info('Report saved: ' + output_path) + + if args.csv: + analyzer.save_to_csv(best, args.csv) + logger.info('CSV saved: ' + args.csv) + + +def cmd_list(args): + configs_dir = os.path.join(args.base_dir, 'configs') + configs = load_all_ea_configs(configs_dir) + + print() + print('=' * 60) + print('EA Configurations') + print('=' * 60) + + for ea_name, config in configs.items(): + print() + print('Name: ' + ea_name) + print('Path: ' + config.ea_path) + print('Parameters: ' + str(len(config.parameters))) + print('Combinations: ' + str(config.get_total_combinations())) + print('Strategy: ' + config.search_strategy) + print('Estimate time: ' + config.estimate_search_time()) + + +def main(): + parser = argparse.ArgumentParser(description='MT5 EA Optimizer') + parser.add_argument('--base-dir', '-d', default='optimizer', + help='Base directory for optimizer') + parser.add_argument('--ea', '-e', nargs='+', + help='EA names to process') + parser.add_argument('--max-samples', '-m', type=int, default=2000, + help='Maximum samples to generate') + parser.add_argument('--sort', '-s', default='profit_factor', + choices=['profit_factor', 'net_profit', 'win_rate', 'sharpe_ratio'], + help='Sort criterion') + parser.add_argument('--csv', '-c', help='Export results to CSV') + parser.add_argument('--ps-script', '-p', help='PowerShell script to run') + + subparsers = parser.add_subparsers(dest='command', help='Commands') + + subparsers.add_parser('generate', help='Generate SET files and INI') + subparsers.add_parser('run', parents=[parser], help='Run MT5 tests') + subparsers.add_parser('analyze', parents=[parser], help='Analyze results') + subparsers.add_parser('list', help='List EA configurations') + + args = parser.parse_args() + + setup_directories(args.base_dir) + + if args.command == 'generate': + cmd_generate(args) + elif args.command == 'run': + cmd_run(args) + elif args.command == 'analyze': + cmd_analyze(args) + elif args.command == 'list': + cmd_list(args) + else: + cmd_generate(args) + + +if __name__ == '__main__': + main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..cd057e6 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +MetaTrader5 +pandas +pyyaml +openpyxl +beautifulsoup4 \ No newline at end of file diff --git a/review/TopBottomEA_审查报告_01_意图推测与逻辑链.md b/review/TopBottomEA_审查报告_01_意图推测与逻辑链.md new file mode 100644 index 0000000..75fcfb2 --- /dev/null +++ b/review/TopBottomEA_审查报告_01_意图推测与逻辑链.md @@ -0,0 +1,244 @@ +# MQL5代码审查报告 - 第一、二阶段 + +**审查对象**: TopBottomEA.mq5 +**审查日期**: 2026-06-03 +**代码总行数**: 2574 行 + +--- + +## 1. 程序意图推测 + +### 1.1 文件类型判断 +- **文件类型**: Expert Advisor(EA,自动交易程序) +- **文件路径**: `C:\Users\Administrator\Desktop\mt5_backtest\TopBottomEA.mq5` +- **依赖头文件**: 无(DFCC 转换库以 class 形式内联在文件 1210–2436 行) +- **文件描述**: 自称"波动率自适应机制"、单笔持仓、平均每天约4单、持仓约12小时、用Dukascopy历史数据通过$20小额回测10年+ +- **文件来源判断**: 顶部 copyright 写 2022 MetaQuotes,version 1.31,但变量名大量使用 `dword_6B59710`/`qword_6B59550` 这样的**反编译器十六进制地址风格**,是 fxDreema MQL4→MQL5 转换器**自动生成的产物**(参见 1169 行注释 `//== fxDreema MQL4 to MQL5 Converter ==//`)。 + +### 1.2 输入参数分析 + +| 输入参数 | 类型 | 默认值 | 含义推测 | +|---|---|---|---| +| `__Lots__` | double | 0.1 | 固定手数 | +| `__Compoundinterestswitch__` | bool | false | 是否启用复利(按账户净值计算手数) | +| `__Risk__` | int | 40 | 复利计算分子,公式:`equity * Risk / 1,000,000` | +| `__ParameterSwitching__` | bool | false | 是否按品种自动切换参数(true=用 CHFSGD/GBPSGD 特殊规则) | +| `__Volatility__` | int | 110 | WPR(威廉指标)的回溯周期 | +| `__StopLoss__` | int | 800 | 止损点数(与 `_Point` 相乘) | +| `__Profit__` | int | 300 | 止盈点数(**仅 MQL4 4位报价下=30pips;5位下=3pips,明显偏小**) | +| `__Pointdifferencelimit__` | double | 50.0 | 最大点差过滤(MODE_SPREAD ≤ 此值才允许开仓) | +| `__Displayswitch__` | bool | false | 图表显示开关(代码全被注释,无实际效果) | +| `__Magic__` | int | 888999 | 魔术号 | +| `__CommentName__` | string | "TopBottomEA" | 订单注释 | + +**隐含的设计假设**: +- 报价位数固定为 4 位(MQL4 时代遗留假设),移植到 5 位经纪商时所有点数类参数(StopLoss/Profit 等)量纲会发生 10 倍变化。 +- `Volatility` 同时承担 WPR 周期和"参数切换开关的品种识别"双重角色。 +- 复利计算基数 `qword_6B59510 = 1,000,000` 是硬编码常量。 + +### 1.3 核心指标/品种识别 + +- **iBands**(布林带):`PERIOD_CURRENT, period=20, shift=0, deviation=2.0, PRICE_CLOSE` + - 取两条线:`mode=1`(UPPER_BAND)、`mode=2`(LOWER_BAND) + - **浪费**:`g_iBands_Upper` 和 `g_iBands_Lower` 是**两个独立的 iBands 句柄**(行 529–530),而一个 iBands 句柄本身就包含 2/3 个 buffer——单句柄即可 +- **iWPR**(威廉百分比):`period = Volatility`(默认 110),shift=0 +- **未使用 MA/RSI/MACD/ATR/K线形态** +- **特殊数据**: + - 大量全局变量承担"上一次成交状态/订单扫描缓存"功能 + - 2 个**新柱检测**变量 `qword_6B59548` / `qword_6B59558`(分别对应 Buy/Sell 通道) + - DFCC 类在 RefreshRates 中维护 6 个全局价格数组 `Ask/Bid/Close/High/Low/Open/Time/Volume`(行 1180) + +### 1.4 功能意图总结 + +- **核心策略**: **波动率自适应的"顶/底反转"EA**——以布林带宽度(Upper-Lower)作为波动率过滤器,仅在带宽处于指定区间时,结合 WPR 极值(< -95 做多,> -5 做空)触发单笔反向开仓;持仓由"反向 WPR 极值"或"达到 Profit 点数"主动平仓,由硬编码 StopLoss 兜底。 +- **策略类型**: **均值回归(Mean Reversion)+ 波动率过滤**,单仓方向性反转 +- **关键特征**: + 1. 单品种单笔同时持仓(`dword_6B595A0 + dword_6B59598 < 1` 强约束) + 2. 同一柱内不重复加仓(新柱检测) + 3. 区分"测试模式时间窗"与"实盘 GMT 时间窗"(行 553/690) + 4. 5 个品种硬编码参数表(GBPCAD/EURSGD/GBPCHF/CHFSGD/GBPSGD) + 5. 复利开关开启时按账户净值动态算手数 + 6. 用 fxDreema 工具链从 MQL4 批量转换,非手写 + +--- + +## 2. 全局逻辑链审查 + +### 2.1 文件依赖关系 + +``` +TopBottomEA.mq5 + ├── (内联) class DFCC ── 2000+ 行的 MQL4→MQL5 兼容层 + └── (内联) class DFCC_TRADES ── 错误码/填充策略工具 +``` + +- 无 `#include` 头文件 +- 无外部库依赖 +- DFCC 实质是**MQL4 API 的完整仿真层**(OrderSelect/OrderSend/OrderClose/MarketInfo 等),是 fxDreema 转换器自动生成;这种"以单文件 inline 巨型包装类"的做法严重牺牲可读性 + +### 2.2 事件处理完整性 + +| 事件函数 | 是否存在 | 实现状态 | 备注 | +|---|---|---|---| +| `OnInit()` | ✅ | 几乎空壳 | 99% 是被注释掉的图表对象创建代码;仅 220 行一行有效赋值被后续 OnTick 覆盖 | +| `OnDeinit()` | ✅ | 完整 | 1197 行,仅释放三个指标句柄 | +| `OnTick()` | ✅ | 完整 | 1202 行入口→调 RefreshRates→__OnTick__ | +| `OnTimer()` | ❌ | — | 未使用 | +| `OnTrade()` / `OnTradeTransaction()` | ❌ | — | 未使用,订单状态变化靠轮询 | + +**关键事件链**: +``` +MT5报价 → OnTick() → DFCC::RefreshRates()(更新全局价格数组) + ↓ + __OnTick__() + ↓ + [a] 品种识别 → 切换 dword_6B59710/14/18/1C/20 + [b] 点差过滤(行 447-455) + [c] 复用/重建指标句柄(行 525-532) + [d] 读 v68=Upper / v67=Lower / v66=WPR + [e] sub_5546348() 扫描持仓,更新 18 个全局缓存变量 + [f] 复利/固定手数 → dbl_6B59728 + [g] 时间窗 + 带宽区间 + WPR 极值 → 开仓 OrderSend + [h] 4 段平仓逻辑(WPR 反转 + 止盈点) +``` + +### 2.3 状态转换分析 + +EA 运行时主要状态: + +| 状态 | 进入条件 | 退出条件 | +|---|---|---| +| **空仓观望** | 扫描后 `dword_6B595A0 + dword_6B59598 == 0` | 满足开仓条件 | +| **持有多单** | `OrderType==0` 成交 | 主动平仓(4 类触发) | +| **持有空单** | `OrderType==1` 成交 | 主动平仓(4 类触发) | +| **订单重试中** | `dword_6B59570<0` | 重试 <10 次或成功 | + +**潜在死循环/异常路径**: +- **新柱防抖与开仓互斥**: `qword_6B59548 != qword_6B59550` 条件在开仓成功后立即刷新;若 Tick 频率异常高(测试器每柱 tick=全部 ticks)但 iTime 取到的是 K 线开始时间,可能让 `qword_6B59550` 不更新导致**本柱永远不再开仓**——需关注。 +- **同柱平+开**: 行 824(多单 WPR 反转平仓)与行 570(卖 WPR< -95 开空)的 v66 共享变量,理论上下一个 tick 内可能"平多后立即开空";无显式冷却。 +- **断点续传**: 终端重启后 `qword_6B59548/558/548/558` 等防抖变量被重置为 0,与 `qword_6B59550/560 = iTime` 不等 → **会立即允许再开一笔**,存在重复建仓风险。 +- **句柄重建竞争**: 行 526-532 中 `CleanupIndicatorHandles()` 在 OnTick 中执行,但调用 `_GetIndicatorValue_` 前已重建(行 535-537)→ 安全;但若多次 `Volatility` 变化会**泄漏中间态句柄**(实际 cleanup 已正确调用,无泄漏)。 + +### 2.4 跨文件冲突 + +- 全部代码内联,无 `#include`,**无跨文件冲突**。 +- 但内部隐式约定:DFCC 内部所有 `static` 函数(OrderTicket/LoadedType/CheckForTradingError)共享静态变量,**与外部全局变量 dword_6B59710 等无命名冲突**。 +- 真正的"冲突"是**命名空间污染**:50+ 形如 `dword_6B59710` 的全局变量与 11 个 input 重复声明(`__Lots__` / `Lots`),维护时极易混淆。 + +### 2.5 数据流分析 + +``` +MT5 报价 + ↓ SymbolInfoDouble(ASK/BID) → Ask/Bid 全局(行 2228-2229, 1204 RefreshRates) + ↓ SymbolInfoInteger → Bars_FXD, Digits_FXD, Point_FXD + ↓ +__OnTick__(): + ↓ iBands(0,1) → v68=Upper ← g_iBands_Upper + ↓ iBands(0,2) → v67=Lower ← g_iBands_Lower + ↓ iWPR(0) → v66=WPR ← g_iWPR_Handle + ↓ + ├─ 时间窗判断 (Hour() 或 TimeGMT) + ├─ 带宽判断: v68 - v67 ∈ [dword_6B59720*P, dword_6B5971C*P] + ├─ WPR 极值: v66 < (5-100)=-95 → 多 + │ v66 > -5 → 空 + ├─ 新柱: qword_6B59550 vs qword_6B59548 + ├─ 持仓: dword_6B595A0 + dword_6B59598 < 1 + └─ 点差: byte_6B59544 (MarketInfo spread ≤ Pointdifferencelimit) + ↓ OrderSend(symbol, 0/1, lot, Ask/Bid, slip, SL, 0, ...) + ↓ +sub_5546348() // 持仓扫描 + ↓ 累加 dword_6B595A0 (空)/ dword_6B59598 (多) + ↓ 取最近仓位 OpenPrice → qword_6B595F8/59600 + ↓ 取次新仓位 OpenPrice/Lots/Ticket → qword_6B59690/660 等 + ↓ +平仓 4 段: + ├─ 行 824: 多 → WPR > -5(与空开条件对称) + ├─ 行 868: 空 → WPR < -95(与多开条件对称) + ├─ 行 911: 多 → Bid - OpenPrice > Profit*P + └─ 行 957: 空 → OpenPrice - Ask > Profit*P +``` + +**数据流问题**: +- `qword_6B58FB0 = Point()`(行 42)—— **在全局初始化时只取一次**,符号切换或账户配置变化不会更新;但 `_Point` 是 compile-time 常量,**实际不会变**——可接受。 +- `qword_6B59590 = MarketInfo("", 13)`(行 220)—— 启动时取的点差,**立即被覆盖**(行 447 每 tick 重读);`qword_6B59590` 在本 EA 中**未被任何代码读取**,是死代码。 + +--- + +## 3. 关键代码片段分析 + +### 3.1 初始化逻辑 + +```mql5 +// OnInit() 行 159-430:99% 注释,仅 220 行一行有效 +qword_6B59590 = DFCC::MarketInfo("", 13); // 返回最后报价时间整数 +``` + +**说明**: +- 几乎无初始化工作,所有"实质性初始化"(指标句柄、品种参数、复利手数)都放在 OnTick 第一次执行时。 +- 这种"延迟初始化"模式在策略 EA 中可接受,但**指标句柄应在 OnInit 中建好**——目前依赖 OnTick 中的 `g_iBands_Upper == INVALID_HANDLE` 守卫条件,逻辑正确但不规范。 +- 220 行 `MarketInfo("", 13)`(MODE_SPREAD=13)将 spread 存入 `qword_6B59590`,但该变量**全文未被读取**——是反编译器残留的初始化赋值,**死代码**。 + +### 3.2 核心交易逻辑 + +```mql5 +// __OnTick__() 行 438-982 - 核心决策 +void __OnTick__() +{ + // 1) 点差过滤 + if (DFCC::MarketInfo("", 13) <= Pointdifferencelimit) byte_6B59544 = 1; + else byte_6B59544 = 0; + + // 2) 品种参数切换 (55 行 if-else if 链) + if (ParameterSwitching) { ... } + else { /* 5 个 StringFind 分支 */ } + + // 3) 指标句柄管理 + if (g_iBands_Upper == INVALID_HANDLE || g_Volatility != Volatility) { ... } + v68 = DFCC::_GetIndicatorValue_(g_iBands_Upper, 1, 0); + v67 = DFCC::_GetIndicatorValue_(g_iBands_Lower, 2, 0); + v66 = DFCC::_GetIndicatorValue_(g_iWPR_Handle, 0, 0); + + // 4) 时间窗 + 带宽 + WPR 极值 + 单仓约束 → 4 段几乎对称的开仓块 + // 5) 4 段平仓块(多/空 × WPR反转/止盈) +} +``` + +**说明**: +- 整个 `__OnTick__` 函数 540+ 行,**未抽取任何子函数**——典型的"反编译产物"。 +- 4 段开仓逻辑 + 4 段平仓逻辑**结构高度对称**(测试模式×实盘模式 × 多×空),共 8 段近重复 if 块,应封装为 `TryOpenBuy()/TryOpenSell()/TryCloseBuy()/TryCloseSell()`。 +- "测试模式"(行 553-684)与"实盘模式"(行 686-815)只有时间窗不同;条件体几乎逐行复制。 +- `v66`(WPR)变量在同一次 tick 中**既用于开仓判断又用于平仓判断**,平仓与开仓可能同 tick 触发。 + +### 3.3 事件处理逻辑 + +- **不存在** `OnTrade()` / `OnTradeTransaction()`。 +- 订单成交确认依赖**轮询式**扫描(`sub_5546348()` 在每个 tick 重算 `dword_6B595A0/dword_6B59598`),**有最多 1 个 tick 的状态滞后**。 +- `OrderSend` 的重试机制为 do-while 循环,最多 10 次(行 600-624, 655-678, 729-751, 785-807)—— 4 段开仓**各自实现**了相同的重试逻辑。 + +### 3.4 资源释放逻辑 + +```mql5 +// OnDeinit() 行 1197-1200 - 资源释放 +void OnDeinit(const int reason) +{ + CleanupIndicatorHandles(); +} +``` + +**说明**: +- 正确释放 3 个指标句柄。 +- **未释放**: 任何动态对象、文件句柄、定时器、图形对象——本 EA 几乎没有这些资源,可接受。 +- **未保存任何状态**:终端重启后所有"防重入变量"清零,存在重启后立即同向加仓风险。 + +--- + +## 4. 整体结构判断总结 + +| 维度 | 评价 | +|---|---| +| **策略清晰度** | 核心思想(布林带带宽 + WPR 极值 + 单仓反转)可识别,但被 540 行重复代码淹没 | +| **代码风格** | 反编译器十六进制变量名主导,**几乎无法人工阅读** | +| **状态管理** | 依赖 50+ 全局变量互相同步,缺乏显式状态机 | +| **错误恢复** | 仅有 OrderSend 重试,无 OnTrade 事件、无断点续传保护 | +| **资源管理** | 句柄已用 cleanup 模式管理,但 iBands 双句柄浪费 | +| **多品种** | 5 个品种硬编码参数表,**Symbol() 字符串匹配**而非 enum | diff --git a/review/TopBottomEA_审查报告_02_可视化图表.md b/review/TopBottomEA_审查报告_02_可视化图表.md new file mode 100644 index 0000000..e8bcf3c --- /dev/null +++ b/review/TopBottomEA_审查报告_02_可视化图表.md @@ -0,0 +1,286 @@ +# MQL5代码审查报告 - 第三阶段(可视化图表) + +--- + +## 1. 程序运行状态机图 + +```mermaid +stateDiagram-v2 + [*] --> OnInit + OnInit --> WaitingForTick : 完成(实际为空壳) + WaitingForTick --> SpreadCheck : OnTick触发 + SpreadCheck --> SymbolParamSelect : spread正常 + SpreadCheck --> WaitingForTick : spread过大 + SymbolParamSelect --> HandleInit : 选好品种参数 + HandleInit --> IndicatorRead : 句柄ready + HandleInit --> WaitingForTick : 句柄创建失败 + IndicatorRead --> PositionScan : 读v66/v67/v68 + PositionScan --> TimeWindow : sub_5546348完成 + TimeWindow --> BandWidthCheck : 时间窗内 + TimeWindow --> PositionClose : 时间窗外 + BandWidthCheck --> WPRExtreme : 带宽dword_6B59720P PositionClose : 带宽越界 + WPRExtreme --> NoPosition : WPR<-95 (BUY)或>-5 (SELL) + NoPosition --> NewBarCheck : 无持仓+dword_6B59544 + NewBarCheck --> OpenBuy : WPR<-95 + NewBarCheck --> OpenSell : WPR>-5 + NewBarCheck --> PositionClose : 已有持仓或本柱已开 + OpenBuy --> OrderSendLoop : 设置SL=Ask-dword_6B59714*P + OpenSell --> OrderSendLoop : 设置SL=Bid+dword_6B59714*P + OrderSendLoop --> OpenBuy : 重试<10次失败 + OrderSendLoop --> WaitingForTick : 下单成功 + PositionClose --> CloseBuyWPR : 多仓+WPR反转(v66>-5) + PositionClose --> CloseBuyProfit : 多仓+Bid-Open>Profit*P + PositionClose --> CloseSellWPR : 空仓+WPR反转(v66<-95) + PositionClose --> CloseSellProfit : 空仓+Open-Ask>Profit*P + PositionClose --> WaitingForTick : 平仓完成 + WaitingForTick --> [*] : OnDeinit +``` + +**说明**: +- **正常路径**: 等待tick → 8 个串联条件(spread→品种→句柄→指标→时间→带宽→WPR→新柱)→ 开仓/平仓 → 回到等待 +- **异常/旁路**: + - `OpenBuy → OrderSendLoop → OpenBuy` 自循环(重试<10次) + - 4 段平仓逻辑**互不互斥**(WPR反转与止盈可同tick触发) +- **死状态**: 句柄创建失败后回到 `WaitingForTick`,但**没有计数器**,理论可能无限重试创建——但 fxDreema 转换的 iBands/iWPR 不太可能创建失败,实操风险低。 + +--- + +## 2. 策略逻辑流程图 + +```mermaid +flowchart TD + Start([OnTick触发]) --> Refresh[DFCC::RefreshRates
更新Ask/Bid/Bars] + Refresh --> Spread{spread ≤ Pointdifferencelimit?} + Spread -->|否| End1([返回]) + Spread -->|是| SpreadOK[byte_6B59544=1] + SpreadOK --> SymbolSwitch{Symbol参数切换} + SymbolSwitch -->|GBPCAD| P1[Vol=110 SL=800 TP=300] + SymbolSwitch -->|EURSGD| P2[Vol=140 SL=700 TP=160] + SymbolSwitch -->|GBPCHF| P3[Vol=110 SL=600 TP=200] + SymbolSwitch -->|CHFSGD| P4[Vol=60 SL=700 TP=160] + SymbolSwitch -->|GBPSGD| P5[Vol=35 SL=700 TP=160] + SymbolSwitch -->|其他| P0[用input默认] + P1 & P2 & P3 & P4 & P5 & P0 --> HandleCheck{句柄ready?} + HandleCheck -->|否| BuildH[创建iBands+iWPR] + BuildH --> Calc + HandleCheck -->|是| Calc[读v68=Upper v67=Lower v66=WPR] + Calc --> Scan[sub_5546348
扫描持仓计数] + Scan --> Lot{Compoundinterest?} + Lot -->|是| LotComp[equity*Risk/1e6 round 2位] + Lot -->|否| LotFix[Lots=0.1] + LotComp & LotFix --> TimeGate{IsTesting?} + TimeGate -->|是| TimeTest[Hour∈20-24或0-3] + TimeGate -->|否| TimeLive[TimeGMT∈18-1] + TimeTest & TimeLive --> Band[带宽检查
v68-v67 ∈ dword_6B59720P, dword_6B5971CP] + Band -->|带宽越界| CloseCheck + Band -->|带宽ok| Pos{多+空总数<1?} + Pos -->|否| CloseCheck + Pos -->|是| SpreadAct[byte_6B59544==1?] + SpreadAct -->|否| CloseCheck + SpreadAct -->|是| WPRExtreme{v66<-95?} + WPRExtreme -->|是| NewBar1{qword_6B59548≠iTime?} + NewBar1 -->|是| Buy[OrderSend BUY
SL=Ask-dword_6B59714*P] + NewBar1 -->|否| CloseCheck + WPRExtreme -->|否| WPRExtreme2{v66>-5?} + WPRExtreme2 -->|是| NewBar2{qword_6B59558≠iTime?} + NewBar2 -->|是| Sell[OrderSend SELL
SL=Bid+dword_6B59714*P] + NewBar2 -->|否| CloseCheck + WPRExtreme2 -->|否| CloseCheck + Buy & Sell --> CloseCheck + CloseCheck{持有多?} + CloseCheck -->|是| WPRClose1{v66>-5?} + WPRClose1 -->|是| DoCloseBuy1[OrderClose多] + CloseCheck -->|否| CloseCheck2 + WPRClose1 -->|否| ProfitClose1{Bid-Open>ProfitP?} + ProfitClose1 -->|是| DoCloseBuy2[OrderClose多] + WPRClose1 & ProfitClose1 -->|否| CloseCheck2 + CloseCheck2{持有空?} + CloseCheck2 -->|是| WPRClose2{v66<-95?} + WPRClose2 -->|是| DoCloseSell1[OrderClose空] + CloseCheck2 -->|否| End2 + WPRClose2 -->|否| ProfitClose2{Open-Ask>ProfitP?} + ProfitClose2 -->|是| DoCloseSell2[OrderClose空] + WPRClose2 & ProfitClose2 -->|否| End2 + DoCloseBuy1 & DoCloseBuy2 & DoCloseSell1 & DoCloseSell2 --> End2([返回]) + End1 & End2 --> WaitNext[等下一tick] +``` + +**说明**: +- **核心决策点**: 8 个串联(spread / 品种 / 句柄 / 指标 / 时间 / 带宽 / 持仓 / WPR),任一不满足即跳过开仓 +- **平仓双重触发**: WPR反转(v66>-5/-95)作为反转信号、Profit*P 作为目标止盈;**两个条件可同tick都满足**,但 OrderClose 内部会因仓位已平而失败 +- **新柱防重入**: `qword_6B59548 != qword_6B59550`(多通道)/ `qword_6B59558 != qword_6B59560`(空通道),通过 iTime 比较 +- **资金管理**: 复利开关开启时 → `equity*40/1e6`;关闭时固定 0.1 手 + +--- + +## 3. 核心类图 + +```mermaid +classDiagram + class TopBottomEA { + +input double __Lots__ = 0.1 + +input bool __Compoundinterestswitch__ + +input int __Risk__ = 40 + +input int __Volatility__ = 110 + +input int __StopLoss__ = 800 + +input int __Profit__ = 300 + +input double __Pointdifferencelimit__ = 50 + +input int __Magic__ = 888999 + +__OnTick__() void + +OnInit() void + +OnDeinit(reason) void + +sub_5546348() int + } + class DFCC { + -static int _LastError + +AccountEquity() double + +AccountFreeMarginCheck() double + +Hour() int + +IsTesting() bool + +MarketInfo() double + +OrderClose() bool + +OrderClosePrice() double + +OrderCommission() double + +OrderLots() double + +OrderMagicNumber() long + +OrderOpenPrice() double + +OrderProfit() double + +OrderSelect() bool + +OrderSend() int + +OrderStopLoss() double + +OrderSwap() double + +OrderSymbol() string + +OrderTakeProfit() double + +OrderTicket() int + +OrderType() int + +OrdersTotal() int + +RefreshRates() bool + +TimeHour() int + +iBands() double + +iTime() datetime + +iWPR() double + -_GetIndicatorValue_() double + -_ConvertAppliedPrice_() ENUM_APPLIED_PRICE + -_ConvertTimeframe_() ENUM_TIMEFRAMES + } + class DFCC_TRADES { + +CheckForTradingError() int + +IsExpirationTypeAllowed() bool + +IsFillingTypeAllowed() bool + +LoadPendingOrder() bool + +LoadedType() int + } + class IndicatorCache { + +int g_iBands_Upper + +int g_iBands_Lower + +int g_iWPR_Handle + +int g_Volatility + +CleanupIndicatorHandles() void + } + class GlobalState { + +byte_6B59544 bool // spread flag + +dword_6B595A0 int // sell count + +dword_6B59598 int // buy count + +qword_6B595F8 double // last buy open + +qword_6B59600 double // last sell open + +qword_6B59548 datetime // last buy bar + +qword_6B59558 datetime // last sell bar + +qword_6B59550 datetime // current bar + +dword_6B59710 int // vol override + +dword_6B59714 int // SL override + +dword_6B59718 int // TP override + } + TopBottomEA --> DFCC : 大量调用 + TopBottomEA --> DFCC_TRADES : 间接(经DFCC) + TopBottomEA --> IndicatorCache : 创建/释放 + TopBottomEA --> GlobalState : 读写50+全局 + DFCC --> DFCC_TRADES : 错误处理 +``` + +**说明**: +- `DFCC` 类是 MQL4 API 的**完全仿真层**(fxDreema 工具生成),把 MQL5 原生 API 重新包装成 MQL4 风格的静态方法 +- `GlobalState` 在 UML 中以"上帝对象"形式存在——50+ `dword_/qword_/byte_6B5xxxx` 全局变量承担所有状态管理 +- 没有任何"策略类"抽象(无 `CSignalGenerator / CRiskManager / CPositionManager`),所有逻辑平铺在 `__OnTick__` 的 540 行中 +- `IndicatorCache` 是个**隐式类**(用全局变量+全局函数实现),应在 `OnInit` 中创建、`OnDeinit` 中释放——目前放在 `OnTick` 中懒创建 + +--- + +## 4. 交互时序图 + +```mermaid +sequenceDiagram + participant T as MetaTrader 5 + participant EA as TopBottomEA + participant C as DFCC::RefreshRates + participant I as IndicatorCache + participant S as GlobalState + participant SC as sub_5546348 + participant O as DFCC::OrderSend + participant OC as DFCC::OrderClose + + T->>EA: OnTick(new tick) + EA->>C: RefreshRates() + C->>T: SymbolInfoDouble/SymbolInfoInteger + T-->>C: Ask, Bid, Bars + C-->>EA: true (data updated) + + EA->>EA: spread check
(byte_6B59544) + EA->>EA: symbol param switch
(dword_6B59710/14/18) + + EA->>I: handle ready? + I-->>EA: yes / 创建句柄 + + EA->>T: iBands(upper) iBands(lower) iWPR + T-->>EA: v68, v67, v66 + + EA->>SC: 扫描持仓 + SC->>T: OrdersTotal + OrderSelect循环 + T-->>SC: 各订单数据 + SC->>S: 写入dword_6B595A0/598/qword_6B595F8/600等 + SC-->>EA: 完成 + + EA->>S: 读qword_6B595A0+598<1? + S-->>EA: 是 + EA->>EA: 带宽检查 v68-v67 + EA->>EA: 时间窗检查 Hour/TimeGMT + EA->>EA: WPR极值 v66 + + alt 开多条件满足 + EA->>S: 更新qword_6B59548=qword_6B59550 + EA->>O: OrderSend(BUY, lot, Ask, 30slip, SL=Ask-dword_6B59714*P) + loop 重试<10 + O->>T: OrderSend(DEAL) + T-->>O: retcode + end + O-->>EA: ticket + else 开空条件满足 + EA->>S: 更新qword_6B59558=qword_6B59560 + EA->>O: OrderSend(SELL, lot, Bid, 30slip, SL=Bid+dword_6B59714*P) + loop 重试<10 + O->>T: OrderSend(DEAL) + T-->>O: retcode + end + O-->>EA: ticket + end + + alt 持有多+反向WPR或Profit目标 + EA->>OC: OrderClose(ticket, lots, closeprice, 300slip) + OC->>T: OrderSend(DEAL reverse) + T-->>OC: retcode + OC-->>EA: bool + else 持有空+反向WPR或Profit目标 + EA->>OC: OrderClose(ticket, lots, closeprice, 300slip) + OC->>T: OrderSend(DEAL reverse) + T-->>OC: retcode + OC-->>EA: bool + end + + EA-->>T: 返回 +``` + +**说明**: +- **典型周期**: 1 个 tick 触发 1 次 OnTick → 4~5 次同步 MT5 API 调用 → 1 次持仓扫描 → 0~1 次开仓 + 0~1 次平仓 +- **异步点**: DFCC::OrderSend/OrderClose 内部有 `Sleep(10ms)` 轮询等待 MT5 状态同步(行 1974/2015),一次订单最多阻塞 ~200ms(10ms × 20次重试) +- **无 OnTrade 回调**: 成交状态完全靠 sub_5546348 的轮询式扫描 +- **关键数据流**: v66(WPR) 同时驱动开仓和平仓判断,**无冷却时间**——理论上 tick 1 触发平多,tick 2 同一价格触发开空 diff --git a/review/TopBottomEA_审查报告_03_最佳实践分析.md b/review/TopBottomEA_审查报告_03_最佳实践分析.md new file mode 100644 index 0000000..bf3d969 --- /dev/null +++ b/review/TopBottomEA_审查报告_03_最佳实践分析.md @@ -0,0 +1,955 @@ +# MQL5代码审查报告 - 第四阶段(最佳实践分析) + +--- + +## 4.1 代码规范与可读性 + +### 4.1.1 命名规范 + +```mql5 +// 📍 问题位置:第 41–143 行 - 全局变量声明 +double qword_6B59510 = 1000000; +int dword_6B59520 = 1000; +int dword_6B59524 = 150; +int dword_6B59528 = 5; +... +double qword_6B595F8 = 0; +double qword_6B59600 = 0; +... +bool byte_6B59544 = 1; +bool byte_6B596D8 = 1; +``` + +```mql5 +// 📍 问题位置:第 19, 21, 23... 行 - input 重复声明 +input double __Lots__ = 0.1; // 6B594B0 +double Lots = __Lots__; +input bool __Compoundinterestswitch__ = false; +bool Compoundinterestswitch = __Compoundinterestswitch__; +input int __Risk__ = 40; +int Risk = __Risk__; +``` + +```mql5 +// 📍 问题位置:第 602 行 - 函数内变量 +DFCC::OrderSend( + Symbol(), // symbol + 0, // operation + dbl_6B59728, // 开仓量 + Ask, // 开仓价 + dword_6B59540, // 滑点 + qword_6B59578, // 止损 + qword_6B59580, // 止盈 + CommentName, + Magic, + 0, + 16711680); // 颜色 +``` + +**⚠️ 问题原因** +- 反编译器残留的**十六进制地址命名**(`dword_6B59710`),完全丧失语义 +- 每个 input 变量被**重复声明**两次(`__Lots__` 与 `Lots`),浪费 22 行且易造成修改遗漏 +- 命名风格**三套混用**:匈牙利反编译器风格(`dword_`)、input 风格(`__Lots__`)、缩写拼音(`Lots`/`Risk`),无可读性 + +**🔍 影响范围** +- **可维护性**: 任何维护者无法从变量名推断用途,必须靠反编译文档或注释(行末的 `// 6B594B0` 提示原地址)—— 是反编译产物的标志 +- **逻辑**: 实际不影响运行(MQL5 允许任意命名),但 `Lots` 与 `__Lots__` 的 double 隐式转换在调试时会引起歧义 +- **审计风险**: 第三方审查者无法快速确认"止损用的是 StopLoss 还是 dword_6B59714" + +--- + +### 4.1.2 代码注释 + +```mql5 +// 📍 问题位置:第 159-430 行 - OnInit 大量注释掉的代码 +/* + if ( Displayswitch == 1 ) + { + sub_554698E(0, 0, 84520750, 0, 25, 15, 150, 60, 0, 84520770, v37, 10, 16443110, 3947580, 0, 0, 0, 0, 0, 0, 0); + ... + ObjectSetInteger(0, v23, 102, 30, 0); + ... + }*/ +``` + +```mql5 +// 📍 问题位置:第 451-453 行 - 中文注释保留自原作者 +// qword_6B58FF4 = dword_6B5971C * qword_6B58FB0; +// qword_6B58FF4 =dword_6B59720 * qword_6B58FB0; + +//AccountFreeMarginCheck 检查可用保证金 +``` + +**⚠️ 问题原因** +- 270+ 行 `OnInit` 中 99% 是被 `/* */` 注释掉的 MQL4 图表对象创建代码(MQL4 的 `ObjectSetInteger` 调用) +- 注释中混用**反编译的地址数字**(`84520750`、`84520810`)和**真实业务注释**("开仓量"、"开仓价"、"滑点"),可读性混乱 +- 翻译注释("多单平仓1"、"多单平仓2")仅是平仓触发条件不同时的区分,**缺乏说明为何分两段** + +**🔍 影响范围** +- **可维护性**: 大量死代码膨胀文件,IDE 索引耗时;维护时需小心不要"启用"这些注释 +- **编译期**: 注释代码不会被编译,**0 编译影响** +- **运行期**: 注释中 `ObjectSetString` 等 MQL4 语法在 MQL5 中已改变(如 MQL5 用 `ObjectSetString(0, name, OBJPROP_TEXT, value)`),即使取消注释也**无法编译通过**——是定时炸弹 + +--- + +### 4.1.3 魔术数字 + +```mql5 +// 📍 问题位置:第 44-52 行 - 魔术数字常量 +int dword_6B59528 = 5; // WPR 阈值 = 5 → 条件 v66 < -95 +int dword_6B5952C = 5; // WPR 平仓阈值 +int dword_6B59530 = 20; // 时间窗起点(小时) +int dword_6B59534 = 24; // 时间窗终点 +int dword_6B59538 = 0; +int dword_6B5953C = 3; // 第二时间窗终点 +int dword_6B59540 = 30; // 开仓滑点 +int dword_6B59520 = 1000; // 带宽上限 +int dword_6B59524 = 150; // 带宽下限 +``` + +```mql5 +// 📍 问题位置:第 529-530 行 - iBands 硬编码参数 +g_iBands_Upper = ::iBands(_Symbol, PERIOD_CURRENT, 20, 0, 2.0, PRICE_CLOSE); +g_iBands_Lower = ::iBands(_Symbol, PERIOD_CURRENT, 20, 0, 2.0, PRICE_CLOSE); +g_iWPR_Handle = ::iWPR(_Symbol, PERIOD_CURRENT, g_Volatility); +``` + +```mql5 +// 📍 问题位置:第 849, 891, 936, 973 行 - OrderClose 硬编码 +DFCC::OrderClose(DFCC::OrderTicket(), DFCC::OrderLots(), DFCC::OrderClosePrice(), 300, 0xFFFF); +``` + +```mql5 +// 📍 问题位置:第 616, 669, 743, 799 行 - 颜色魔术数字 +... 16711680); // 红色 clrRed +... 255); // 蓝色 clrBlue +``` + +**⚠️ 问题原因** +- 9 个"内部参数"以**全局变量初始值**形式定义,无法被 input 调整、无法在策略测试器中优化 +- iBands 的 period=20 / deviation=2.0 写死在 OnTick 中 +- OrderClose 的 300 slippage、0xFFFF arrow_color 无法配置 +- 16711680 实际是 `C'0xFF0000'` 红色,但 255 是 `C'0x0000FF'` 蓝色,**含义未注释** + +**🔍 影响范围** +- **可维护性**: 调参困难——回测时若想测"带宽阈值变化对收益影响"必须改源码 +- **性能**: 无法做参数优化(Strategy Tester 只识别 input) +- **业务**: 300 点 slippage 对 4 位报价 30pips 是正常,对 5 位报价 3pips 偏紧——**该值未根据报价位数自适应** + +--- + +### 4.1.4 代码复用 + +```mql5 +// 📍 问题位置:第 553-684 行 vs 第 686-815 行 - 测试模式与实盘模式几乎完全相同 +if (DFCC::IsTesting() == 1) +{ + if (DFCC::Hour() >= dword_6B59530 && DFCC::Hour() <= dword_6B59534 || DFCC::Hour() >= dword_6B59538 && DFCC::Hour() <= dword_6B5953C) + { + if (v68-v67 < dword_6B5971C*qword_6B58FB0) { + if (v68-v67 > dword_6B59720 * qword_6B58FB0) { + if (dword_6B595A0 + dword_6B59598 < 1 && byte_6B59544 == 1) { + if (v66 < dword_6B59528 - 100 && qword_6B59548 != qword_6B59550) { + // 开多 ~50 行 + } + } + if (dword_6B595A0 + dword_6B59598 < 1 && byte_6B59544 == 1) { + if (v66 > -dword_6B59528 && qword_6B59558 != qword_6B59560) { + // 开空 ~50 行 + } + } + } + } + } +} +else +{ + if (DFCC::TimeHour(TimeGMT()) >= 18 || DFCC::TimeHour(TimeGMT()) <= 1) { + if (v68-v67 < dword_6B5971C*qword_6B58FB0) { + // 与上面 100% 相同结构 ~130 行 + } + } +} +``` + +```mql5 +// 📍 问题位置:第 818-897 行 - 平仓WPR反转(多+空几乎复制) +if (dword_6B59598 > 0 && byte_6B59544 == 1) { + if (v66 > (-dword_6B5952C)) { + for (int i = ...) { ... close buy ... } + } +} +if (dword_6B595A0 > 0 && byte_6B59544 == 1) { + if (v66 < dword_6B5952C - 100) { + for (int j = ...) { ... close sell ... } + } +} +``` + +```mql5 +// 📍 问题位置:第 899-979 行 - 止盈平仓(多+空几乎复制) +if (dword_6B59598 > 0 && byte_6B59544 == 1) { + if (Bid - qword_6B595F8 > dword_6B59718 * qword_6B58FB0) { + for (int k = ...) { ... } + } +} +if (dword_6B595A0 > 0 && byte_6B59544 == 1) { + if (qword_6B59600 - Ask > dword_6B59718 * qword_6B58FB0) { + for (int m = ...) { ... } + } +} +``` + +**⚠️ 问题原因** +- 8 段近重复的 if 块(4 段开仓 × 2 模式 / 4 段平仓 × 2 触发条件)共 ~400 行,**结构对称度 95%**: + - 4 段开仓:仅方向/阈值不同 + - 4 段平仓:仅多空+条件不同 +- 全部应封装为 `TryOpen(ENUM_ORDER_TYPE dir)` / `TryClose(ENUM_ORDER_TYPE dir, CLOSE_REASON reason)` +- 测试/实盘模式只是时间窗不同,外层应抽出 `GetTimeHour()` 函数 + +**🔍 影响范围** +- **可维护性**: 任何逻辑修改(如改止损计算、加追踪止损)必须改 4~8 处,**必然遗漏** +- **代码体积**: 当前 2574 行,若重构可压缩到 ~1500 行 +- **bug 风险**: 实测行 824 处的 `dword_6B59598 > 0` 复用了多仓计数变量,行 868 处的 `dword_6B595A0 > 0` 复用了空仓计数变量——对称但**容易在复制时搞反**(已发生:行 870 `if (v66 < dword_6B5952C - 100)` 闭区间 vs 行 911 等是开区间,但混在一起阅读极易出错) + +--- + +### 4.1.5 文件组织 + +```mql5 +// 📍 问题位置:第 1210-2436 行 - DFCC 类 1200+ 行内联 +class DFCC { + // ... 2000 行 +}; +class DFCC_TRADES { + // ... 200 行 +}; +``` + +**⚠️ 问题原因** +- DFCC 类(2000+ 行)作为**通用 MQL4→MQL5 兼容层**,本应独立为 `fxdreema_converter.mqh` 头文件,被任何移植项目共享 +- 当前内联在主 EA 中,导致核心策略(~700 行)只占文件 27%,其余 73% 是通用兼容代码——**关注点严重不分离** + +**🔍 影响范围** +- **可维护性**: 升级 DFCC 库需要修改 EA 文件 +- **复用**: 其他 fxDreema 移植的 EA 无法共享这份代码 +- **审查成本**: 审查者必须穿透 2000 行无关代码才能定位策略 + +--- + +## 4.2 交易逻辑正确性 + +### 4.2.1 信号闪烁(Repainting) + +```mql5 +// 📍 问题位置:第 535-537 行 - 指标读取使用 shift=0(当前未完成K线) +v68 = DFCC::_GetIndicatorValue_(g_iBands_Upper, 1, 0); // Upper band at bar 0 +v67 = DFCC::_GetIndicatorValue_(g_iBands_Lower, 2, 0); // Lower band at bar 0 +v66 = DFCC::_GetIndicatorValue_(g_iWPR_Handle, 0, 0); // WPR at bar 0 +``` + +**⚠️ 问题原因** +- 所有指标都用 `shift=0`,即**当前正在形成的K线**。K 线未收盘时 WPR/布林带**会随新 tick 不断重算**。 +- 实盘中:开仓信号可能在 tick 1 出现 → 500ms 后 K 线收盘时 WPR 已经回到正常区域 → 信号消失。**实盘会"漏掉"信号或成交后立即反向**。 +- 回测中:测试器在每根 K 线收盘时**仍可访问 shift=0 的最终值**,这意味着回测用的是 K 线收盘后的"未来" WPR。**回测结果虚高**。 + +**🔍 影响范围** +- **回测 vs 实盘**: 严重背离。实盘开仓数可能比回测少 30-50% +- **信号可靠性**: WPR 在 K 线未收盘时的极值(<-95 / >-5)比收盘后极值**更极端**,EA 实际上"在最有利的瞬间"成交,但**成交价不一定有利** +- **建议方向**: 信号触发应改用 `shift=1`(已收盘K线)并加新柱检测——但本 EA 新柱检测只用 iTime 而非指标周期,**不能完全避免** + +--- + +### 4.2.2 未来函数(Look-ahead Bias) + +```mql5 +// 📍 问题位置:第 535-537 行(同上) + 第 540-541 行 +qword_6B59550 = DFCC::iTime("", 1, 1); // bar 1 +qword_6B59560 = DFCC::iTime("", 1, 1); // bar 1 +``` + +**⚠️ 问题原因** +- iTime 用 shift=1(已收盘K线),是正确的 +- 但 WPR/BB 仍用 shift=0,**回测时 shift=0 的值是"已知未来"**(MT5 测试器在 tick 模拟时假定 K 线收盘后指标值已知) +- MQL5 中 `iBands(handle, mode, 0, 1)` 在 K 线未收盘时返回**当前已知最高/最低价计算的临时值**,这个值会随 K 线进行**变化**——是 repainting 的根源 + +**🔍 影响范围** +- **回测收益虚高**: 这是 MQL5 中典型的"未来函数"陷阱,回测报告的 Sharpe / Profit Factor 不可信 +- **实盘表现**: 当 WPR 极值条件在 K 线中间触发后,下一个 tick 不再满足条件 → 错过入场 + +--- + +### 4.2.3 多品种处理 + +```mql5 +// 📍 问题位置:第 460, 480-519 行 - 用 StringFind 识别品种 +if (StringFind(Symbol(), "CHFSGD", 0) < 0 && StringFind(Symbol(), "GBPSGD", 0) < 0) +if (StringFind(Symbol(), "GBPCAD", 0) >= 0) { dword_6B59710 = 110; ... } +if (StringFind(Symbol(), "EURSGD", 0) >= 0) { ... } +``` + +**⚠️ 问题原因** +- 用**字符串子串匹配**识别品种,**极易出错**: + - `GBPCAD` 也会匹配到不存在的 `GBPCADOT` 等变种名 + - 子串不区分大小写(在某些 MT5 版本中) + - 增加新品种需要改源码 +- 魔术号 `888999` 在所有品种间**共享**——若把 EA 拖到多张图表(GBPCAD + EURSGD),不同品种的仓位会被混合统计 `dword_6B595A0 + dword_6B59598 < 1` 的判断将**全部品种视为同一仓**——可能造成在 GBPCAD 已有仓时仍尝试在 EURSGD 反向开仓,且**违反"单笔持仓"约束** + +**🔍 影响范围** +- **多品种运行**: 完全不安全。EA 设计假设单品种单仓 +- **字符串匹配**: 不规范的经纪商 symbol 命名(带 `.` `,` `_`)可能导致误判 +- **可维护性**: 5 个品种硬编码,加新品种需改源码并重编译 + +--- + +### 4.2.4 时间过滤 + +```mql5 +// 📍 问题位置:第 555, 690 行 - 复杂的时间窗口条件 +if (DFCC::Hour() >= dword_6B59530 && DFCC::Hour() <= dword_6B59534 + || DFCC::Hour() >= dword_6B59538 && DFCC::Hour() <= dword_6B5953C) +// 即: (20-24) || (0-3) → 实际是 20:00 到次日 03:00 + +if (DFCC::TimeHour(TimeGMT()) >= 18 || DFCC::TimeHour(TimeGMT()) <= 1) +// 即: GMT 18:00-次日 01:00(用 || 而非 &&,含义不清晰) +``` + +**⚠️ 问题原因** +- 测试模式用 `Hour()`(**服务器时间**),实盘用 `TimeGMT()`(GMT)—— 两个时基混用,回测/实盘行为不一致 +- 第一个时间窗条件 `||` 缺少括号,按优先级 `(A && B) || (C && D)` 解析——**逻辑正确但极易误读**为 `(A && B && C) || D` +- 第二个时间窗 `>= 18 || <= 1` 实际覆盖全天所有小时(18-23 或 0-1)—— **OR 的两段不是分时段,而是大多数时段**!意图可能是 18-次日 1 的连续窗口,但写法错误 + +**🔍 影响范围** +- **行为**: 实盘"时间窗过滤"几乎不生效(GMT 18:00 到次日 01:00 之外也被允许?需重新解读) +- **时基混乱**: 测试与实盘时基不同,回测时区设置会改变行为 +- **周末/节假日**: 无显式处理,依赖服务器的"市场关闭"自动拒绝订单 + +--- + +### 4.2.5 滑点与重报价 + +```mql5 +// 📍 问题位置:第 607, 662, 736, 792 行 - 开仓滑点 +DFCC::OrderSend(..., dword_6B59540, ...); // dword_6B59540 = 30 + +// 📍 问题位置:第 849, 891, 936, 973 行 - 平仓滑点 +DFCC::OrderClose(..., 300, ...); // 硬编码 300 +``` + +**⚠️ 问题原因** +- 开仓滑点 30、平仓滑点 300 严重不对称(10倍差距)—— 可能是反编译器对 MQL4 的 `slippage` 参数处理误差 +- 30 在 5 位报价下 = 0.3pips,**对市价单几乎无要求**;300 在 4 位报价下 = 30pips,**过宽** +- DFCC 包装的 OrderSend 内部对 requote/error 有重试,但**没有显式的滑点统计/告警** + +**🔍 影响范围** +- **成本**: 过宽的平仓滑点会在高波动时让经纪商以劣于要求价 30pips 平仓 +- **回测准确性**: Strategy Tester 模拟滑点方式与实盘不同,宽滑点会**掩盖实盘滑点问题** + +--- + +## 4.3 订单与仓位管理 + +### 4.3.1 订单类型选择 + +```mql5 +// 📍 问题位置:第 602, 657, 731, 787 行 - 全部为市价单(DEAL) +DFCC::OrderSend(Symbol(), 0, ...); // OP_BUY = 0 +DFCC::OrderSend(Symbol(), 1, ...); // OP_SELL = 1 +``` + +**⚠️ 问题原因** +- 只用市价单(DEAL),无挂单(pending order) +- 市价单在 EA 中:触发延迟 0,但成交价不可控 +- 策略意图是"波动率极值反转入场",**实际可能更适合挂限价单**(在 BB 内/外一定距离挂单),减少滑点 + +**🔍 影响范围** +- **执行质量**: 高波动时段市价单滑点可能 5-20pips +- **回测 vs 实盘**: Strategy Tester 的"Every tick" 模式才能模拟市价单的真实成交,否则用"Open prices only" 会极大高估 + +--- + +### 4.3.2 订单填充模式 + +```mql5 +// 📍 问题位置:DFCC::OrderSend 行 1907-1913 - FOK/IOC/RETURN 智能选择 +if (DFCC_TRADES::IsFillingTypeAllowed(symbol, SYMBOL_FILLING_FOK)) + request.type_filling = ORDER_FILLING_FOK; +else if (DFCC_TRADES::IsFillingTypeAllowed(symbol, SYMBOL_FILLING_IOC)) + request.type_filling = ORDER_FILLING_IOC; +else if (DFCC_TRADES::IsFillingTypeAllowed(symbol, ORDER_FILLING_RETURN)) + request.type_filling = ORDER_FILLING_RETURN; +``` + +**⚠️ 问题原因** +- 兼容层正确处理了三种填充模式 +- 但**对市价单而言优先 FOK/IOC**:在流动性不足时会**整笔被拒**(FOK 全部成交否则取消)—— 而本策略 WPR 极值信号出现时往往伴随流动性降低 +- **应优先 RETURN 模式**(部分成交即可),但代码选了 FOK 优先 + +**🔍 影响范围** +- **成交率**: 极端行情 WPR 触及极值时,订单可能因 FOK 部分成交失败而被拒,错过入场 + +--- + +### 4.3.3 持仓对冲模式 + +```mql5 +// 📍 问题位置:第 567, 630, 702, 757 行 - 单仓约束 +if (dword_6B595A0 + dword_6B59598 < 1 && byte_6B59544 == 1) +``` + +**⚠️ 问题原因** +- 限制"多仓数+空仓数 < 1" = 至多 1 个总仓位 +- **对冲模式下** (RETAIL_HEDGING): 单品种可有 1 个多 + 1 个空,"1 个总仓位"约束**阻止了对冲**(如多空锁仓) +- **净值模式下** (RETAIL_NETTING): 同方向开仓会合并,**单仓约束失效**——dword_6B595A0/dword_6B59598 计数可能不准确 +- 净值模式下,DFCC 包装的 OrderSend 会先 `PositionSelect` 检查是否反仓(行 1826-1834),但本 EA 没意识到"反仓"会导致旧仓被关——**行为不一致** + +**🔍 影响范围** +- **净值账户**: 实际持仓可能突破 1 笔(多次加仓合并),与策略设计冲突 +- **对冲账户**: 想锁仓时被禁止 + +--- + +### 4.3.4 部分平仓 + +```mql5 +// 📍 问题位置:第 849, 891, 936, 973 行 - 全部用 OrderLots() 全平 +DFCC::OrderClose(DFCC::OrderTicket(), DFCC::OrderLots(), DFCC::OrderClosePrice(), 300, 0xFFFF); +``` + +**⚠️ 问题原因** +- 全部用 `OrderLots()` 平仓,即**全平**——无法分批止盈 +- 净值模式下加仓后 `OrderLots()` 是总手数,**会一平全平**——丢失"分批建仓分批平仓"的灵活性 +- 策略盈利目标 300 点平仓,但**没有"达到 150 点先平一半保本"等中间管理** + +**🔍 影响范围** +- **盈利曲线**: 一次性平仓对滑点敏感(特别在高 spread 时段) +- **风险**: 没有部分平仓来锁盈 + +--- + +### 4.3.5 订单修改限制 + +```mql5 +// 📍 问题位置:第 580, 642, 714, 769 行 - 止损计算 +qword_6B59578 = NormalizeDouble(Ask-dword_6B59714 *qword_6B58FB0, 5); +qword_6B59578 = NormalizeDouble(Bid+dword_6B59714 *qword_6B58FB0, 5); +``` + +**⚠️ 问题原因** +- SL = `dword_6B59714 * _Point` = 800 * Point = 80pips (5位) / 800pips (4位) +- **未检查 `SYMBOL_TRADE_STOPS_LEVEL`**(经纪商要求的最小止损距离)—— 部分经纪商要求 100pips+,本 EA 800pips 是 80pips,**多数情况下安全**但**未自适应** +- **未检查 `SYMBOL_TRADE_FREEZE_LEVEL`**(止损冻结区)—— 在新闻/收盘时设止损可能被拒 +- SL 用 `NormalizeDouble(..., 5)` 硬编码 5 位—— 4 位报价的品种会被错误归一化(如 GBPJPY=3 位会出现 1.23456789 → 1.23457 但实际应是 1.235) + +**🔍 影响范围** +- **订单拒绝**: 某些经纪商在特定时段要求更严的 stops level,未检查会导致 10034 error +- **精度错误**: 4 位报价下止损精度异常(小数位过多或过少) + +--- + +## 4.4 风险管理 + +### 4.4.1 仓位计算 + +```mql5 +// 📍 问题位置:第 546 行 - 复利手数计算 +dbl_6B59728 = StringToDouble(DoubleToString(DFCC::AccountEquity() * Risk / qword_6B59510, 2)); +// 即: lots = (equity * 40 / 1_000_000) 截取2位小数 +``` + +```mql5 +// 📍 问题位置:第 587-591 行 - 注释掉的 lot 边界检查 +/* if (dbl_6B59728 < SymbolInfoDouble(0, 35)) // MODE_MINLOT + dbl_6B59728 = SymbolInfoDouble(0, 35); + if (dbl_6B59728 > SymbolInfoDouble(0, 34)) // MODE_MAXLOT + dbl_6B59728 = SymbolInfoDouble(0, 34); */ +``` + +**⚠️ 问题原因** +- 复利公式 `(equity * 40) / 1,000,000` 含义不清: + - $10,000 账户 → 0.4 手 + - $1,000 账户 → 0.04 手 + - $100,000 账户 → 4.0 手 + - **与 StopLoss 完全无关**——没有按"风险金额 / 止损点数"的标准手数公式 +- `StringToDouble(DoubleToString(..., 2))` 是个**反模式**:先格式化再解析回 double,浪费 CPU 且有精度损失 +- **未应用最小/最大手数约束**(代码已注释掉)—— 0.04 手低于 SYMBOL_VOLUME_MIN(如 0.1)会被 OrderSend 拒绝 +- 复利开关关闭时硬编码 0.1 手—— 风险敞口固定,**$1,000 账户和 $100,000 账户用同样手数** + +**🔍 影响范围** +- **资金管理失效**: 小账户可能被自动化为"小于最小手"而无法开仓 +- **大账户风险过大**: 0.1 手对 $100k 账户是 0.1% 风险,但对 $1k 账户是 10% 风险 +- **复利失控**: 公式中"Risk=40"含义不明确,调整时无依据 + +--- + +### 4.4.2 最大回撤控制 + +```mql5 +// 📍 问题位置:整个 __OnTick__ - 无任何回撤控制 +``` + +**⚠️ 问题原因** +- **完全没有**: + - 单日亏损限制 + - 最大持仓时长(依赖 StopLoss 兜底) + - 最大连续亏损次数暂停 + - 账户净值低于某值时停止交易 +- StopLoss 是**唯一**的亏损控制手段——但 80pips (5位) 在 XAUUSD 等品种上可能相当于 0.5-1% 净值 + +**🔍 影响范围** +- **极端行情**: 跳空、闪崩、stops level 不足时实际亏损可能远超 80pips +- **回测可信度**: 无风控 = 任意极端年份的回测都会被这些极端事件主导 + +--- + +### 4.4.3 保证金监控 + +```mql5 +// 📍 问题位置:第 598, 652, 727, 782 行 - 保证金检查 +if (DFCC::AccountFreeMarginCheck(Symbol(),1, dbl_6B59728) > 0 && dword_6B59570 < 0 && dword_6B59588 < 10) +``` + +**⚠️ 问题原因** +- 开仓前调用 `AccountFreeMarginCheck`,**返回值 > 0 才下单**——逻辑正确 +- 但 `AccountFreeMarginCheck` 是**同步阻塞函数**,在订单量大时会慢 +- **平仓前未做保证金检查**(实际上也不需要,但行情极端时 close → open 顺序可能因保证金不足失败) + +**🔍 影响范围** +- **保证金不足**: 极端行情下 `平 → 开` 之间的 tick 内保证金状态可能变化,导致开仓失败 +- **重试 10 次**: 重试期间保证金检查可能持续失败 + +--- + +### 4.4.4 杠杆适应性 + +```mql5 +// 📍 问题位置:全 EA - 未处理杠杆差异 +``` + +**⚠️ 问题原因** +- 复利公式 `equity*40/1e6` 隐含杠杆假设(约 1000:1 时 equity$1000 = 0.04 手)—— 杠杆变化时手数会偏离预期 +- 未读取 `ACCOUNT_LEVERAGE` 做自适应 + +**🔍 影响范围** +- **跨账户**: 在 100:1 杠杆账户上手数会比 1000:1 账户小 10 倍 + +--- + +### 4.4.5 异常市场条件 + +```mql5 +// 📍 问题位置:第 447-455 行 - 仅做点差过滤 +if (DFCC::MarketInfo("", 13) <= Pointdifferencelimit) + byte_6B59544 = 1; +else + byte_6B59544 = 0; +``` + +**⚠️ 问题原因** +- 只过滤了点差(spread ≤ 50) +- **未处理**: + - 跳空(周末、周一开盘、央行决议) + - 流动性枯竭(节假日、交投清淡时段) + - 报价异常(bid > ask、零报价) + - 服务器时间/本地时间异常 + +**🔍 影响范围** +- **跳空**: 周一开盘 gap 可能让 WPR 极值持续 → 在不合理的价位开仓 +- **流动性**: 圣诞/元旦等节假日的滑点和拒单会显著上升 + +--- + +## 4.5 性能与资源管理 + +### 4.5.1 指标句柄复用 + +```mql5 +// 📍 问题位置:第 525-532 行 - 句柄管理 +if (g_iBands_Upper == INVALID_HANDLE || g_Volatility != Volatility) +{ + CleanupIndicatorHandles(); + g_Volatility = Volatility; + g_iBands_Upper = ::iBands(_Symbol, PERIOD_CURRENT, 20, 0, 2.0, PRICE_CLOSE); + g_iBands_Lower = ::iBands(_Symbol, PERIOD_CURRENT, 20, 0, 2.0, PRICE_CLOSE); // 重复创建! + g_iWPR_Handle = ::iWPR(_Symbol, PERIOD_CURRENT, g_Volatility); +} +``` + +**⚠️ 问题原因** +- `g_iBands_Upper` 和 `g_iBands_Lower` 是**两个独立的 iBands 句柄**(行 529-530)—— 但 iBands 在 MQL5 中**只用一个句柄**就能访问 3 个 buffer(BASE_LINE=0, UPPER=1, LOWER=2) +- `_GetIndicatorValue_(handle, mode, shift)` 切换 mode 即可取不同 buffer +- **当前浪费了一个句柄 + 一次 BarsCalculated 等待** + +**🔍 影响范围** +- **性能**: 多占用 1 个指标槽(MT5 限制每个图表 ≤ 64 个指标) +- **逻辑**: 两个句柄的 BarsCalculated 各自等待,最多 5 秒(行 2339-2345 的 100×50ms) +- **资源**: 多一次 IndicatorRelease 调用 + +--- + +### 4.5.2 数组动态分配 + +```mql5 +// 📍 问题位置:第 2231-2252 行 - RefreshRates 中动态扩展数组 +if ((Bars_FXD > 0) && (Bars_FXD > prevBars)) { + ::ArrayResize(::Time, Bars_FXD); + ::ArrayResize(::Open, Bars_FXD); + ::ArrayResize(::High, Bars_FXD); + ::ArrayResize(::Low, Bars_FXD); + ::ArrayResize(::Close, Bars_FXD); + ::ArrayResize(::Volume, Bars_FXD); + // 然后循环 CopyRates 填充 +} +``` + +**⚠️ 问题原因** +- 6 个全局数组在第一次 OnTick 时按 Bars_FXD 扩容(可能上万根) +- 后续新增 bar 时只 CopyRates bar[i],不 resize +- **首次扩容代价**: 6 次 ArrayResize + 最多 1 万次 CopyRates 调用 +- **本 EA 主逻辑未使用这些数组**(v68/v67/v66 直接来自 iBands/iWPR 句柄)—— 这些数组**实际上是死代码** + +**🔍 影响范围** +- **性能**: 首 tick 显著延迟(可达数百 ms) +- **内存**: 6 × 10000 × sizeof(double/datetime) ≈ 0.5 MB 常驻 +- **可维护性**: 死代码误导维护者(以为 EA 用了价格数组) + +--- + +### 4.5.3 字符串操作 + +```mql5 +// 📍 问题位置:第 546 行 +dbl_6B59728 = StringToDouble(DoubleToString(DFCC::AccountEquity() * Risk / qword_6B59510, 2)); +``` + +**⚠️ 问题原因** +- 每个 tick 都进行 `double → string → double` 转换,浪费 CPU +- 截断到 2 位小数用 `NormalizeDouble(..., 2)` 即可 + +**🔍 影响范围** +- **性能**: 单次约 0.5µs,但每秒数千 tick 时累计 +- **精度**: StringToDouble 路径可能有舍入误差 + +--- + +### 4.5.4 文件句柄 + +- **不涉及**文件 I/O +- 无资源泄漏 + +--- + +### 4.5.5 定时器使用 + +- **未使用** `EventSetTimer` +- 时间相关逻辑全部在 OnTick 中即时计算(Hour / iTime) +- **可接受**——本策略对时间精度要求不高 + +--- + +## 4.6 错误处理与健壮性 + +### 4.6.1 交易返回码 + +```mql5 +// 📍 问题位置:第 617-624, 670-677, 744-750, 800-806 行 - OrderSend 后仅检查 ticket < 0 +if (dword_6B59570 < 0) { + dword_6B58FA8 = 0; + // 注释掉的 Print: "84521270", LODWORD(v60) +} +++dword_6B59588; +} while (dword_6B59570 < 0 && dword_6B59588 < 10); +``` + +**⚠️ 问题原因** +- 仅判断 `ticket < 0`(即返回值是否失败),未读取 `result.retcode` +- `Print` 调试信息被注释,无法定位失败原因 +- 失败后**仅继续重试**,没有区分"可重试错误"(requote/timeout)和"致命错误"(invalid stops/not enough money) +- 10 次重试是写死常量,**无自适应**(如 timeout 应加大间隔,invalid stops 应立即停止) + +**🔍 影响范围** +- **调试困难**: 出问题时无日志定位 +- **效率**: 持续失败时浪费 10 次重试时间 + +--- + +### 4.6.2 错误重试机制 + +```mql5 +// 📍 问题位置:第 2447-2520 行 - CheckForTradingError 有重试逻辑但未在主 EA 调用 +``` + +**⚠️ 问题原因** +- DFCC_TRADES::CheckForTradingError 函数**已实现 5 次重试 + 1 秒间隔**(行 2453-2520) +- 但 EA 主逻辑**没有调用它**!仅依赖 `do-while` 的 10 次重试 +- 两个重试机制并存但**互不协作**——一个在 DFCC 内部(被 bypass),一个在主 EA(功能简单) + +**🔍 影响范围** +- **重试浪费**: DFCC 内部的重试在主 EA 的循环中被跳过 +- **可维护性**: 错误处理分散在两处,行为不一致 + +--- + +### 4.6.3 连接状态 + +```mql5 +// 📍 问题位置:全 EA - 未检查连接 +``` + +**⚠️ 问题原因** +- 未检查 `TerminalInfoInteger(TERMINAL_CONNECTED)` +- 断网时 `SymbolInfoDouble` 会用最后一次缓存值,导致"幽灵报价" + +**🔍 影响范围** +- **断网恢复**: 可能用过期报价开仓 + +--- + +### 4.6.4 报价有效性 + +```mql5 +// 📍 问题位置:第 1204, 2228-2229 行 - Ask/Bid 直接赋值 +::Ask = ::SymbolInfoDouble(::_Symbol, SYMBOL_ASK); +::Bid = ::SymbolInfoDouble(::_Symbol, SYMBOL_BID); +``` + +**⚠️ 问题原因** +- `SymbolInfoDouble` 在交易服务器关闭/品种停盘时返回 0 +- 未做 `if (Ask > 0 && Bid > 0 && Ask >= Bid)` 校验 +- EA 用 `Ask/Bid` 计算 SL/TP 时若 Ask=0 会得到 SL=-dword_6B59714*P(**负数止损 = 方向错误的止损**) + +**🔍 影响范围** +- **周末/节假日**: 服务器停盘时收到"tick"(实际上是上一笔缓存)→ 开出 SL 反向的订单 +- **流动性事件**: 极端行情下短暂零报价可能造成严重错误 + +--- + +### 4.6.5 除零保护 + +```mql5 +// 📍 问题位置:第 546 行 - 复利公式 +dbl_6B59728 = DFCC::AccountEquity() * Risk / qword_6B59510; +// qword_6B59510 = 1,000,000 (硬编码常量,恒非零) +``` + +```mql5 +// 📍 问题位置:第 555 行 - 时间窗判断 +if (DFCC::Hour() >= dword_6B59530 && DFCC::Hour() <= dword_6B59534 || ...) +``` + +**⚠️ 问题原因** +- 主逻辑中**无除法运算**(v68-v67 是减法,×Point 是乘法) +- 唯一除法是复利公式但分母是常量 +- **无除零风险** + +--- + +## 4.7 平台特性合规 + +### 4.7.1 MQL5 vs MQL4 差异 + +```mql5 +// 📍 问题位置:第 4 行 - 文件头错标 +//| TopBottomEA.mq4 | +``` + +```mql5 +// 📍 问题位置:第 1169 行 - 转换器签名 +//== fxDreema MQL4 to MQL5 Converter ==// +``` + +**⚠️ 问题原因** +- 文件头注释写 `.mq4`(**MQL4 扩展名**)但实际是 .mq5 +- 通过 fxDreema 工具**自动转换**而非手写——保留了 MQL4 风格: + - 订单类型用整数 0/1/2/3 而非 `ORDER_TYPE_BUY` 等枚举 + - `OrderSend` 10 参数重载而非 MQL5 的 `MqlTradeRequest` 结构体 + - `MarketInfo` 用整数 mode 编码而非 MQL5 的 SYMBOL_* 枚举 +- **未使用 MQL5 标准库**: `CTrade` / `CSymbolInfo` / `CPositionInfo` 等更现代的封装 + +**🔍 影响范围** +- **学习成本**: MQL5 原生开发者难以理解 fxDreema 生成的兼容层 +- **性能**: DFCC 包装增加了 ~20% 的调用开销(特别是 OrderSend 同步轮询 Sleep(10ms)) +- **未来兼容性**: fxDreema 转换器本身可能不再维护,升级 MQL5 版本时需重写 DFCC + +--- + +### 4.7.2 枚举使用 + +```mql5 +// 📍 问题位置:第 602 行 - 订单类型用魔术数字 +DFCC::OrderSend( + Symbol(), + 0, // OP_BUY = 0 + dbl_6B59728, + Ask, + dword_6B59540, + qword_6B59578, + qword_6B59580, + CommentName, + Magic, + 0, + 16711680); +``` + +```mql5 +// 📍 问题位置:第 838, 881, 925, 970 行 - OrderType 比较 +if (DFCC::OrderType() == 0) // 应为 POSITION_TYPE_BUY +if (DFCC::OrderType() == 1) // 应为 POSITION_TYPE_SELL +``` + +**⚠️ 问题原因** +- 50+ 处用 `0/1/2/3` 代替 `POSITION_TYPE_BUY/POSITION_TYPE_SELL/ORDER_TYPE_BUY_LIMIT/ORDER_TYPE_SELL_LIMIT` +- DFCC 包装内部才用枚举,对外是 MQL4 风格 +- 颜色 16711680 / 255 替代 `clrRed/clrBlue` + +**🔍 影响范围** +- **可读性**: 维护时需查表"0 是 BUY 还是 SELL" +- **编译期**: 无影响(MQL5 允许整数→枚举隐式转换) +- **审计风险**: 代码 review 时容易混淆 + +--- + +### 4.7.3 类型安全 + +```mql5 +// 📍 问题位置:第 2167 行 - 静态变量存 ticket +static int memory = 0; +if (ticket > 0) { + memory = (int)ticket; // ulong → int 截断 +} +return memory; +``` + +```mql5 +// 📍 问题位置:第 1358 行 - magic 用 long +request.magic = ::PositionGetInteger(POSITION_MAGIC); +``` + +```mql5 +// 📍 问题位置:第 1805, 1793 行 - OrderSend 返回 ulong 转 int +ulong ticket = -1; // ulong -1 = ULONG_MAX(约 1.8e19) +return (int)ticket; // 截断 +``` + +**⚠️ 问题原因** +- `int` 32 位最多 21 亿——MT5 ticket 在某些经纪商可能超过 int 范围(虽然实际少见) +- `ulong ticket = -1` 是反编译器为兼容 MQL4 的 -1 失败约定,**实际值是 0xFFFFFFFFFFFFFFFF**——后续 `if (ticket > 0)` 判断会失败(无符号 > 0 永远 true,但 (int)ticket 转回 -1 后 `if (dword_6B59570 < 0)` 又变 true)——逻辑绕了一圈 +- 大量 `(ulong)slippage`、`(int)::PositionGetInteger(...)` 强转 +- `DoubleToString → StringToDouble` 路径(行 546)有精度损失 + +**🔍 影响范围** +- **极端 ticket**: 极少触发但可能 +- **代码可读性**: 大量强转掩盖真实意图 + +--- + +### 4.7.4 时间处理 + +```mql5 +// 📍 问题位置:第 540-541 行 +qword_6B59550 = DFCC::iTime("", 1, 1); // bar 1 +qword_6B59560 = DFCC::iTime("", 1, 1); // bar 1 +``` + +```mql5 +// 📍 问题位置:第 555, 690 行 +if (DFCC::Hour() >= dword_6B59530 && ...) // 服务器时间 +if (DFCC::TimeHour(TimeGMT()) >= 18 || ...) // GMT +``` + +**⚠️ 问题原因** +- `qword_6B59550` 和 `qword_6B59560` 都在**同一行**被赋**相同的值**——两个本应独立的"新柱时间戳"完全相同,**防重入失效**(行 567 通道和 630 通道用的是同一个时间) +- 测试与实盘时基不同(服务器时间 vs GMT),回测时区设置会改变行为 + +**🔍 影响范围** +- **防重入失效**: `qword_6B59548 != qword_6B59550` 在多通道下可能永远成立 +- **行为不一致**: 回测与实盘时区差异导致开仓时机不同 + +--- + +### 4.7.5 指针与引用 + +- **不涉及**动态对象 +- 全局数组的 ArrayResize 是安全操作 +- 无指针使用 + +--- + +## 5. 风险评级与建议 + +### 5.1 严重问题(P0) + +| 编号 | 位置 | 问题描述 | 影响范围 | +|---|---|---|---| +| P0-1 | 535-537 行 | 指标用 shift=0 导致 repainting + 未来函数 | 回测结果虚高 30-50%;实盘表现远差于回测 | +| P0-2 | 540-541 行 | `qword_6B59550 == qword_6B59560`,新柱防重入失效 | 同一 K 线内可多次开仓,违反"单笔持仓"约束 | +| P0-3 | 460-519 行 | 多品种用 StringFind + 共享 Magic 888999 | 多图表运行时仓位计数混乱,可能在 GBPCAD 持仓时仍开 EURSGD 仓位 | +| P0-4 | 690 行 | `>= 18 || <= 1` 实盘时间窗条件可能是 OR 而非连续窗口 | 实际可交易时段远超设计意图 | +| P0-5 | 220 行 + 全文 | `qword_6B59590 = MarketInfo("", 13)` 是死代码 | 误导维护者,但不影响功能 | + +### 5.2 警告问题(P1) + +| 编号 | 位置 | 问题描述 | 影响范围 | +|---|---|---|---| +| P1-1 | 529-530 行 | iBands 创建了 2 个独立句柄,浪费资源 | 性能下降 50%(多一次 BarsCalculated 等待) | +| P1-2 | 546 行 | 复利公式 `StringToDouble(DoubleToString(...))` 反模式 | CPU 浪费 + 精度损失 | +| P1-3 | 849-973 行 | 平仓 slippage 硬编码 300,开仓 30,10 倍差距 | 平仓成本估算错误 | +| P1-4 | 587-591 行 | 注释掉的最小/最大手数检查 | 复利模式下可能产出小于最小手数 | +| P1-5 | 2208-2277 行 | RefreshRates 中 6 个全局数组实际未被主逻辑使用 | 0.5 MB 死内存 + 首 tick 延迟 | +| P1-6 | 567-624 行 | 4 段 OrderSend 各 10 次重试,但 DFCC 内部还有 CheckForTradingError | 错误处理分散、行为不一致 | +| P1-7 | 159-430 行 | OnInit 中 270 行被注释的 MQL4 图表对象代码 | 维护陷阱,可能误启用 | +| P1-8 | 553-815 行 | 4 段开仓 × 2 模式共 8 块近重复代码 | 任何修改需同步 8 处 | +| P1-9 | 41-143 行 | 50+ `dword_6Bxxxxx` 全局变量无法 input 调参 | 策略优化困难 | +| P1-10 | 全 EA | 无任何回撤/单日亏损/连续亏损风控 | 极端行情可能击穿账户 | + +### 5.3 优化建议(P2) + +| 编号 | 位置 | 问题描述 | 影响范围 | +|---|---|---|---| +| P2-1 | 1177-1200 行 | Bars_FXD/Digits_FXD 全局变量无 input 控制 | 兼容性测试困难 | +| P2-2 | 580, 642, 714, 769 行 | SL 硬编码 `NormalizeDouble(..., 5)` 5 位 | 4 位品种下精度错误 | +| P2-3 | 1169 行 | 2000 行 DFCC 内联而非独立 .mqh | 复用困难 | +| P2-4 | 824, 868, 911, 957 行 | 平仓条件混用 `> 0` 和 `> -dword_6B5952C` 不一致 | 阅读时易误解 | +| P2-5 | 525-532 行 | 句柄管理放在 OnTick 而非 OnInit | 启动延迟一次 tick | +| P2-6 | 1202-1206 行 | OnTick 入口调 RefreshRates 再调 __OnTick__ | 间接调用,可直接合并 | +| P2-7 | 438-982 行 | `__OnTick__` 540 行无任何子函数 | 代码可读性差 | + +--- + +## 6. 总体评价 + +### 6.1 代码质量评分 + +| 维度 | 分数 | 说明 | +|---|---|---| +| **代码规范** | 20 / 100 | 反编译器产物,命名、注释、可读性均极差 | +| **交易逻辑** | 50 / 100 | 核心思想(BB 带宽 + WPR 极值 + 单仓反转)合理,但有 repainting 致命缺陷 | +| **风险管理** | 25 / 100 | 几乎无风控(无回撤限制、无单日亏损、无连续亏损暂停) | +| **性能优化** | 40 / 100 | 句柄管理基本正确,但 iBands 双句柄浪费 + RefreshRates 死数组 | +| **错误处理** | 30 / 100 | 有重试但无日志、无重连检查、无报价校验 | + +### 6.2 综合评级 + +**评级**: **D** + +- **策略思路可识别**,但**实现质量极差** +- 主要是**反编译器产物**而非手写代码,反编译器保留了 MQL4 风格 +- 关键**未来函数 / repainting** 问题使回测结果不可信 +- **不适合直接用于实盘** + +### 6.3 实盘建议 + +- **是否适合实盘**: **否**(除非重写) +- **需要修复的关键问题**: + 1. 修复指标 shift(改用 shift=1 + 新柱检测) + 2. 修复多品种参数识别(用 enum 而非 StringFind) + 3. 修复新柱防重入(拆分为 4 个独立时间戳) + 4. 修正实盘时间窗条件 + 5. 重构为模块化结构(拆出 DFCC、拆出 4 段开/平仓) + 6. 增加最小/最大手数检查、回撤控制、风控熔断 +- **建议的测试方案**: + - 先在 Strategy Tester 的 "Every tick based on real ticks" 模式下做 1 年回测 + - 重点检查:是否出现"开仓→立即平仓"或"开仓→同 K 线再开仓"的情况 + - 与 "1 minute OHLC" 模式对比,**两者结果差异过大 = 确认有 repainting** + - 至少 3 个月模拟盘(demo)实盘观察,与回测对比 + - **强烈建议先用 MT5 策略测试器跑乱序(random delay)模式**,检测执行质量 diff --git a/run_backtests.bat b/run_backtests.bat new file mode 100644 index 0000000..9515980 --- /dev/null +++ b/run_backtests.bat @@ -0,0 +1,25 @@ +@echo off +echo MT5 Batch Backtest Runner +echo ======================= + +SET "MT5_PATH=C:\Program Files\MetaTrader 5 IC Markets Global\terminal64.exe" +SET "INI_DIR=C:\Users\Administrator\Desktop\mt5_backtest\config\generated" + +echo Running: BlessingRebuildEA_EURUSD_M1_default.ini +START "MT5" /WAIT "%MT5_PATH%" /portable /config:"%INI_DIR%\BlessingRebuildEA_EURUSD_M1_default.ini" +if errorlevel 1 echo Failed: BlessingRebuildEA_EURUSD_M1_default.ini + +echo Running: BlessingRebuildEA_EURUSD_M5_default.ini +START "MT5" /WAIT "%MT5_PATH%" /portable /config:"%INI_DIR%\BlessingRebuildEA_EURUSD_M5_default.ini" +if errorlevel 1 echo Failed: BlessingRebuildEA_EURUSD_M5_default.ini + +echo Running: BlessingRebuildEA_GBPUSD_M1_default.ini +START "MT5" /WAIT "%MT5_PATH%" /portable /config:"%INI_DIR%\BlessingRebuildEA_GBPUSD_M1_default.ini" +if errorlevel 1 echo Failed: BlessingRebuildEA_GBPUSD_M1_default.ini + +echo Running: BlessingRebuildEA_GBPUSD_M5_default.ini +START "MT5" /WAIT "%MT5_PATH%" /portable /config:"%INI_DIR%\BlessingRebuildEA_GBPUSD_M5_default.ini" +if errorlevel 1 echo Failed: BlessingRebuildEA_GBPUSD_M5_default.ini + +echo All backtests completed! +pause \ No newline at end of file diff --git a/scripts/__init__.py b/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scripts/batch_executor.py b/scripts/batch_executor.py new file mode 100644 index 0000000..72f3847 --- /dev/null +++ b/scripts/batch_executor.py @@ -0,0 +1,222 @@ +import os +import subprocess +import time +import logging +from datetime import datetime +from typing import List, Dict, Optional +from pathlib import Path + + +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s', + handlers=[ + logging.FileHandler('logs/batch_executor.log'), + logging.StreamHandler() + ] +) +logger = logging.getLogger(__name__) + + +class BatchExecutor: + def __init__(self, config_path: str): + self.config = self._load_config(config_path) + self.mt5_path = self.config["mt5_settings"]["terminal_path"] + self.reports_dir = self.config["mt5_settings"]["reports_dir"] + self.results_dir = self.config["mt5_settings"].get("results_dir", "results") + os.makedirs(self.results_dir, exist_ok=True) + os.makedirs("logs", exist_ok=True) + + def _load_config(self, config_path: str) -> Dict: + import yaml + with open(config_path, 'r', encoding='utf-8') as f: + return yaml.safe_load(f) + + def _wait_for_report(self, report_path: str, timeout: int = 600) -> bool: + start_time = time.time() + while time.time() - start_time < timeout: + if os.path.exists(report_path): + time.sleep(2) + try: + with open(report_path, 'r', encoding='utf-8') as f: + content = f.read() + if len(content) > 100: + return True + except: + pass + time.sleep(5) + return False + + def _check_mt5_process(self) -> bool: + try: + result = subprocess.run( + ['tasklist', '/FI', 'IMAGENAME eq terminal64.exe'], + capture_output=True, + text=True + ) + return 'terminal64.exe' in result.stdout + except: + return False + + def execute_single(self, ini_path: str, wait_time: int = 120) -> Dict: + result = { + "ini_file": os.path.basename(ini_path), + "status": "pending", + "start_time": None, + "end_time": None, + "duration": 0, + "report_path": None, + "error": None + } + + logger.info(f"Starting backtest: {ini_path}") + + if not os.path.exists(self.mt5_path): + result["status"] = "error" + result["error"] = f"MT5 terminal not found: {self.mt5_path}" + logger.error(result["error"]) + return result + + result["start_time"] = datetime.now() + + try: + process = subprocess.Popen( + [self.mt5_path, "/portable", f"/config:{ini_path}"], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE + ) + + logger.info(f"MT5 process started with PID: {process.pid}") + + ini_basename = os.path.splitext(os.path.basename(ini_path))[0] + report_xml = os.path.join(self.results_dir, f"{ini_basename}_report.xml") + + report_found = self._wait_for_report(report_xml, timeout=wait_time * 60) + + if report_found: + result["status"] = "completed" + result["report_path"] = report_xml + logger.info(f"Report generated: {report_xml}") + else: + if process.poll() is not None: + result["status"] = "mt5_closed" + logger.warning("MT5 closed before report was generated") + else: + process.terminate() + process.wait(timeout=10) + result["status"] = "timeout" + logger.warning(f"Timeout waiting for report: {ini_path}") + + if process.poll() is None: + try: + process.terminate() + process.wait(timeout=5) + except: + pass + + except Exception as e: + result["status"] = "error" + result["error"] = str(e) + logger.error(f"Error executing backtest: {e}") + + result["end_time"] = datetime.now() + if result["start_time"] and result["end_time"]: + result["duration"] = (result["end_time"] - result["start_time"]).total_seconds() + + return result + + def execute_batch(self, ini_files: List[str], + max_parallel: int = 1, + wait_time_per_test: int = 120) -> List[Dict]: + results = [] + total = len(ini_files) + + logger.info(f"Starting batch execution: {total} tests") + logger.info(f"Parallel execution: {max_parallel}") + + for idx, ini_path in enumerate(ini_files, 1): + logger.info(f"[{idx}/{total}] Executing: {os.path.basename(ini_path)}") + result = self.execute_single(ini_path, wait_time_per_test) + results.append(result) + + status = result["status"] + duration = result["duration"] + logger.info(f" Status: {status}, Duration: {duration:.1f}s") + + if result["error"]: + logger.error(f" Error: {result['error']}") + + success_count = sum(1 for r in results if r["status"] == "completed") + logger.info(f"Batch completed: {success_count}/{total} successful") + + return results + + def execute_validate_tasks(self, ini_files: List[str]) -> str: + validate_dir = os.path.join(os.path.dirname(self.mt5_path), + "MQL5", "Files", "ValidateTasks") + os.makedirs(validate_dir, exist_ok=True) + + for ini_file in ini_files: + dest_path = os.path.join(validate_dir, os.path.basename(ini_file)) + with open(ini_file, 'r', encoding='utf-8') as src: + content = src.read() + with open(dest_path, 'w', encoding='utf-8') as dst: + dst.write(content) + logger.info(f"Copied to ValidateTasks: {os.path.basename(ini_file)}") + + logger.info(f"All {len(ini_files)} tasks queued in ValidateTasks folder") + return validate_dir + + +def main(): + import argparse + parser = argparse.ArgumentParser(description="MT5 Batch Backtest Executor") + parser.add_argument("--config", "-c", default="config/ea_configs.yaml", + help="Path to config file") + parser.add_argument("--ini-dir", "-i", + help="Directory containing INI files to execute") + parser.add_argument("--wait", "-w", type=int, default=120, + help="Wait time per test in minutes") + parser.add_argument("--validate", "-v", action="store_true", + help="Use ValidateTasks method") + + args = parser.parse_args() + + executor = BatchExecutor(args.config) + + if args.ini_dir: + ini_files = [os.path.join(args.ini_dir, f) + for f in os.listdir(args.ini_dir) + if f.endswith('.ini')] + else: + generator = __import__('ini_generator', fromlist=['']).INIGenerator(args.config) + ini_files = generator.generate_ini_files() + + logger.info(f"Found {len(ini_files)} INI files to execute") + + if args.validate: + validate_dir = executor.execute_validate_tasks(ini_files) + logger.info(f"ValidateTasks method: files copied to {validate_dir}") + logger.info("Run the Validate EA in MT5 terminal to execute") + else: + results = executor.execute_batch(ini_files, wait_time_per_test=args.wait) + + success = [r for r in results if r["status"] == "completed"] + failed = [r for r in results if r["status"] != "completed"] + + print("\n" + "="*60) + print("BATCH EXECUTION SUMMARY") + print("="*60) + print(f"Total tests: {len(results)}") + print(f"Completed: {len(success)}") + print(f"Failed: {len(failed)}") + print("="*60) + + if failed: + print("\nFailed tests:") + for r in failed: + print(f" - {r['ini_file']}: {r['status']} - {r['error']}") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts/ini_generator.py b/scripts/ini_generator.py new file mode 100644 index 0000000..0fbe87f --- /dev/null +++ b/scripts/ini_generator.py @@ -0,0 +1,256 @@ +import os +import sys +import yaml +from datetime import datetime +from itertools import product +from typing import Dict, List, Any, Optional + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from mt5_paths import resolve_mt5_settings + + +class INIGenerator: + def __init__(self, source): + """ + source: YAML 文件路径 str 或 已加载的 config dict(GUI 内存直接传入用)。 + """ + if isinstance(source, dict): + self.config_path = None + self.config = source + else: + self.config_path = source + self.config = self._load_config() + self.config["mt5_settings"] = resolve_mt5_settings(self.config.get("mt5_settings", {})) + self.output_dir = self.config["mt5_settings"]["ini_dir"] + os.makedirs(self.output_dir, exist_ok=True) + + def _load_config(self) -> Dict: + with open(self.config_path, 'r', encoding='utf-8') as f: + return yaml.safe_load(f) + + def _scan_experts_dir(self) -> List[str]: + data_dir = self.config["mt5_settings"].get("data_dir", "") + if not data_dir: + mt5_base = os.path.dirname(self.config["mt5_settings"]["terminal_path"]) + data_dir = mt5_base + experts_dir = os.path.join(data_dir, "MQL5", "Experts") + ea_files = [] + + if not os.path.exists(experts_dir): + return [] + + for root, dirs, files in os.walk(experts_dir): + for f in files: + if f.endswith('.ex5'): + rel_path = os.path.relpath(os.path.join(root, f), experts_dir) + ea_files.append(rel_path) + + return ea_files + + def _load_set_file(self, set_file_path: str) -> Dict[str, Any]: + params = {} + if not os.path.exists(set_file_path): + return params + with open(set_file_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line and not line.startswith(';') and '=' in line: + key, value = line.split('=', 1) + try: + params[key.strip()] = float(value.strip()) + except: + params[key.strip()] = value.strip() + return params + + def _generate_parameter_combinations(self, parameters: Dict[str, List]) -> List[Dict]: + if not parameters: + return [{}] + keys = list(parameters.keys()) + values = list(parameters.values()) + combinations = list(product(*values)) + return [dict(zip(keys, combo)) for combo in combinations] + + def _get_timeframe_code(self, timeframe: str) -> str: + mapping = { + "M1": "M1", "M5": "M5", "M15": "M15", + "H1": "H1", "H4": "H4", "D1": "D1", "W1": "W1" + } + return mapping.get(timeframe, "H1") + + def _params_hash(self, parameters: Dict) -> str: + if not parameters: + return "default" + sorted_params = sorted(parameters.items()) + param_str = "_".join([f"{k}{v}" for k, v in sorted_params]) + return str(abs(hash(param_str)))[:8] + + def _generate_filename(self, ea_name: str, symbol: str, + timeframe: str, parameters: Dict) -> str: + safe_ea_name = ea_name.replace("\\", "_").replace("/", "_").replace("..", "") + for c in '()[]{}|\\/*?:"\'<>': + safe_ea_name = safe_ea_name.replace(c, "_") + param_hash = self._params_hash(parameters) + return f"{safe_ea_name}_{symbol}_{timeframe}_{param_hash}.ini" + + def _build_ini_content(self, ea_filename: str, symbol: str, timeframe: str, + bt_settings: Dict, parameters: Dict, ea_name: str, + set_file: Optional[str] = None) -> str: + date_from = bt_settings["date_range"]["from"] + date_to = bt_settings["date_range"]["to"] + report_name = f"{ea_name}_{symbol}_{timeframe}_{self._params_hash(parameters)}" + for c in '()[]{}|\\/*?:"\'<>': + report_name = report_name.replace(c, "_") + safe_report_name = report_name + + ini_lines = [ + "; MT5 Strategy Tester Configuration", + f"; Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}", + "", + "[Tester]", + f"Expert={ea_filename}", + ] + + if set_file: + ini_lines.append(f"ExpertParameters={set_file}") + else: + ini_lines.append("ExpertParameters=") + + ini_lines.extend([ + f"Symbol={symbol}", + f"Period={self._get_timeframe_code(timeframe)}", + f"Model={bt_settings['model']}", + f"ExecutionMode={bt_settings.get('execution_mode', 0)}", + f"ExecutionDelay={bt_settings.get('execution_delay', 0)}", + f"Optimization={bt_settings['optimization']}", + ]) + if bt_settings.get("optimization"): + ini_lines.append("OptimizationCriterion=6") + ini_lines.extend([ + f"FromDate={date_from}", + f"ToDate={date_to}", + f"ForwardMode={bt_settings.get('forward_mode', 0)}", + f"ForwardDate={bt_settings.get('forward_date', '')}", + f"Report={safe_report_name}", + f"ReplaceReport={1 if bt_settings['replace_report'] else 0}", + f"ShutdownTerminal={1 if bt_settings['shutdown_terminal'] else 0}", + f"Deposit={int(float(bt_settings['deposit']))}", + f"Currency={bt_settings['currency']}", + f"Leverage={bt_settings['leverage']}", + f"Visual={bt_settings['visual']}", + "ProfitInPips=0", + ]) + + if parameters: + ini_lines.extend(["", "; EA Parameters"]) + for param_name, param_value in parameters.items(): + ini_lines.append(f"{param_name}={param_value}") + + return "\n".join(ini_lines) + + def generate_ini_files(self) -> List[str]: + generated_files = [] + bt_settings = self.config["backtest_settings"] + set_files_dir = self.config["mt5_settings"].get("set_files_dir", "config/sets") + + ea_configs = self.config.get("eas", []) + + if not ea_configs: + print("No EAs configured, scanning MT5 Experts directory...") + ea_files = self._scan_experts_dir() + if ea_files: + print(f"Found {len(ea_files)} EA files: {ea_files}") + for ea_file in ea_files: + ea_name = os.path.splitext(ea_file)[0] + ea_configs.append({ + "name": ea_name, + "filename": ea_file, + "description": "Auto-scanned EA" + }) + else: + print("No EAs found in Experts directory") + return [] + + for ea in ea_configs: + ea_name = ea["name"] + ea_filename = ea["filename"] + set_file = ea.get("set_file") + parameters = ea.get("parameters", {}) + + if set_file: + set_file_path = os.path.join(set_files_dir, set_file) + set_params = self._load_set_file(set_file_path) + param_combinations = [set_params] if set_params else [{}] + else: + param_combinations = self._generate_parameter_combinations(parameters) + + for symbol in bt_settings["symbols"]: + for timeframe in bt_settings["timeframes"]: + for param_combo in param_combinations: + ini_content = self._build_ini_content( + ea_filename, symbol, timeframe, + bt_settings, param_combo, ea_name, set_file + ) + ini_filename = self._generate_filename( + ea_name, symbol, timeframe, param_combo + ) + ini_path = os.path.join(self.output_dir, ini_filename) + + with open(ini_path, 'w', encoding='utf-8') as f: + f.write(ini_content) + generated_files.append(ini_path) + + return generated_files + + def generate_batch_run_script(self, ini_files: List[str], + output_script: str = "run_backtests.bat"): + mt5_path = self.config["mt5_settings"]["terminal_path"] + + lines = [ + "@echo off", + "echo MT5 Batch Backtest Runner", + "echo =======================", + "", + f'SET "MT5_PATH={mt5_path}"', + f'SET "INI_DIR={self.output_dir}"', + "", + ] + + for ini_file in ini_files: + ini_filename = os.path.basename(ini_file) + lines.append(f'echo Running: {ini_filename}') + lines.append( + f'START "MT5" /WAIT "%MT5_PATH%" /portable /config:"%INI_DIR%\\{ini_filename}"' + ) + lines.append("if errorlevel 1 echo Failed: " + ini_filename) + lines.append("") + + lines.append("echo All backtests completed!") + lines.append("pause") + + with open(output_script, 'w', encoding='utf-8') as f: + f.write("\n".join(lines)) + + return output_script + + +def main(): + config_path = os.path.join(os.path.dirname(__file__), "..", "config", "ea_configs.yaml") + generator = INIGenerator(config_path) + + print("Generating INI files...") + ini_files = generator.generate_ini_files() + print(f"Generated {len(ini_files)} INI files") + + for f in ini_files[:5]: + print(f" - {os.path.basename(f)}") + if len(ini_files) > 5: + print(f" ... and {len(ini_files) - 5} more") + + if ini_files: + print("\nGenerating batch run script...") + script_path = generator.generate_batch_run_script(ini_files) + print(f"Batch script: {script_path}") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts/mt5_auto_runner.py b/scripts/mt5_auto_runner.py new file mode 100644 index 0000000..0fff17e --- /dev/null +++ b/scripts/mt5_auto_runner.py @@ -0,0 +1,355 @@ +import os +import subprocess +import time +import logging +import json +import shutil +from datetime import datetime +from typing import List, Dict + + +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s', + handlers=[ + logging.FileHandler('logs/batch_executor.log', encoding='utf-8'), + logging.StreamHandler() + ] +) +logger = logging.getLogger(__name__) + + +class MT5AutoRunner: + def __init__(self, source): + """ + source: YAML 文件路径 str 或 已加载的 config dict(GUI 内存直接传入用)。 + """ + if isinstance(source, dict): + self.config = source + else: + self.config = self._load_config(source) + + # 占位符解析(不做自动探测) + from mt5_paths import resolve_mt5_settings + self.config["mt5_settings"] = resolve_mt5_settings(self.config.get("mt5_settings", {})) + + self.mt5_path = self.config["mt5_settings"]["terminal_path"] + self.data_dir = self.config["mt5_settings"].get("data_dir", "") + self.reports_dir = os.path.abspath(self.config["mt5_settings"].get("reports_dir", "reports")) + self.ini_dir = os.path.abspath(self.config["mt5_settings"].get("ini_dir", + os.path.join(os.path.dirname(self.reports_dir), "config", "generated"))) + os.makedirs(self.reports_dir, exist_ok=True) + os.makedirs(self.ini_dir, exist_ok=True) + + exec_cfg = self.config.get("execution", {}) or {} + self.kill_between = bool(exec_cfg.get("kill_between", True)) + self.skip_existing = bool(exec_cfg.get("skip_existing", True)) + self.timeout_per_test = int(exec_cfg.get("timeout_per_test", 30)) + + if not self.mt5_path or not os.path.isfile(self.mt5_path): + raise FileNotFoundError( + f"MT5 终端路径未配置或不存在: {self.mt5_path!r}\n" + "请在 GUI '回测配置' 标签页设置 terminal64.exe 的完整路径后点 '保存配置'。" + ) + + def _load_config(self, config_path: str) -> Dict: + import yaml + with open(config_path, 'r', encoding='utf-8') as f: + return yaml.safe_load(f) + + def _load_execution_log(self) -> List[Dict]: + log_file = os.path.join(self.ini_dir, "..", "results", "execution_log.json") + log_file = os.path.normpath(log_file) + if os.path.exists(log_file): + with open(log_file, 'r', encoding='utf-8') as f: + return json.load(f) + return [] + + def _save_execution_log(self, log: List[Dict]): + log_file = os.path.join(self.ini_dir, "..", "results", "execution_log.json") + log_file = os.path.normpath(log_file) + os.makedirs(os.path.dirname(log_file), exist_ok=True) + with open(log_file, 'w', encoding='utf-8') as f: + json.dump(log, f, indent=2, ensure_ascii=False) + + def _get_report_path(self, ini_name: str) -> str: + base_name = os.path.splitext(ini_name)[0] + return os.path.join(self.data_dir, f"{base_name}.htm") if self.data_dir else f"{base_name}.htm" + + def _copy_report_to_project(self, ini_name: str) -> str: + base_name = os.path.splitext(ini_name)[0] + src_path = self._get_report_path(ini_name) + + if not os.path.exists(src_path): + logger.warning(f"Source report not found: {src_path}") + return None + + dest_path = os.path.join(self.reports_dir, f"{base_name}.htm") + try: + shutil.copy2(src_path, dest_path) + logger.info(f"Report copied to: {dest_path}") + return dest_path + except Exception as e: + logger.error(f"Failed to copy report: {e}") + return None + + def _kill_mt5(self): + try: + subprocess.run(['taskkill', '/F', '/IM', 'terminal64.exe'], + capture_output=True, text=True) + time.sleep(2) + except: + pass + + def _read_ini_expert(self, ini_path: str) -> str: + try: + with open(ini_path, 'r', encoding='utf-8') as f: + for line in f: + if line.startswith('Expert='): + return line.split('=', 1)[1].strip() + except: + pass + return None + + def _execute_single_ini(self, ini_path: str, timeout_min: int = 30) -> Dict: + result = { + "ini_file": os.path.basename(ini_path), + "status": "pending", + "start_time": datetime.now().isoformat(), + "end_time": None, + "duration_sec": 0, + "report_found": False, + "report_path": None, + "error": None + } + + ini_name = os.path.basename(ini_path) + expected_report = self._get_report_path(ini_name) + + if os.path.exists(expected_report): + result["status"] = "already_completed" + result["report_found"] = True + result["report_path"] = expected_report + logger.info(f"Already completed: {ini_name}") + return result + + logger.info(f"Executing: {ini_name}") + + try: + start_time = time.time() + + proc = subprocess.Popen( + [self.mt5_path, f"/config:{ini_path}"], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL + ) + + logger.info(f"MT5 started PID: {proc.pid}") + + while True: + if proc.poll() is not None: + logger.info("MT5 process ended") + break + + if os.path.exists(expected_report): + try: + with open(expected_report, 'r', encoding='utf-8') as f: + content = f.read() + if len(content) > 1000: + break + except: + pass + + elapsed = time.time() - start_time + if elapsed > timeout_min * 60: + logger.warning(f"Timeout: {ini_name}") + break + + time.sleep(2) + + end_time = time.time() + result["duration_sec"] = end_time - start_time + + if os.path.exists(expected_report): + result["status"] = "completed" + result["report_found"] = True + copied_path = self._copy_report_to_project(ini_name) + result["report_path"] = copied_path or expected_report + logger.info(f"Success: {ini_name} ({result['duration_sec']:.0f}s)") + else: + result["status"] = "failed" + logger.warning(f"Failed: {ini_name}") + + result["end_time"] = datetime.now().isoformat() + + if proc.poll() is None: + proc.terminate() + try: + proc.wait(timeout=5) + except: + pass + + except Exception as e: + result["status"] = "error" + result["error"] = str(e) + logger.error(f"Error: {e}") + + return result + + def run_full_auto(self, ini_files: List[str] = None, + skip_if_exists: bool = None, + kill_between_tests: bool = None, + timeout_min: int = None) -> List[Dict]: + logger.info("="*60) + logger.info("MT5 Full Auto Batch Runner") + logger.info("="*60) + + if skip_if_exists is None: + skip_if_exists = self.skip_existing + if kill_between_tests is None: + kill_between_tests = self.kill_between + if timeout_min is None: + timeout_min = self.timeout_per_test + + logger.info(f"Timeout per test: {timeout_min} minutes, Kill between tests: {kill_between_tests}, Skip existing: {skip_if_exists}") + + self.execution_log = self._load_execution_log() + + if ini_files is None: + ini_files = [os.path.join(self.ini_dir, f) + for f in os.listdir(self.ini_dir) if f.endswith('.ini')] + + total = len(ini_files) + completed = 0 + failed = 0 + + logger.info(f"Total INI files: {total}") + + for idx, ini_path in enumerate(ini_files, 1): + logger.info(f"[{idx}/{total}] {os.path.basename(ini_path)}") + + result = self._execute_single_ini(ini_path, timeout_min=timeout_min) + + self.execution_log.append(result) + self._save_execution_log(self.execution_log) + + if result["status"] == "completed": + completed += 1 + elif result["status"] == "already_completed": + completed += 1 + else: + failed += 1 + + logger.info(f" Status: {result['status']}, Duration: {result['duration_sec']:.0f}s") + + if kill_between_tests and result["status"] != "already_completed": + self._kill_mt5() + time.sleep(2) + + logger.info("="*60) + logger.info(f"DONE: {completed}/{total} completed, {failed} failed") + logger.info("="*60) + + return self.execution_log + + def run_daemon(self, check_interval: int = 60): + logger.info("="*60) + logger.info("MT5 Auto Runner - DAEMON MODE") + logger.info(f"Monitoring: {self.ini_dir}") + logger.info(f"Reports will be copied to: {self.reports_dir}") + logger.info(f"Timeout per test: {self.timeout_per_test} minutes") + logger.info("Press Ctrl+C to stop") + logger.info("="*60) + + self.execution_log = self._load_execution_log() + + try: + while True: + pending_inis = [] + for f in os.listdir(self.ini_dir): + if f.endswith('.ini'): + is_completed = any( + log.get("ini_file") == f and log.get("status") == "completed" + for log in self.execution_log + ) + if not is_completed: + pending_inis.append(f) + + if pending_inis: + logger.info(f"Found {len(pending_inis)} pending INI files") + for ini_name in pending_inis: + ini_path = os.path.join(self.ini_dir, ini_name) + result = self._execute_single_ini(ini_path, timeout_min=self.timeout_per_test) + self.execution_log.append(result) + self._save_execution_log(self.execution_log) + self._kill_mt5() + time.sleep(3) + else: + logger.info("No pending INI files, waiting...") + + time.sleep(check_interval) + + except KeyboardInterrupt: + logger.info("Daemon stopped") + + def generate_report(self) -> str: + logger.info("Generating summary report...") + + from scripts.result_parser import ResultParser + parser = ResultParser(self.reports_dir) + results = parser.parse_all_reports(pattern="*.ht*") + + if results: + from scripts.report_generator import ReportGenerator + generator = ReportGenerator(results) + os.makedirs("reports", exist_ok=True) + output = generator.generate_excel("reports/batch_summary.xlsx") + logger.info(f"Report saved: {output}") + return output + else: + logger.warning("No results to generate report") + return None + + +def main(): + import argparse + parser = argparse.ArgumentParser(description="MT5 Auto Runner") + parser.add_argument("--config", "-c", default="config/ea_configs.yaml") + parser.add_argument("--mode", "-m", choices=["full", "daemon", "report", "init", "execute"], + default="full") + parser.add_argument("--interval", "-i", type=int, default=60) + parser.add_argument("--no-skip", action="store_true") + + args = parser.parse_args() + + runner = MT5AutoRunner(args.config) + + if args.mode == "daemon": + runner.run_daemon(check_interval=args.interval) + elif args.mode == "report": + runner.generate_report() + elif args.mode == "init": + from scripts.ini_generator import INIGenerator + generator = INIGenerator(args.config) + ini_files = generator.generate_ini_files() + print(f"Generated {len(ini_files)} INI files") + elif args.mode == "execute": + from scripts.ini_generator import INIGenerator + generator = INIGenerator(args.config) + ini_files = generator.generate_ini_files() + results = runner.run_full_auto(ini_files, skip_if_exists=not args.no_skip) + completed = sum(1 for r in results if r["status"] == "completed") + print(f"Completed: {completed}/{len(results)}") + else: + from scripts.ini_generator import INIGenerator + generator = INIGenerator(args.config) + ini_files = generator.generate_ini_files() + logger.info(f"Generated {len(ini_files)} INI files") + + results = runner.run_full_auto(ini_files, skip_if_exists=not args.no_skip) + + runner.generate_report() + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts/mt5_paths.py b/scripts/mt5_paths.py new file mode 100644 index 0000000..4668158 --- /dev/null +++ b/scripts/mt5_paths.py @@ -0,0 +1,65 @@ +""" +MT5 路径占位符解析(不做任何自动探测)。 + +支持占位符: + {PROJECT_ROOT} 项目根目录绝对路径 + {APP_DATA_DIR} %APPDATA% (C:\\Users\\\\AppData\\Roaming) + ${APPDATA} 同上 (POSIX 风格) + ${USERPROFILE} C:\\Users\\ + +留空的路径会原样返回,由调用方/用户决定。 +""" + +import os +from typing import Optional + + +PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +def _expand_placeholders(value: str, project_root: str) -> str: + if not value: + return value + expanded = ( + value + .replace("{PROJECT_ROOT}", project_root) + .replace("{APP_DATA_DIR}", os.environ.get("APPDATA", "")) + .replace("${APPDATA}", os.environ.get("APPDATA", "")) + .replace("${USERPROFILE}", os.environ.get("USERPROFILE", "")) + ) + if "{" in expanded and "}" in expanded: + return expanded + return os.path.normpath(expanded) + + +def resolve_mt5_settings(mt5_settings: dict, project_root: Optional[str] = None) -> dict: + """只做 {PROJECT_ROOT} 等占位符替换;空值原样保留,不做任何自动探测。""" + if project_root is None: + project_root = PROJECT_ROOT + + resolved = dict(mt5_settings) + + for key, default_sub in (("ini_dir", os.path.join("config", "generated")), + ("reports_dir", "reports")): + v = resolved.get(key, "") + if not v: + resolved[key] = os.path.join(project_root, default_sub) + else: + expanded = _expand_placeholders(v, project_root) + if expanded and (os.path.isabs(expanded) or "{" not in expanded): + resolved[key] = expanded + else: + resolved[key] = os.path.join(project_root, expanded) + + return resolved + + +if __name__ == "__main__": + import pprint + sample = { + "terminal_path": "", + "data_dir": "", + "ini_dir": "{PROJECT_ROOT}/config/generated", + "reports_dir": "{PROJECT_ROOT}/reports", + } + pprint.pp(resolve_mt5_settings(sample)) diff --git a/scripts/optimizer/__init__.py b/scripts/optimizer/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scripts/optimizer/analyze_results.py b/scripts/optimizer/analyze_results.py new file mode 100644 index 0000000..8e4298c --- /dev/null +++ b/scripts/optimizer/analyze_results.py @@ -0,0 +1,320 @@ +import os +import re +import json +import glob +import shutil +from typing import List, Dict, Any, Optional +from bs4 import BeautifulSoup +import xml.etree.ElementTree as ET + + +class ResultAnalyzer: + def __init__(self, reports_dir: str = 'reports'): + self.reports_dir = reports_dir + + def parse_mt5_html_report(self, report_path: str) -> Optional[Dict]: + if not os.path.exists(report_path): + return None + + try: + with open(report_path, 'rb') as f: + raw_bytes = f.read() + + if raw_bytes[:2] == b'\xff\xfe': + content = raw_bytes[2:].decode('utf-16-le') + else: + content = raw_bytes.decode('utf-8', errors='ignore') + + content = content.encode('utf-8').decode('utf-8') + soup = BeautifulSoup(content, 'html.parser') + + result = {} + + pattern = r']*>([^<]+):\s*]*>([^<]*)' + matches = re.findall(pattern, content) + + plain_pattern = r']*nowrap[^>]*>([^<]+):\s*]*colspan=.10.[^>]*>([^<]*)' + plain_matches = re.findall(plain_pattern, content) + + all_matches = dict(plain_matches) + for k, v in matches: + if k not in all_matches: + all_matches[k] = v + + for key, value in all_matches.items(): + key = key.strip() + value = value.strip() + + if 'Net Profit' in key or '\u603b\u51c0\u76c8\u5229' in key: + result['net_profit'] = self._extract_number(value) + elif 'Gross Profit' in key or '\u6bdb\u5229' in key: + result['gross_profit'] = self._extract_number(value) + elif 'Gross Loss' in key or '\u6bdb\u635f' in key: + result['gross_loss'] = self._extract_number(value) + elif 'Profit Factor' in key or '\u76c8\u5229\u56e0\u5b50' in key: + result['profit_factor'] = self._extract_number(value) + elif 'Total Trades' in key or '\u4ea4\u6613\u603b\u8ba1' in key: + result['total_trades'] = self._extract_number(value) + elif 'Sharpe Ratio' in key or '\u590f\u666e\u6bd4\u7387' in key: + result['sharpe_ratio'] = self._extract_number(value) + elif 'Maximal Drawdown' in key or '\u6700\u5927\u7ed3\u4f59\u4e8f\u635f' in key: + result['max_drawdown'] = self._extract_number(value) + elif 'Win Rate' in key or '\u76c8\u5229\u4ea4\u6613' in key: + result['win_rate'] = self._extract_percentage(value) + + return result if result else None + + except Exception as e: + print('Error parsing ' + report_path + ': ' + str(e)) + return None + + def _extract_number(self, text: str) -> float: + numbers = re.findall(r'[-+]?\d*\.?\d+', text.replace(',', '').replace(' ', '')) + if numbers: + try: + return float(numbers[0]) + except: + return 0.0 + return 0.0 + + def _extract_percentage(self, text: str) -> float: + numbers = re.findall(r'\d+\.?\d*%', text) + if numbers: + try: + return float(numbers[0].replace('%', '')) + except: + return 0.0 + return 0.0 + + def parse_mt5_xml_optimization(self, xml_path: str) -> List[Dict]: + if not os.path.exists(xml_path): + return [] + + results = [] + try: + tree = ET.parse(xml_path) + root = tree.getroot() + + ns = {'ss': 'urn:schemas-microsoft-com:office:spreadsheet'} + worksheet = root.find('.//ss:Worksheet', ns) + + if worksheet is None: + return [] + + table = worksheet.find('ss:Table', ns) + if table is None: + return [] + + rows = table.findall('ss:Row', ns) + if len(rows) < 2: + return [] + + header_row = rows[0] + headers = [] + for cell in header_row.findall('ss:Cell', ns): + data = cell.find('ss:Data', ns) + if data is not None and data.text: + headers.append(data.text.strip().lower()) + + for row_idx, row in enumerate(rows[1:], start=1): + cells = row.findall('ss:Cell', ns) + if not cells: + continue + + result = {'pass': row_idx} + for col_idx, cell in enumerate(cells): + if col_idx >= len(headers): + break + header = headers[col_idx] + data = cell.find('ss:Data', ns) + value = data.text.strip() if data is not None and data.text else '' + + if 'pass' in header: + result['pass'] = int(value) if value.isdigit() else row_idx + elif 'result' in header: + result['result'] = self._extract_number(value) + elif 'profit' in header and 'expected' not in header and 'factor' not in header and 'drawdown' not in header: + result['net_profit'] = self._extract_number(value) + elif 'expected payoff' in header: + result['expected_payoff'] = self._extract_number(value) + elif 'profit factor' in header: + if value: + result['profit_factor'] = self._extract_number(value) + elif 'recovery factor' in header: + result['recovery_factor'] = self._extract_number(value) + elif 'sharpe ratio' in header: + result['sharpe_ratio'] = self._extract_number(value) + elif 'custom' in header: + result['custom'] = self._extract_number(value) + elif 'equity dd' in header or 'drawdown' in header: + result['max_drawdown'] = self._extract_number(value) + elif 'trade' in header: + result['total_trades'] = int(self._extract_number(value)) + + if result: + results.append(result) + + except Exception as e: + import traceback + print('Error parsing MT5 XML ' + xml_path + ': ' + str(e)) + traceback.print_exc() + + return results + + def copy_xml_results_to_reports(self, mt5_terminal_dir: str, ea_name: str, reports_dir: str) -> str: + xml_patterns = [ + f'{ea_name}_optimization.xml', + f'{ea_name}_optimization[1].xml', + f'{ea_name}_optimization[2].xml', + ] + + os.makedirs(reports_dir, exist_ok=True) + latest_xml = None + latest_time = 0 + + for pattern in xml_patterns: + xml_path = os.path.join(mt5_terminal_dir, pattern) + if os.path.exists(xml_path): + mtime = os.path.getmtime(xml_path) + if mtime > latest_time: + latest_time = mtime + latest_xml = xml_path + + if latest_xml: + dest_path = os.path.join(reports_dir, os.path.basename(latest_xml)) + shutil.copy2(latest_xml, dest_path) + return dest_path + + return None + + def parse_all_reports(self, pattern: str = '*.htm*') -> List[Dict]: + results = [] + search_path = os.path.join(self.reports_dir, pattern) + report_files = glob.glob(search_path) + + for report_file in report_files: + parsed = self.parse_mt5_html_report(report_file) + if parsed: + parsed['report_file'] = os.path.basename(report_file) + results.append(parsed) + + return results + + def merge_parameters_and_results(self, param_mapping: List[Dict], results: List[Dict]) -> List[Dict]: + merged = [] + result_map = {r.get('report_file', ''): r for r in results} + + for param_set in param_mapping: + report_name = param_set.get('report_name', '') + if report_name in result_map: + combined = {**param_set, **result_map[report_name]} + merged.append(combined) + + return merged + + def find_optimal_params(self, results: List[Dict], + criterion: str = 'profit_factor', + min_trades: int = 10, + max_drawdown_pct: float = 50.0) -> List[Dict]: + filtered = [] + for r in results: + trades = r.get('total_trades', 0) + dd = r.get('max_drawdown', 0) + pf = r.get('profit_factor', 0) + + if trades >= min_trades and dd <= max_drawdown_pct and pf > 0: + filtered.append(r) + + filtered.sort(key=lambda x: x.get(criterion, 0), reverse=True) + return filtered + + def generate_report(self, results: List[Dict], output_path: str = 'results/optimization_report.txt'): + if not results: + return + + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + lines = [ + '=' * 60, + 'MT5 EA Optimization Report', + '=' * 60, + '', + 'Total Results: ' + str(len(results)), + '', + ] + + if results: + best = results[0] + lines.extend([ + 'Best Configuration:', + ' Profit Factor: ' + str(best.get('profit_factor', 0)), + ' Net Profit: ' + str(best.get('net_profit', 0)), + ' Total Trades: ' + str(best.get('total_trades', 0)), + ' Max Drawdown: ' + str(best.get('max_drawdown', 0)), + ' Win Rate: ' + str(best.get('win_rate', 0)) + '%', + '', + ]) + + lines.append('Top 10 Configurations:') + lines.append('-' * 60) + for i, r in enumerate(results[:10], 1): + lines.append( + str(i) + '. PF=' + str(r.get('profit_factor', 0)) + + ' Net=' + str(r.get('net_profit', 0)) + + ' Trades=' + str(r.get('total_trades', 0)) + ) + + with open(output_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + + return output_path + + def analyze_walk_forward(self, mt5_terminal_dir: str, ea_name: str, reports_dir: str) -> Dict: + result = { + 'ea_name': ea_name, + 'in_sample': {}, + 'out_of_sample': {}, + 'overfitting_score': 0, + 'verdict': 'Unknown' + } + + xml_path = self.copy_xml_results_to_reports(mt5_terminal_dir, ea_name, reports_dir) + + if xml_path: + is_results = self.parse_mt5_xml_optimization(xml_path) + if is_results: + best_is = sorted(is_results, key=lambda x: x.get('profit_factor', 0), reverse=True)[0] + result['in_sample'] = best_is + + forward_xml = os.path.join(mt5_terminal_dir, f'{ea_name}_optimization.forward.xml') + if not os.path.exists(forward_xml): + forward_xml = os.path.join(mt5_terminal_dir, f'{ea_name}_optimization[1].forward.xml') + + if os.path.exists(forward_xml): + oos_results = self.parse_mt5_xml_optimization(forward_xml) + if oos_results: + best_oos = sorted(oos_results, key=lambda x: x.get('profit_factor', 0), reverse=True)[0] + result['out_of_sample'] = best_oos + + is_pf = result.get('in_sample', {}).get('profit_factor', 0) + oos_pf = result.get('out_of_sample', {}).get('profit_factor', 0) + + if is_pf > 0 and oos_pf > 0: + decay = (is_pf - oos_pf) / is_pf + result['pf_decay'] = round(decay * 100, 1) + if oos_pf >= is_pf * 0.7 and oos_pf > 1.0: + result['verdict'] = 'Robust (\u7a33\u5065)' + elif oos_pf > 1.0: + result['verdict'] = 'Mild Overfit (\u8f7b\u5ea6\u8fc7\u62df\u5408)' + else: + result['verdict'] = 'Overfit (\u4e25\u91cd\u8fc7\u62df\u5408)' + elif oos_pf > 0: + result['pf_decay'] = 0 + result['verdict'] = 'Valid (\u6709\u6548\u4f46IS\u65e0\u7ed3\u679c)' + + is_dd = result.get('in_sample', {}).get('max_drawdown', 0) + oos_dd = result.get('out_of_sample', {}).get('max_drawdown', 0) + if is_dd > 0 and oos_dd > 0: + result['dd_increase'] = round((oos_dd / is_dd - 1) * 100, 1) if is_dd > 0 else 0 + + return result \ No newline at end of file diff --git a/scripts/optimizer/batch_auto_optimizer.py b/scripts/optimizer/batch_auto_optimizer.py new file mode 100644 index 0000000..580b5bd --- /dev/null +++ b/scripts/optimizer/batch_auto_optimizer.py @@ -0,0 +1,243 @@ +import os +import sys +import json +import time +import subprocess +import logging +from datetime import datetime +from typing import List, Dict, Any + +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') +logger = logging.getLogger(__name__) + +OPTIMIZER_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, OPTIMIZER_DIR) + +from ea_config_parser import load_all_ea_configs, EAConfig +from smart_search import SmartSearch +from parameter_constraint import create_constraint_engine +from analyze_results import ResultAnalyzer + + +class BatchAutoOptimizer: + def __init__(self, base_dir: str = "optimizer", mt5_path: str = None): + self.base_dir = base_dir + self.mt5_path = mt5_path + self.configs_dir = os.path.join(base_dir, "configs") + self.set_files_dir = os.path.join(base_dir, "set_files") + self.reports_dir = os.path.join(base_dir, "reports") + self.results_dir = os.path.join(base_dir, "results") + self.scripts_dir = os.path.join(base_dir, "scripts") + + for d in [self.configs_dir, self.set_files_dir, self.reports_dir, + self.results_dir, self.scripts_dir]: + os.makedirs(d, exist_ok=True) + + def generate_set_files(self, ea_config: EAConfig, max_samples: int = 1000) -> List[Dict]: + logger.info(f"Generating SET files for {ea_config.ea_name}") + logger.info(f" Combinations: {ea_config.get_total_combinations()}") + + searcher = SmartSearch(ea_config) + combinations = searcher.generate_combinations(max_samples) + logger.info(f" Generated {len(combinations)} samples") + + engine = create_constraint_engine(ea_config) + valid_combos = engine.filter_valid_combinations(combinations) + logger.info(f" Valid combinations: {len(valid_combos)}") + + ea_set_dir = os.path.join(self.set_files_dir, ea_config.ea_name) + os.makedirs(ea_set_dir, exist_ok=True) + + param_mapping = [] + for i, combo in enumerate(valid_combos, 1): + set_id = str(i).zfill(8) + set_filename = f"params_{set_id}.set" + set_path = os.path.join(ea_set_dir, set_filename) + + self._write_set_file(set_path, combo) + + param_mapping.append({ + 'set_id': set_id, + 'set_file': set_filename, + 'set_path': set_path, + 'report_name': f"{ea_config.ea_name}_{set_id}.htm", + 'params': combo + }) + + mapping_path = os.path.join(self.results_dir, f"{ea_config.ea_name}_param_mapping.json") + with open(mapping_path, 'w', encoding='utf-8') as f: + json.dump(param_mapping, f, ensure_ascii=False, indent=2) + + logger.info(f" SET files saved to {ea_set_dir}") + return param_mapping + + def _write_set_file(self, set_path: str, params: Dict): + lines = ["; MT5 EA Parameters", f"; Generated: {datetime.now()}", ""] + for name, value in params.items(): + if isinstance(value, bool): + lines.append(f"{name} <{'true' if value else 'false'}>") + else: + lines.append(f"{name} <{value}> <{value}>") + with open(set_path, 'w', encoding='utf-8') as f: + f.write("\n".join(lines)) + + def generate_ini(self, ea_config: EAConfig) -> str: + test_config = ea_config.test_config + ini_path = os.path.join(self.configs_dir, f"{ea_config.ea_name}.ini") + + date_from = test_config.get("from_date", "2025.01.01") + date_to = test_config.get("to_date", "2025.12.31") + + lines = [ + "; MT5 Strategy Tester Configuration", + f"; Generated: {datetime.now()}", + "", + "[Tester]", + f"Expert={ea_config.ea_path}", + "ExpertParameters=", + f"Symbol={test_config.get('symbol', 'EURUSD')}", + f"Period={test_config.get('period', 'H1')}", + f"Model={test_config.get('model', 1)}", + f"FromDate={date_from}", + f"ToDate={date_to}", + f"Deposit={test_config.get('deposit', 10000)}", + f"Leverage={test_config.get('leverage', '1:100')}", + "ReplaceReport=true", + "ShutdownTerminal=true", + ] + + with open(ini_path, 'w', encoding='utf-8') as f: + f.write("\n".join(lines)) + + logger.info(f"INI saved: {ini_path}") + return ini_path + + def generate_powershell_script(self, ea_config: EAConfig, param_mapping: List[Dict]) -> str: + ps_path = os.path.join(self.scripts_dir, f"run_{ea_config.ea_name}.ps1") + + ea_set_dir = os.path.join(self.set_files_dir, ea_config.ea_name) + ea_report_dir = os.path.join(self.reports_dir, ea_config.ea_name) + os.makedirs(ea_report_dir, exist_ok=True) + + ini_path = os.path.join(self.configs_dir, f"{ea_config.ea_name}.ini") + + lines = [ + f"# MT5 Batch Optimization for {ea_config.ea_name}", + f"# Generated: {datetime.now()}", + "", + f'$MT5Path = "{self.mt5_path or "terminal64.exe"}"', + f'$IniFile = "{ini_path}"', + f'$SetDir = "{ea_set_dir}"', + "", + f"Write-Host 'Starting batch optimization for {ea_config.ea_name}'", + "", + "$SetFiles = Get-ChildItem -Path $SetDir -Filter 'params_*.set'", + "$Total = $SetFiles.Count", + "$Current = 0", + "", + "foreach ($SetFile in $SetFiles) {", + " $Current++", + ' Write-Host "[$Current/$Total] $($SetFile.Name)"', + "", + " $IniContent = Get-Content $IniFile", + ' $IniContent = $IniContent -replace "ExpertParameters=.*", "ExpertParameters=$($SetFile.FullName)"', + ' $TempIni = Join-Path $env:TEMP "temp_$([guid]::NewGuid().ToString().Substring(0,8)).ini"', + " $IniContent | Set-Content $TempIni -Encoding UTF8", + "", + " Start-Process -FilePath $MT5Path -ArgumentList '/portable',\"/config:$TempIni\" -Wait", + " Start-Sleep -Seconds 3", + "}", + "", + 'Write-Host "Batch optimization completed!"', + ] + + with open(ps_path, 'w', encoding='utf-8') as f: + f.write("\n".join(lines)) + + logger.info(f"PowerShell script: {ps_path}") + return ps_path + + def run_full_auto(self, ea_names: List[str] = None, max_samples: int = 1000): + logger.info("=" * 60) + logger.info("MT5 Batch Auto Optimizer") + logger.info("=" * 60) + + configs = load_all_ea_configs(self.configs_dir) + if not configs: + logger.error(f"No configs found in {self.configs_dir}") + return + + if ea_names: + configs = {k: v for k, v in configs.items() if k in ea_names} + + for ea_name, ea_config in configs.items(): + logger.info(f"\nProcessing: {ea_name}") + + param_mapping = self.generate_set_files(ea_config, max_samples) + self.generate_ini(ea_config) + self.generate_powershell_script(ea_config, param_mapping) + + logger.info(f" SET files: {len(param_mapping)}") + logger.info(f" Next: Run the PS1 script in MT5 terminal") + + def analyze_all(self, ea_names: List[str] = None) -> List[Dict]: + logger.info("Analyzing results...") + + all_results = [] + search_dirs = [self.reports_dir] if not ea_names else [os.path.join(self.reports_dir, name) for name in ea_names] + + for search_dir in search_dirs: + if not os.path.exists(search_dir): + continue + + for ea_name in os.listdir(search_dir): + ea_report_dir = os.path.join(search_dir, ea_name) + if not os.path.isdir(ea_report_dir): + continue + + analyzer = ResultAnalyzer(ea_report_dir) + results = analyzer.parse_all_reports() + + for r in results: + r['ea_name'] = ea_name + + all_results.extend(results) + logger.info(f" {ea_name}: {len(results)} reports") + + if not all_results: + logger.warning("No results found") + return [] + + all_results.sort(key=lambda x: x.get('profit_factor', 0), reverse=True) + + output_path = os.path.join(self.results_dir, "optimization_results.json") + with open(output_path, 'w', encoding='utf-8') as f: + json.dump(all_results, f, indent=2, ensure_ascii=False) + + logger.info(f"Results: {len(all_results)} total") + logger.info(f"Best PF: {all_results[0].get('profit_factor', 0) if all_results else 'N/A'}") + + return all_results + + +def main(): + import argparse + parser = argparse.ArgumentParser(description="MT5 Batch Auto Optimizer") + parser.add_argument("--base-dir", "-d", default="optimizer", help="Base directory") + parser.add_argument("--ea", "-e", nargs="+", help="EA names") + parser.add_argument("--max-samples", "-m", type=int, default=1000, help="Max samples per EA") + parser.add_argument("--mt5-path", "-p", help="MT5 terminal path") + parser.add_argument("--analyze", "-a", action="store_true", help="Analyze only") + + args = parser.parse_args() + + optimizer = BatchAutoOptimizer(args.base_dir, args.mt5_path) + + if args.analyze: + optimizer.analyze_all(args.ea) + else: + optimizer.run_full_auto(args.ea, args.max_samples) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts/optimizer/configs/Grid_Pro.json b/scripts/optimizer/configs/Grid_Pro.json new file mode 100644 index 0000000..f7f5af4 --- /dev/null +++ b/scripts/optimizer/configs/Grid_Pro.json @@ -0,0 +1,91 @@ +{ + "ea_name": "Grid Pro", + "ea_path": "Experts\\\\Grid\\\\GridPro.ex5", + "description": "Multi-period grid EA with genetic optimization", + "search_strategy": "genetic", + "optimization_criterion": "profit_factor", + "parameters": { + "GridLevels": { + "type": "int", + "default": 5, + "min": 3, + "max": 20, + "step": 1, + "description": "Grid levels" + }, + "GridSpacing": { + "type": "int", + "default": 50, + "min": 10, + "max": 200, + "step": 10, + "description": "Grid spacing in points" + }, + "GridSpacingMult": { + "type": "double", + "default": 1.5, + "min": 1.0, + "max": 3.0, + "step": 0.1, + "precision": 1, + "description": "Spacing multiplier" + }, + "BaseLotsize": { + "type": "double", + "default": 0.1, + "min": 0.01, + "max": 1.0, + "step": 0.01, + "precision": 2, + "description": "Base lot size" + }, + "MaxOpenLots": { + "type": "double", + "default": 5.0, + "min": 0.1, + "max": 20.0, + "step": 0.1, + "precision": 1, + "description": "Max open lots" + }, + "MaxDrawdown": { + "type": "int", + "default": 30, + "min": 10, + "max": 100, + "step": 5, + "description": "Max drawdown percentage" + }, + "TakeProfitGrid": { + "type": "int", + "default": 20, + "min": 5, + "max": 100, + "step": 5, + "description": "Take profit grid" + }, + "TradingMode": { + "type": "enum", + "default": "BOTH", + "options": [ + "BUY", + "SELL", + "BOTH" + ], + "description": "Trading mode" + } + }, + "test_config": { + "symbol": "EURUSD", + "period": "H1", + "from_date": "2024.01.01", + "to_date": "2025.12.31", + "model": 1, + "deposit": 5000, + "leverage": "1:100" + }, + "walk_forward": { + "enabled": true, + "train_test_ratio": 0.75 + } +} \ No newline at end of file diff --git a/scripts/optimizer/configs/MA_Cross.json b/scripts/optimizer/configs/MA_Cross.json new file mode 100644 index 0000000..30b4aac --- /dev/null +++ b/scripts/optimizer/configs/MA_Cross.json @@ -0,0 +1,68 @@ +{ + "ea_name": "MA Cross Scalper", + "ea_path": "Experts\\\\MA_Cross.ex5", + "description": "Dual MA crossover scalping strategy", + "search_strategy": "grid", + "optimization_criterion": "profit_factor", + "parameters": { + "FastMA_Period": { + "type": "int", + "default": 14, + "min": 5, + "max": 30, + "step": 1, + "description": "Fast MA period" + }, + "SlowMA_Period": { + "type": "int", + "default": 50, + "min": 20, + "max": 100, + "step": 5, + "description": "Slow MA period", + "condition": ">FastMA_Period" + }, + "StopLoss": { + "type": "int", + "default": 50, + "min": 10, + "max": 200, + "step": 10, + "description": "Stop loss in points" + }, + "TakeProfit": { + "type": "int", + "default": 100, + "min": 30, + "max": 300, + "step": 10, + "description": "Take profit in points" + }, + "RiskPercent": { + "type": "double", + "default": 1.0, + "min": 0.5, + "max": 3.0, + "step": 0.5, + "precision": 1, + "description": "Risk percentage" + }, + "EnableMM": { + "type": "bool", + "default": true, + "description": "Enable money management" + } + }, + "test_config": { + "symbol": "EURUSD", + "period": "H1", + "from_date": "2025.01.01", + "to_date": "2025.12.31", + "model": 1, + "deposit": 10000, + "leverage": "1:100" + }, + "walk_forward": { + "enabled": false + } +} \ No newline at end of file diff --git a/scripts/optimizer/ea_auto_scanner.py b/scripts/optimizer/ea_auto_scanner.py new file mode 100644 index 0000000..2a63490 --- /dev/null +++ b/scripts/optimizer/ea_auto_scanner.py @@ -0,0 +1,87 @@ +import os +import glob +import re +from typing import Dict, List, Any, Optional + +class EAAutoScanner: + def __init__(self, mt5_data_dir: str = None): + self.mt5_data_dir = mt5_data_dir + self.experts_dir = os.path.join(mt5_data_dir, "MQL5", "Experts") if mt5_data_dir else None + + def scan_experts(self) -> List[Dict]: + experts = [] + if not self.experts_dir or not os.path.exists(self.experts_dir): + return experts + for root, dirs, files in os.walk(self.experts_dir): + for f in files: + if f.endswith('.ex5'): + full_path = os.path.join(root, f) + rel_path = os.path.relpath(full_path, self.experts_dir) + ea_name = os.path.splitext(f)[0] + experts.append({'name': ea_name, 'filename': f, 'path': rel_path, 'full_path': full_path}) + return experts + + def generate_json_config(self, ea_info: Dict, params: Dict = None) -> Dict: + ea_name = ea_info["name"] + config = { + "ea_name": ea_name, + "ea_path": ea_info["path"], + "description": "Auto-scanned EA", + "search_strategy": "auto", + "optimization_criterion": "profit_factor", + "parameters": {}, + "test_config": { + "symbol": "EURUSD", "period": "H1", + "from_date": "2025.01.01", "to_date": "2025.12.31", + "model": 1, "deposit": 10000, "leverage": "1:100" + }, + "walk_forward": {"enabled": False} + } + if params: + for pname, pinfo in params.items(): + config["parameters"][pname] = { + "type": pinfo.get("type", "int"), + "default": pinfo.get("default", 0), + "min": pinfo.get("min", 0), + "max": pinfo.get("max", 100), + "step": pinfo.get("step", 1), + "description": "Auto-scanned" + } + return config + + def auto_scan_all(self) -> List[Dict]: + configs = [] + experts = self.scan_experts() + for expert in experts: + config = self.generate_json_config(expert) + configs.append(config) + return configs + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("--data-dir", "-d") + parser.add_argument("--output", "-o", default="configs") + parser.add_argument("--list", "-l", action="store_true") + args = parser.parse_args() + + scanner = EAAutoScanner(args.data_dir) + experts = scanner.scan_experts() + + if args.list: + print(f"Found {len(experts)} EAs:") + for e in experts: + print(f" - {e['name']}") + + configs = scanner.auto_scan_all() + print(f"Generated {len(configs)} configs") + + if args.output and configs: + import json + import os + os.makedirs(args.output, exist_ok=True) + for cfg in configs: + fname = cfg["ea_name"].replace(" ", "_") + ".json" + with open(os.path.join(args.output, fname), "w", encoding="utf-8") as f: + json.dump(cfg, f, indent=4, ensure_ascii=False) + print(f"Saved: {fname}") \ No newline at end of file diff --git a/scripts/optimizer/ea_batch_optimizer.py b/scripts/optimizer/ea_batch_optimizer.py new file mode 100644 index 0000000..afded7e --- /dev/null +++ b/scripts/optimizer/ea_batch_optimizer.py @@ -0,0 +1,328 @@ +import os +import sys +import json +import time +import shutil +import subprocess +from datetime import datetime +from typing import List, Dict, Any, Optional + +sys.path.insert(0, os.path.dirname(__file__)) +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +from ea_config_parser import load_ea_config, load_all_ea_configs, EAConfig +from parameter_constraint import create_constraint_engine +from smart_search import SmartSearch +from analyze_results import ResultAnalyzer +from mt5_paths import auto_detect_data_dir + + +class EABatchOptimizer: + def __init__(self, base_dir: str = 'optimizer'): + self.base_dir = base_dir + self.configs_dir = os.path.join(base_dir, 'configs') + self.set_files_dir = os.path.join(base_dir, 'set_files') + self.reports_dir = os.path.join(base_dir, 'reports') + self.results_dir = os.path.join(base_dir, 'results') + self.scripts_dir = os.path.join(base_dir, 'scripts') + self.logs_dir = os.path.join(base_dir, 'logs') + + for d in [self.configs_dir, self.set_files_dir, self.reports_dir, + self.results_dir, self.scripts_dir, self.logs_dir]: + os.makedirs(d, exist_ok=True) + + def generate_set_files(self, ea_config: EAConfig, max_samples: int = 2000) -> List[Dict]: + print('Generating SET files for ' + ea_config.ea_name) + print(' Total combinations: ' + str(ea_config.get_total_combinations())) + print(' Strategy: ' + SmartSearch(ea_config).select_strategy()) + + searcher = SmartSearch(ea_config) + combinations = searcher.generate_combinations(max_samples) + + engine = create_constraint_engine(ea_config) + valid_combinations = engine.filter_valid_combinations(combinations) + + print(' Valid combinations: ' + str(len(valid_combinations))) + + ea_set_dir = os.path.join(self.set_files_dir, ea_config.ea_name) + os.makedirs(ea_set_dir, exist_ok=True) + + param_mapping = [] + for i, combo in enumerate(valid_combinations, 1): + set_id = str(i).zfill(8) + set_filename = 'params_' + set_id + '.set' + set_path = os.path.join(ea_set_dir, set_filename) + + self._write_set_file(set_path, combo) + + mapping = { + 'set_id': set_id, + 'set_file': set_filename, + 'report_name': ea_config.ea_name + '_' + set_id + '.htm', + 'params': combo + } + param_mapping.append(mapping) + + mapping_path = os.path.join(self.results_dir, ea_config.ea_name + '_param_mapping.json') + with open(mapping_path, 'w', encoding='utf-8') as f: + json.dump(param_mapping, f, ensure_ascii=False, indent=2) + + print(' SET files generated: ' + str(len(valid_combinations))) + return param_mapping + + def _write_set_file(self, set_path: str, params: Dict): + lines = ['; MT5 EA Parameters SET File', '; Generated: ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S'), ''] + + for name, value in params.items(): + if isinstance(value, bool): + lines.append(name + ' <' + ('true' if value else 'false') + '>') + elif isinstance(value, float): + lines.append(name + ' <' + str(value) + '> <' + str(value) + '>') + else: + lines.append(name + ' <' + str(value) + '> <' + str(value) + '>') + + with open(set_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + + def _save_param_mapping(self, mapping: List[Dict], output_path: str): + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + with open(output_path, 'w', encoding='utf-8') as f: + f.write('set_id,set_file,report_name\n') + for m in mapping: + f.write(m['set_id'] + ',' + m['set_file'] + ',' + m['report_name'] + '\n') + + def generate_ini_for_ea(self, ea_config: EAConfig, param_mapping: List[Dict] = None): + test_config = ea_config.test_config + ini_filename = ea_config.ea_name + '.ini' + ini_path = os.path.join(self.configs_dir, ini_filename) + set_filename = ea_config.ea_name + '_optimization.set' + + data_dir = auto_detect_data_dir() or r'C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\010E047102812FC0C18890992854220E' + mt5_tester_dir = os.path.join(data_dir, 'MQL5', 'Profiles', 'Tester') + set_path = os.path.join(mt5_tester_dir, set_filename) + + date_from = test_config.get('from_date', '2025.01.01') + date_to = test_config.get('to_date', '2025.12.31') + + criterion_map = { + 'profit_factor': 1, + 'net_profit': 0, + 'sharpe_ratio': 5, + 'expected_payoff': 2, + 'drawdown': 3, + 'recovery_factor': 4, + } + opt_criterion = test_config.get('optimization_criterion', 1) + + set_lines = [ + '; saved automatically', + '; this file contains last used input parameters for testing/optimizing ' + ea_config.ea_name + ' expert advisor', + '', + ] + + if ea_config.parameters: + for pname, param in ea_config.parameters.items(): + if param.param_type == 'bool': + if not param.optimize: + set_lines.append(pname + '=false||false||false||false||N') + else: + set_lines.append(pname + '=false||false||false||false||Y') + elif param.param_type == 'int': + start = int(param.min_value) if param.min_value is not None else 0 + step = int(param.step) if param.step is not None else 1 + stop = int(param.max_value) if param.max_value is not None else 100 + cur = int(param.default) if param.default is not None else start + if not param.optimize or start == stop or step == 0: + set_lines.append(pname + '=' + str(cur) + '||' + str(cur) + '||' + str(cur) + '||' + str(cur) + '||N') + else: + set_lines.append(pname + '=' + str(cur) + '||' + str(start) + '||' + str(step) + '||' + str(stop) + '||Y') + elif param.param_type == 'double': + start = float(param.min_value) if param.min_value is not None else 0.0 + step = float(param.step) if param.step is not None else 0.01 + stop = float(param.max_value) if param.max_value is not None else 1.0 + cur = float(param.default) if param.default is not None else start + if not param.optimize or start == stop or step == 0: + set_lines.append(pname + '=' + str(cur) + '||' + str(cur) + '||' + str(cur) + '||' + str(cur) + '||N') + else: + set_lines.append(pname + '=' + str(cur) + '||' + str(start) + '||' + str(step) + '||' + str(stop) + '||Y') + + with open(set_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(set_lines)) + + ini_lines = [ + '; EA backtest', + '[Tester]', + 'Expert=' + ea_config.ea_path, + 'ExpertParameters=' + set_filename, + 'Symbol=' + test_config.get('symbol', 'EURUSD'), + 'Period=' + test_config.get('period', 'H1'), + 'Model=' + str(test_config.get('model', 1)), + 'FromDate=' + date_from, + 'ToDate=' + date_to, + ] + + wf = ea_config.walk_forward + if wf.get('enabled', False): + fm = wf.get('forward_mode', 2) + ini_lines.append('ForwardMode=' + str(fm)) + else: + ini_lines.append('ForwardMode=0') + + ini_lines.extend([ + 'Deposit=' + str(test_config.get('deposit', 10000)), + 'Currency=' + str(test_config.get('currency', 'USD')), + 'Leverage=' + str(test_config.get('leverage', '1:100')), + 'ExecutionMode=' + str(test_config.get('execution_delay', 0)), + 'Optimization=' + str(test_config.get('optimization_mode', 2)), + 'OptimizationCriterion=' + str(opt_criterion), + 'Report=' + ea_config.ea_name + '_optimization', + 'ReplaceReport=true', + 'ShutdownTerminal=true', + 'Visual=0', + '', + ]) + + with open(ini_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(ini_lines)) + + print('INI saved: ' + ini_path) + print('SET saved: ' + set_path) + return ini_path + + def build_powershell_script(self, ea_config: EAConfig, param_mapping: List[Dict], mt5_path: str): + ps_filename = 'run_' + ea_config.ea_name + '.ps1' + ps_path = os.path.join(self.scripts_dir, ps_filename) + + ea_set_dir = os.path.join(self.set_files_dir, ea_config.ea_name) + ea_report_dir = os.path.join(self.reports_dir, ea_config.ea_name) + os.makedirs(ea_report_dir, exist_ok=True) + + ini_path = os.path.join(self.configs_dir, ea_config.ea_name + '.ini') + + lines = [ + '# MT5 Batch Backtest Script', + '# Generated: ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S'), + '', + f'$MT5Path = "{mt5_path}"', + f'$IniFile = "{ini_path}"', + f'$SetDir = "{ea_set_dir}"', + '', + f"Write-Host 'Starting batch optimization for {ea_config.ea_name}'", + '', + '$SetFiles = Get-ChildItem -Path $SetDir -Filter "params_*.set"', + '$Total = $SetFiles.Count', + '$Current = 0', + '', + 'foreach ($SetFile in $SetFiles) {', + ' $Current++', + ' Write-Host "[$Current/$Total] Processing: $($SetFile.Name)"', + '', + ' $IniContent = Get-Content $IniFile', + ' $IniContent = $IniContent -replace "ExpertParameters=.*", "ExpertParameters=$($SetFile.FullName)"', + ' $TempIni = Join-Path $env:TEMP "temp_$([guid]::NewGuid().ToString().Substring(0,8)).ini"', + ' $IniContent | Set-Content $TempIni -Encoding UTF8', + '', + ' Start-Process -FilePath $MT5Path -ArgumentList "/config:$TempIni" -Wait', + '', + ' Start-Sleep -Seconds 3', + '}', + '', + f"Write-Host 'Batch optimization completed for {ea_config.ea_name}!'", + ] + + with open(ps_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + + print('PowerShell script: ' + ps_path) + return ps_path + + def run_optimization_for_ea(self, ea_config: EAConfig, mt5_path: str = None, + max_samples: int = 2000): + print('\n' + '=' * 60) + print('Optimization for: ' + ea_config.ea_name) + print('=' * 60) + + param_mapping = self.generate_set_files(ea_config, max_samples) + self.generate_ini_for_ea(ea_config, param_mapping) + + if mt5_path: + ps_path = self.build_powershell_script(ea_config, param_mapping, mt5_path) + print('PowerShell script: ' + ps_path) + + return param_mapping + + def run_full_optimization(self, ea_names: List[str] = None, + mt5_path: str = None, + max_samples_per_ea: int = 2000): + configs = load_all_ea_configs(self.configs_dir) + + if ea_names: + configs = {k: v for k, v in configs.items() if k in ea_names} + + all_mapping = {} + for ea_name, ea_config in configs.items(): + mapping = self.run_optimization_for_ea(ea_config, mt5_path, max_samples_per_ea) + all_mapping[ea_name] = mapping + + return all_mapping + + def analyze_results(self, ea_names: List[str] = None) -> List[Dict]: + all_results = [] + + if ea_names: + for ea_name in ea_names: + report_dir = os.path.join(self.reports_dir, ea_name) + if os.path.exists(report_dir): + analyzer = ResultAnalyzer(report_dir) + results = analyzer.parse_all_reports() + for r in results: + r['ea_name'] = ea_name + all_results.extend(results) + else: + for ea_name in os.listdir(self.reports_dir): + report_dir = os.path.join(self.reports_dir, ea_name) + if os.path.isdir(report_dir): + analyzer = ResultAnalyzer(report_dir) + results = analyzer.parse_all_reports() + for r in results: + r['ea_name'] = ea_name + all_results.extend(results) + + return all_results + + def find_optimal_params(self, results: List[Dict], criterion: str = 'profit_factor', + min_trades: int = 10) -> List[Dict]: + filtered = [r for r in results if r.get('total_trades', 0) >= min_trades + and r.get('profit_factor', 0) > 0] + filtered.sort(key=lambda x: x.get(criterion, 0), reverse=True) + return filtered + + +def main(): + import argparse + parser = argparse.ArgumentParser(description='MT5 EA Batch Optimizer') + parser.add_argument('--base-dir', '-d', default='optimizer', help='Base directory') + parser.add_argument('--ea', '-e', nargs='+', help='EA names to optimize') + parser.add_argument('--max-samples', '-m', type=int, default=2000, help='Max samples') + parser.add_argument('--mt5-path', '-p', help='MT5 terminal path') + parser.add_argument('--analyze-only', '-a', action='store_true', help='Only analyze results') + + args = parser.parse_args() + + optimizer = EABatchOptimizer(args.base_dir) + + if args.analyze_only: + results = optimizer.analyze_results(args.ea) + if results: + analyzer = ResultAnalyzer() + best = optimizer.find_optimal_params(results) + analyzer.generate_report(best) + print('Results: ' + str(len(results))) + print('Best: PF=' + str(best[0].get('profit_factor', 0)) if best else 'No results') + else: + optimizer.run_full_optimization(args.ea, args.mt5_path, args.max_samples) + print('\nOptimization files generated. Run MT5 tests, then use --analyze-only') + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/scripts/optimizer/ea_config_parser.py b/scripts/optimizer/ea_config_parser.py new file mode 100644 index 0000000..d81d408 --- /dev/null +++ b/scripts/optimizer/ea_config_parser.py @@ -0,0 +1,135 @@ +import os +import json +from dataclasses import dataclass, field +from typing import Dict, List, Any + +@dataclass +class ParameterDef: + name: str + param_type: str + default: Any = None + min_value: Any = None + max_value: Any = None + step: Any = None + precision: int = 0 + optimize: bool = True + enum_options: List[Any] = field(default_factory=list) + description: str = '' + condition: str = '' + + def expand_values(self) -> List[Any]: + if self.param_type == 'bool': + return [True, False] + elif self.param_type == 'enum': + return self.enum_options + elif self.param_type in ('int', 'double'): + if self.min_value is None or self.max_value is None: + return [self.default] if self.default is not None else [] + values = [] + current = self.min_value + while current <= self.max_value: + values.append(round(current, self.precision) if self.precision > 0 else int(current)) + current += self.step + return values + return [self.default] + + def is_valid_value(self, value: Any) -> bool: + if self.param_type == 'bool': + return isinstance(value, bool) + elif self.param_type == 'enum': + return value in self.enum_options + elif self.param_type in ('int', 'double'): + if self.min_value is not None and value < self.min_value: + return False + if self.max_value is not None and value > self.max_value: + return False + return True + return True + +@dataclass +class EAConfig: + ea_name: str + ea_path: str + parameters: Dict[str, ParameterDef] = field(default_factory=dict) + search_strategy: str = 'auto' + optimization_criterion: str = 'profit_factor' + test_config: Dict[str, Any] = field(default_factory=dict) + walk_forward: Dict[str, Any] = field(default_factory=dict) + description: str = '' + + def get_total_combinations(self) -> int: + total = 1 + for param in self.parameters.values(): + values = param.expand_values() + total *= len(values) if values else 1 + return total + + def estimate_search_time(self, tests_per_minute: float = 10) -> str: + total = self.get_total_combinations() + minutes = total / tests_per_minute + if minutes < 60: + return str(round(minutes, 1)) + ' minutes' + elif minutes < 1440: + return str(round(minutes/60, 1)) + ' hours' + else: + return str(round(minutes/1440, 1)) + ' days' + + def is_complex(self) -> bool: + return len(self.parameters) > 6 or self.get_total_combinations() > 1_000_000 + +def load_ea_config(config_path: str) -> EAConfig: + with open(config_path, 'r', encoding='utf-8') as f: + config_data = json.load(f) + ea_name = config_data.get('ea_name', 'Unknown') + ea_path = config_data.get('ea_path', '') + description = config_data.get('description', '') + search_strategy = config_data.get('search_strategy', 'auto') + criterion = config_data.get('optimization_criterion', 'profit_factor') + test_config = config_data.get('test_config', {}) + walk_forward = config_data.get('walk_forward', {}) + parameters = {} + for param_name, param_data in config_data.get('parameters', {}).items(): + param_type = param_data.get('type', 'int') + if param_type == 'enum': + param = ParameterDef( + name=param_name, + param_type='enum', + default=param_data.get('default'), + enum_options=param_data.get('options', []), + description=param_data.get('description', ''), + condition=param_data.get('condition', '') + ) + else: + param = ParameterDef( + name=param_name, + param_type=param_type, + default=param_data.get('default'), + min_value=param_data.get('min'), + max_value=param_data.get('max'), + step=param_data.get('step', 1), + precision=param_data.get('precision', 0), + optimize=param_data.get('optimize', True), + description=param_data.get('description', ''), + condition=param_data.get('condition', '') + ) + parameters[param_name] = param + return EAConfig( + ea_name=ea_name, ea_path=ea_path, parameters=parameters, + search_strategy=search_strategy, optimization_criterion=criterion, + test_config=test_config, walk_forward=walk_forward, description=description + ) + +def load_all_ea_configs(configs_dir: str) -> Dict[str, EAConfig]: + configs = {} + if not os.path.exists(configs_dir): + return configs + for filename in os.listdir(configs_dir): + if filename.endswith('.json'): + config_path = os.path.join(configs_dir, filename) + try: + config = load_ea_config(config_path) + configs[config.ea_name] = config + except Exception as e: + print('Error loading ' + config_path + ': ' + str(e)) + return configs + diff --git a/scripts/optimizer/parameter_constraint.py b/scripts/optimizer/parameter_constraint.py new file mode 100644 index 0000000..e2001cb --- /dev/null +++ b/scripts/optimizer/parameter_constraint.py @@ -0,0 +1,86 @@ +import re +from typing import List, Dict, Any, Callable + +class ParameterConstraintEngine: + def __init__(self): + self.constraints = [] + self.condition_functions = [] + + def add_constraint(self, name: str, condition: str, error_message: str = ''): + self.constraints.append({ + 'name': name, + 'condition': condition, + 'error_message': error_message or 'Constraint violated: ' + name + }) + + def add_condition_from_config(self, param_name: str, condition_str: str): + if not condition_str: + return + + condition_str = condition_str.strip() + self.constraints.append({ + 'name': param_name, + 'condition': condition_str, + 'error_message': 'Parameter constraint violated: ' + param_name + }) + + def _parse_condition(self, condition: str) -> Callable[[Dict], bool]: + condition = condition.strip() + + patterns = [ + (r'^(\w+)\s*>\s*(\w+)$', lambda m, p: p.get(m.group(1), 0) > p.get(m.group(2), 0)), + (r'^(\w+)\s*<\s*(\w+)$', lambda m, p: p.get(m.group(1), 0) < p.get(m.group(2), 0)), + (r'^(\w+)\s*>=\s*(\w+)$', lambda m, p: p.get(m.group(1), 0) >= p.get(m.group(2), 0)), + (r'^(\w+)\s*<=\s*(\w+)$', lambda m, p: p.get(m.group(1), 0) <= p.get(m.group(2), 0)), + (r'^(\w+)\s*==\s*(\w+)$', lambda m, p: p.get(m.group(1), 0) == p.get(m.group(2), 0)), + (r'^(\w+)\s*!=\s*(\w+)$', lambda m, p: p.get(m.group(1), 0) != p.get(m.group(2), 0)), + (r'^(\w+)\s*>\s*(\d+)$', lambda m, p: p.get(m.group(1), 0) > int(m.group(2))), + (r'^(\w+)\s*<\s*(\d+)$', lambda m, p: p.get(m.group(1), 0) < int(m.group(2))), + ] + + for pattern, func in patterns: + match = re.match(pattern, condition) + if match: + return lambda params, m=match, f=func: f(m, params) + + return lambda params: True + + def _is_valid_combination(self, params: Dict) -> bool: + for constraint in self.constraints: + condition = constraint['condition'] + if not condition: + continue + + parse_func = self._parse_condition(condition) + if not parse_func(params): + return False + + return True + + def filter_valid_combinations(self, combinations: List[Dict]) -> List[Dict]: + valid = [] + invalid_count = 0 + for combo in combinations: + if self._is_valid_combination(combo): + valid.append(combo) + else: + invalid_count += 1 + + if invalid_count > 0: + print('Filtered ' + str(invalid_count) + ' invalid combinations') + + return valid + + def get_constraint_count(self) -> int: + return len(self.constraints) + + +def create_constraint_engine(ea_config) -> ParameterConstraintEngine: + engine = ParameterConstraintEngine() + + for param_name, param in ea_config.parameters.items(): + if param.condition: + engine.add_condition_from_config(param_name, param.condition) + + return engine + diff --git a/scripts/optimizer/smart_search.py b/scripts/optimizer/smart_search.py new file mode 100644 index 0000000..65ec97a --- /dev/null +++ b/scripts/optimizer/smart_search.py @@ -0,0 +1,168 @@ +import random +import math +from typing import List, Dict, Any, Tuple +from itertools import product + +class SmartSearch: + def __init__(self, ea_config): + self.ea_config = ea_config + self.total_combinations = ea_config.get_total_combinations() + + def select_strategy(self) -> str: + if self.ea_config.search_strategy != 'auto': + return self.ea_config.search_strategy + if self.total_combinations <= 10000: + return 'grid' + elif self.total_combinations <= 500000: + return 'latin' + else: + return 'genetic' + + def generate_combinations(self, max_samples: int = 2000) -> List[Dict]: + strategy = self.select_strategy() + print('Selected strategy: ' + strategy + ' for ' + str(self.total_combinations) + ' combinations') + + if strategy == 'grid': + return self._grid_search() + elif strategy == 'random': + return self._random_search(max_samples) + elif strategy == 'latin': + return self._latin_hypercube(max_samples) + elif strategy == 'genetic': + return self._genetic_search(max_samples) + return [] + + def _grid_search(self) -> List[Dict]: + param_names = list(self.ea_config.parameters.keys()) + param_values = [p.expand_values() for p in self.ea_config.parameters.values()] + combinations = list(product(*param_values)) + return [dict(zip(param_names, combo)) for combo in combinations] + + def _random_search(self, max_samples: int) -> List[Dict]: + all_values = {name: p.expand_values() for name, p in self.ea_config.parameters.items()} + samples = [] + for _ in range(min(max_samples, self.total_combinations)): + sample = {name: random.choice(values) for name, values in all_values.items()} + if sample not in samples: + samples.append(sample) + return samples + + def _latin_hypercube(self, max_samples: int) -> List[Dict]: + all_values = {name: p.expand_values() for name, p in self.ea_config.parameters.items()} + n_params = len(all_values) + samples = [] + for i in range(min(max_samples, self.total_combinations)): + sample = {} + for j, (name, values) in enumerate(all_values.items()): + idx = int((i / max_samples) * len(values)) % len(values) + sample[name] = values[idx] + if sample not in samples: + samples.append(sample) + return samples + + def _genetic_search(self, max_samples: int) -> List[Dict]: + pop_size = min(50, max_samples) + n_generations = max_samples // pop_size + all_values = {name: p.expand_values() for name, p in self.ea_config.parameters.items()} + + population = [] + for _ in range(pop_size): + individual = {name: random.choice(values) for name, values in all_values.items()} + population.append(individual) + + for gen in range(n_generations): + population = self._evolve(population, all_values) + + return population[:max_samples] + + def _evolve(self, population: List[Dict], all_values: Dict) -> List[Dict]: + crossover_rate = 0.8 + mutation_rate = 0.15 + + offspring = [] + for _ in range(len(population)): + parent1, parent2 = random.sample(population, 2) + if random.random() < crossover_rate: + child = self._crossover(parent1, parent2) + else: + child = parent1.copy() + + if random.random() < mutation_rate: + child = self._mutate(child, all_values) + + offspring.append(child) + + return population[:5] + offspring[:len(population)-5] + + def _crossover(self, parent1: Dict, parent2: Dict) -> Dict: + child = {} + for key in parent1.keys(): + if random.random() < 0.5: + child[key] = parent1[key] + else: + child[key] = parent2[key] + return child + + def _mutate(self, individual: Dict, all_values: Dict) -> Dict: + key = random.choice(list(all_values.keys())) + individual[key] = random.choice(all_values[key]) + return individual + + +class GeneticOptimizer: + def __init__(self, ea_config, population_size: int = 50, generations: int = 30): + self.ea_config = ea_config + self.population_size = population_size + self.generations = generations + self.all_values = {name: p.expand_values() for name, p in ea_config.parameters.items()} + + def create_individual(self) -> Dict: + return {name: random.choice(values) for name, values in self.all_values.items()} + + def evaluate(self, individual: Dict) -> float: + return random.random() * 10 + + def tournament_select(self, population: List[Dict], k: int = 3) -> Dict: + tournament = random.sample(population, k) + return max(tournament, key=self.evaluate) + + def crossover(self, parent1: Dict, parent2: Dict) -> Tuple[Dict, Dict]: + child1, child2 = {}, {} + for key in parent1.keys(): + if random.random() < 0.5: + child1[key] = parent1[key] + child2[key] = parent2[key] + else: + child1[key] = parent2[key] + child2[key] = parent1[key] + return child1, child2 + + def mutate(self, individual: Dict, rate: float = 0.15) -> Dict: + for key in individual.keys(): + if random.random() < rate: + individual[key] = random.choice(self.all_values[key]) + return individual + + def run(self) -> List[Dict]: + population = [self.create_individual() for _ in range(self.population_size)] + best_individuals = [] + + for gen in range(self.generations): + fitness_scores = [(ind, self.evaluate(ind)) for ind in population] + fitness_scores.sort(key=lambda x: x[1], reverse=True) + + elite = [ind for ind, _ in fitness_scores[:5]] + best_individuals.extend(elite) + + new_population = elite.copy() + while len(new_population) < self.population_size: + parent1 = self.tournament_select(population) + parent2 = self.tournament_select(population) + child1, child2 = self.crossover(parent1, parent2) + child1 = self.mutate(child1) + child2 = self.mutate(child2) + new_population.extend([child1, child2]) + + population = new_population[:self.population_size] + + return best_individuals diff --git a/scripts/report_generator.py b/scripts/report_generator.py new file mode 100644 index 0000000..ad90bc0 --- /dev/null +++ b/scripts/report_generator.py @@ -0,0 +1,321 @@ +import os +import json +from datetime import datetime +from typing import List, Dict, Optional +import logging + + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +class ReportGenerator: + def __init__(self, results: List[Dict] = None): + self.results = results or [] + + def generate_excel(self, output_path: str = "reports/batch_report.xlsx") -> str: + try: + import openpyxl + from openpyxl.styles import Font, Alignment, PatternFill, Border, Side + + wb = openpyxl.Workbook() + ws = wb.active + ws.title = "Backtest Results" + + headers = [ + "EA Name", "Symbol", "Period", "Model", + "Total Trades", "Winning Trades", "Losing Trades", + "Win Rate %", "Gross Profit", "Gross Loss", + "Profit Factor", "Expected Payoff", + "Initial Deposit", "Final Balance" + ] + + header_fill = PatternFill(start_color="366092", end_color="366092", fill_type="solid") + header_font = Font(bold=True, color="FFFFFF") + thin_border = Border( + left=Side(style='thin'), + right=Side(style='thin'), + top=Side(style='thin'), + bottom=Side(style='thin') + ) + + for col, header in enumerate(headers, 1): + cell = ws.cell(row=1, column=col, value=header) + cell.fill = header_fill + cell.font = header_font + cell.alignment = Alignment(horizontal='center', vertical='center') + cell.border = thin_border + + for row_idx, result in enumerate(self.results, 2): + metrics = result.get("metrics", {}) + test_info = result.get("test_info", {}) + + row_data = [ + test_info.get("expert", ""), + test_info.get("symbol", ""), + test_info.get("period", ""), + test_info.get("model", ""), + metrics.get("total_trades", 0), + metrics.get("winning_trades", 0), + metrics.get("losing_trades", 0), + metrics.get("win_rate", 0), + metrics.get("gross_profit", 0), + metrics.get("gross_loss", 0), + metrics.get("profit_factor", 0), + metrics.get("expected_payoff", 0), + metrics.get("initial_deposit", 0), + metrics.get("final_balance", 0) + ] + + for col, value in enumerate(row_data, 1): + cell = ws.cell(row=row_idx, column=col, value=value) + cell.border = thin_border + if col >= 5: + cell.number_format = '0.00' + + for col in range(1, len(headers) + 1): + ws.column_dimensions[openpyxl.utils.get_column_letter(col)].width = 15 + + ws.auto_filter.ref = f"A1:N{len(self.results) + 1}" + + os.makedirs(os.path.dirname(output_path), exist_ok=True) + wb.save(output_path) + logger.info(f"Excel report saved: {output_path}") + return output_path + + except Exception as e: + logger.error(f"Error generating Excel report: {e}") + raise + + def generate_csv(self, output_path: str = "reports/batch_report.csv") -> str: + try: + import csv + + os.makedirs(os.path.dirname(output_path) or '.', exist_ok=True) + + headers = [ + "EA Name", "Symbol", "Period", "Model", + "Total Trades", "Winning Trades", "Losing Trades", + "Win Rate %", "Gross Profit", "Gross Loss", + "Profit Factor", "Expected Payoff", + "Initial Deposit", "Final Balance" + ] + + with open(output_path, 'w', newline='', encoding='utf-8-sig') as f: + writer = csv.writer(f) + writer.writerow(headers) + + for result in self.results: + metrics = result.get("metrics", {}) + test_info = result.get("test_info", {}) + + row_data = [ + test_info.get("expert", ""), + test_info.get("symbol", ""), + test_info.get("period", ""), + test_info.get("model", ""), + metrics.get("total_trades", 0), + metrics.get("winning_trades", 0), + metrics.get("losing_trades", 0), + metrics.get("win_rate", 0), + metrics.get("gross_profit", 0), + metrics.get("gross_loss", 0), + metrics.get("profit_factor", 0), + metrics.get("expected_payoff", 0), + metrics.get("initial_deposit", 0), + metrics.get("final_balance", 0) + ] + writer.writerow(row_data) + + logger.info(f"CSV report saved: {output_path}") + return output_path + + except Exception as e: + logger.error(f"Error generating CSV report: {e}") + raise + + def generate_html(self, output_path: str = "reports/batch_report.html") -> str: + try: + os.makedirs(os.path.dirname(output_path) or '.', exist_ok=True) + + html_content = f""" + + + + + MT5 Batch Backtest Report + + + +

MT5 Batch Backtest Report

+

Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}

+ +
+

Summary

+

Total Tests: {len(self.results)}

+
+ + + + + + + + + + + + + +""" + + for result in self.results: + metrics = result.get("metrics", {}) + test_info = result.get("test_info", {}) + + pf = metrics.get("profit_factor", 0) + row_class = "best" if pf >= 2.0 else ("worst" if pf < 1.0 else "") + + html_content += f""" + + + + + + + + + + + +""" + + html_content += """ +
EA NameSymbolPeriodTotal TradesWin Rate %Profit FactorGross ProfitGross LossFinal Balance
{test_info.get("expert", "")}{test_info.get("symbol", "")}{test_info.get("period", "")}{metrics.get("total_trades", 0)}{metrics.get("win_rate", 0):.2f}%{pf:.2f}{metrics.get("gross_profit", 0):.2f}{metrics.get("gross_loss", 0):.2f}{metrics.get("final_balance", 0):.2f}
+ + +""" + + with open(output_path, 'w', encoding='utf-8') as f: + f.write(html_content) + + logger.info(f"HTML report saved: {output_path}") + return output_path + + except Exception as e: + logger.error(f"Error generating HTML report: {e}") + raise + + def generate_markdown(self, output_path: str = "reports/batch_report.md") -> str: + try: + os.makedirs(os.path.dirname(output_path) or '.', exist_ok=True) + + md_lines = [ + "# MT5 Batch Backtest Report", + "", + f"Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}", + "", + f"**Total Tests:** {len(self.results)}", + "" + ] + + if self.results: + best = max(self.results, key=lambda x: x.get("metrics", {}).get("profit_factor", 0)) + worst = min(self.results, key=lambda x: x.get("metrics", {}).get("profit_factor", 0)) + + md_lines.append(f"**Best Test:** {best.get('test_info', {}).get('expert', 'N/A')} " + f"(PF: {best.get('metrics', {}).get('profit_factor', 0):.2f})") + md_lines.append(f"**Worst Test:** {worst.get('test_info', {}).get('expert', 'N/A')} " + f"(PF: {worst.get('metrics', {}).get('profit_factor', 0):.2f})") + md_lines.append("") + + md_lines.append("## Results") + md_lines.append("") + md_lines.append("| EA Name | Symbol | Period | Total Trades | Win Rate | Profit Factor | " + "Gross Profit | Gross Loss | Final Balance |") + md_lines.append("|---------|--------|--------|--------------|----------|---------------|" + "--------------|------------|---------------|") + + for result in self.results: + metrics = result.get("metrics", {}) + test_info = result.get("test_info", {}) + + md_lines.append( + f"| {test_info.get('expert', '')} | " + f"{test_info.get('symbol', '')} | " + f"{test_info.get('period', '')} | " + f"{metrics.get('total_trades', 0)} | " + f"{metrics.get('win_rate', 0):.2f}% | " + f"{metrics.get('profit_factor', 0):.2f} | " + f"{metrics.get('gross_profit', 0):.2f} | " + f"{metrics.get('gross_loss', 0):.2f} | " + f"{metrics.get('final_balance', 0):.2f} |" + ) + + with open(output_path, 'w', encoding='utf-8') as f: + f.write("\n".join(md_lines)) + + logger.info(f"Markdown report saved: {output_path}") + return output_path + + except Exception as e: + logger.error(f"Error generating Markdown report: {e}") + raise + + +def main(): + import argparse + parser = argparse.ArgumentParser(description="MT5 Report Generator") + parser.add_argument("--input", "-i", default="reports/parsed_results.json", + help="Input JSON file from result_parser") + parser.add_argument("--output-dir", "-o", default="reports", + help="Output directory for reports") + parser.add_argument("--format", "-f", choices=["excel", "csv", "html", "markdown", "all"], + default="all", help="Output format") + + args = parser.parse_args() + + results = [] + if os.path.exists(args.input): + with open(args.input, 'r', encoding='utf-8') as f: + data = json.load(f) + results = data.get("results", []) + else: + logger.warning(f"Input file not found: {args.input}") + logger.info("Use result_parser.py first to generate parsed results") + + if not results: + print("No results to generate report") + return + + generator = ReportGenerator(results) + + base_name = os.path.join(args.output_dir, "batch_report") + + if args.format in ["excel", "all"]: + generator.generate_excel(f"{base_name}.xlsx") + + if args.format in ["csv", "all"]: + generator.generate_csv(f"{base_name}.csv") + + if args.format in ["html", "all"]: + generator.generate_html(f"{base_name}.html") + + if args.format in ["markdown", "all"]: + generator.generate_markdown(f"{base_name}.md") + + print(f"\nReports generated in: {args.output_dir}") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts/result_parser.py b/scripts/result_parser.py new file mode 100644 index 0000000..a711045 --- /dev/null +++ b/scripts/result_parser.py @@ -0,0 +1,483 @@ +import os +import csv +import xml.etree.ElementTree as ET +from datetime import datetime +from typing import Dict, List, Optional +from bs4 import BeautifulSoup +import logging + + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +class ResultParser: + def __init__(self, results_dir: str = "results"): + self.results_dir = results_dir + + def parse_xml_report(self, report_path: str) -> Optional[Dict]: + if not os.path.exists(report_path): + logger.warning(f"Report not found: {report_path}") + return None + + try: + tree = ET.parse(report_path) + root = tree.getroot() + + result = { + "report_file": os.path.basename(report_path), + "parse_time": datetime.now().isoformat(), + "test_info": {}, + "metrics": {}, + "trades": [] + } + + tester = root.find("Tester") + if tester is not None: + result["test_info"] = { + "expert": tester.findtext("Expert", ""), + "symbol": tester.findtext("Symbol", ""), + "period": tester.findtext("Period", ""), + "model": tester.findtext("Model", ""), + "from_date": tester.findtext("FromDate", ""), + "to_date": tester.findtext("ToDate", ""), + } + + equity = root.find("Equity") + if equity is not None: + result["metrics"]["initial_deposit"] = float(equity.findtext("Initial", "0")) + result["metrics"]["final_balance"] = float(equity.findtext("Final", "0")) + result["metrics"]["gross_profit"] = float(equity.findtext("GrossProfit", "0")) + result["metrics"]["gross_loss"] = float(equity.findtext("GrossLoss", "0")) + result["metrics"]["profit_factor"] = float(equity.findtext("ProfitFactor", "0")) + result["metrics"]["expected_payoff"] = float(equity.findtext("ExpectedPayoff", "0")) + + trades_elem = root.find("Trades") + if trades_elem is not None: + result["metrics"]["total_trades"] = int(trades_elem.findtext("Total", "0")) + result["metrics"]["short_positions"] = int(trades_elem.findtext("Short", "0")) + result["metrics"]["long_positions"] = int(trades_elem.findtext("Long", "0")) + result["metrics"]["winning_trades"] = int(trades_elem.findtext("ProfitTrades", "0")) + result["metrics"]["losing_trades"] = int(trades_elem.findtext("LossTrades", "0")) + + if result["metrics"]["total_trades"] > 0: + result["metrics"]["win_rate"] = ( + result["metrics"]["winning_trades"] / result["metrics"]["total_trades"] * 100 + ) + else: + result["metrics"]["win_rate"] = 0.0 + + return result + + except Exception as e: + logger.error(f"Error parsing XML report {report_path}: {e}") + return None + + def _detect_encoding(self, report_path: str) -> str: + with open(report_path, 'rb') as f: + bom = f.read(4) + if bom[:2] == b'\xff\xfe': + return 'utf-16-le' + elif bom[:2] == b'\xfe\xff': + return 'utf-16-be' + return 'utf-8' + + def parse_html_report(self, report_path: str) -> Optional[Dict]: + if not os.path.exists(report_path): + logger.warning(f"Report not found: {report_path}") + return None + + try: + import re + with open(report_path, 'rb') as f: + raw_bytes = f.read() + + if raw_bytes[:2] == b'\xff\xfe': + content = raw_bytes[2:].decode('utf-16-le') + else: + content = raw_bytes.decode('utf-8') + + result = { + "report_file": os.path.basename(report_path), + "parse_time": datetime.now().isoformat(), + "test_info": {}, + "metrics": {}, + "trades": [] + } + + plain_pattern = r']*nowrap[^>]*>([^<]+):\s*]*colspan=.10.[^>]*>([^<]*)' + plain_matches = re.findall(plain_pattern, content) + for key, value in plain_matches: + key = key.strip() + value = value.strip() + if key in result["test_info"] and result["test_info"].get(key): + continue + self._parse_html_cell(key, value, result) + + pattern = r']*>([^<]+):\s*]*>([^<]*)' + matches = re.findall(pattern, content) + for key, value in matches: + key = key.strip() + value = value.strip() + if key in result["test_info"] and result["test_info"].get(key): + continue + if key in result["metrics"] and result["metrics"].get(key): + continue + self._parse_html_cell(key, value, result) + + return result + + except Exception as e: + logger.error(f"Error parsing HTML report {report_path}: {e}") + return None + + try: + with open(report_path, 'r', encoding='utf-16') as f: + content = f.read() + content_utf8 = content.encode('utf-8').decode('utf-8') + soup = BeautifulSoup(content_utf8, 'html.parser') + + result = { + "report_file": os.path.basename(report_path), + "parse_time": datetime.now().isoformat(), + "test_info": {}, + "metrics": {}, + "trades": [] + } + + tables = soup.find_all('table') + for table in tables: + rows = table.find_all('tr') + for row in rows: + cells = row.find_all(['td', 'th']) + if len(cells) >= 2: + non_empty = [c for c in cells if c.get_text(strip=True)] + if len(non_empty) >= 2: + key = non_empty[0].get_text(strip=True) + value = non_empty[1].get_text(strip=True) + self._parse_html_cell(key, value, result) + + return result + + except Exception as e: + logger.error(f"Error parsing HTML report {report_path}: {e}") + return None + + def _extract_number(self, text: str) -> float: + import re + numbers = re.findall(r'[-+]?\d*\.?\d+', text.replace(',', '').replace(' ', '')) + if numbers: + try: + return float(numbers[0]) + except: + return 0.0 + return 0.0 + + def _extract_percentage(self, text: str) -> float: + import re + numbers = re.findall(r'\d+\.?\d*%', text) + if numbers: + try: + return float(numbers[0].replace('%', '')) + except: + return 0.0 + return 0.0 + + def _parse_html_cell(self, key: str, value: str, result: Dict): + import re + key_lower = key.lower() + if '专家' in key or 'Expert' in key: + if not result["test_info"].get("expert"): + result["test_info"]["expert"] = value + elif '交易品种' in key or '交易品' in key or 'Symbol' in key or 'symbol' in key_lower: + current = result["test_info"].get("symbol") + if (not current or current in ('1', '0', '')) and value and value not in ('1', ''): + result["test_info"]["symbol"] = value + + if not result["test_info"].get("symbol") or result["test_info"].get("symbol") == "0": + fn = result["report_file"] + m = re.search(r'_([A-Z]{5,6})_', fn) + if m: + result["test_info"]["symbol"] = m.group(1) + elif '期间' in key or 'Period' in key: + if not result["test_info"].get("period"): + result["test_info"]["period"] = value + elif '模型' in key or 'Model' in key: + result["test_info"]["model"] = value + elif '公司' in key or 'Company' in key: + result["test_info"]["company"] = value + elif '货币' in key or 'Currency' in key: + result["test_info"]["currency"] = value + elif '杠杆' in key or 'Leverage' in key: + result["test_info"]["leverage"] = value + elif '初始入金' in key or ('Initial' in key and 'Deposit' in key): + result["metrics"]["initial_deposit"] = self._extract_number(value) + elif '总净盈利' in key or 'Net Profit' in key: + result["metrics"]["net_profit"] = self._extract_number(value) + elif '毛利' in key or 'Gross Profit' in key: + result["metrics"]["gross_profit"] = self._extract_number(value) + elif '毛损' in key or 'Gross Loss' in key: + result["metrics"]["gross_loss"] = self._extract_number(value) + elif '盈利因子' in key or 'Profit Factor' in key: + result["metrics"]["profit_factor"] = self._extract_number(value) + elif '预期收益' in key or 'Expected Payoff' in key: + result["metrics"]["expected_payoff"] = self._extract_number(value) + elif ('总' in key and '交易' in key.lower()) or ('Total' in key and 'trades' in key_lower): + result["metrics"]["total_trades"] = self._extract_number(value) + elif '采收率' in key or 'Recovery Factor' in key: + result["metrics"]["recovery_factor"] = self._extract_number(value) + elif '夏普比率' in key or 'Sharpe Ratio' in key: + result["metrics"]["sharpe_ratio"] = self._extract_number(value) + elif 'AHPR' in key: + result["metrics"]["ahpr"] = value + elif 'GHPR' in key: + result["metrics"]["ghpr"] = value + elif 'LR 相关性' in key or 'LR Correlation' in key: + result["metrics"]["lr_correlation"] = self._extract_number(value) + elif 'LR 标准误差' in key or 'LR Standard Error' in key: + result["metrics"]["lr_standard_error"] = self._extract_number(value) + elif '最大结余亏损' in key or 'Maximal Drawdown' in key: + result["metrics"]["max_drawdown"] = self._extract_number(value) + elif '最大净值亏损' in key or 'Max Equity Drawdown' in key: + result["metrics"]["max_equity_drawdown"] = self._extract_number(value) + elif '绝对结余亏损' in key or 'Absolute Drawdown' in key: + result["metrics"]["absolute_drawdown"] = self._extract_number(value) + elif '预付款维持率' in key or 'Margin Level' in key: + result["metrics"]["margin_level"] = self._extract_number(value) + elif '卖出交易' in key or 'Short Positions' in key: + result["metrics"]["short_trades"] = self._extract_number(value.split('(')[0]) if '(' in value else self._extract_number(value) + elif '买入交易' in key or 'Long Positions' in key: + result["metrics"]["long_trades"] = self._extract_number(value.split('(')[0]) if '(' in value else self._extract_number(value) + elif '总成交' in key or 'Total Deals' in key: + result["metrics"]["total_deals"] = self._extract_number(value) + elif '盈利交易' in key or 'Profit Trades' in key: + result["metrics"]["winning_trades"] = self._extract_number(value.split('(')[0]) if '(' in value else self._extract_number(value) + result["metrics"]["win_rate"] = self._extract_percentage(value) + elif '亏损交易' in key or 'Loss Trades' in key: + result["metrics"]["losing_trades"] = self._extract_number(value.split('(')[0]) if '(' in value else self._extract_number(value) + elif '最大 获利交易' in key or 'Max Profit Trade' in key: + result["metrics"]["max_profit_trade"] = self._extract_number(value) + elif '最大 亏损交易' in key or 'Max Loss Trade' in key: + result["metrics"]["max_loss_trade"] = self._extract_number(value) + elif '平均 获利交易' in key or 'Avg Profit Trade' in key: + result["metrics"]["avg_profit_trade"] = self._extract_number(value) + elif '平均 亏损交易' in key or 'Avg Loss Trade' in key: + result["metrics"]["avg_loss_trade"] = self._extract_number(value) + elif '最大值 连胜' in key or 'Longest Winning Streak' in key: + result["metrics"]["longest_win_streak"] = self._extract_number(value.split('(')[0]) if '(' in value else self._extract_number(value) + elif '最大值 连败' in key or 'Longest Losing Streak' in key: + result["metrics"]["longest_lose_streak"] = self._extract_number(value.split('(')[0]) if '(' in value else self._extract_number(value) + elif '平均 连胜' in key or 'Average Winning Streak' in key: + result["metrics"]["avg_win_streak"] = self._extract_number(value) + elif '平均 连败' in key or 'Average Losing Streak' in key: + result["metrics"]["avg_lose_streak"] = self._extract_number(value) + elif '最小持仓时间' in key or 'Min Hold Time' in key: + result["metrics"]["min_hold_time"] = value + elif '最大持仓时间' in key or 'Max Hold Time' in key: + result["metrics"]["max_hold_time"] = value + elif '平均持仓时间' in key or 'Avg Hold Time' in key: + result["metrics"]["avg_hold_time"] = value + elif '质量历史' in key or 'Quality' in key: + result["metrics"]["quality"] = self._extract_number(value) + elif '柱' in key or 'Bars' in key: + result["metrics"]["bars"] = self._extract_number(value) + elif '报价' in key or 'Quotes' in key: + result["metrics"]["quotes"] = self._extract_number(value) + elif '分值' in key or 'Score' in key: + result["metrics"]["score"] = self._extract_number(value.split('(')[0]) if '(' in value else self._extract_number(value) + elif 'OnTester结果' in key or 'OnTester' in key: + result["metrics"]["on_tester"] = self._extract_number(value) + + def parse_all_reports(self, pattern: str = "*.xml") -> List[Dict]: + import glob + pattern_base = pattern.replace('*', '') + if pattern_base == '.xml': + report_files = glob.glob(os.path.join(self.results_dir, '*.xml')) + report_files.extend(glob.glob(os.path.join(self.results_dir, '*.htm'))) + report_files.extend(glob.glob(os.path.join(self.results_dir, '*.html'))) + else: + report_files = glob.glob(os.path.join(self.results_dir, pattern)) + + results = [] + for report_file in report_files: + if report_file.endswith('.xml'): + parsed = self.parse_xml_report(report_file) + elif report_file.endswith(('.html', '.htm')): + parsed = self.parse_html_report(report_file) + else: + continue + + if parsed: + parsed["file_path"] = os.path.abspath(report_file) + parsed.setdefault("report_file", os.path.basename(report_file)) + results.append(parsed) + logger.info(f"Parsed: {os.path.basename(report_file)}") + else: + logger.warning(f"Failed to parse: {report_file}") + + logger.info(f"Total reports parsed: {len(results)}") + return results + + def get_summary(self, results: List[Dict]) -> Dict: + if not results: + return {} + + summary = { + "total_tests": len(results), + "total_trades": 0, + "avg_win_rate": 0, + "avg_profit_factor": 0, + "best_test": None, + "worst_test": None + } + + total_trades = sum(r["metrics"].get("total_trades", 0) for r in results) + win_rates = [r["metrics"].get("win_rate", 0) for r in results if "win_rate" in r["metrics"]] + profit_factors = [r["metrics"].get("profit_factor", 0) for r in results if "profit_factor" in r["metrics"]] + + summary["total_trades"] = total_trades + if win_rates: + summary["avg_win_rate"] = sum(win_rates) / len(win_rates) + if profit_factors: + summary["avg_profit_factor"] = sum(profit_factors) / len(profit_factors) + + completed = [r for r in results if r.get("test_info", {}).get("expert")] + if completed: + summary["best_test"] = max(completed, key=lambda x: x["metrics"].get("profit_factor", 0)) + summary["worst_test"] = min(completed, key=lambda x: x["metrics"].get("profit_factor", 0)) + + return summary + + def export_to_csv(self, results: List[Dict], output_path: str, sort_by: str = "profit_factor", reverse: bool = True): + if not results: + return + + fieldnames = [ + "expert", "symbol", "period", "company", "currency", "leverage", + "initial_deposit", "net_profit", "gross_profit", "gross_loss", + "profit_factor", "expected_payoff", "recovery_factor", "sharpe_ratio", + "ahpr", "ghpr", "lr_correlation", "lr_standard_error", + "max_drawdown", "max_equity_drawdown", "absolute_drawdown", "margin_level", + "total_trades", "total_deals", "short_trades", "long_trades", + "winning_trades", "losing_trades", "win_rate", + "max_profit_trade", "max_loss_trade", "avg_profit_trade", "avg_loss_trade", + "longest_win_streak", "longest_lose_streak", "avg_win_streak", "avg_lose_streak", + "min_hold_time", "max_hold_time", "avg_hold_time", + "quality", "bars", "quotes", "score", "on_tester" + ] + + rows = [] + for r in results: + info = r.get("test_info", {}) + metrics = r.get("metrics", {}) + row = { + "expert": info.get("expert", ""), + "symbol": info.get("symbol", ""), + "period": info.get("period", ""), + "company": info.get("company", ""), + "currency": info.get("currency", ""), + "leverage": info.get("leverage", ""), + "initial_deposit": metrics.get("initial_deposit", ""), + "net_profit": metrics.get("net_profit", ""), + "gross_profit": metrics.get("gross_profit", ""), + "gross_loss": metrics.get("gross_loss", ""), + "profit_factor": metrics.get("profit_factor", ""), + "expected_payoff": metrics.get("expected_payoff", ""), + "recovery_factor": metrics.get("recovery_factor", ""), + "sharpe_ratio": metrics.get("sharpe_ratio", ""), + "ahpr": metrics.get("ahpr", ""), + "ghpr": metrics.get("ghpr", ""), + "lr_correlation": metrics.get("lr_correlation", ""), + "lr_standard_error": metrics.get("lr_standard_error", ""), + "max_drawdown": metrics.get("max_drawdown", ""), + "max_equity_drawdown": metrics.get("max_equity_drawdown", ""), + "absolute_drawdown": metrics.get("absolute_drawdown", ""), + "margin_level": metrics.get("margin_level", ""), + "total_trades": metrics.get("total_trades", ""), + "total_deals": metrics.get("total_deals", ""), + "short_trades": metrics.get("short_trades", ""), + "long_trades": metrics.get("long_trades", ""), + "winning_trades": metrics.get("winning_trades", ""), + "losing_trades": metrics.get("losing_trades", ""), + "win_rate": metrics.get("win_rate", ""), + "max_profit_trade": metrics.get("max_profit_trade", ""), + "max_loss_trade": metrics.get("max_loss_trade", ""), + "avg_profit_trade": metrics.get("avg_profit_trade", ""), + "avg_loss_trade": metrics.get("avg_loss_trade", ""), + "longest_win_streak": metrics.get("longest_win_streak", ""), + "longest_lose_streak": metrics.get("longest_lose_streak", ""), + "avg_win_streak": metrics.get("avg_win_streak", ""), + "avg_lose_streak": metrics.get("avg_lose_streak", ""), + "min_hold_time": metrics.get("min_hold_time", ""), + "max_hold_time": metrics.get("max_hold_time", ""), + "avg_hold_time": metrics.get("avg_hold_time", ""), + "quality": metrics.get("quality", ""), + "bars": metrics.get("bars", ""), + "quotes": metrics.get("quotes", ""), + "score": metrics.get("score", ""), + "on_tester": metrics.get("on_tester", ""), + } + rows.append(row) + + rows.sort(key=lambda x: x.get(sort_by, ""), reverse=reverse) + + os.makedirs(os.path.dirname(output_path) if os.path.dirname(output_path) else '.', exist_ok=True) + with open(output_path, 'w', newline='', encoding='utf-8-sig') as f: + writer = csv.DictWriter(f, fieldnames=fieldnames) + writer.writeheader() + writer.writerows(rows) + + logger.info(f"CSV exported to: {output_path}") + + +def main(): + import argparse + parser = argparse.ArgumentParser(description="MT5 Report Parser") + parser.add_argument("--results-dir", "-r", default="reports", + help="Directory containing report files") + parser.add_argument("--output", "-o", default="reports/parsed_results.json", + help="Output file for parsed results") + parser.add_argument("--csv", "-c", default=None, + help="CSV output path (e.g. reports/results.csv)") + parser.add_argument("--sort", "-s", default="profit_factor", + choices=["expert", "symbol", "period", "net_profit", "gross_profit", + "profit_factor", "total_trades", "win_rate", "max_drawdown"], + help="Field to sort by") + parser.add_argument("--asc", action="store_true", + help="Sort in ascending order (default: descending)") + + args = parser.parse_args() + + parser = ResultParser(args.results_dir) + results = parser.parse_all_reports() + + if results: + summary = parser.get_summary(results) + + print("\n" + "="*60) + print("PARSED RESULTS SUMMARY") + print("="*60) + print(f"Total tests parsed: {summary['total_tests']}") + print(f"Total trades: {summary['total_trades']}") + print(f"Average win rate: {summary['avg_win_rate']:.2f}%") + print(f"Average profit factor: {summary['avg_profit_factor']:.2f}") + + if summary['best_test']: + print(f"\nBest test: {summary['best_test']['test_info'].get('expert', 'N/A')}") + print(f" Profit factor: {summary['best_test']['metrics'].get('profit_factor', 0):.2f}") + print(f" Win rate: {summary['best_test']['metrics'].get('win_rate', 0):.2f}%") + + os.makedirs(os.path.dirname(args.output) if os.path.dirname(args.output) else '.', exist_ok=True) + import json + with open(args.output, 'w', encoding='utf-8') as f: + json.dump({"results": results, "summary": summary}, f, indent=2, ensure_ascii=False) + print(f"\nResults saved to: {args.output}") + + if args.csv: + parser.export_to_csv(results, args.csv, sort_by=args.sort, reverse=not args.asc) + else: + print("No results to parse") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts/scan_set_prompt.py b/scripts/scan_set_prompt.py new file mode 100644 index 0000000..14496a9 --- /dev/null +++ b/scripts/scan_set_prompt.py @@ -0,0 +1,430 @@ +import os +import re +import argparse +import unicodedata +from dataclasses import dataclass, field +from typing import List, Dict, Optional +from pathlib import Path + + +def sanitize_path_name(name: str) -> str: + name = unicodedata.normalize('NFKD', name) + name = name.encode('ascii', 'ignore').decode('ascii') + name = re.sub(r'[^\w\-_.]', '_', name) + name = re.sub(r'_{2,}', '_', name) + return name.strip('_') + + +@dataclass +class SetParameter: + name: str + param_type: str + default: float + min_value: float + max_value: float + step: float + optimize: bool + + +@dataclass +class SetFileResult: + file_path: str + ea_name: str + parameters: Dict[str, SetParameter] = field(default_factory=dict) + optimize_count: int = 0 + fixed_count: int = 0 + + +MT5_NATIVE_PATTERN = re.compile(r'^(\w+)\s+<([^>]+)>\s+<([^>]+)>') +OUR_FORMAT_PATTERN = re.compile(r'^(\w+)=([^|]+)\|\|([^|]+)\|\|([^|]+)\|\|([^|]+)\|\|([YN])') + + +def detect_encoding(file_path: str) -> str: + with open(file_path, 'rb') as f: + raw = f.read(4) + if raw[:2] == b'\xff\xfe': + return 'utf-16-le' + elif raw[:2] == b'\xfe\xff': + return 'utf-16-be' + elif raw[:3] == b'\xef\xbb\xbf': + return 'utf-8-sig' + return 'utf-8' + + +def detect_set_format(line: str) -> str: + if '=' in line and '||' in line: + return 'our_format' + elif '<' in line and '>' in line: + return 'mt5_native' + elif line.strip().startswith(';'): + return 'comment' + elif line.strip() == '': + return 'empty' + return 'unknown' + + +def parse_set_line(line: str) -> Optional[SetParameter]: + line = line.strip() + if not line or line.startswith(';'): + return None + + fmt = detect_set_format(line) + if fmt == 'our_format': + m = OUR_FORMAT_PATTERN.match(line) + if m: + name, cur, start, step, stop, opt = m.groups() + + cur_lower = cur.lower() + if cur_lower in ('true', 'false'): + is_true = cur_lower == 'true' + return SetParameter( + name=name, + param_type='bool', + default=1.0 if is_true else 0.0, + min_value=0.0, + max_value=1.0, + step=1.0, + optimize=(opt.upper() == 'Y') + ) + + return SetParameter( + name=name, + param_type='double', + default=float(cur), + min_value=float(start), + max_value=float(stop), + step=float(step), + optimize=(opt.upper() == 'Y') + ) + elif fmt == 'mt5_native': + m = MT5_NATIVE_PATTERN.match(line) + if m: + name, val1, val2 = m.groups() + val1l = val1.lower().strip() + val2l = val2.lower().strip() + + if val1l in ('true', 'false') or val2l in ('true', 'false'): + is_true = val1l == 'true' or val2l == 'true' + return SetParameter( + name=name, + param_type='bool', + default=1.0 if is_true else 0.0, + min_value=0.0, + max_value=1.0, + step=1.0, + optimize=False + ) + + try: + v1 = float(val1) + v2 = float(val2) + return SetParameter( + name=name, + param_type='double', + default=v1, + min_value=min(v1, v2), + max_value=max(v1, v2), + step=abs(v2 - v1) if v1 != v2 else 0, + optimize=False + ) + except ValueError: + pass + return None + + +def parse_set_file(file_path: str) -> SetFileResult: + result = SetFileResult(file_path=file_path, ea_name='') + + path = Path(file_path) + result.ea_name = path.stem.replace('_optimization', '').replace('_params', '') + + enc = detect_encoding(file_path) + with open(file_path, 'r', encoding=enc) as f: + content = f.read() + + for line in content.split('\n'): + param = parse_set_line(line) + if param: + result.parameters[param.name] = param + + result.optimize_count = sum(1 for p in result.parameters.values() if p.optimize) + result.fixed_count = sum(1 for p in result.parameters.values() if not p.optimize) + + return result + + +def parse_set_content(content: str) -> SetFileResult: + result = SetFileResult(file_path='memory', ea_name='') + + for line in content.split('\n'): + param = parse_set_line(line) + if param: + result.parameters[param.name] = param + + result.optimize_count = sum(1 for p in result.parameters.values() if p.optimize) + result.fixed_count = sum(1 for p in result.parameters.values() if not p.optimize) + + return result + + +def scan_folder(folder_path: str) -> List[SetFileResult]: + results = [] + folder = Path(folder_path) + + if folder.is_file(): + return [parse_set_file(str(folder))] + + for set_file in folder.rglob('*.set'): + try: + result = parse_set_file(str(set_file)) + results.append(result) + except Exception as e: + print(f'Warning: Failed to parse {set_file}: {e}') + + return sorted(results, key=lambda x: x.ea_name) + + +def batch_scan(file_paths: List[str]) -> List[SetFileResult]: + results = [] + for path in file_paths: + if os.path.exists(path): + try: + result = parse_set_file(path) + results.append(result) + except Exception as e: + print(f'Warning: Failed to parse {path}: {e}') + return results + + +def generate_prompt(results: List[SetFileResult], output_dir: str = '.') -> List[str]: + output_files = [] + + for result in results: + lines = [] + lines.append('=' * 80) + lines.append(f'EA 参数优化分析请求 - {result.ea_name}') + lines.append('=' * 80) + lines.append('') + lines.append('## 基本信息') + lines.append(f'- EA名称: {result.ea_name}') + lines.append(f'- SET文件: {result.file_path}') + lines.append(f'- 参数总数: {len(result.parameters)} 个') + lines.append('') + + lines.append('## 参数详情表') + lines.append('') + lines.append('| 参数名 | 类型 | 当前值 | 最小值 | 最大值 | 步进 | 建议范围 |') + lines.append('|--------|------|--------|--------|--------|------|----------|') + + for name, param in sorted(result.parameters.items()): + suggest = f'{param.min_value}~{param.max_value}' + if param.param_type == 'int': + suggest = f'{int(param.min_value)}~{int(param.max_value)} (步进:{int(param.step)})' + elif param.param_type == 'double': + suggest = f'{param.min_value}~{param.max_value} (步进:{param.step})' + + lines.append(f'| {name} | {param.param_type} | {param.default} | {param.min_value} | {param.max_value} | {param.step} | {suggest} |') + + lines.append('') + lines.append('## 参数分析任务') + lines.append('') + lines.append('请分析以上所有参数,根据策略逻辑和交易逻辑判断:') + lines.append('') + lines.append('1. **哪些参数应该参与优化(optimize: true)**') + lines.append(' - 通常是影响策略核心逻辑、盈亏比、风险的关键参数') + lines.append(' - 例如:手数、止损止盈倍数、加仓间隔、风控阈值等') + lines.append('') + lines.append('2. **哪些参数应该保持固定(optimize: false)**') + lines.append(' - 通常是风控类、开关类、显示类参数') + lines.append(' - 例如:开关标识、魔数、面板位置等') + lines.append('') + lines.append('3. **推荐优化范围调整**') + lines.append(' - 检查当前范围是否合理') + lines.append(' - 给出你认为更合适的 min/max/step') + lines.append('') + lines.append('4. **重要参数优先级**') + lines.append(' - 哪些2-3个参数对策略影响最大,需要重点优化') + lines.append('') + lines.append('## 输出要求') + lines.append('') + lines.append('请输出符合以下格式的完整JSON配置文件:') + lines.append('') + lines.append('```json') + lines.append('{') + lines.append(f' "ea_name": "{result.ea_name}",') + safe_ea_name = sanitize_path_name(result.ea_name) + lines.append(f' "ea_path": "MY-EA\\\\{safe_ea_name}.ex5", // {result.ea_name}') + lines.append(' "description": "Edited via GUI",') + lines.append(' "search_strategy": "auto",') + lines.append(' "parameters": {') + param_list = list(result.parameters.items()) + for i, (name, param) in enumerate(param_list): + comma = ',' if i < len(param_list) - 1 else '' + lines.append(f' "{name}": {{') + lines.append(f' "type": "{param.param_type}",') + lines.append(f' "default": {param.default},') + lines.append(f' "min": {param.min_value},') + lines.append(f' "max": {param.max_value},') + lines.append(f' "step": {param.step},') + lines.append(f' "optimize": true // 请根据分析填写 true 或 false') + lines.append(f' }}{comma}') + lines.append(' },') + lines.append(' "test_config": {') + lines.append(' "symbol": "XAUUSD", // 请填写交易品种') + lines.append(' "period": "M1", // 请填写周期: M1/M5/M15/H1/H4/D1') + lines.append(' "from_date": "2026.01.01", // 请填写开始日期') + lines.append(' "to_date": "2026.01.04", // 请填写结束日期') + lines.append(' "model": 0, // 建模方式: 0=Every Tick, 1=1分钟OHLC, 2=仅开盘价, 3=数学计算, 4=真实Tick') + lines.append(' "execution_delay": 0, // 执行延迟: 0=无延迟, -1=随机延迟, 正数=固定延迟毫秒') + lines.append(' "optimization_mode": 2, // 优化模式: 0=禁用, 1=慢速完整算法, 2=快速遗传算法, 3=MarketWatch所有符号') + lines.append(' "optimization_criterion": 1, // 优化指标: 0=余额最大, 1=盈利因子最大, 2=期望收益, 3=回撤最小, 4=恢复因子, 5=夏普比率, 6=自定义, 7=复合指标') + lines.append(' "deposit": 10000, // 初始保证金') + lines.append(' "leverage": "1:100" // 杠杆') + lines.append(' },') + lines.append(' "walk_forward": {') + lines.append(' "enabled": true, // 是否启用前向测试') + lines.append(' "forward_mode": 2 // 前向模式: 0=禁用, 1=OOS 50%, 2=OOS 33%, 3=OOS 25%') + lines.append(' }') + lines.append('}') + lines.append('```') + lines.append('') + lines.append('注意:') + lines.append(f'- EA原始名称: {result.ea_name}') + lines.append(f'- ea_path 使用ASCII安全名称: {safe_ea_name}') + lines.append('- 实际EA文件应放在 MY-EA 目录下,文件名需与 ea_path 中的名称一致') + lines.append('- 每个参数的 "optimize" 字段需要你根据策略分析来填写') + lines.append('- optimize: true = 参与优化, optimize: false = 保持固定') + lines.append('- test_config 和 walk_forward 部分请根据回测需求填写或调整') + lines.append('- ea_path 路径使用双反斜杠 `\\\\`') + lines.append('') + lines.append('=' * 80) + + output_path = os.path.join(output_dir, f'{result.ea_name}_optimization_prompt.txt') + with open(output_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + + output_files.append(output_path) + print(f'Generated: {output_path}') + + return output_files + + +def interactive_scan(): + print('请选择扫描模式:') + print('1. 扫描单个 SET 文件') + print('2. 扫描文件夹下所有 SET 文件') + print('3. 批量扫描多个 SET 文件') + print('4. 从剪贴板读取 SET 内容') + print('0. 退出') + print('') + + choice = input('请输入选项 (0-4): ').strip() + + if choice == '1': + path = input('请输入 SET 文件路径: ').strip() + if os.path.exists(path): + results = [parse_set_file(path)] + output_dir = os.path.dirname(path) or '.' + generate_prompt(results, output_dir) + else: + print('文件不存在') + + elif choice == '2': + path = input('请输入文件夹路径: ').strip() + if os.path.exists(path): + results = scan_folder(path) + generate_prompt(results, path) + else: + print('文件夹不存在') + + elif choice == '3': + print('请输入 SET 文件路径(每行一个,输入空行结束):') + paths = [] + while True: + line = input().strip() + if not line: + break + if os.path.exists(line): + paths.append(line) + else: + print(f'文件不存在: {line}') + if paths: + results = batch_scan(paths) + generate_prompt(results, os.path.dirname(paths[0]) if len(paths) == 1 else '.') + + elif choice == '4': + print('请粘贴 SET 文件内容(输入空行结束):') + lines = [] + while True: + line = input() + if not line.strip(): + break + lines.append(line) + if lines: + content = '\n'.join(lines) + result = parse_set_content(content) + result.ea_name = input('请输入 EA 名称: ').strip() or 'EA' + generate_prompt([result], '.') + + +def main(): + parser = argparse.ArgumentParser( + description='SET 文件扫描工具 - 生成 AI 优化提示词', + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=''' +示例: + python scan_set_prompt.py --file C:\\path\\to\\EA.set + python scan_set_prompt.py --folder C:\\path\\to\\set_files + python scan_set_prompt.py --batch a.set b.set c.set + python scan_set_prompt.py --interactive + ''' + ) + + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('--file', '-f', metavar='PATH', help='扫描单个 SET 文件') + group.add_argument('--folder', '-d', metavar='PATH', help='扫描文件夹下所有 SET 文件') + group.add_argument('--batch', '-b', nargs='+', metavar='PATH', help='批量扫描多个 SET 文件') + group.add_argument('--interactive', '-i', action='store_true', help='交互式扫描') + + parser.add_argument('--output', '-o', metavar='DIR', default='.', help='输出目录 (默认当前目录)') + + args = parser.parse_args() + + if args.interactive: + interactive_scan() + return + + results = [] + + if args.file: + if not os.path.exists(args.file): + print(f'Error: 文件不存在 {args.file}') + return + results = [parse_set_file(args.file)] + output_dir = os.path.dirname(args.file) or args.output + + elif args.folder: + if not os.path.exists(args.folder): + print(f'Error: 文件夹不存在 {args.folder}') + return + results = scan_folder(args.folder) + output_dir = args.folder + + elif args.batch: + existing = [p for p in args.batch if os.path.exists(p)] + if not existing: + print('Error: 所有文件都不存在') + return + results = batch_scan(existing) + output_dir = args.output + + if not results: + print('Warning: 没有找到任何 SET 文件') + return + + output_files = generate_prompt(results, output_dir) + print(f'\n完成!共生成 {len(output_files)} 个提示词文件') + + +if __name__ == '__main__': + main() diff --git a/tools/trade_analyzer/__init__.py b/tools/trade_analyzer/__init__.py new file mode 100644 index 0000000..864eb13 --- /dev/null +++ b/tools/trade_analyzer/__init__.py @@ -0,0 +1 @@ +# Trade Analyzer Module diff --git a/tools/trade_analyzer/parser.py b/tools/trade_analyzer/parser.py new file mode 100644 index 0000000..fd29f74 --- /dev/null +++ b/tools/trade_analyzer/parser.py @@ -0,0 +1,271 @@ +import csv +import json +import re +from datetime import datetime +from typing import Dict, List, Any, Optional +from collections import defaultdict +import statistics + +class TradeParser: + \"\"\"\"Parse MT5 trade history CSV and convert to structured data\"\"\" + + COLUMN_MAPPING = { + 'Ticket': 'ticket', + 'Symbol': 'symbol', + 'Type': 'type', + 'Open time': 'open_time', + 'Open price': 'open_price', + 'Size': 'size', + 'Close time': 'close_time', + 'Close price': 'close_price', + 'Time in trade': 'duration', + 'Profit/Loss': 'profit_loss', + 'Cummulative P/L': 'cumulative_pl', + 'Comm/Swap': 'comm_swap', + 'P/L in money': 'pl_money', + 'Cummulative money P/L': 'cumulative_money', + 'P/L in pips': 'pl_pips', + 'Cummulative pips P/L': 'cumulative_pips', + 'P/L in %': 'pl_percent', + 'Cummulative % P/L': 'cumulative_percent', + 'Comment': 'comment', + 'Sample type': 'sample_type' + } + + def __init__(self, csv_path: str): + self.csv_path = csv_path + self.trades = [] + self.stats = {} + + def parse_duration(self, duration_str: str) -> int: + \"\"\"\"Convert duration string to seconds\"\"\" + if not duration_str: + return 0 + total_seconds = 0 + # Parse patterns like \"2d 3h 18m\", \"5h 59m\", \"1m 0s\", etc. + days_match = re.search(r'(\d+)d', duration_str) + hours_match = re.search(r'(\d+)h', duration_str) + mins_match = re.search(r'(\d+)m', duration_str) + secs_match = re.search(r'(\d+)s', duration_str) + + if days_match: + total_seconds += int(days_match.group(1)) * 86400 + if hours_match: + total_seconds += int(hours_match.group(1)) * 3600 + if mins_match: + total_seconds += int(mins_match.group(1)) * 60 + if secs_match: + total_seconds += int(secs_match.group(1)) + + return total_seconds + + def parse_date(self, date_str: str) -> datetime: + \"\"\"\"Parse date string to datetime object\"\"\" + formats = ['%d.%m.%Y %H:%M:%S', '%Y.%m.%d %H:%M:%S', '%m/%d/%Y %H:%M:%S'] + for fmt in formats: + try: + return datetime.strptime(date_str.strip(), fmt) + except ValueError: + continue + return datetime.now() + + def parse_csv(self) -> List[Dict]: + \"\"\"Parse the CSV file and return list of trade dictionaries\"\"\" + trades = [] + + with open(self.csv_path, 'r', encoding='utf-8') as f: + reader = csv.DictReader(f) + for row in reader: + trade = {} + for col, key in self.COLUMN_MAPPING.items(): + value = row.get(col, '') + if col in ['Open time', 'Close time']: + trade[key] = self.parse_date(value).isoformat() + elif col in ['Open price', 'Close price', 'Size', 'Profit/Loss', + 'Cummulative P/L', 'Comm/Swap', 'P/L in money', + 'Cummulative money P/L', 'P/L in pips', 'Cummulative pips P/L', + 'P/L in %', 'Cummulative % P/L']: + try: + trade[key] = float(value) if value else 0.0 + except ValueError: + trade[key] = 0.0 + elif col == 'Time in trade': + trade['duration_seconds'] = self.parse_duration(value) + trade['duration_str'] = value + else: + trade[key] = value + trades.append(trade) + + self.trades = trades + return trades + + def get_statistics(self) -> Dict[str, Any]: + \"\"\"Calculate comprehensive trading statistics\"\"\" + if not self.trades: + self.parse_csv() + + trades = self.trades + + # Basic counts + total_trades = len(trades) + buy_trades = [t for t in trades if t['type'] == 'Buy'] + sell_trades = [t for t in trades if t['type'] == 'Sell'] + + # Profit/Loss analysis + profits = [t['profit_loss'] for t in trades if t['profit_loss'] > 0] + losses = [t['profit_loss'] for t in trades if t['profit_loss'] < 0] + + winning_trades = [t for t in trades if t['profit_loss'] > 0] + losing_trades = [t for t in trades if t['profit_loss'] < 0] + + gross_profit = sum(profits) if profits else 0 + gross_loss = abs(sum(losses)) if losses else 0 + net_profit = sum(t['profit_loss'] for t in trades) + + # Win rate + win_rate = len(winning_trades) / total_trades * 100 if total_trades > 0 else 0 + + # Profit Factor + profit_factor = gross_profit / gross_loss if gross_loss > 0 else float('inf') + + # Duration analysis + durations = [t['duration_seconds'] for t in trades] + avg_duration = statistics.mean(durations) if durations else 0 + + # Pips analysis + pl_pips = [t['pl_pips'] for t in trades] + total_pips = sum(pl_pips) + + # Time-based analysis + open_times = [self.parse_date(t['open_time']) for t in trades] + + # Group by hour of day + hourly_stats = defaultdict(lambda: {'trades': 0, 'profit': 0, 'wins': 0, 'losses': 0}) + for t in trades: + dt = self.parse_date(t['open_time']) + hour = dt.hour + hourly_stats[hour]['trades'] += 1 + hourly_stats[hour]['profit'] += t['profit_loss'] + if t['profit_loss'] > 0: + hourly_stats[hour]['wins'] += 1 + else: + hourly_stats[hour]['losses'] += 1 + + # Group by day of week + daily_stats = defaultdict(lambda: {'trades': 0, 'profit': 0, 'wins': 0, 'losses': 0}) + day_names = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] + for t in trades: + dt = self.parse_date(t['open_time']) + day = day_names[dt.weekday()] + daily_stats[day]['trades'] += 1 + daily_stats[day]['profit'] += t['profit_loss'] + if t['profit_loss'] > 0: + daily_stats[day]['wins'] += 1 + else: + daily_stats[day]['losses'] += 1 + + # Consecutive win/loss streaks + sorted_trades = sorted(trades, key=lambda x: x['open_time']) + current_streak = 0 + current_streak_type = None # 'win' or 'loss' + max_win_streak = 0 + max_loss_streak = 0 + win_streaks = [] + loss_streaks = [] + + for t in sorted_trades: + if t['profit_loss'] > 0: + if current_streak_type == 'win': + current_streak += 1 + else: + if current_streak > 0 and current_streak_type == 'loss': + loss_streaks.append(current_streak) + current_streak = 1 + current_streak_type = 'win' + else: + if current_streak_type == 'loss': + current_streak += 1 + else: + if current_streak > 0 and current_streak_type == 'win': + win_streaks.append(current_streak) + current_streak = 1 + current_streak_type = 'loss' + + if current_streak > 0: + if current_streak_type == 'win': + win_streaks.append(current_streak) + else: + loss_streaks.append(current_streak) + + max_win_streak = max(win_streaks) if win_streaks else 0 + max_loss_streak = max(loss_streaks) if loss_streaks else 0 + + # Drawdown analysis + cumulative = [t['cumulative_money'] for t in trades] + peak = cumulative[0] if cumulative else 0 + max_drawdown = 0 + max_drawdown_percent = 0 + + for val in cumulative: + if val > peak: + peak = val + drawdown = peak - val + if drawdown > max_drawdown: + max_drawdown = drawdown + if peak > 0: + dd_percent = (drawdown / peak) * 100 + if dd_percent > max_drawdown_percent: + max_drawdown_percent = dd_percent + + self.stats = { + 'total_trades': total_trades, + 'buy_trades': len(buy_trades), + 'sell_trades': len(sell_trades), + 'winning_trades': len(winning_trades), + 'losing_trades': len(losing_trades), + 'win_rate': round(win_rate, 2), + 'gross_profit': round(gross_profit, 2), + 'gross_loss': round(gross_loss, 2), + 'net_profit': round(net_profit, 2), + 'profit_factor': round(profit_factor, 2) if profit_factor != float('inf') else 'INF', + 'avg_profit': round(statistics.mean(profits), 2) if profits else 0, + 'avg_loss': round(statistics.mean(losses), 2) if losses else 0, + 'best_trade': round(max(profits), 2) if profits else 0, + 'worst_trade': round(min(losses), 2) if losses else 0, + 'avg_duration_seconds': round(avg_duration, 0), + 'total_pips': round(total_pips, 2), + 'avg_pips': round(statistics.mean(pl_pips), 2) if pl_pips else 0, + 'max_win_streak': max_win_streak, + 'max_loss_streak': max_loss_streak, + 'max_drawdown': round(max_drawdown, 2), + 'max_drawdown_percent': round(max_drawdown_percent, 2), + 'hourly_stats': dict(hourly_stats), + 'daily_stats': dict(daily_stats), + } + + return self.stats + + def to_json(self, output_path: Optional[str] = None) -> str: + \"\"\"\"Export to JSON format for AI consumption\"\"\" + if not self.trades: + self.parse_csv() + if not self.stats: + self.get_statistics() + + output = { + 'metadata': { + 'source_file': self.csv_path, + 'generated_at': datetime.now().isoformat(), + 'total_trades': len(self.trades) + }, + 'statistics': self.stats, + 'trades': self.trades + } + + json_str = json.dumps(output, indent=2, ensure_ascii=False) + + if output_path: + with open(output_path, 'w', encoding='utf-8') as f: + f.write(json_str) + + return json_str diff --git a/优化方案.md b/优化方案.md new file mode 100644 index 0000000..6416013 --- /dev/null +++ b/优化方案.md @@ -0,0 +1,890 @@ +# MT5 EA 参数批量优化系统 — 最终项目计划 + +--- + +## 一、项目概述 + +### 1.1 项目目标 + +构建一套 **Python + MT5 策略测试器** 的 EA 参数批量优化系统,支持: + +- **多 EA 管理**:不同 EA 有完全不同的参数配置,互不影响 +- **智能搜索**:根据参数数量和组合数自动选择最优搜索策略 +- **约束过滤**:处理参数间的互斥、依赖、条件关系 +- **批量执行**:通过 PowerShell 脚本批量驱动 MT5 执行测试 +- **结果汇总**:自动解析 HTML/XML 报告,输出最优参数推荐 +- **过拟合防护**:Walk-Forward 验证 + 统计显著性检验 + +### 1.2 核心挑战与解决方案 + +``` +┌─────────────────────────────────────────┬─────────────────────────────────────────┐ +│ 挑战 │ 解决方案 │ +├─────────────────────────────────────────┼─────────────────────────────────────────┤ +│ 不同 EA 参数完全不同 │ JSON 配置文件,每个 EA 独立一套参数定义 │ +│ 参数多 + 范围大 = 组合爆炸 │ 自动策略选择:Grid→拉丁超立方→遗传算法 │ +│ 参数间存在互斥/依赖关系 │ ParameterConstraintEngine 约束引擎 │ +│ 暴力遍历不现实 │ 遗传算法 (GA) 智能搜索 │ +│ 不同 EA 需要不同测试配置 │ per-EA INI 模板 + test_config 字段 │ +│ MT5 终端必须等待测试完成才能启动下一个 │ PowerShell Start-Process -Wait 机制 │ +│ 优化结果过拟合严重 │ Walk-Forward 验证 + 样本外测试 │ +│ 测试结果格式不统一 │ 统一 HTML/XML 解析器 │ +│ 参数映射与测试结果需要关联 │ SET 文件 ID 追踪机制 │ +└─────────────────────────────────────────┴─────────────────────────────────────────┘ +``` + +--- + +## 二、系统架构 + +### 2.1 整体架构图 + +``` +┌─────────────────────────────────────────────────────────────────────────────────────┐ +│ EA 批量优化管理系统 │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────────────────┐ │ +│ │ 配置管理层 (configs/) │ │ +│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ +│ │ │ MA_Cross.json│ │ RSI_EA.json │ │ Grid_EA.json │ │ Breakout.json│ ... │ │ +│ │ │ 6个参数 │ │ 12个参数 │ │ 25个参数 │ │ 8个参数 │ │ │ +│ │ │ Grid搜索 │ │ 遗传算法 │ │ 遗传+降维 │ │ 拉丁超立方 │ │ │ +│ │ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │ │ +│ └─────────────────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌─────────────────────────────────────────────────────────────────────────────┐ │ +│ │ 核心引擎层 (ea_batch_optimizer.py) │ │ +│ │ │ │ +│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ +│ │ │ 配置加载器 │ │ 约束引擎 │ │ 搜索策略 │ │ 任务调度器 │ │ │ +│ │ │ │ │ │ │ │ │ │ │ │ +│ │ │ 解析JSON │ │ 互斥关系 │ │ Grid │ │ 批量排队 │ │ │ +│ │ │ 验证参数 │ │ 依赖条件 │ │ Random │ │ 进程管理 │ │ │ +│ │ │ 补全默认值 │ │ 条件过滤 │ │ LatinHypercube│ │ 超时控制 │ │ │ +│ │ │ │ │ │ │ Genetic │ │ │ │ │ +│ │ │ │ │ │ │ (自适应) │ │ │ │ │ +│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ +│ └─────────────────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ ┌─────────────────────┼─────────────────────┐ │ +│ ▼ ▼ ▼ │ +│ ┌────────────────────────┐ ┌────────────────────────┐ ┌────────────────────┐ │ +│ │ SET 文件生成 │ │ INI 配置生成 │ │ PowerShell 脚本 │ │ +│ │ │ │ │ │ │ │ +│ │ params_00001.set │ │ EA_Name.ini │ │ run_EAName.ps1 │ │ +│ │ params_00002.set │ │ (per-EA) │ │ (per-EA) │ │ +│ │ ... │ │ │ │ │ │ +│ │ params_10000.set │ │ Expert=... │ │ Start-Process │ │ +│ │ │ │ Symbol=... │ │ -Wait │ │ +│ │ → set_files/ │ │ Period=... │ │ → MT5 Terminal │ │ +│ └────────────────────────┘ └────────────────────────┘ └────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌─────────────────────────────────────────────────────────────────────────────┐ │ +│ │ MT5 策略测试器批量执行 │ │ +│ │ │ │ +│ │ terminal64.exe ──▶ 测试1 ──▶ 报告1 ─┐ │ │ +│ │ terminal64.exe ──▶ 测试2 ──▶ 报告2 ─┼──▶ reports/ │ │ +│ │ terminal64.exe ──▶ 测试3 ──▶ 报告3 ─┤ │ │ +│ │ ... │ │ │ +│ │ terminal64.exe ──▶ 测试N ──▶ 报告N ─┘ │ │ +│ └─────────────────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌─────────────────────────────────────────────────────────────────────────────┐ │ +│ │ 结果分析层 │ │ +│ │ │ │ +│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ +│ │ │ HTML解析器 │ │ XML解析器 │ │ 结果合并器 │ │ 最优推荐器 │ │ │ +│ │ │ │ │ │ │ │ │ │ │ │ +│ │ │ BeautifulSoup│ │ xml.etree │ │ param+result│ │ 多维度排序 │ │ │ +│ │ │ 提取统计指标│ │ 解析标准格式│ │ 按set_id关联│ │ 过滤条件 │ │ │ +│ │ │ │ │ │ │ │ │ Walk-Forward│ │ │ +│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ +│ └─────────────────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌─────────────────────────────────────────────────────────────────────────────┐ │ +│ │ 输出层 │ │ +│ │ │ │ +│ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────────────┐ │ │ +│ │ │ full_results.csv │ │ optimization_report.txt│ │ best_params.json │ │ │ +│ │ │ (完整测试记录) │ │ (分析报告) │ │ (最优参数) │ │ │ +│ │ └──────────────────┘ └──────────────────┘ └──────────────────────────┘ │ │ +│ │ │ │ +│ └─────────────────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────────────┘ +``` + +### 2.2 目录结构 + +``` +MT5Optimizer/ +│ +├── ea_batch_optimizer.py # ★ 主程序:多EA统一管理器 +├── ea_config_parser.py # ★ 配置解析:EAConfig + ParameterDef +├── parameter_constraint.py # ★ 约束引擎:互斥/依赖/条件过滤 +├── smart_search.py # ★ 搜索策略:Grid/Random/Latin/GA +├── analyze_results.py # ★ 结果解析:HTML/XML → DataFrame +│ +├── configs/ # ★ EA 配置文件目录 +│ ├── MA_Cross.json # EA1: 双MA交叉 (6参数, Grid) +│ ├── RSI_EA.json # EA2: RSI策略 (12参数, 遗传算法) +│ ├── Grid_EA.json # EA3: 网格EA (25参数, 遗传+降维) +│ └── Breakout.json # EA4: 突破EA (8参数, 拉丁超立方) +│ +├── set_files/ # 生成的 .set 参数文件 +│ ├── MA_Cross/ # params_00001.set ~ params_NNNNN.set +│ ├── RSI_EA/ +│ ├── Grid_EA/ +│ └── Breakout/ +│ +├── reports/ # MT5 输出的测试报告 +│ ├── MA_Cross/ # *.html +│ ├── RSI_EA/ +│ ├── Grid_EA/ +│ └── Breakout/ +│ +├── results/ # 分析结果输出 +│ ├── MA_Cross_param_mapping.csv +│ ├── MA_Cross_optimization_results.csv +│ ├── MA_Cross_optimization_report.txt +│ ├── all_ea_optimization_results.csv # ★ 全EA汇总 +│ ├── all_ea_optimization_report.txt # ★ 全EA分析报告 +│ └── best_params.json +│ +├── scripts/ # PowerShell 执行脚本 (自动生成) +│ ├── run_MA_Cross.ps1 +│ ├── run_RSI_EA.ps1 +│ ├── run_Grid_EA.ps1 +│ └── run_Breakout.ps1 +│ +├── logs/ # 运行日志 +│ └── batch_log.txt +│ +└── README.md +``` + +--- + +## 三、模块规格 + +### 3.1 EA 配置模型 (ea_config_parser.py) + +每个 EA 对应一个 JSON 配置文件,字段说明: + +```json +{ + "ea_name": "MA Cross Scalper", + "ea_path": "Experts\\MA_Cross_Scalper.ex5", + "description": "双MA交叉头皮策略", + + "parameters": { + "FastMA_Period": { + "type": "int", // int | double | bool | enum | string + "default": 14, + "min": 3, + "max": 100, + "step": 1, + "description": "快速MA周期", + "condition": "SlowMA_Period>FastMA_Period" // 可选:参数约束 + }, + "RiskPercent": { + "type": "double", + "default": 1.0, + "min": 0.1, + "max": 5.0, + "step": 0.1, + "precision": 1 + } + }, + + "search_strategy": "auto", + // "auto" - 根据组合数自动选择 + // "grid" - 网格搜索 (<1万组合) + // "latin" - 拉丁超立方 (<50万组合) + // "genetic" - 遗传算法 (>10万组合) + + "optimization_criterion": "custom", + // "balance_max" | "profit_factor" | "custom" | "sharpe_ratio" ... + + "test_config": { + "symbol": "EURUSD", + "period": "H1", + "from_date": "2023.01.01", + "to_date": "2024.01.01", + "model": 1, // 1=1分钟OHLC, 4=真实tick + "deposit": 10000, + "leverage": "1:100" + }, + + "walk_forward": { + "enabled": true, + "train_test_ratio": 0.75 // 前75%训练,后25%验证 + } +} +``` + +**ParameterDef 数据类**: + +``` +参数名 ──▶ ParamType ──▶ expand_values() ──▶ 值列表 + │ + ├── INT (int) + ├── DOUBLE (float) + ├── BOOL (true/false) + ├── ENUM (枚举选项列表) + └── STRING (字符串) + +EAConfig { + ea_name: str + ea_path: str + parameters: Dict[str, ParameterDef] + search_strategy: str + criterion: str + test_config: Dict + walk_forward: Dict + + get_total_combinations() → int + estimate_search_time() → str + is_complex() → bool (>6参数 或 >100万组合) +} +``` + +### 3.2 约束引擎 (parameter_constraint.py) + +``` +输入: List[Dict] 参数组合 + │ + ▼ +┌────────────────────────────────────────┐ +│ ParameterConstraintEngine │ +│ │ +│ ┌──────────────┐ ┌──────────────┐ │ +│ │ 互斥约束 │ │ 依赖条件 │ │ +│ │ A↑B↓ │ │ C==true时 │ │ +│ │ │ │ D才生效 │ │ +│ ├──────────────┤ ├──────────────┤ │ +│ │ 范围约束 │ │ 逻辑约束 │ │ +│ │ RSI: 0-100 │ │ SL0 │ │ MA_fast 500,000 → Genetic Algorithm (智能搜索) + +┌──────────────────┐ +│ Grid Search │ 遍历所有组合 → 全局最优 +│ Random Search │ 随机采样 → 快速 +│ Latin Hypercube │ 分层均匀 → 效率高 +│ Genetic Algorithm │ 选择+交叉+变异 → 参数爆炸克星 +└──────────────────┘ + +遗传算法核心参数: + - 种群大小: 50 + - 进化代数: 30 + - 交叉率: 0.8 + - 变异率: 0.15 + - 精英保留: 5 +``` + +### 3.4 结果解析 (analyze_results.py) + +``` +MT5 HTML 报告 ──▶ BeautifulSoup ──▶ 正则提取 ──▶ 统计指标 + │ + ├── Net Profit + ├── Gross Profit + ├── Gross Loss + ├── Max Drawdown + ├── Profit Factor + ├── Sharpe Ratio + ├── Total Trades + ├── Win Rate + └── Custom Criterion (OnTester) + +输出: + DataFrame { + set_id, ea_name, + params (各参数名), + total_profit, profit_factor, max_drawdown, + total_trades, sharpe_ratio, win_rate, + custom_criterion, html_report + } +``` + +--- + +## 四、PowerShell 执行流程 + +``` +┌─────────────────────────────────────────────────────────────────────────────────┐ +│ PowerShell 批量执行流程 │ +│ │ +│ ┌─────────────┐ │ +│ │ run_tests.ps1│ ← ea_batch_optimizer.py 自动生成 │ +│ └──────┬──────┘ │ +│ │ │ +│ ├─▶ 读取 set_files/ 目录下的所有 params_*.set │ +│ │ │ +│ ├─▶ 循环读取 INI 配置模板 │ +│ │ │ +│ ├─▶ 修改 ExpertParameters= 指向当前 SET 文件 │ +│ │ 修改 Report= 唯一报告名 │ +│ │ │ +│ ├─▶ 启动 MT5 │ +│ │ Start-Process │ +│ │ -FilePath terminal64.exe │ +│ │ -ArgumentList "/portable /config:INI路径" │ +│ │ -Wait ← 关键: 等待当前测试完成再启动下一个 │ +│ │ -WindowStyle Normal │ +│ │ │ +│ ├─▶ MT5 执行回测 → 输出 HTML 报告到 reports/ │ +│ │ │ +│ ├─▶ MT5 关闭 (ShutdownTerminal=1) │ +│ │ │ +│ ├─▶ 等待 3 秒确保完全释放 │ +│ │ │ +│ └─▶ 下一轮循环 ──────────────────────────────────────────────────────▶ │ +│ │ +│ 关键机制: │ +│ 1. Start-Process -Wait 确保顺序执行, 不丢任务 │ +│ 2. 每次循环动态修改 INI, 不需要多个 INI 文件 │ +│ 3. 唯一报告名 (含时间戳/set_id) 避免覆盖 │ +│ 4. 日志记录每个任务的开始/结束/耗时 │ +│ 5. 进度报告:每10个输出进度 + ETA │ +└─────────────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 五、实施计划 + +### 5.1 分阶段实施 + +``` +┌─────────────────────────────────────────────────────────────────────────────────────┐ +│ 项目实施计划 (共5个阶段) │ +│ │ +│ Phase 1 ────────────────────────────────────────────────────────────────────────▶ │ +│ 【基础框架搭建】 预计 1 天 │ +│ │ +│ □ 创建目录结构 │ +│ □ 实现 ea_config_parser.py │ +│ - ParameterDef 数据类 │ +│ - EAConfig 数据类 │ +│ - parse_set_file() 解析现有SET │ +│ - load_ea_config() 加载JSON配置 │ +│ - load_all_ea_configs() 批量加载 │ +│ □ 实现 parameter_constraint.py │ +│ - ConstraintEngine 类 │ +│ - add_constraint() 添加约束 │ +│ - filter_valid_combinations() 过滤 │ +│ □ 测试: 加载一个示例 EA 配置文件 │ +│ │ +│ Phase 2 ────────────────────────────────────────────────────────────────────────▶ │ +│ 【搜索策略模块】 预计 1 天 │ +│ │ +│ □ 实现 smart_search.py │ +│ - generate_param_combinations() 自适应策略选择 │ +│ - _grid_search() 网格搜索 │ +│ - _random_search() 随机搜索 │ +│ - _latin_hypercube() 拉丁超立方采样 │ +│ - GeneticOptimizer 遗传算法类 │ +│ □ 实现 ea_batch_optimizer.py 核心类 │ +│ - EABatchOptimizer.__init__() │ +│ - generate_set_files_for_ea() │ +│ - generate_ini_for_ea() │ +│ - build_powershell_script() │ +│ □ 测试: 为一个EA生成1000个SET文件 │ +│ │ +│ Phase 3 ────────────────────────────────────────────────────────────────────────▶ │ +│ 【执行层 + 结果解析】 预计 2 天 │ +│ │ +│ □ 实现 analyze_results.py │ +│ - parse_mt5_html_report() │ +│ - parse_mt5_xml_report() │ +│ - parse_all_reports() 批量解析 │ +│ - merge_parameters_and_results() 合并 │ +│ - find_optimal_params() 最优筛选 │ +│ - generate_report() 报告生成 │ +│ □ PowerShell 脚本生成器 │ +│ □ 端到端测试: 单EA + 50个参数组合全流程 │ +│ □ 测试报告正确性验证 │ +│ │ +│ Phase 4 ────────────────────────────────────────────────────────────────────────▶ │ +│ 【多EA管理 + 过拟合防护】 预计 2 天 │ +│ │ +│ □ 多EA并行优化 │ +│ - parallel_optimize() 多进程 │ +│ - 任务队列管理 │ +│ □ Walk-Forward 验证 │ +│ - walk_forward_validate() │ +│ - 过拟合检测指标 │ +│ □ 高级约束: 参数降维、相邻参数相关性分析 │ +│ □ 全EA汇总分析 │ +│ - cross_ea_ranking() 跨EA横向比较 │ +│ - 综合最优推荐 │ +│ □ 异常处理: MT5崩溃、超时、报告缺失 │ +│ │ +│ Phase 5 ────────────────────────────────────────────────────────────────────────▶ │ +│ 【优化与交付】 预计 1 天 │ +│ │ +│ □ 命令行参数完善 (--ea, --phase, --parallel, --strategy) │ +│ □ 日志系统完善 │ +│ □ 配置示例: 为4个不同复杂度的EA创建配置示例 │ +│ □ 文档: README + 使用手册 │ +│ □ 一键启动脚本 │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────────────────┐ │ +│ │ 总工期: 7 个工作日 │ │ +│ │ Phase1(1d) + Phase2(1d) + Phase3(2d) + Phase4(2d) + Phase5(1d) │ │ +│ └─────────────────────────────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────────────────────────────┘ +``` + +### 5.2 任务清单 (Phase 1 详细) + +``` +Phase 1: 基础框架搭建 +────────────────────────────────────────────────────── + +[P1-01] 创建目录结构 + 创建以下目录: + configs/, set_files/, reports/, results/, scripts/, logs/ + +[P1-02] 实现 ParameterDef 数据类 + ea_config_parser.py + 字段: name, param_type, default, min_value, max_value, + step, enum_options, description, precision + 方法: expand_values() → List[Any] + 判断类型: INT/DOUBLE/BOOL/ENUM/STRING + +[P1-03] 实现 EAConfig 数据类 + ea_config_parser.py + 字段: ea_name, ea_path, parameters (Dict[str, ParameterDef]), + search_strategy, criterion, test_config, description + 方法: get_total_combinations() → int + estimate_search_time() → str + is_complex() → bool + __repr__() + +[P1-04] 实现 parse_set_file() + 解析 MT5 .set 文件 + 格式: VarName [comment] + 返回: List[ParameterDef] + +[P1-05] 实现 load_ea_config() + 读取 JSON 配置文件 + 转换为 ParameterDef + EAConfig 对象 + 补全默认值 + +[P1-06] 实现 load_all_ea_configs() + 遍历 configs/ 目录下所有 .json + 加载并验证每个 EA 配置 + +[P1-07] 创建示例 EA 配置文件 + configs/MA_Cross.json (6参数, 简单EA) + configs/RSI_EA.json (12参数, 中等EA) + +[P1-08] 实现 ParameterConstraintEngine + parameter_constraint.py + add_constraint(name, condition, error_message) + add_condition_from_config(param_name, condition_str) + filter_valid_combinations(List[Dict]) → List[Dict] + +[P1-09] 测试 Phase 1 + 验证: 加载配置 → 展开参数 → 过滤约束 → 输出统计 + 输出: 参数数量、组合数、估算时间 + +Phase 2: 搜索策略模块 +────────────────────────────────────────────────────── + +[P2-01] 实现 generate_param_combinations() + smart_search.py + 根据 total_combos 自动选择策略 + 参数: ea_config, strategy="auto", max_samples=2000 + 返回: List[Dict] 参数组合 + +[P2-02] 实现 _grid_search() + 遍历所有组合 (适合 <1万组合) + +[P2-03] 实现 _random_search() + 随机采样 (适合快速探索) + +[P2-04] 实现 _latin_hypercube() + 拉丁超立方采样 (适合 1万~50万组合) + +[P2-05] 实现 GeneticOptimizer 类 + _create_individual() + _mutate() + _crossover() + _tournament_select() + run() → List[GAIndividual] + +[P2-06] 实现 EABatchOptimizer.__init__ + generate_set_files_for_ea() + 核心类初始化 + 生成 SET 文件到 set_files/{EA_NAME}/ + +[P2-07] 实现 generate_ini_for_ea() + 生成 per-EA INI 配置文件 + +[P2-08] 实现 build_powershell_script() + 动态生成 PowerShell 批量执行脚本 + +[P2-09] 测试 Phase 2 + 为 MA_Cross.json 生成 500 个 SET 文件 + 验证文件内容正确 + +Phase 3: 执行层 + 结果解析 +────────────────────────────────────────────────────── + +[P3-01] 实现 parse_mt5_html_report() + analyze_results.py + 使用 BeautifulSoup + 正则 + 提取: profit, drawdown, trades, pf, sharpe, win_rate + +[P3-02] 实现 parse_all_reports() + 遍历 reports/ 目录 + 调用 HTML/XML 解析器 + +[P3-03] 实现 merge_parameters_and_results() + 按 set_id 关联参数与测试结果 + +[P3-04] 实现 find_optimal_params() + 多维度排序 + 过滤条件: min_trades, min_pf, max_dd + +[P3-05] 实现 generate_report() + 输出文本分析报告 + +[P3-06] 实现 EABatchOptimizer.run_optimization_for_ea() + 执行 PowerShell 脚本 + 等待完成 + +[P3-07] 实现 EABatchOptimizer.analyze_all_results() + 解析所有报告 → 合并 → 排序 → 输出 + +[P3-08] 端到端测试 (Phase 3) + EA: MA_Cross, 组合数: 50 + 全流程: SET生成 → PS脚本 → MT5测试 → 报告解析 → 结果输出 + +Phase 4: 多EA管理 + 过拟合防护 +────────────────────────────────────────────────────── + +[P4-01] 实现 parallel_optimize() + 多进程并行优化多个 EA + +[P4-02] 实现 walk_forward_validate() + In-Sample + Out-of-Sample 验证 + 过拟合检测 + +[P4-03] 参数降维模块 + 相关性分析 + PCA/因子分析 (可选) + +[P4-04] 实现 cross_ea_ranking() + 跨 EA 横向比较 + 综合最优推荐 + +[P4-05] 异常处理 + MT5 超时 + 报告缺失 + 进程管理 + +[P4-06] 创建复杂 EA 配置示例 + configs/Grid_EA.json (25参数) + +[P4-07] 全EA集成测试 + +Phase 5: 优化与交付 +────────────────────────────────────────────────────── + +[P5-01] 命令行参数完善 + --phase, --ea, --strategy, --parallel, --max-samples + --base-dir, --configs-dir + +[P5-02] 日志系统 + 运行日志 → logs/ + 错误追踪 + +[P5-03] 创建 README.md + +[P5-04] 创建 4 个不同复杂度的配置示例 + configs/MA_Cross.json (6参数, Grid) + configs/RSI_EA.json (12参数, 遗传) + configs/Grid_EA.json (25参数, 遗传) + configs/Breakout.json (8参数, 拉丁超立方) + +[P5-05] 一键启动脚本 main.py + +[P5-06] 最终验收测试 +``` + +--- + +## 六、使用工作流 + +### 6.1 首次使用流程 + +```bash +# 1. 目录结构 (由 Phase 1 自动创建) +mkdir -p MT5Optimizer/{configs,set_files,reports,results,scripts,logs} + +# 2. 安装依赖 +pip install MetaTrader5 pandas numpy beautifulsoup4 + +# 3. 为你的 EA 创建配置文件 (参考 configs/ 示例) +# 编辑 configs/MY_EA.json + +# 4. 分步执行 +# 步骤1: 生成 SET 文件 +python ea_batch_optimizer.py --phase 1 + +# 步骤2: 生成 INI 配置 +python ea_batch_optimizer.py --phase 2 + +# 步骤3: 运行批量测试 +python ea_batch_optimizer.py --phase 3 --ea "MY_EA" + +# 步骤4: 解析结果 +python ea_batch_optimizer.py --phase 4 + +# 5. 查看结果 +cat results/optimization_report.txt +``` + +### 6.2 完整一键执行 + +```bash +# 单 EA 完整流程 +python ea_batch_optimizer.py --phase 5 --ea "MA_Cross" + +# 多 EA 并行 +python ea_batch_optimizer.py --phase 3 --parallel + +# 指定搜索策略 +python ea_batch_optimizer.py --phase 1 --strategy genetic +``` + +### 6.3 分步执行详解 + +``` +┌──────────────────────────────────────────────────────────────────────────────┐ +│ --phase 1: 生成 SET 文件 │ +│ 输入: configs/*.json │ +│ 输出: set_files/{EA_NAME}/params_*.set │ +│ results/{EA_NAME}_param_mapping.csv │ +│ │ +│ --phase 2: 生成 INI 配置 │ +│ 输入: configs/*.json │ +│ 输出: configs/{EA_NAME}.ini │ +│ │ +│ --phase 3: 运行 MT5 批量测试 │ +│ 输入: set_files/*.set + configs/*.ini │ +│ 执行: PowerShell 脚本 │ +│ 输出: reports/{EA_NAME}/*.html │ +│ │ +│ --phase 4: 解析并分析结果 │ +│ 输入: reports/*.html │ +│ 输出: results/full_optimization_results.csv │ +│ results/optimization_report.txt │ +│ results/best_params.json │ +│ │ +│ --phase 5: 全部执行 (1+2+4) │ +│ │ +│ --ea NAME: 只处理指定 EA │ +│ --parallel: 多 EA 并行 (Phase 3) │ +│ --strategy: 强制指定搜索策略 (grid/random/latin/genetic) │ +└──────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 七、搜索策略选择决策树 + +``` +参数组合数 + │ + ▼ + ├── ≤ 10,000 ────────────────────▶ Grid Search + │ (暴力遍历, 全局最优) + │ + ├── 10,001 ~ 100,000 ──────────▶ Latin Hypercube + │ (均匀采样, 效率高) + │ + ├── 100,001 ~ 500,000 ─────────▶ Genetic Algorithm + │ (智能搜索, 参数爆炸克星) + │ + └── ≥ 500,001 ─────────────────▶ Genetic Algorithm + 约束过滤 + (必须用 GA, 先过滤约束减少搜索空间) +``` + +--- + +## 八、EA 配置示例 + +### 8.1 简单 EA (6参数, Grid Search) + +```json +// configs/MA_Cross.json +{ + "ea_name": "MA Cross Scalper", + "ea_path": "Experts\\MA_Cross.ex5", + "description": "双MA交叉头皮策略, 6个参数", + + "parameters": { + "FastMA_Period": {"type": "int", "default": 14, "min": 5, "max": 30, "step": 1}, + "SlowMA_Period": {"type": "int", "default": 50, "min": 20, "max": 100, "step": 5, + "condition": ">FastMA_Period"}, + "StopLoss": {"type": "int", "default": 50, "min": 10, "max": 200, "step": 10}, + "TakeProfit": {"type": "int", "default": 100,"min": 30, "max": 300, "step": 10}, + "RiskPercent": {"type": "double", "default": 1.0, "min": 0.5, "max": 3.0, "step": 0.5, + "precision": 1}, + "EnableMM": {"type": "bool", "default": true} + }, + + "search_strategy": "grid", + "test_config": { + "symbol": "EURUSD", "period": "H1", + "from_date": "2023.01.01", "to_date": "2024.01.01", + "deposit": 10000 + } +} +``` + +### 8.2 复杂 EA (25参数, Genetic Algorithm) + +```json +// configs/Grid_EA.json +{ + "ea_name": "MultiGrid Pro", + "ea_path": "Experts\\Grid\\MultiGrid.ex5", + "description": "多周期网格EA, 25个参数, 必须用遗传算法", + + "parameters": { + "GridLevels": {"type": "int", "default": 5, "min": 3, "max": 20, "step": 1}, + "GridSpacing": {"type": "int", "default": 50, "min": 10, "max": 200,"step": 10}, + "GridSpacingMult": {"type": "double", "default": 1.5, "min": 1.0, "max": 3.0, "step": 0.1, "precision": 1}, + "BaseLotsize": {"type": "double", "default": 0.1, "min": 0.01, "max": 1.0, "step": 0.01, "precision": 2}, + "MaxOpenLots": {"type": "double", "default": 5.0, "min": 0.1, "max": 20.0, "step": 0.1, "precision": 1}, + "MaxDrawdown": {"type": "int", "default": 30, "min": 10, "max": 100, "step": 5}, + "TakeProfitGrid": {"type": "int", "default": 20, "min": 5, "max": 100, "step": 5}, + "StartHour": {"type": "int", "default": 0, "min": 0, "max": 23, "step": 1}, + "EndHour": {"type": "int", "default": 23, "min": 0, "max": 23, "step": 1}, + "TradingDays": {"type": "enum", "default": "ALL", + "options": ["ALL", "MON-FRI", "MON-THU", "FRI-MON"]}, + "MaxSpread": {"type": "int", "default": 30, "min": 5, "max": 100, "step": 5}, + "CloseOnOpposite": {"type": "bool", "default": false}, + "HedgeMode": {"type": "bool", "default": true}, + "Indicator1_Type": {"type": "enum", "default": "RSI", + "options": ["RSI", "CCI", "Stochastic", "MACD"]}, + "Indicator1_Period":{"type": "int", "default": 14, "min": 5, "max": 50, "step": 1}, + "Indicator1_Level":{"type": "double", "default": 30, "min": 10, "max": 90, "step": 5, "precision": 0}, + "Indicator2_Type": {"type": "enum", "default": "Bollinger", + "options": ["Bollinger", "ATR", "STDDEV", "None"]}, + "Indicator2_Period":{"type": "int", "default": 20, "min": 10, "max": 100, "step": 5}, + "Indicator2_Dev": {"type": "double", "default": 2.0, "min": 1.0, "max": 5.0, "step": 0.5, "precision": 1}, + "NewsFilter": {"type": "bool", "default": true}, + "NewsImpact": {"type": "enum", "default": "HIGH", + "options": ["NONE", "LOW", "HIGH", "ALL"]}, + "MagicNumber": {"type": "int", "default": 123456, "min": 100000, "max": 999999, "step": 1}, + "Slippage": {"type": "int", "default": 30, "min": 10, "max": 100, "step": 5}, + "MaxTrades": {"type": "int", "default": 10, "min": 1, "max": 50, "step": 1}, + "RecoveryMode": {"type": "bool", "default": false}, + "RecoveryMult": {"type": "double", "default": 1.5, "min": 1.0, "max": 3.0, "step": 0.1, "precision": 1}, + "TrailStop": {"type": "bool", "default": true}, + "TrailStep": {"type": "int", "default": 10, "min": 5, "max": 50, "step": 5} + }, + + "search_strategy": "genetic", + "optimization_criterion": "custom", + + "test_config": { + "symbol": "EURUSD", "period": "H1", + "from_date": "2022.01.01", "to_date": "2024.01.01", + "deposit": 5000, "leverage": "1:100" + }, + + "walk_forward": { + "enabled": true, + "train_test_ratio": 0.75 + } +} +``` + +--- + +## 九、预期交付物 + +``` +┌──────────────────────────────────────────────────────────────────────────────┐ +│ 交付清单 │ +├──────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 1. 源代码文件 │ +│ ├── ea_batch_optimizer.py (主程序) │ +│ ├── ea_config_parser.py (配置解析) │ +│ ├── parameter_constraint.py (约束引擎) │ +│ ├── smart_search.py (搜索策略) │ +│ └── analyze_results.py (结果解析) │ +│ │ +│ 2. EA 配置示例 (4个不同复杂度) │ +│ ├── configs/MA_Cross.json (6参数, Grid) │ +│ ├── configs/RSI_EA.json (12参数, 遗传) │ +│ ├── configs/Grid_EA.json (25参数, 遗传) │ +│ └── configs/Breakout.json (8参数, 拉丁超立方) │ +│ │ +│ 3. 文档 │ +│ ├── README.md (使用说明) │ +│ └── 项目计划.md (本计划) │ +│ │ +│ 4. 一键启动脚本 │ +│ └── main.py │ +│ │ +│ ┌──────────────────────────────────────────────────────────────────────────┐ │ +│ │ 系统能力总结: │ │ +│ │ │ │ +│ │ □ 支持 1~25+ 个参数的 EA 优化 │ │ +│ │ □ 自动选择最优搜索策略 (Grid/Latin/GA) │ │ +│ │ □ 参数约束过滤 (互斥/依赖/条件) │ │ +│ │ □ 多 EA 并行优化 │ │ +│ │ □ Walk-Forward 过拟合防护 │ │ +│ │ □ HTML/XML 报告自动解析 │ │ +│ │ □ 最优参数多维度排序推荐 │ │ +│ │ □ 跨 EA 横向比较 │ │ +│ └──────────────────────────────────────────────────────────────────┘ │ +│ │ +└──────────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 十、关键设计原则 + +| 原则 | 说明 | +|------|------| +| **per-EA 独立配置** | 每个 EA 有自己的 JSON 配置,参数名/类型/范围完全自定义,互不影响 | +| **自适应搜索策略** | 不需要人工选策略,系统根据参数数量和组合数自动选择最优方案 | +| **约束先行** | 大量参数组合先通过约束引擎过滤,减少无效测试 | +| **MT5 兜底** | 实际回测由 MT5 策略测试器完成,确保与实盘行为完全一致 | +| **结果可追溯** | 每个 SET 文件对应唯一 ID,报告文件名含 ID,全程可关联 | +| **Walk-Forward 防过拟合** | In-Sample 优化 + Out-of-Sample 验证,只有两步都优秀的参数才推荐 | +| **日志完整** | 每个任务记录开始/结束/耗时/退出码,出问题可追溯 | \ No newline at end of file diff --git a/报告排序名词解释.txt b/报告排序名词解释.txt new file mode 100644 index 0000000..d40a592 --- /dev/null +++ b/报告排序名词解释.txt @@ -0,0 +1,10 @@ +profit_factor - 盈利因子 (毛利/毛损, >1才盈利) +net_profit - 总净盈利 (最终盈亏金额) +gross_profit - 毛利 (所有盈利交易总和) +win_rate - 胜率 (盈利交易占比%) +total_trades - 总交易次数 +max_drawdown - 最大回撤 (最大亏损金额) +sharpe_ratio - 夏普比率 (风险收益比, >1较好) +expert - EA名称 +symbol - 交易品种 (如XAUUSD) +period - 时间周期 (如H1, M15) \ No newline at end of file