Ejemplo n.º 1
0
    def _bc_newSignal(self, signal, direction, offset, price, volume):
        """
        对交易信号进行过滤,符合条件的才发单执行。
        计算真实交易价格和数量。
        """
        multiplier = self.portfolioValue * 0.01 / get_contract(
            signal.vtSymbol).size
        multiplier = int(round(multiplier, 0))
        #print(multiplier)
        multiplier = 1

        #print(self.posDict)
        # 计算合约持仓
        if direction == DIRECTION_LONG:
            self.posDict[signal.vtSymbol] += volume * multiplier
        else:
            self.posDict[signal.vtSymbol] -= volume * multiplier

        #print(self.posDict)

        # 对价格四舍五入
        priceTick = get_contract(signal.vtSymbol).price_tick
        price = int(round(price / priceTick, 0)) * priceTick
        self.engine._bc_sendOrder(signal.vtSymbol, direction, offset, price,
                                  volume * multiplier, self.name)

        # 记录成交数据
        trade = TradeData(self.result.date, signal.vtSymbol, direction, offset,
                          price, volume * multiplier)
        # l = self.tradeDict.setdefault(self.result.date, [])
        # l.append(trade)

        self.result.updateTrade(trade)
Ejemplo n.º 2
0
    def _bc_newSignal(self, signal, direction, offset, price, volume):
        """
        对交易信号进行过滤,符合条件的才发单执行。
        计算真实交易价格和数量。
        """
        pos = self.posDict.get(signal.vtSymbol, 0)

        # 如果当前无仓位,则重新根据波动幅度计算委托量单位
        # if pos == 0:
        #     size = get_contract(signal.vtSymbol).size
        #     riskValue = self.portfolioValue * 0.01
        #     multiplier = riskValue / (signal.atrVolatility * size)
        #     multiplier = int(round(multiplier, 0))
        #     self.multiplierDict[signal.vtSymbol] = multiplier
        # else:
        #     multiplier = self.multiplierDict[signal.vtSymbol]

        # 先简化
        multiplier = 1

        # 开仓
        if offset == OFFSET_OPEN:
            # 检查上一次是否为盈利
            if signal.profitCheck:
                pnl = signal.getLastPnl()
                if pnl > 0:
                    return

            # 买入
            if direction == DIRECTION_LONG:
                # 组合持仓不能超过上限
                if self.totalLong > MAX_DIRECTION_POS:
                    return

                # 单品种持仓不能超过上限
                if signal.unit > MAX_PRODUCT_POS:
                    return
            # 卖出
            else:
                if self.totalShort < -MAX_DIRECTION_POS:
                    return

                if signal.unit < -MAX_PRODUCT_POS:
                    return
        # # 平仓
        # else:
        #     if direction == DIRECTION_LONG:
        #         # 必须有空头持仓
        #         if signal.unit >= 0:
        #             return
        #
        #         # 平仓数量不能超过空头持仓
        #         volume = min(volume, abs(signal.unit))
        #     else:
        #         if signal.unit <= 0:
        #             return
        #
        #         volume = min(volume, abs(signal.unit))

        # 更新总持仓
        if direction == DIRECTION_LONG and offset == OFFSET_OPEN:
            self.totalLong += 1  #多开
        if direction == DIRECTION_SHORT and offset != OFFSET_OPEN:
            self.totalLong -= 1  #空平
        if direction == DIRECTION_SHORT and offset == OFFSET_OPEN:
            self.totalShort += 1  #空开
        if direction == DIRECTION_LONG and offset != OFFSET_OPEN:
            self.totalShort -= 1  #多平

        # 更新合约持仓
        if direction == DIRECTION_LONG:
            self.posDict[signal.vtSymbol] += volume * multiplier
        else:
            self.posDict[signal.vtSymbol] -= volume * multiplier

        # 对价格四舍五入
        priceTick = get_contract(signal.vtSymbol).price_tick
        price = int(round(price / priceTick, 0)) * priceTick

        self.engine._bc_sendOrder(signal.vtSymbol, direction, offset, price,
                                  volume * multiplier, self.name)

        # 记录成交数据
        trade = TradeData(self.result.date, signal.vtSymbol, direction, offset,
                          price, volume * multiplier)
        # l = self.tradeDict.setdefault(self.result.date, [])
        # l.append(trade)

        self.result.updateTrade(trade)