1、交易期货当周或次周合约,需要经常换仓,请问从哪里添加好呢?是否需要一个换仓引擎?
2、价差引擎初始化的时候为什么不更新账户持仓呢?
1、交易期货当周或次周合约,需要经常换仓,请问从哪里添加好呢?是否需要一个换仓引擎?
2、价差引擎初始化的时候为什么不更新账户持仓呢?
用Python的交易员 wrote:
- 确实需要开发一个换仓引擎了,这块目前没有通用方案,建议自己做吧
- 价差引擎初始化时,会基于收到的每个合约持仓更新数据,计算生成价差持仓
谢谢 请问 vnpy/app/cta_strategy/engine.py 中send_limit_order方法是不是写错了?
vt_orderid = self.main_engine.send_limit_order(req, contract.gateway_name) 应该修改为
vt_orderid = self.main_engine.send_order(req, contract.gateway_name)
杨切 wrote:
用Python的交易员 wrote:
- 确实需要开发一个换仓引擎了,这块目前没有通用方案,建议自己做吧
- 价差引擎初始化时,会基于收到的每个合约持仓更新数据,计算生成价差持仓
谢谢 请问 vnpy/app/cta_strategy/engine.py 中send_limit_order方法是不是写错了?
vt_orderid = self.main_engine.send_limit_order(req, contract.gateway_name) 应该修改为
vt_orderid = self.main_engine.send_order(req, contract.gateway_name)
确实是bug,已经修复,非常感谢
用Python的交易员
关于策略回测,请问实盘交易中的撤单如果是基于EVENT_TIMER事件触发的,比如委托后等待10s,不成交就撤单。
1、这种情况BacktestingEngine好像没有考虑,是吗?
2、如果要修改,有什么好的建议吗?
时间事件在K线模式的回测中没法很好的模拟,K线周期是1分钟的,委托后10秒撤单根本没法判断是否成交了。
Tick级别的回测模式,如果tick频率足够高理论上可以支持,但实现也同样比较别扭。
更好的方式是基于收到的tick数据时间或者K线数据时间戳来判断时间已经过去了多久。
这是网络不稳定导致的,发包的时候websocket连接断了,推荐换个香港阿里云试试
@用Python的交易员
请问vnpy中有网格交易的例子吗?
GridTrading的例子在算法交易中有
@用Python的交易员
你好,请问v1.9.2-LTS版本中,stBase文件(目录在 vnpy/vnpy/trader/app/spreadTrading/stBase.py)
为什么要清空价格和委托量数据 、清空持仓数据呢,我觉得好像没必要呀?
def calculatePrice(self):
"""计算价格"""
# 清空价格和委托量数据
self.bidPrice = EMPTY_FLOAT
self.askPrice = EMPTY_FLOAT
self.askVolume = EMPTY_INT
self.bidVolume = EMPTY_INT
# 遍历价差腿列表
for n, leg in enumerate(self.allLegs):
# 过滤有某条腿尚未初始化的情况(无挂单量)
if not leg.bidVolume or not leg.askVolume:
self.bidPrice = EMPTY_FLOAT
self.askPrice = EMPTY_FLOAT
self.askVolume = EMPTY_INT
self.bidVolume = EMPTY_INT
return
# 计算价格
if leg.multiplier > 0:
self.bidPrice += leg.bidPrice * leg.multiplier
self.askPrice += leg.askPrice * leg.multiplier
else:
self.bidPrice += leg.askPrice * leg.multiplier
self.askPrice += leg.bidPrice * leg.multiplier
# 计算报单量
if leg.ratio > 0:
legAdjustedBidVolume = floor(leg.bidVolume / leg.ratio)
legAdjustedAskVolume = floor(leg.askVolume / leg.ratio)
else:
legAdjustedBidVolume = floor(leg.askVolume / abs(leg.ratio))
legAdjustedAskVolume = floor(leg.bidVolume / abs(leg.ratio))
if n == 0:
self.bidVolume = legAdjustedBidVolume # 对于第一条腿,直接初始化
self.askVolume = legAdjustedAskVolume
else:
self.bidVolume = min(self.bidVolume, legAdjustedBidVolume) # 对于后续的腿,价差可交易报单量取较小值
self.askVolume = min(self.askVolume, legAdjustedAskVolume)
# 更新时间
self.time = datetime.now().strftime('%H:%M:%S.%f')[:-3]
def calculatePos(self):
"""计算持仓"""
# 清空持仓数据
self.longPos = EMPTY_INT
self.shortPos = EMPTY_INT
self.netPos = EMPTY_INT
因为涉及到累加,清空是一种比较好的代码写法