如何通过Python版MetaTrader获取平仓交易的最终止损价格
获取MT5持仓平仓时的最终止损价问题
MT5 Python接口的历史数据访问限制
Python版MetaTrader的文档显示,用户只能通过history_orders_get和history_deals_get函数访问历史交易数据,没有直接的history_positions_get函数。
MT5的交易核心元素
MT5中的交易由以下5个核心元素构成:
- 持仓(Position)
- 开仓订单('In' Order)
- 开仓成交单('In' Deal)
- 平仓订单('Out' Order)
- 平仓成交单('Out' Deal)
这些元素在MT管理端视图中可以更直观地查看。
需求痛点:自定义报表需要最终止损价
对于用Python生成自定义账户报表的用户来说,获取持仓平仓时的最终止损值是关键需求,但当前Python接口仅能访问订单(Order)和成交单(Deal)数据,且存在信息缺失。
示例数据与问题分析
以下是持仓ID为275的所有历史数据:
TradeOrder(ticket=275, time_setup=1657825200, time_setup_msc=1657825200024, time_done=1657825200, time_done_msc=1657825200053, time_expiration=0, type=0, type_time=0, type_filling=0, state=4, magic=0, position_id=275, position_by_id=0, reason=3, volume_initial=12.5, volume_current=0.0, price_open=0.0, sl=138.876, tp=140.266, price_current=139.154, price_stoplimit=0.0, symbol='EURJPY', comment='Long Breakout PERIOD_H1', external_id='') TradeDeal(ticket=285, order=275, time=1657825200, time_msc=1657825200053, type=0, entry=0, magic=0, position_id=275, reason=3, volume=12.5, price=139.154, commission=0.0, swap=0.0, profit=0.0, fee=0.0, symbol='EURJPY', comment='Long Breakout PERIOD_H1', external_id='') TradeOrder(ticket=276, time_setup=1657868538, time_setup_msc=1657868538652, time_done=1657868538, time_done_msc=1657868538652, time_expiration=0, type=1, type_time=0, type_filling=1, state=4, magic=0, position_id=275, position_by_id=0, reason=4, volume_initial=12.5, volume_current=0.0, price_open=139.243, sl=0.0, tp=0.0, price_current=139.243, price_stoplimit=0.0, symbol='EURJPY', comment='[sl 139.243]', external_id='') TradeDeal(ticket=286, order=276, time=1657868538, time_msc=1657868538652, type=1, entry=1, magic=0, position_id=275, reason=4, volume=12.5, price=139.243, commission=0.0, swap=-45.15, profit=800.41, fee=0.0, symbol='EURJPY', comment='[sl 139.243]', external_id='')
从数据中可以看到:
- 只有订单数据包含止损(SL)字段,但开仓订单的SL值(138.876)并非最终平仓时的止损价
- 平仓订单的SL字段为0.0,但备注(comment)中明确标注了
[sl 139.243],而MT5报表显示该持仓确实是以139.243的止损价平仓 - 成交单数据中没有SL或TP字段,无法直接提取
可行解决思路
1. 解析订单/成交单的备注字段
利用订单或成交单的comment字段提取止损值,比如通过正则表达式匹配格式为[sl X.XXX]的内容,提取其中的数字部分。示例代码片段:
import re def extract_sl_from_comment(comment): match = re.search(r'\[sl (\d+\.\d+)\]', comment) if match: return float(match.group(1)) return None # 调用示例 sl_value = extract_sl_from_comment("[sl 139.243]")
2. 追踪持仓的所有修改订单
MT5中修改止损/止盈的操作会生成单独的修改订单(类型为ORDER_TYPE_MODIFY),可以通过history_orders_get筛选出对应position_id的所有订单,按时间排序后取最新的SL值,即为平仓时的最终止损价。
3. 结合MQL5脚本辅助
如果Python接口的限制无法满足需求,可以编写MQL5脚本直接从MT5终端获取持仓的完整历史数据(包括最终止损价),再通过文件、共享内存等方式传递给Python程序处理。
内容的提问来源于stack exchange,提问作者BenHardman
相关产品推荐
相关产品推荐

