mirror of
https://github.com/silencesdg/mt5_python_ea_suite.git
synced 2026-07-27 18:57:44 +00:00
更新 readme
This commit is contained in:
-112
@@ -1,112 +0,0 @@
|
||||
# 架构重构说明
|
||||
|
||||
## 重构概述
|
||||
|
||||
本次重构将原有的单一策略架构分离为**策略层**和**风险管理层**,实现了更清晰的功能分离和动态权重配置。
|
||||
|
||||
## 新架构结构
|
||||
|
||||
### 1. 策略层 (strategies/)
|
||||
包含纯粹的交易策略,每个策略只负责生成买入/卖出信号:
|
||||
- `ma_cross.py` - 均线交叉策略
|
||||
- `rsi.py` - RSI超买超卖策略
|
||||
- `bollinger.py` - 布林带策略
|
||||
- `macd.py` - MACD策略
|
||||
- `kdj.py` - KDJ策略
|
||||
- `turtle.py` - 海龟交易法则
|
||||
- `daily_breakout.py` - 日内突破策略
|
||||
- `mean_reversion.py` - 均值回归策略
|
||||
- `momentum_breakout.py` - 动量突破策略
|
||||
|
||||
### 2. 风险管理层 (risk_management/)
|
||||
- `market_state.py` - 市场状态分析器(基于原resilient_trend)
|
||||
- `position_manager.py` - 仓位管理器(基于原profit_protect)
|
||||
- `__init__.py` - 风险管理控制器
|
||||
|
||||
### 3. 动态权重系统
|
||||
- `dynamic_weights.py` - 动态权重管理器
|
||||
|
||||
## 核心改进
|
||||
|
||||
### 1. 市场状态判断
|
||||
- 将`resilient_trend`重构为市场状态分析器
|
||||
- 判断市场状态:`uptrend`、`downtrend`、`ranging`、`none`
|
||||
- 提供置信度评估(0.0-1.0)
|
||||
|
||||
### 2. 动态权重配置
|
||||
根据市场状态自动调整策略权重:
|
||||
- **上升趋势**:侧重趋势跟踪策略(均线交叉、动量突破)
|
||||
- **下降趋势**:侧重趋势跟踪和反转策略
|
||||
- **震荡市场**:侧重均值回归和超买超卖策略
|
||||
- **无明确趋势**:使用平衡的权重配置
|
||||
|
||||
### 3. 综合风险管理
|
||||
- **止损机制**:固定止损10%
|
||||
- **止盈机制**:固定止盈20% + 追踪止损
|
||||
- **仓位控制**:最大单笔仓位10%
|
||||
- **日内限制**:最大日亏损5%
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 1. 运行回测
|
||||
```bash
|
||||
python main.py
|
||||
```
|
||||
回测会使用当前市场状态对应的权重配置进行测试。
|
||||
|
||||
### 2. 运行实盘交易
|
||||
```bash
|
||||
# 在main.py中取消注释
|
||||
run_realtime()
|
||||
```
|
||||
实盘交易会实时分析市场状态并动态调整权重。
|
||||
|
||||
### 3. 运行优化
|
||||
```bash
|
||||
# 在main.py中取消注释
|
||||
run_optimizer()
|
||||
```
|
||||
优化器会寻找最佳的基础权重配置。
|
||||
|
||||
## 配置说明
|
||||
|
||||
### config.py 新配置项
|
||||
```python
|
||||
# 风险管理参数
|
||||
RISK_CONFIG = {
|
||||
"stop_loss_pct": -0.10, # 固定止损:亏损10%
|
||||
"profit_retracement_pct": 0.30, # 利润回撤30%止盈
|
||||
"min_profit_for_trailing": 0.05, # 追踪止损激活阈值:利润5%
|
||||
"take_profit_pct": 0.20, # 固定止盈:盈利20%
|
||||
"max_position_size": 0.1, # 最大仓位10%
|
||||
"max_daily_loss": -0.05, # 最大日亏损5%
|
||||
}
|
||||
|
||||
# 市场状态分析参数
|
||||
MARKET_STATE_CONFIG = {
|
||||
"trend_period": 50,
|
||||
"retracement_tolerance": 0.30,
|
||||
}
|
||||
|
||||
# 默认权重(低置信度时使用)
|
||||
DEFAULT_WEIGHTS = {
|
||||
"ma_cross": 1.5,
|
||||
"rsi": 1.5,
|
||||
"bollinger": 1.5,
|
||||
# ... 其他策略
|
||||
}
|
||||
```
|
||||
|
||||
## 优势
|
||||
|
||||
1. **更清晰的功能分离**:策略专注于信号生成,风险管理专注于风险控制
|
||||
2. **动态适应性**:根据市场状态自动调整策略权重
|
||||
3. **更强的风险控制**:多层次的风险管理机制
|
||||
4. **更好的可扩展性**:易于添加新策略和风险管理规则
|
||||
5. **更稳定的性能**:通过权重分散降低单一策略风险
|
||||
|
||||
## 兼容性
|
||||
|
||||
- 保持与现有回测和优化系统的兼容性
|
||||
- 策略接口保持不变,现有策略无需修改
|
||||
- 配置文件结构更新,但提供了向后兼容
|
||||
@@ -1,99 +1,300 @@
|
||||
# MT5 Python EA Suite (MetaTrader 5 量化交易策略套件)
|
||||
# MetaTrader 5 智能交易系统 (EA套件)
|
||||
|
||||
这是一个基于Python与MetaTrader 5 (MT5)平台交互的、经过重构的现代化量化交易策略套件。它提供了一个清晰、可扩展的框架,用于开发、回测和运行由多个交易策略组成的投资组合。
|
||||
基于Python的MetaTrader 5智能交易系统,通过多策略组合和动态权重管理实现自动化量化交易。
|
||||
|
||||
---
|
||||
## 🚀 核心特性
|
||||
|
||||
## 核心概念
|
||||
- **多策略组合**: 集成10种量化策略,通过加权投票生成稳健交易信号
|
||||
- **动态权重管理**: 根据市场状态动态调整策略权重,提升适应性
|
||||
- **完整风控体系**: 追踪止损、时间退出、资金管理等多层次风险控制
|
||||
- **遗传算法优化**: 自动寻找最佳策略参数和权重组合
|
||||
- **多模式运行**: 支持回测、实盘交易、模拟运行三种模式
|
||||
- **架构重构**: 采用依赖注入设计,提高代码可维护性和扩展性
|
||||
|
||||
- **多策略组合**: 系统的核心思想不是依赖于单一策略,而是将多个不同类型的策略(如趋势跟踪、均值回归等)组合起来,通过动态加权生成一个更稳健的交易决策。
|
||||
|
||||
- **动态权重**: 系统能根据对市场状态(如趋势、震荡)的分析,动态地调整不同策略的权重,在趋势行情中倚重趋势策略,在震荡行情中侧重于摆动策略。
|
||||
|
||||
- **依赖注入架构**: 项目采用依赖注入的设计模式,将核心交易逻辑与数据来源彻底分离。无论是处理实时行情、模拟数据还是历史数据,核心逻辑都保持不变,极大地保证了回测与实盘的一致性,并方便了未来的扩展。
|
||||
|
||||
- **配置即代码**: 所有的系统行为,从交易参数到策略组合,都通过 `config.py` 文件进行集中配置,清晰直观。
|
||||
|
||||
---
|
||||
|
||||
## 系统架构
|
||||
## 📁 项目结构
|
||||
|
||||
```
|
||||
/ (根目录)
|
||||
├── core/ # 核心逻辑模块
|
||||
│ ├── __init__.py
|
||||
│ ├── data_providers.py # 数据提供者 (实盘/模拟/回测)
|
||||
│ ├── risk/ # 风险管理 (包含PositionManager)
|
||||
│ └── utils.py # 通用工具函数
|
||||
├── execution/ # 执行逻辑模块
|
||||
│ ├── __init__.py
|
||||
│ ├── backtest_engine.py # 回测引擎
|
||||
│ ├── dynamic_weights.py # 动态权重管理器
|
||||
│ └── realtime_trader.py # 实时交易处理器
|
||||
├── strategies/ # 策略库
|
||||
│ ├── __init__.py
|
||||
│ ├── base_strategy.py
|
||||
│ └── ... (具体策略)
|
||||
├── logs/ # 日志目录
|
||||
├── start_realtime.py # [入口] 启动实时/模拟交易
|
||||
├── start_backtest.py # [入口] 启动回测
|
||||
├── config.py # [核心] 全局配置文件
|
||||
├── requirements.txt # Python依赖
|
||||
└── README.md # 项目说明
|
||||
mt5_python_ea_suite/
|
||||
├── core/ # 核心组件
|
||||
│ ├── data_providers.py # 数据提供者(实盘/回测/模拟)
|
||||
│ ├── utils.py # 工具函数
|
||||
│ └── risk/ # 风险管理模块
|
||||
│ ├── position_manager.py # 持仓管理器
|
||||
│ ├── market_state.py # 市场状态分析
|
||||
│ └── __init__.py
|
||||
├── execution/ # 执行模块
|
||||
│ ├── realtime_trader.py # 实时交易器
|
||||
│ ├── backtest_engine.py # 回测引擎
|
||||
│ ├── dynamic_weights.py # 动态权重管理
|
||||
│ └── __init__.py
|
||||
├── strategies/ # 交易策略
|
||||
│ ├── ma_cross.py # 均线交叉策略
|
||||
│ ├── rsi.py # RSI策略
|
||||
│ ├── bollinger.py # 布林带策略
|
||||
│ ├── macd.py # MACD策略
|
||||
│ ├── kdj.py # KDJ策略
|
||||
│ ├── turtle.py # 海龟交易法则
|
||||
│ ├── mean_reversion.py # 均值回归策略
|
||||
│ ├── momentum_breakout.py # 动量突破策略
|
||||
│ ├── daily_breakout.py # 日内突破策略
|
||||
│ ├── wave_theory.py # 波浪理论策略
|
||||
│ └── base_strategy.py # 策略基类
|
||||
├── config.py # 配置文件
|
||||
├── main.py # 主入口(优化器)
|
||||
├── start_backtest.py # 回测启动脚本
|
||||
├── start_realtime.py # 实时交易启动脚本
|
||||
├── optimizer.py # 遗传算法优化器
|
||||
├── logger.py # 日志系统
|
||||
└── requirements.txt # 依赖包
|
||||
```
|
||||
|
||||
---
|
||||
## 🛠️ 安装与配置
|
||||
|
||||
## 如何运行
|
||||
### 环境要求
|
||||
|
||||
#### 1. 环境准备
|
||||
- Python 3.7+
|
||||
- MetaTrader 5 终端
|
||||
- 网络连接
|
||||
|
||||
- 确保您的电脑上已经安装了MetaTrader 5交易终端。
|
||||
- 在MT5中,进入 `工具 > 选项 > EA交易`,确保勾选了“允许算法交易”和“允许DLL导入”。
|
||||
- 安装Python 3.x并创建虚拟环境。
|
||||
- **安装依赖**:
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
### 安装步骤
|
||||
|
||||
#### 2. 核心配置 (`config.py`)
|
||||
1. **克隆项目**
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd mt5_python_ea_suite
|
||||
```
|
||||
|
||||
这是您与系统交互的唯一配置中心。在这里您可以调整几乎所有的参数,例如:
|
||||
- `INITIAL_CAPITAL`: 初始资金。
|
||||
- `USE_DATE_RANGE` / `BACKTEST_COUNT`: 选择回测模式(按日期或按K线数)。
|
||||
- `REALTIME_CONFIG`: **实盘/模拟交易的配置**,包括`dry_run`模式的开关。
|
||||
- `RISK_CONFIG`: 止盈、止损等风险参数。
|
||||
- `CAPITAL_ALLOCATION`: 多、空方向的资金分配比例。
|
||||
- `DEFAULT_WEIGHTS`: 策略的基础权重。
|
||||
2. **创建虚拟环境**
|
||||
```bash
|
||||
python -m venv myenv
|
||||
# Windows
|
||||
myenv\Scripts\activate
|
||||
# macOS/Linux
|
||||
source myenv/bin/activate
|
||||
```
|
||||
|
||||
#### 3. 运行回测
|
||||
3. **安装依赖**
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
直接运行回测启动脚本。所有配置将从 `config.py` 读取。
|
||||
4. **配置MT5终端**
|
||||
- 确保MT5终端已登录
|
||||
- 启用自动交易(点击"自动交易"按钮或按Ctrl+E)
|
||||
- 确保账户允许自动交易
|
||||
|
||||
## 🎯 策略说明
|
||||
|
||||
### 技术指标策略
|
||||
- **均线交叉 (MACrossStrategy)**: 基于快慢均线交叉的买卖信号
|
||||
- **相对强弱指数 (RSIStrategy)**: 使用RSI指标判断超买超卖
|
||||
- **布林带 (BollingerStrategy)**: 基于价格与布林带的相对位置
|
||||
- **MACD策略**: MACD指标的金叉死叉信号
|
||||
- **KDJ策略**: KDJ指标的超买超卖信号
|
||||
|
||||
### 价格行为策略
|
||||
- **海龟交易法则 (TurtleStrategy)**: 基于价格突破的顺势交易
|
||||
- **均值回归 (MeanReversionStrategy)**: 价格偏离均值时的回归交易
|
||||
- **动量突破 (MomentumBreakoutStrategy)**: 基于动量指标的突破信号
|
||||
- **日内突破 (DailyBreakoutStrategy)**: 基于日内价格区间的突破
|
||||
|
||||
### 复杂策略
|
||||
- **波浪理论 (WaveTheoryStrategy)**: 结合EMA、ADX、动量等多指标的趋势分析
|
||||
|
||||
## 🚦 运行模式
|
||||
|
||||
### 1. 回测模式
|
||||
|
||||
```bash
|
||||
# 运行历史回测
|
||||
python start_backtest.py
|
||||
```
|
||||
回测结束后,会打印详细的性能报告,并将完整的交易记录保存到 `backtest_trades.csv` 和 `backtest_trades.json` 文件中。
|
||||
|
||||
#### 4. 运行实盘或模拟交易
|
||||
回测结果将生成:
|
||||
- `backtest_trades.csv`: 交易记录CSV格式
|
||||
- `backtest_trades.json`: 交易记录JSON格式
|
||||
- 详细的性能报告(胜率、盈亏比、最大回撤等)
|
||||
|
||||
在 `config.py` 中,将 `REALTIME_CONFIG` 里的 `dry_run` 设置为 `False`(实盘)或 `True`(模拟),然后运行:
|
||||
### 2. 实时交易模式
|
||||
|
||||
```bash
|
||||
# 启动实时交易(模拟运行)
|
||||
python start_realtime.py
|
||||
|
||||
# 启动实盘交易(需要确认)
|
||||
python start_realtime.py
|
||||
# 输入 'YES' 确认实盘交易
|
||||
```
|
||||
程序会根据您的配置,以实盘或模拟模式启动。
|
||||
|
||||
---
|
||||
### 3. 参数优化模式
|
||||
|
||||
## 如何添加一个新策略
|
||||
```bash
|
||||
# 运行遗传算法优化
|
||||
python optimizer.py
|
||||
```
|
||||
|
||||
新架构下添加策略非常简单:
|
||||
优化结果将生成:
|
||||
- `optimization_results_YYYYMMDD_HHMMSS.json`: 详细优化结果
|
||||
- `optimization_best_params_YYYYMMDD_HHMMSS.csv`: 最佳参数
|
||||
- `optimization_history_YYYYMMDD_HHMMSS.csv`: 优化历史
|
||||
- `optimization_report_YYYYMMDD_HHMMSS.txt`: 优化报告
|
||||
|
||||
1. 在 `strategies/` 目录下,创建一个新的Python文件,例如 `my_strategy.py`。
|
||||
2. 在该文件中,创建一个继承自 `base_strategy.BaseStrategy` 的策略类。
|
||||
3. 实现您的 `__init__` 和 `generate_signal` (用于实盘) 或 `run_backtest` (用于回测) 方法。
|
||||
4. 在 `execution/dynamic_weights.py` 文件的 `__init__` 方法中,将您的新策略添加到 `self.strategy_instances` 字典中。
|
||||
5. 在 `config.py` 的 `DEFAULT_WEIGHTS` 中,为您的新策略添加一个基础权重。
|
||||
## ⚙️ 关键配置
|
||||
|
||||
完成!您的新策略已经无缝集成到整个系统中。
|
||||
### 交易参数
|
||||
```python
|
||||
# 基础配置
|
||||
SYMBOL = "XAUUSD" # 交易品种
|
||||
TIMEFRAME = 1 # 时间周期(1分钟)
|
||||
INITIAL_CAPITAL = 20000 # 初始资金
|
||||
SPREAD = 16 # 点差
|
||||
|
||||
# 回测配置
|
||||
BACKTEST_COUNT = 30000 # 回测数据量
|
||||
BACKTEST_START_DATE = "2025-05-01"
|
||||
BACKTEST_END_DATE = "2025-08-01"
|
||||
```
|
||||
|
||||
### 风险管理
|
||||
```python
|
||||
RISK_CONFIG = {
|
||||
"stop_loss_pct": -0.01, # 止损阈值(-1%)
|
||||
"take_profit_pct": 0.20, # 止盈阈值(20%)
|
||||
"profit_retracement_pct": 0.10, # 追踪止损回撤阈值(10%)
|
||||
"min_profit_for_trailing": 0.01, # 启动追踪止损的最小盈利(1%)
|
||||
"max_holding_minutes": 60, # 最大持仓时间(分钟)
|
||||
"min_profit_for_time_exit": 0.001 # 时间退出最小盈利(0.1%)
|
||||
}
|
||||
```
|
||||
|
||||
### 信号阈值
|
||||
```python
|
||||
SIGNAL_THRESHOLDS = {
|
||||
"buy_threshold": 1.5, # 买入信号阈值
|
||||
"sell_threshold": -1.5 # 卖出信号阈值
|
||||
}
|
||||
```
|
||||
|
||||
## 🛡️ 风险控制
|
||||
|
||||
### 多层次风控体系
|
||||
|
||||
1. **止损保护**
|
||||
- 固定百分比止损
|
||||
- 追踪止损(基于盈利回撤)
|
||||
- 动态止损位调整
|
||||
|
||||
2. **时间管理**
|
||||
- 最大持仓时间限制
|
||||
- 盈利未达标强制平仓
|
||||
- 市场状态适应性调整
|
||||
|
||||
3. **资金管理**
|
||||
- 初始资金分配
|
||||
- 多空仓位资金分配
|
||||
- 动态权益更新
|
||||
|
||||
4. **持仓限制**
|
||||
- 最大持仓数量控制
|
||||
- 交易方向限制(多/空/双向)
|
||||
- 信号强度过滤
|
||||
|
||||
### 动态权重管理
|
||||
|
||||
系统根据市场状态动态调整策略权重:
|
||||
- **趋势识别**: 价格突破、成交量确认、动量指标
|
||||
- **市场状态**: 强趋势、弱趋势、震荡市
|
||||
- **置信度评估**: 高置信度、中等置信度
|
||||
- **权重调整**: 根据市场状态调整各策略权重
|
||||
|
||||
## 📊 性能监控
|
||||
|
||||
### 实时监控
|
||||
- 当前持仓状态
|
||||
- 浮动盈亏计算
|
||||
- 策略信号强度
|
||||
- 账户权益更新
|
||||
|
||||
### 历史记录
|
||||
- 交易记录CSV/JSON格式导出
|
||||
- 性能指标统计
|
||||
- 参数优化历史
|
||||
- 峰值盈利数据持久化
|
||||
|
||||
## 🔧 故障排除
|
||||
|
||||
### 常见问题
|
||||
|
||||
1. **MT5连接失败**
|
||||
- 确保MT5终端已启动并登录
|
||||
- 检查网络连接
|
||||
- 验证MT5终端版本
|
||||
|
||||
2. **自动交易被禁用**
|
||||
- 点击MT5终端"自动交易"按钮
|
||||
- 按Ctrl+E快捷键
|
||||
- 检查账户权限
|
||||
|
||||
3. **订单执行失败**
|
||||
- 检查账户资金
|
||||
- 验证品种信息
|
||||
- 确认交易时间
|
||||
|
||||
4. **数据获取失败**
|
||||
- 检查日期范围设置
|
||||
- 验证MT5服务器连接
|
||||
- 调整数据量设置
|
||||
|
||||
### 日志文件
|
||||
|
||||
- `logs/error.log`: 错误日志
|
||||
- `logs/strategy.log`: 策略执行日志
|
||||
- `position_peaks.json`: 持仓峰值数据
|
||||
|
||||
## 📈 优化建议
|
||||
|
||||
1. **参数优化**
|
||||
- 使用遗传算法优化策略参数
|
||||
- 定期重新优化以适应市场变化
|
||||
- 保存最佳参数组合
|
||||
|
||||
2. **策略调整**
|
||||
- 根据市场情况调整策略权重
|
||||
- 添加新的策略模块
|
||||
- 优化信号阈值
|
||||
|
||||
3. **风险控制**
|
||||
- 定期检查止损设置
|
||||
- 监控最大回撤
|
||||
- 调整资金分配比例
|
||||
|
||||
## ⚠️ 风险提示
|
||||
|
||||
- **实盘交易前务必充分测试**
|
||||
- **建议先使用模拟运行模式**
|
||||
- **不要投入超过风险承受能力的资金**
|
||||
- **定期监控系统运行状态**
|
||||
- **保持策略的持续优化**
|
||||
|
||||
## 📝 更新日志
|
||||
|
||||
### v2.0 (重构版)
|
||||
- 架构重构,采用依赖注入设计
|
||||
- 新增动态权重管理模块
|
||||
- 完善风险控制体系
|
||||
- 优化持仓管理和数据持久化
|
||||
- 改进信号组合逻辑
|
||||
|
||||
### v1.0
|
||||
- 基础多策略组合框架
|
||||
- 遗传算法参数优化
|
||||
- 回测和实时交易功能
|
||||
- 基本风险控制
|
||||
|
||||
## 🤝 贡献指南
|
||||
|
||||
欢迎提交Issue和Pull Request来改进系统!
|
||||
|
||||
## 📄 许可证
|
||||
|
||||
本项目仅供学习和研究使用,实盘交易风险自负。
|
||||
@@ -1,16 +0,0 @@
|
||||
trade_id,symbol,direction,open_price,open_time,strategy_signal,status,close_price,close_time,close_reason,profit_loss,profit_loss_pct
|
||||
1,XAUUSD,buy,3325.65,3,signal_1.0,closed,3321.32,45,risk_management_close_long,-4.329999999999927,-0.13020011125644393
|
||||
2,XAUUSD,sell,3320.07,46,signal_-1.0,closed,3316.63,48,risk_management_close_long,3.4400000000000546,0.10361227323520451
|
||||
3,XAUUSD,sell,3318.83,49,signal_-1.0,closed,3315.46,57,risk_management_close_long,3.369999999999891,0.1015418084083816
|
||||
4,XAUUSD,sell,3314.19,58,signal_-1.0,closed,3310.61,62,risk_management_close_long,3.5799999999999272,0.10802036093283508
|
||||
5,XAUUSD,sell,3312.83,63,signal_-1.0,closed,3306.49,16527,risk_management_close_long,6.3400000000001455,0.19137716091680362
|
||||
6,XAUUSD,sell,3309.13,16528,signal_-1.0,closed,3303.25,16531,risk_management_close_long,5.880000000000109,0.17769020860468188
|
||||
7,XAUUSD,sell,3302.25,16532,signal_-1.0,closed,3298.6,19352,risk_management_close_long,3.650000000000091,0.11053069876599564
|
||||
8,XAUUSD,sell,3294.11,19353,signal_-1.0,closed,3289.99,19363,risk_management_close_long,4.120000000000346,0.12507171891650082
|
||||
9,XAUUSD,sell,3291.61,19364,signal_-1.0,closed,3287.05,19561,risk_management_close_long,4.559999999999945,0.13853403045925688
|
||||
10,XAUUSD,sell,3285.18,19562,signal_-1.0,closed,3281.16,19566,risk_management_close_long,4.019999999999982,0.12236772414296879
|
||||
11,XAUUSD,sell,3283.41,19567,signal_-1.0,closed,3277.08,19574,risk_management_close_long,6.329999999999927,0.19278737653841363
|
||||
12,XAUUSD,sell,3280.13,19575,signal_-1.0,closed,3275.76,19580,risk_management_close_long,4.369999999999891,0.13322642700136553
|
||||
13,XAUUSD,sell,3280.44,19581,signal_-1.0,closed,3275.42,19587,risk_management_close_long,5.019999999999982,0.1530282523076167
|
||||
14,XAUUSD,sell,3275.99,19588,signal_-1.0,closed,3272.71,19593,risk_management_close_long,3.2799999999997453,0.1001224057460415
|
||||
15,XAUUSD,sell,3274.53,19594,signal_-1.0,closed,3271.01,19603,risk_management_close_long,3.519999999999982,0.10749634298662651
|
||||
|
@@ -1,212 +0,0 @@
|
||||
[
|
||||
{
|
||||
"trade_id": 1,
|
||||
"symbol": "XAUUSD",
|
||||
"direction": "buy",
|
||||
"open_price": 3325.65,
|
||||
"open_time": 3,
|
||||
"strategy_signal": "signal_1.0",
|
||||
"status": "closed",
|
||||
"close_price": 3321.32,
|
||||
"close_time": 45,
|
||||
"close_reason": "risk_management_close_long",
|
||||
"profit_loss": -4.329999999999927,
|
||||
"profit_loss_pct": -0.13020011125644393
|
||||
},
|
||||
{
|
||||
"trade_id": 2,
|
||||
"symbol": "XAUUSD",
|
||||
"direction": "sell",
|
||||
"open_price": 3320.07,
|
||||
"open_time": 46,
|
||||
"strategy_signal": "signal_-1.0",
|
||||
"status": "closed",
|
||||
"close_price": 3316.63,
|
||||
"close_time": 48,
|
||||
"close_reason": "risk_management_close_long",
|
||||
"profit_loss": 3.4400000000000546,
|
||||
"profit_loss_pct": 0.10361227323520451
|
||||
},
|
||||
{
|
||||
"trade_id": 3,
|
||||
"symbol": "XAUUSD",
|
||||
"direction": "sell",
|
||||
"open_price": 3318.83,
|
||||
"open_time": 49,
|
||||
"strategy_signal": "signal_-1.0",
|
||||
"status": "closed",
|
||||
"close_price": 3315.46,
|
||||
"close_time": 57,
|
||||
"close_reason": "risk_management_close_long",
|
||||
"profit_loss": 3.369999999999891,
|
||||
"profit_loss_pct": 0.1015418084083816
|
||||
},
|
||||
{
|
||||
"trade_id": 4,
|
||||
"symbol": "XAUUSD",
|
||||
"direction": "sell",
|
||||
"open_price": 3314.19,
|
||||
"open_time": 58,
|
||||
"strategy_signal": "signal_-1.0",
|
||||
"status": "closed",
|
||||
"close_price": 3310.61,
|
||||
"close_time": 62,
|
||||
"close_reason": "risk_management_close_long",
|
||||
"profit_loss": 3.5799999999999272,
|
||||
"profit_loss_pct": 0.10802036093283508
|
||||
},
|
||||
{
|
||||
"trade_id": 5,
|
||||
"symbol": "XAUUSD",
|
||||
"direction": "sell",
|
||||
"open_price": 3312.83,
|
||||
"open_time": 63,
|
||||
"strategy_signal": "signal_-1.0",
|
||||
"status": "closed",
|
||||
"close_price": 3306.49,
|
||||
"close_time": 16527,
|
||||
"close_reason": "risk_management_close_long",
|
||||
"profit_loss": 6.3400000000001455,
|
||||
"profit_loss_pct": 0.19137716091680362
|
||||
},
|
||||
{
|
||||
"trade_id": 6,
|
||||
"symbol": "XAUUSD",
|
||||
"direction": "sell",
|
||||
"open_price": 3309.13,
|
||||
"open_time": 16528,
|
||||
"strategy_signal": "signal_-1.0",
|
||||
"status": "closed",
|
||||
"close_price": 3303.25,
|
||||
"close_time": 16531,
|
||||
"close_reason": "risk_management_close_long",
|
||||
"profit_loss": 5.880000000000109,
|
||||
"profit_loss_pct": 0.17769020860468188
|
||||
},
|
||||
{
|
||||
"trade_id": 7,
|
||||
"symbol": "XAUUSD",
|
||||
"direction": "sell",
|
||||
"open_price": 3302.25,
|
||||
"open_time": 16532,
|
||||
"strategy_signal": "signal_-1.0",
|
||||
"status": "closed",
|
||||
"close_price": 3298.6,
|
||||
"close_time": 19352,
|
||||
"close_reason": "risk_management_close_long",
|
||||
"profit_loss": 3.650000000000091,
|
||||
"profit_loss_pct": 0.11053069876599564
|
||||
},
|
||||
{
|
||||
"trade_id": 8,
|
||||
"symbol": "XAUUSD",
|
||||
"direction": "sell",
|
||||
"open_price": 3294.11,
|
||||
"open_time": 19353,
|
||||
"strategy_signal": "signal_-1.0",
|
||||
"status": "closed",
|
||||
"close_price": 3289.99,
|
||||
"close_time": 19363,
|
||||
"close_reason": "risk_management_close_long",
|
||||
"profit_loss": 4.120000000000346,
|
||||
"profit_loss_pct": 0.12507171891650082
|
||||
},
|
||||
{
|
||||
"trade_id": 9,
|
||||
"symbol": "XAUUSD",
|
||||
"direction": "sell",
|
||||
"open_price": 3291.61,
|
||||
"open_time": 19364,
|
||||
"strategy_signal": "signal_-1.0",
|
||||
"status": "closed",
|
||||
"close_price": 3287.05,
|
||||
"close_time": 19561,
|
||||
"close_reason": "risk_management_close_long",
|
||||
"profit_loss": 4.559999999999945,
|
||||
"profit_loss_pct": 0.13853403045925688
|
||||
},
|
||||
{
|
||||
"trade_id": 10,
|
||||
"symbol": "XAUUSD",
|
||||
"direction": "sell",
|
||||
"open_price": 3285.18,
|
||||
"open_time": 19562,
|
||||
"strategy_signal": "signal_-1.0",
|
||||
"status": "closed",
|
||||
"close_price": 3281.16,
|
||||
"close_time": 19566,
|
||||
"close_reason": "risk_management_close_long",
|
||||
"profit_loss": 4.019999999999982,
|
||||
"profit_loss_pct": 0.12236772414296879
|
||||
},
|
||||
{
|
||||
"trade_id": 11,
|
||||
"symbol": "XAUUSD",
|
||||
"direction": "sell",
|
||||
"open_price": 3283.41,
|
||||
"open_time": 19567,
|
||||
"strategy_signal": "signal_-1.0",
|
||||
"status": "closed",
|
||||
"close_price": 3277.08,
|
||||
"close_time": 19574,
|
||||
"close_reason": "risk_management_close_long",
|
||||
"profit_loss": 6.329999999999927,
|
||||
"profit_loss_pct": 0.19278737653841363
|
||||
},
|
||||
{
|
||||
"trade_id": 12,
|
||||
"symbol": "XAUUSD",
|
||||
"direction": "sell",
|
||||
"open_price": 3280.13,
|
||||
"open_time": 19575,
|
||||
"strategy_signal": "signal_-1.0",
|
||||
"status": "closed",
|
||||
"close_price": 3275.76,
|
||||
"close_time": 19580,
|
||||
"close_reason": "risk_management_close_long",
|
||||
"profit_loss": 4.369999999999891,
|
||||
"profit_loss_pct": 0.13322642700136553
|
||||
},
|
||||
{
|
||||
"trade_id": 13,
|
||||
"symbol": "XAUUSD",
|
||||
"direction": "sell",
|
||||
"open_price": 3280.44,
|
||||
"open_time": 19581,
|
||||
"strategy_signal": "signal_-1.0",
|
||||
"status": "closed",
|
||||
"close_price": 3275.42,
|
||||
"close_time": 19587,
|
||||
"close_reason": "risk_management_close_long",
|
||||
"profit_loss": 5.019999999999982,
|
||||
"profit_loss_pct": 0.1530282523076167
|
||||
},
|
||||
{
|
||||
"trade_id": 14,
|
||||
"symbol": "XAUUSD",
|
||||
"direction": "sell",
|
||||
"open_price": 3275.99,
|
||||
"open_time": 19588,
|
||||
"strategy_signal": "signal_-1.0",
|
||||
"status": "closed",
|
||||
"close_price": 3272.71,
|
||||
"close_time": 19593,
|
||||
"close_reason": "risk_management_close_long",
|
||||
"profit_loss": 3.2799999999997453,
|
||||
"profit_loss_pct": 0.1001224057460415
|
||||
},
|
||||
{
|
||||
"trade_id": 15,
|
||||
"symbol": "XAUUSD",
|
||||
"direction": "sell",
|
||||
"open_price": 3274.53,
|
||||
"open_time": 19594,
|
||||
"strategy_signal": "signal_-1.0",
|
||||
"status": "closed",
|
||||
"close_price": 3271.01,
|
||||
"close_time": 19603,
|
||||
"close_reason": "risk_management_close_long",
|
||||
"profit_loss": 3.519999999999982,
|
||||
"profit_loss_pct": 0.10749634298662651
|
||||
}
|
||||
]
|
||||
@@ -1,97 +0,0 @@
|
||||
import MetaTrader5 as mt5
|
||||
|
||||
# 登录账号
|
||||
ACCOUNT = 12345678
|
||||
PASSWORD = "your_password"
|
||||
SERVER = "Exness-MT5Trial" # 服务器名称
|
||||
SYMBOL = "EURUSD"
|
||||
|
||||
# 初始化
|
||||
if not mt5.initialize():
|
||||
print("initialize() failed:", mt5.last_error())
|
||||
quit()
|
||||
|
||||
if not mt5.login(ACCOUNT, PASSWORD, SERVER):
|
||||
print("login() failed:", mt5.last_error())
|
||||
mt5.shutdown()
|
||||
quit()
|
||||
|
||||
# 获取当前持仓
|
||||
positions = mt5.positions_get(symbol=SYMBOL)
|
||||
if positions is None or len(positions) == 0:
|
||||
print(f"没有 {SYMBOL} 的持仓")
|
||||
mt5.shutdown()
|
||||
quit()
|
||||
|
||||
# 遍历并平仓
|
||||
for pos in positions:
|
||||
ticket = pos.ticket
|
||||
lot = pos.volume
|
||||
position_type = pos.type # 0=BUY, 1=SELL
|
||||
|
||||
if position_type == mt5.POSITION_TYPE_BUY:
|
||||
# 平多 -> 发送SELL订单
|
||||
close_request = {
|
||||
"action": mt5.TRADE_ACTION_DEAL,
|
||||
"symbol": SYMBOL,
|
||||
"volume": lot,
|
||||
"type": mt5.ORDER_TYPE_SELL,
|
||||
"position": ticket,
|
||||
"price": mt5.symbol_info_tick(SYMBOL).bid,
|
||||
"deviation": 10,
|
||||
"magic": 234000,
|
||||
"comment": "Python Close Buy",
|
||||
"type_filling": mt5.ORDER_FILLING_IOC,
|
||||
}
|
||||
else:
|
||||
# 平空 -> 发送BUY订单
|
||||
close_request = {
|
||||
"action": mt5.TRADE_ACTION_DEAL,
|
||||
"symbol": SYMBOL,
|
||||
"volume": lot,
|
||||
"type": mt5.ORDER_TYPE_BUY,
|
||||
"position": ticket,
|
||||
"price": mt5.symbol_info_tick(SYMBOL).ask,
|
||||
"deviation": 10,
|
||||
"magic": 234000,
|
||||
"comment": "Python Close Sell",
|
||||
"type_filling": mt5.ORDER_FILLING_IOC,
|
||||
}
|
||||
|
||||
result = mt5.order_send(close_request)
|
||||
print(result)
|
||||
if result.retcode != mt5.TRADE_RETCODE_DONE:
|
||||
print(f"平仓失败: {result.comment}, 错误码: {result.retcode}")
|
||||
|
||||
mt5.shutdown()
|
||||
|
||||
'''
|
||||
2️⃣ 常见平仓失败原因
|
||||
未传 position 参数
|
||||
|
||||
在 MT5 里,如果是平仓,你必须指定 原单的 ticket ID(即 position 字段)。
|
||||
|
||||
不然系统会认为你是开新仓,而不是平仓。
|
||||
|
||||
价格方向不对
|
||||
|
||||
平多必须用 SELL,平空必须用 BUY,价格要对应 bid 或 ask。
|
||||
|
||||
多单平仓价用 Bid(卖给市场),空单平仓价用 Ask(买回)。
|
||||
|
||||
lot 不匹配
|
||||
|
||||
发送的 volume 必须和剩余仓位量一致(或等于合约最小手数的整数倍)。
|
||||
|
||||
有些券商要求精确到 2~3 位小数,否则 Invalid volume。
|
||||
|
||||
订单类型与服务器支持不符
|
||||
|
||||
type_filling 要用服务器支持的方式(常见 ORDER_FILLING_IOC)。
|
||||
|
||||
有些外汇服务器不支持 FOK。
|
||||
|
||||
symbol 没有准备好
|
||||
|
||||
必须 mt5.symbol_select(SYMBOL, True),并且 symbol_info_tick() 不为 None。
|
||||
'''
|
||||
-58
@@ -1,58 +0,0 @@
|
||||
ma_cross_short_window: 5
|
||||
ma_cross_long_window: 39
|
||||
rsi_period: 22
|
||||
rsi_overbought: 80
|
||||
rsi_oversold: 24
|
||||
bollinger_period: 10
|
||||
bollinger_std_dev: 2.8916513144581044
|
||||
macd_fast_ema: 17
|
||||
macd_slow_ema: 22
|
||||
macd_signal_period: 13
|
||||
mean_reversion_period: 40
|
||||
mean_reversion_std_dev: 2.917216289407233
|
||||
momentum_breakout_period: 27
|
||||
kdj_period: 6
|
||||
turtle_period: 16
|
||||
wave_ema_short: 3
|
||||
wave_ema_medium: 15
|
||||
wave_ema_long: 36
|
||||
wave_period: 28
|
||||
wave_range_period: 30
|
||||
wave_adx_period: 21
|
||||
wave_momentum_period: 13
|
||||
wave_range_threshold: -0.02028040971155598
|
||||
wave_adx_threshold: 22
|
||||
daily_breakout_bars_count: 807
|
||||
buy_threshold: 2.52197653160939
|
||||
sell_threshold: -2.8041541426704852
|
||||
stop_loss_pct: -0.16609967085382554
|
||||
profit_retracement_pct: 0.1
|
||||
min_profit_for_trailing: 0.05431287857723996
|
||||
take_profit_pct: 0.049359092938974364
|
||||
max_holding_minutes: 79
|
||||
min_profit_for_time_exit: -0.051349429573099285
|
||||
weight_MACrossStrategy: 0.44428771408324463
|
||||
weight_RSIStrategy: 1.6518277343219148
|
||||
weight_BollingerStrategy: 0.6014474871460991
|
||||
weight_MeanReversionStrategy: 0.04509729271515517
|
||||
weight_MomentumBreakoutStrategy: 1.0768245883204248
|
||||
weight_MACDStrategy: 0.8909161638775971
|
||||
weight_KDJStrategy: 1.095784002572773
|
||||
weight_TurtleStrategy: 1.7942934575029192
|
||||
weight_DailyBreakoutStrategy: 2.4237777692491713
|
||||
weight_WaveTheoryStrategy: 0.7354173414675755
|
||||
market_trend_period: 44
|
||||
market_retracement_tolerance: 0.1382775008306345
|
||||
market_volume_period: 13
|
||||
market_volume_ma_period: 12
|
||||
trend_price_breakout_weight: 0.03552729699860058
|
||||
trend_volume_confirmation_weight: 0.2564191814903339
|
||||
trend_momentum_oscillator_weight: 0.48690789892001296
|
||||
trend_moving_average_weight: 0.3549274308680269
|
||||
trend_strong_threshold: 0.24063407379490956
|
||||
trend_weak_threshold: 0.3708545035763192
|
||||
trend_volume_spike: 1.7781348694952452
|
||||
trend_oversold: 29
|
||||
trend_overbought: 69
|
||||
confidence_high: 0.941049792261965
|
||||
confidence_medium: 0.8881796011658835
|
||||
Reference in New Issue
Block a user