VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 6
声望: 0

1、交易期货当周或次周合约,需要经常换仓,请问从哪里添加好呢?是否需要一个换仓引擎?
2、价差引擎初始化的时候为什么不更新账户持仓呢?

Administrator
avatar
加入于:
帖子: 4500
声望: 320
  1. 确实需要开发一个换仓引擎了,这块目前没有通用方案,建议自己做吧
  2. 价差引擎初始化时,会基于收到的每个合约持仓更新数据,计算生成价差持仓
Member
avatar
加入于:
帖子: 6
声望: 0

用Python的交易员 wrote:

  1. 确实需要开发一个换仓引擎了,这块目前没有通用方案,建议自己做吧
  2. 价差引擎初始化时,会基于收到的每个合约持仓更新数据,计算生成价差持仓

谢谢 请问 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)

Administrator
avatar
加入于:
帖子: 4500
声望: 320

杨切 wrote:

用Python的交易员 wrote:

  1. 确实需要开发一个换仓引擎了,这块目前没有通用方案,建议自己做吧
  2. 价差引擎初始化时,会基于收到的每个合约持仓更新数据,计算生成价差持仓

谢谢 请问 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,已经修复,非常感谢

Member
avatar
加入于:
帖子: 6
声望: 0

用Python的交易员
关于策略回测,请问实盘交易中的撤单如果是基于EVENT_TIMER事件触发的,比如委托后等待10s,不成交就撤单。
1、这种情况BacktestingEngine好像没有考虑,是吗?
2、如果要修改,有什么好的建议吗?

Administrator
avatar
加入于:
帖子: 4500
声望: 320

时间事件在K线模式的回测中没法很好的模拟,K线周期是1分钟的,委托后10秒撤单根本没法判断是否成交了。

Tick级别的回测模式,如果tick频率足够高理论上可以支持,但实现也同样比较别扭。

更好的方式是基于收到的tick数据时间或者K线数据时间戳来判断时间已经过去了多久。

Administrator
avatar
加入于:
帖子: 4500
声望: 320

这是网络不稳定导致的,发包的时候websocket连接断了,推荐换个香港阿里云试试

Member
avatar
加入于:
帖子: 6
声望: 0

@用Python的交易员
请问vnpy中有网格交易的例子吗?

Administrator
avatar
加入于:
帖子: 4500
声望: 320

GridTrading的例子在算法交易中有

Member
avatar
加入于:
帖子: 6
声望: 0

@用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
Administrator
avatar
加入于:
帖子: 4500
声望: 320

因为涉及到累加,清空是一种比较好的代码写法

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

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】