def on_trade(self, trade: TradeData): """ Callback of new trade data update. """ if self.entrust == 0 and trade.offset == Offset.OPEN: if trade.direction == Direction.LONG: self.long_price = trade.price else: self.short_price = trade.price msg = f'{trade.offset.value}{trade.direction.value},{trade.volume}张,成交价:{trade.price}' self.write_log(f'交易完成,{trade.orderid},{msg}') if self.get_engine_type() == EngineType.LIVE: sendWxMsg(trade.symbol + msg, '') if self.entrust2 == 0 and trade.offset == Offset.CLOSE: if trade.direction == Direction.LONG: direc = '空' else: direc = '多' msg = f'{trade.offset.value}{direc},{trade.volume}张,成交价:{trade.price}' self.write_log(f'\t交易完成,{trade.orderid},{msg}') if self.get_engine_type() == EngineType.LIVE: sendWxMsg(trade.symbol + msg, '') self.put_event()
def on_order(self, order: OrderData): """收到委托变化推送(必须由用户继承实现)""" ''' SUBMITTING = "提交中" NOTTRADED = "未成交" PARTTRADED = "部分成交" ALLTRADED = "全部成交" CANCELLED = "已撤销" REJECTED = "拒单" 不完全成交会出现下面的重复bug 2019-07-28 00:01:58,261 INFO: tick1: 报单更新,19072722371710923,拒单,平,多单,价87.204 2019-07-28 00:01:58,408 INFO: tick1: 报单更新,19072722371710924,提交中,平,多单,价87.204 2019-07-28 00:01:58,785 INFO: 委托请求出错,代码:1040,信息:Invalid amount, please modify and order again. ''' if order.offset == Offset.OPEN: msg = u'{}{},{}张,价:{}'.format(order.offset.value, order.direction.value, order.traded, order.price) else: if order.direction == Direction.LONG: dir = '空' else: dir = '多' msg = u'{}{},{}张,价:{}'.format(order.offset.value, dir, order.traded, order.price) self.write_log(u' 报单更新,{},{},{}'.format(order.orderid, order.status.value, msg)) if order.status == Status.SUBMITTING: self.entrust = 1 if order.status == Status.NOTTRADED: # if order.offset == Offset.OPEN: # sleep(20) # self.write_log("取消开单") # self.cancel_all() # self.entrust = 0 pass if order.status in [Status.ALLTRADED]: if order.offset == Offset.OPEN: self.new_step = self.step * 0.5 self.wincount = 0 if order.direction == Direction.LONG: self.poss += self.input_ss elif order.direction == Direction.SHORT: self.poss -= self.input_ss self.entrust = 0 sendWxMsg(order.symbol + msg, '') elif order.status in [Status.CANCELLED, Status.REJECTED]: if order.offset == Offset.CLOSE: # 停止单异常 self.write_log("取消多余的平仓单") self.cancel_all() sleep(10) #10s self.entrust = 0 else: pass self.put_event()
def on_order(self, order: OrderData): """ Callback of new order data update. """ if order.status == Status.SUBMITTING: self.entrust = 1 if order.offset == Offset.OPEN: msg = u'{}{},{}张,价:{}'.format(order.offset.value, order.direction.value, order.volume, order.price) else: if order.direction == Direction.LONG: dir = '空' else: dir = '多' msg = u'{}{},{}张,价:{}'.format(order.offset.value, dir, order.volume, order.price) self.write_log(u' 报单更新,{},{},{}'.format(order.orderid, order.status.value, msg)) elif order.status in [Status.ALLTRADED]: if order.offset == Offset.OPEN: msg = u'{}{},{}张,价:{}'.format(order.offset.value, order.direction.value, order.volume, order.price) else: if order.direction == Direction.LONG: dir = '空' else: dir = '多' msg = u'{}{},{}张,价:{}'.format(order.offset.value, dir, order.volume, order.price) self.write_log(u' 报单更新,{},{},{}'.format(order.orderid, order.status.value, msg)) if self.get_engine_type() == EngineType.LIVE: sendWxMsg(order.symbol + msg, '') self.entrust = 0 elif order.status in [Status.CANCELLED, Status.REJECTED]: if order.offset == Offset.CLOSE: # 平单异常 self.write_log("取消多余的平仓单") self.cancel_all() sleep(5) #10s self.entrust = 0 self.put_event()
def on_order(self, order: OrderData): """ Callback of new order data update. """ msg = f'\t报单更新,{order.orderid},{order.symbol},{order.offset.value},价:{order.price},委托:{order.volume},{order.status.value}' self.write_log(msg) if order.volume == order.traded or order.status == Status.ALLTRADED: # 开仓,平仓委托单全部成交 # 计算收益 if order.direction == Direction.LONG: self.buy_times = self.buy_times + 1 self.roi = self.roi - order.price * order.traded * self.rate else: self.sell_times = self.sell_times + 1 self.roi = self.roi + (order.price - self.base_line - order.price * self.rate) * order.traded self.base_line = order.price self.new_up = self.base_line * (1 + self.grid_height / 100) self.new_down = self.base_line / (1 + self.grid_height / 100) self.new_down = round_to(self.new_down, self.min_diff) self.entrust = 0 if self.get_engine_type() == EngineType.LIVE: base_pos = self.cta_engine.main_engine.get_account('.'.join( [order.exchange.value, self.base])) volumn = round_to(base_pos.balance, self.min_volumn) else: volumn = 10 sub = order.symbol + ' ' + order.offset.value + u',{}'.format( order.price) self.roi = round(self.roi, 4) msg2 = u'{},\n低吸次数:{},高抛次数:{},套利:{}{}, 持仓{}'.format( msg, self.buy_times, self.sell_times, self.roi, self.quote, volumn) if self.get_engine_type() == EngineType.LIVE: self.send_email(msg2) sendWxMsg(sub, msg2) elif order.status in [Status.CANCELLED, Status.REJECTED]: self.write_log("取消多余的单") self.cancel_all() sleep(10) # 10s self.entrust = 0 self.put_event()
def on_tick(self, tick: TickData): """ Callback of new tick data update. run once one second """ # 首先检查是否是实盘运行还是数据预处理阶段 if not self.inited or not self.trading: return if self.entrust != 0: return if tick.last_price > self.grid_up_line: if self.__singleton1: if self.get_engine_type() == EngineType.LIVE: sendWxMsg(u'价格上涨超出区间', u'价格:{}'.format(tick.last_price)) self.__singleton1 = False return # 下限清仓 if tick.last_price < self.grid_dn_line: if self.__singleton2: if self.get_engine_type() == EngineType.LIVE: sendWxMsg(u'价格下跌超出区间', u'价格:{}'.format(tick.last_price)) self.__singleton2 = False if self.get_engine_type() == EngineType.LIVE: base_pos = self.cta_engine.main_engine.get_account( '.'.join([tick.exchange.value, self.base])) if base_pos is not None: sell_volume = base_pos.balance else: sell_volume = 0 else: sell_volume = 50 sell_volume = round_to(sell_volume, self.min_volumn) if sell_volume >= self.min_volumn: price = tick.bid_price_1 # 买一价 price = round_to(price, self.min_diff) ref = self.sell(price=price, volume=sell_volume) if ref is not None and len(ref) > 0: self.entrust = -1 self.write_log( u'清仓委托卖出成功, 委托编号:{},委托价格:{},卖出数量{}'.format( ref, price, sell_volume)) if self.get_engine_type() == EngineType.LIVE: sendWxMsg( u'清仓委托卖出成功', u'委托编号:{},委托价格:{},卖出数量{}'.format( ref, price, sell_volume)) else: self.write_log(u'清仓委托卖出{}失败,价格:{},数量:{}'.format( self.vt_symbol, price, sell_volume)) return price = tick.last_price if price <= self.new_down: # 买入,开多 if self.get_engine_type() == EngineType.LIVE: account = self.cta_engine.main_engine.get_account('.'.join( [tick.exchange.value, self.quote])) if account is not None: buy = account.balance else: buy = 0 else: buy = 1000 price = tick.ask_price_1 #卖一价 price = round_to(price, self.min_diff) buy_volume = min(buy / price, float(self.input_ss)) buy_volume = round_to(buy_volume, self.min_volumn) if buy_volume < self.min_volumn: return ref = self.buy(price=price, volume=buy_volume) if ref is not None and len(ref) > 0: self.entrust = 1 self.write_log(u'开多委托单号{},价:{},数量{}'.format( ref, price, buy_volume)) else: self.write_log(u'开多委托单失败:价:{},数量:{}'.format(price, buy_volume)) elif price >= self.new_up: # 卖出,平多 if self.get_engine_type() == EngineType.LIVE: base_pos = self.cta_engine.main_engine.get_account('.'.join( [tick.exchange.value, self.base])) if base_pos is not None: sell_volume1 = base_pos.balance else: sell_volume1 = 0 else: sell_volume1 = 10 price = tick.bid_price_1 #买一价 price = round_to(price, self.min_diff) sell_volume = min(sell_volume1, float(self.input_ss)) sell_volume = round_to(sell_volume, self.min_volumn) if sell_volume < self.min_volumn: return ref = self.sell(price=price, volume=sell_volume) if ref is not None and len(ref) > 0: self.entrust = -1 self.write_log(u'平多委托单号{},价:{},数量{}'.format( ref, price, sell_volume)) else: self.write_log(u'平多委托单失败:价:{},数量:{}'.format( price, sell_volume))