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)
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)