vn.py官网
开源量化社区
Member
加入于:
帖子: 44
声望: 0

用okex V5的模拟环境做了个eth两个到期合约间的价差交易
先开100多单价差,程序运行没问题,就是委托窗口里的开平方向变来变去,不应该都是开吗?为什么除了第一笔主动腿多开对了外,剩余主动腿都变成了多平?空开到是都对了。
之后平20多单,问题来了,第一笔主动腿空20成交了,但显示为空开,不应该是空平吗?
然后要hedge,多平20,显示多平对了,但数量为-100,导致拒单

description

换个方向试试,先开100空单价差,除了开平显示问题外都正常成交,然后多平20,主动腿直接就是多平-100
所以,主要问题就在对负仓位进行多平时产生的
能否请官方看下程序哪里需要修改一下

Member
加入于:
帖子: 44
声望: 0

看了下程序,发现在价差交易的部分一直到写入日志都是对的,比如主动腿空10之后,被动腿多10是在self.algo_engine.send_order之后写入日志的,都没错,只是在trader的委托窗口,多10就变成了多-100

description

研究一下algo_engine.send_order

Member
avatar
加入于:
帖子: 470
声望: 25

请贴一下具体的委托拒单报错信息。

Member
加入于:
帖子: 44
声望: 0

description
我查了下,感觉应该是-100的原因

Member
加入于:
帖子: 44
声望: 0

通过writelog打印出参数看了下,应该找到问题原因了,问题是holding.long_pos一只都是0,在short时,holding.short_pos被给了long_pos的值,available=0,volume不变,order能成交。 long时,holding.short_pos就是short_pos,由于if else判断有问题,volume最后等于了short_pos,sz负数,所以api拒单
self.write_algo_log(algo,"VOL:{}".format(volume))
self.write_algo_log(algo,"VOL:{}".format(holding.long_pos))
self.write_algo_log(algo,"VOL:{}".format(holding.long_pos_frozen))
self.write_algo_log(algo,"VOL:{}".format(holding.short_pos))
self.write_algo_log(algo,"VOL:{}".format(holding.short_pos_frozen))
if direction == Direction.LONG:
available = holding.short_pos - holding.short_pos_frozen
else:
available = holding.long_pos - holding.long_pos_frozen
self.write_algo_log(algo,"VOL:{}".format(available))

    # If no position to close, just open new
    if not available:
        offset = Offset.OPEN
    # If enougth position to close, just close old
    elif volume < available:
        offset = Offset.CLOSE
    # Otherwise, just close existing position
    else:
        volume = available
        offset = Offset.CLOSE
    self.write_algo_log(algo,"VOL:{}".format(volume))


description

Member
加入于:
帖子: 44
声望: 0

看来官方下班了,折腾了大半天我总结一下吧
algo_engine.send_order里应该有两个问题,首先是long_pos的值给了short_pos,导致holding.long_pos一直是0,这导致了开平的判断错误,但不影响order的成交,感觉开平从始至终都没有用
然后是volume是一个绝对值传进来的,不可能小于零,而short_pos是小于零的,所以感觉available也应该被绝对值一下,之后比较才有用,所以修改
if direction == Direction.LONG:
available = abs(holding.short_pos - holding.short_pos_frozen)
这样改后起码程序运行达到了预期的结果。
希望官方还是能够给个最终方案,多谢!

Administrator
avatar
加入于:
帖子: 5114
声望: 296

巍岱 wrote:

看来官方下班了,折腾了大半天我总结一下吧
algo_engine.send_order里应该有两个问题,首先是long_pos的值给了short_pos,导致holding.long_pos一直是0,这导致了开平的判断错误,但不影响order的成交,感觉开平从始至终都没有用
然后是volume是一个绝对值传进来的,不可能小于零,而short_pos是小于零的,所以感觉available也应该被绝对值一下,之后比较才有用,所以修改
if direction == Direction.LONG:
available = abs(holding.short_pos - holding.short_pos_frozen)
这样改后起码程序运行达到了预期的结果。
希望官方还是能够给个最终方案,多谢!

收到,我们来处理下,这里初步判断是vnpy_okex接口中的合约字段类型有点问题,OKEX V5全都应该是净仓位模式,而不是多空模式

Member
avatar
加入于:
帖子: 3171
声望: 185

巍岱 wrote:

看来官方下班了,折腾了大半天我总结一下吧
algo_engine.send_order里应该有两个问题,首先是long_pos的值给了short_pos,导致holding.long_pos一直是0,这导致了开平的判断错误,但不影响order的成交,感觉开平从始至终都没有用
然后是volume是一个绝对值传进来的,不可能小于零,而short_pos是小于零的,所以感觉available也应该被绝对值一下,之后比较才有用,所以修改
if direction == Direction.LONG:
available = abs(holding.short_pos - holding.short_pos_frozen)
这样改后起码程序运行达到了预期的结果。
希望官方还是能够给个最终方案,多谢!

OKEX价差下单的时候请不要选开平,留空就好了。
报错可能是因为OKEX统一账户接口默认单向持仓,所以所有合约的contract.net_position都是True(即不需要开平转换),所以OffsetConverter通过update_position更新仓位的时候会被is_convert_required判断打回去,所以send_order里获取的available会是0。但是OKEX支持净仓,下单应该只填方向不填开平。
description

description

Member
加入于:
帖子: 44
声望: 0

多谢,今天发现windows版本的okex有很大的问题,想论坛发帖的,后来想是不是要更新一下,pip完就解决问题了,给官方点个赞

© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3

沪公网安备 31011502017034号