vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 7
声望: 0

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

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

杨切 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
加入于:
帖子: 7
声望: 0

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

Administrator
avatar
加入于:
帖子: 2096
声望: 96

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

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

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

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

用Python的交易员 wrote:
谢谢,请问在运行测试的时候经常报这个错误,该如何避免呢?

  File "E:\yangqie\code\vnpy20190307\trader\engine.py", line 655, in create_spread_algo
    self.subscribe(spread.name)
  File "E:\yangqie\code\vnpy20190307\trader\engine.py", line 755, in subscribe
    self.main_engine.subscribe(req, contract.gateway_name)
  File "E:\yangqie\code\vnpy20190307\trader\engine.py", line 162, in subscribe
    gateway.subscribe(req)
  File "E:\yangqie\code\vnpy20190307\gateway\okexf\okexfGateway.py", line 115, in subscribe
    self.ws_api.subscribe(req)
  File "E:\yangqie\code\vnpy20190307\gateway\okexf\okexfGateway.py", line 426, in subscribe
    self.send_packet(subscribeReq)
  File "E:\yangqie\code\vnpy20190307\api\websocket\websocket_client.py", line 99, in send_packet
    return self._get_ws().send(text, opcode=websocket.ABNF.OPCODE_TEXT)
AttributeError: 'NoneType' object has no attribute 'send'
Administrator
avatar
加入于:
帖子: 2096
声望: 96

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

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

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

Administrator
avatar
加入于:
帖子: 2096
声望: 96

GridTrading的例子在算法交易中有

Member
avatar
加入于:
帖子: 7
声望: 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
加入于:
帖子: 2096
声望: 96

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

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