5.52K 浏览
1

单进程,单合约。(以下错误看起来好像我同时运行了两个程序,但是查询后台确认是单个进程,单个合约)

满足条件时,执行了:target_pos.set_target_volume(-1)

日志显示:
2020-05-11 21:01:09,865 – INFO – 通知: 下单成功
2020-05-11 21:01:09,893 – INFO – 通知: 成交通知,合约:DCE.a2009,手数:1
2020-05-11 21:01:10,084 – WARNING – 通知: 撤单失败,CTP:报单已全成交或已撤销,不能再撤
2020-05-11 21:01:10,111 – WARNING – 通知: 撤单失败,CTP:报单已全成交或已撤销,不能再撤
2020-05-11 21:01:12,655 – INFO – 通知: 下单成功
2020-05-11 21:01:12,657 – INFO – 通知: 成交通知,合约:DCE.a2009,手数:1

莫名多出来的一笔损失:

问题:

1.像这种异常错误对交易影响是很大的呀,后续下单就会内心揣揣。怎么产生的?如何避免?

2.代码中想限制单位时间内交易笔数(如1分钟内只可做一笔交易,大于一笔交易就等待)如何写代码?

west 已回答的问题 2020年5月14日

希望稳定的在“间隔”时间内检查条件并开平仓,如何写代码更可靠?

鉴于以前实盘遇到几个问题:
1.可能因为价格数据摆动,非常短的时间内开平仓条件交替满足,1分钟内完成几十次开仓平仓动作;
2.下单结果的不可预测性:几秒钟内下单并撤单,结果是“无缘无故多出 一对 买和平操作”而无缘无故造成损失。

希望每次开仓、平仓要间隔一定时间,希望官方给一个例子。
如:
while True:
    api.wait_update()
    if check_con == True:
        target_pos.set_target_volume(1)
    else:
        target_pos.set_target_volume(0)
    sleep(60) ### 官方:用户程序中需要避免阻塞, 不要使用 sleep 暂停程序!!!!

确认无人为干预,全部程序执行。
可能的推测:程序下单set_target_volume(1)手,程序发现价格变动执行撤单操作,撤单操作反馈信息不确定,程序又执行set_target_volume(1),再次检查状态发现set_target_volume ==2了,平一手, 逻辑也算合理。

从执行结果看:下单,一秒后撤单两次,两秒后重新下单,非常快。不会是手工执行的结果。
set_target_volume只能查到源码的:InsertOrderUntilAllTradedTask位置。
“””追价下单task, 该task会在行情变化后自动撤单重下,直到全部成交
(注:此类主要在tqsdk内部使用,并非简单用法,不建议用户使用)”””
文档中能说明下set_target_volume下单滑点可能情况,下单、撤单的概率不?作为用户而言,只希望少滑点,避免逻辑陷阱

2020-05-11 21:01:09,865 – INFO – 通知: 下单成功
2020-05-11 21:01:09,893 – INFO – 通知: 成交通知,合约:DCE.a2009,手数:1
2020-05-11 21:01:10,084 – WARNING – 通知: 撤单失败,CTP:报单已全成交或已撤销,不能再撤
2020-05-11 21:01:10,111 – WARNING – 通知: 撤单失败,CTP:报单已全成交或已撤销,不能再撤
2020-05-11 21:01:12,655 – INFO – 通知: 下单成功
2020-05-11 21:01:12,657 – INFO – 通知: 成交通知,合约:DCE.a2009,手数:1

0

这个不是错误,委托单发送到交易所后任意时间都有可能成交。TargetPosTask在撤单后进行了检查,如果委托单已经成交了就报出”撤单失败“的信息。能调整到正常手数,其实是正常现象,无需特意避免。

west 已回答的问题 2020年5月14日
您正在查看3个答案中的1个,单击此处查看所有答案。