使用XTB API tradeTransaction修改持仓失败求助
我正在使用xAPI Playground测试通过tradeTransaction指令修改现有持仓。根据官方文档,修改持仓需将type设为3,cmd需匹配现有持仓(0代表BUY,1代表SELL)。
第一次请求及错误
发送的请求:
{ "command": "tradeTransaction", "arguments": { "tradeTransInfo": { "cmd": 1, "customComment": "Some text", "expiration": 0, "order": order_number_as_int , "price": open_price_as_double, "sl": my_double_value, "tp": my_another_double_value, "symbol": "f.e. OIL.WTI", "type": 3, "volume": 0.01 } } }
返回错误:
{ "status": false, "errorCode": "SE199", "errorDescr": "Internal error" }
现有持仓数据
{'cmd': 1, 'order': 474325736, 'digits': 2, 'offset': 0, 'order2': 474325838, 'position': 474325736, 'symbol': 'OIL.WTI', 'comment': '', 'customComment': '', 'commission': 0.0, 'storage': 0.0, 'margin_rate': 0.0, 'close_price': 76.65, 'open_price': 76.57, 'nominalValue': 0.0, 'profit': -3.56, 'volume': 0.01, 'sl': 80.0, 'tp': 70.0, 'closed': False, 'timestamp': 1676665564666, 'spread': 0, 'taxes': 0.0, 'open_time': 1676663063081, 'open_timeString': 'Fri Feb 17 20:44:23 CET 2023', 'close_time': None, 'close_timeString': None, 'expiration': None, 'expirationString': None},
第二次尝试的请求及错误
尝试其他参数组合后,发送如下请求:
{ "command": "tradeTransaction", "arguments": { "tradeTransInfo": { "cmd": 3, "customComment": "Some text", "expiration": 0, "order": 474325838, "price": 0, "sl": 0, "tp": 0, "symbol": "OIL.WTI", "type": 3, "volume": 0.01 } } }
返回错误:
{ "status": false, "errorCode": "BE4", "errorDescr": "remaining nominal must be greater than zero" }
我已尝试所有可能的cmd和type参数值,问题仍未解决,且联系XTB官方支持尚未收到回复。请问可能是哪里出现了问题?
SE199内部错误的排查方向
参数准确性校验
- 第一次请求中
order用了占位符,实际需填入持仓数据中的position(或order)字段值474325736,不能用占位符或错误ID。price字段对于修改持仓(type=3)场景,无需填写开仓价格,部分情况下需填当前市价或直接省略,错误的价格值可能触发后端校验异常。 - 确认
sl和tp的数值符合品种精度要求:OIL.WTI的digits是2,止损止盈值需保留两位小数(如79.90而非79.9)。
- 第一次请求中
冗余参数清理
修改持仓时,expiration应设为null而非0,因为持仓无到期时间,传入0会导致后端解析逻辑异常。若仅调整止损止盈,无需填写volume字段(或填写与持仓一致的0.01),冗余或错误的参数可能触发内部错误。
BE4错误的原因分析
第二次请求中使用了order=474325838,但该值是持仓数据中的order2字段(通常为关联挂单ID),而非主持仓ID,系统无法识别有效持仓,进而触发“剩余名义金额必须大于0”的错误。另外cmd=3是无效值,修改持仓的cmd必须与原持仓一致(即1),错误的指令类型会导致逻辑混乱。
修正后的请求示例
基于你的持仓数据,正确的修改持仓(调整止损止盈)请求如下:
{ "command": "tradeTransaction", "arguments": { "tradeTransInfo": { "cmd": 1, "customComment": "Modify SL/TP", "expiration": null, "order": 474325736, "sl": 79.50, "tp": 71.00, "symbol": "OIL.WTI", "type": 3 } } }
注意事项:
order必须填写持仓的position或order字段值474325736- 可省略
price和volume字段(或volume填0.01) expiration设为null而非0sl和tp需符合品种精度要求
额外建议
若修正后仍出现SE199,可能是XTB后端临时故障,可换时间段重试;同时检查账户保证金是否充足(修改持仓通常不涉及,但极端场景下可能有影响)、API认证信息是否正确、会话是否未过期。
内容的提问来源于stack exchange,提问作者Daniel

