예제 #1
0
    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()
예제 #2
0
    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()
예제 #3
0
    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()
예제 #4
0
    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()
예제 #5
0
    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))