You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:30:52