© 本贴为 mogo123 首发,严禁抄袭!
# EA交易策略文档 ## 1. 总体功能和设计思路 ### 1.1 核心交易逻辑 - 利用1小时周期的EMA均线判断趋势方向(上涨或下跌) - 使用ATR(平均真实波幅)计算挂单的合理价格范围(根据当前波动率动态调整挂单距离) - 在符合趋势方向且无同类型订单时,挂买入止损单(Buy Stop)或卖出止损单(Sell Stop) ### 1.2 订单管理功能 - **挂单管理**:超时且价格偏移较大时自动修改挂单价格 - **仓位管理**:支持跟踪止损,动态调整止损价位锁定利润 ### 1.3 风险管理 - 支持自动手数计算,根据账户余额和风险偏好自动调整手数 - 挂单和止损点数均可配置 - 时间过滤,限定EA交易时间 ## 2. 主要输入参数 ### 2.1 基本参数 | 参数名 | 类型 | 说明 | |--------|------|------| | magicNumber | int | 订单标识,确保只操作本EA下的订单 | | FixedLot | double | 固定手数(当不开自动手数时) | ### 2.2 自动手数设置 | 参数名 | 类型 | 说明 | |--------|------|------| | UseAutoLot | bool | 是否启用自动手数计算 | | LotMode | enum | 手数模式:激进、适中、保守三档 | ### 2.3 止损止盈设置 | 参数名 | 类型 | 说明 | |--------|------|------| | SL_Points | int | 止损点数 | | TP_Points | int | 止盈点数 | | Trigger_Step | int | 挂单价格与当前价的间距(点数) | ### 2.4 时间控制 | 参数名 | 类型 | 说明 | |--------|------|------| | StartHour | int | 交易开始时间(小时制) | | EndHour | int | 交易结束时间(小时制) | ### 2.5 技术指标参数 | 参数名 | 类型 | 说明 | |--------|------|------| | MAPeriod | int | EMA均线周期 | | ATR_Period | int | ATR计算周期 | | ATR_Multiplier | double | ATR乘数因子 | ### 2.6 高级设置 | 参数名 | 类型 | 说明 | |--------|------|------| | UseTrailingStop | bool | 是否启用跟踪止损 | | TSL_StepPoints | int | 跟踪止损移动步长 | | MaxPendingPriceMovePoints | int | 挂单价格最大偏差点数 | ## 3. 关键函数解析 ### 3.1 OnInit() - 初始化最小手数和手数步长 - 计算DigitsMultiplier处理3、5位小数的货币对 - 读取当前1小时ATR值(供初始使用) - 初始化缓存数组lastModifyTime用于控制挂单价格修改频率 ### 3.2 OnTick() 1. 时间判断:检查是否在允许交易时间段内 2. 指标计算: - 计算最新ATR和EMA均线 - 判断趋势方向(上涨或下跌) 3. 价格计算:根据ATR和ATR_Multiplier计算买卖挂单触发价格 4. 订单管理: - 调用ManageExistingOrders管理当前所有订单 - 调用TryPlacePending尝试挂新单 ### 3.3 ManageExistingOrders() - **持仓单处理**:应用跟踪止损(如果启用) - **挂单处理**: - 检查挂单时间是否超过5分钟 - 检查价格偏差是否超过阈值 - 检查距离上次修改是否超过10分钟 - 满足条件则修改挂单价格 ### 3.4 TryPlacePending() 1. 趋势判断:确认当前趋势方向 2. 订单检查:确保无同类型挂单或持仓单 3. 挂单执行: - 计算触发价格 - 设置止损止盈(基于SL_Points和TP_Points) - 通过NormalizeLot()计算手数 - 执行挂单操作 ### 3.5 NormalizeLot() - **自动手数模式**: - 根据账户余额和风险模式计算手数 - 计算公式:账户余额/(基数*1000),基数为10、20或30 - **固定手数模式**:使用FixedLot值 - 确保手数符合平台最小手数和步长要求 ### 3.6 ApplyTrailingStop() - **买单处理**: - 新止损价 = 当前Bid价格 - TSL_StepPoints - 仅当价格上涨且新止损价高于旧止损价时修改 - **卖单处理**: - 新止损价 = 当前Ask价格 + TSL_StepPoints - 仅当价格下跌且新止损价低于旧止损价时修改 ### 3.7 ModifyPendingOrder() - 重新计算挂单价格、止损和止盈价格 - 执行订单修改操作 - 输出操作结果日志 ### 3.8 CountActiveOrders() - 统计当前指定类型的订单数量 - 仅计算本EA和当前品种的订单 ## 4. 代码特点与优缺点分析 ### 4.1 优势特点 - **动态适应性**: - 使用ATR动态调整挂单距离 - 自动手数管理适应不同账户规模 - **完善的管理机制**: - 挂单超时自动修正 - 跟踪止损保护利润 - **风险控制**: - 多种风险模式可选 - 交易时间段限制 ### 4.2 潜在改进点 #### 数据结构优化 - 当前lastModifyTime数组可能浪费内存 - 建议改用映射结构或只存储有效挂单时间 #### 功能增强 - 增加挂单修改频率参数化 - 添加订单失败重试机制 - 实现多重趋势确认(增加指标) - 扩展多周期分析能力 #### 风险控制强化 - 添加显式风控模块: - 最大单日亏损限制 - 账户风险控制 - 完善滑点处理机制 - 验证不同经纪商点值计算方式 ## 5. 总结 本EA实现了一个基于趋势跟随和ATR波动率调整的自动交易策略,具有以下核心价值: 1. **智能挂单系统**:结合趋势判断和波动率分析,实现动态价格调整 2. **全自动管理**:从挂单到平仓的完整生命周期管理 3. **灵活配置**:支持多种风险偏好和交易时段设置 4. **代码质量**:结构清晰,可读性好,易于二次开发
1
欢迎大家下载测试。如果对源码感兴趣,可以找我 |