Exemple #1
0
def seed(dbpath=DBPATH):
    ORM.dbpath = dbpath

    default = Account(username='******',
                      balance=10000.00,
                      first='sami',
                      last='s',
                      api_key="12345678912345678902")
    default.set_password('1234')
    default.save()

    default_buy = Trade(buy_sell='Buy',
                        username='******',
                        ticker='tsla',
                        price='100',
                        shares='10',
                        time=time())
    default_buy.save()

    default_sale = Trade(buy_sell='Sell',
                         username='******',
                         ticker='tsla',
                         price='110',
                         shares='5',
                         time=time())
    default_sale.save()

    default_position = Position(username='******', ticker='tsla', shares='5')
    default_position.save()
def parse_trade_data(trade_data_list):
    trades = []

    for trade_data in trade_data_list:
        if len(trade_data['STOCK CODE']) > 0:  # check that row is not empty
            trade = Trade(asset_name=trade_data['STOCK CODE'],
                          entry_date=trade_data['BUY DATE'],
                          exit_date=trade_data['SELL DATE'],
                          buy_price=trade_data['BUY PRICE'],
                          number_of_shares=trade_data['NUMBER OF SHARES'])
            if trade.data_fetch_successful:
                trades.append(trade)

    portfolio = Portfolio(trades)
    return portfolio
 def record_trade(self, stock_symbol, trade_data, stock=None):
     """
     :param stock:
     :return:
     :type stock_symbol: string
     :type trade_data: Trade object
     """
     if not stock_symbol:
         logger.error("record_trade :: Stock Symbol can not be empty")
         raise ValueError("Stock Symbol cannot be None")
     if not trade_data:
         logger.error("record_trade :: Trade data can not be empty")
         raise ValueError("Trade data cannot be None")
     if not stock:
         stock = get_stock_by_symbol(stock_symbol)
     trade = Trade()
     trade.indicator = trade_data.indicator
     trade.price = trade_data.price
     trade.quantity = trade_data.quantity
     trade.timestamp = trade_data.timestamp
     stock.trade_list = trade
     print(stock.trade_list)
     return stock
def __get__trade_list(account_id, trade_array, order_dict):
    trade_list = []
    for trade_info in trade_array:
        trade_db = Trade()
        trade_db.symbol = getattr(trade_info, 'm_strInstrumentID', '')
        trade_db.order_id = getattr(trade_info, 'm_strOrderSysID', '')
        if trade_db.order_id not in order_dict:
            print '[Error]unfind OrderID:', trade_db.order_id
            continue

        trade_db.trade_id = getattr(trade_info, 'm_strTradeID', '')

        trading_day = getattr(trade_info, 'm_strTradeDate', '')
        insert_time = getattr(trade_info, 'm_strTradeTime', '')
        if (trading_day != '') and (insert_time != ''):
            insert_time_str = '%s-%s-%s %s' % (trading_day[0:4],
                                               trading_day[4:6],
                                               trading_day[6:8], insert_time)
            if insert_time > now_datetime_str:
                insert_time_str = '%s %s' % (last_trading_day, insert_time)
        else:
            insert_time_str = '%s 00:00:00' % (now_date_str, )
        trade_db.time = insert_time_str

        order_db = order_dict[trade_db.order_id]
        qty = getattr(trade_info, 'm_nVolume', '')
        if order_db.direction == '48':
            trade_db.qty = qty
        elif order_db.direction == '49':
            trade_db.qty = 0 - int(qty)

        trade_db.price = getattr(trade_info, 'm_dAveragePrice', '')

        # 普通成交:'0'|期权执行:'1'|OTC成交:'2'|期转现衍生成交:'3'|组合衍生成交:'4'
        trade_db.trade_type = 0
        # 开仓:'0'|平仓:'1'|强平:'2'|平今:'3'|平昨:'4'|强减:'5'|本地强平:'6'
        trade_db.offsetflag = getattr(trade_info, 'm_nOffsetFlag', '')

        trade_db.account = account_id
        trade_db.direction = getattr(trade_info, 'm_nDirection', '')

        hedge_flag = getattr(trade_info, 'm_nHedgeFlag', '')
        trade_db.hedgeflag = HEDGE_FLAG_MAP[hedge_flag]
        trade_list.append(trade_db)
    return trade_list
def __build_trade(account_id, order_info):
    trade_db = Trade()
    trade_db.account = account_id
    trade_db.order_id = getattr(order_info, 'ORDER_ID', '')

    trade_db.trade_id = getattr(order_info, 'SYS_ORDER_ID', '')

    trade_db.time = getattr(order_info, 'FILL_TIME', '').replace('/', '-')

    message_symbol = getattr(order_info, 'SYMBOL', 'NULL').split('.')[0]
    instrumet_db = instrument_dict[message_symbol]
    trade_db.symbol = instrumet_db.ticker

    # 成交量
    filled_quantity = getattr(order_info, 'FILLED_QUANTITY', '')
    trade_db.qty = Decimal(filled_quantity)

    trade_db.price = Decimal(getattr(order_info, 'FILLED_PRICE', ''))

    # 普通成交:'0'|期权执行:'1'|OTC成交:'2'|期转现衍生成交:'3'|组合衍生成交:'4'
    trade_db.trade_type = 0
    # 开仓:'0'|平仓:'1'|强平:'2'|平今:'3'|平昨:'4'|强减:'5'|本地强平:'6'
    action = getattr(order_info, 'ACTION', '')
    if action == 'BUYTOOPEN':
        # 0:开仓  1:平仓  3:平今  4:平昨
        trade_db.offsetflag = 0
        # 0:买,1:卖
        trade_db.direction = 0
    elif action == 'BUYTOCLOSE':
        if 'yd' in trade_db.order_id:
            trade_db.offsetflag = 4
        else:
            trade_db.offsetflag = 1
        trade_db.direction = 0
    elif action == 'SELLTOOPEN':
        trade_db.offsetflag = 0
        trade_db.direction = 1
    elif action == 'SELLTOCLOSE':
        if 'yd' in trade_db.order_id:
            trade_db.offsetflag = 4
        else:
            trade_db.offsetflag = 1
        trade_db.direction = 1

    trade_db.hedgeflag = 0
    return trade_db
Exemple #6
0
    def match(self, open_orders):
        price_board = self._env.price_board
        for account, order in open_orders:
            order_book_id = order.order_book_id
            instrument = self._env.get_instrument(order_book_id)

            if np.isnan(price_board.get_last_price(order_book_id)):
                listed_date = instrument.listed_date.date()
                if listed_date == self._trading_dt.date():
                    reason = _(
                        u"Order Cancelled: current security [{order_book_id}] can not be traded in listed date [{listed_date}]"
                    ).format(
                        order_book_id=order.order_book_id,
                        listed_date=listed_date,
                    )
                else:
                    reason = _(
                        u"Order Cancelled: current bar [{order_book_id}] miss market data."
                    ).format(order_book_id=order.order_book_id)
                order.mark_rejected(reason)
                continue

            deal_price = self._deal_price_decider(order_book_id, order.side)
            if order.type == ORDER_TYPE.LIMIT:
                if order.side == SIDE.BUY and order.price < deal_price:
                    continue
                if order.side == SIDE.SELL and order.price > deal_price:
                    continue
                # 是否限制涨跌停不成交
                if self._price_limit:
                    if order.side == SIDE.BUY and deal_price >= price_board.get_limit_up(
                            order_book_id):
                        continue
                    if order.side == SIDE.SELL and deal_price <= price_board.get_limit_down(
                            order_book_id):
                        continue
                if self._liquidity_limit:
                    if order.side == SIDE.BUY and price_board.get_a1(
                            order_book_id) == 0:
                        continue
                    if order.side == SIDE.SELL and price_board.get_b1(
                            order_book_id) == 0:
                        continue
            else:
                if self._price_limit:
                    if order.side == SIDE.BUY and deal_price >= price_board.get_limit_up(
                            order_book_id):
                        reason = _(
                            "Order Cancelled: current bar [{order_book_id}] reach the limit_up price."
                        ).format(order_book_id=order.order_book_id)
                        order.mark_rejected(reason)
                        continue
                    if order.side == SIDE.SELL and deal_price <= price_board.get_limit_down(
                            order_book_id):
                        reason = _(
                            "Order Cancelled: current bar [{order_book_id}] reach the limit_down price."
                        ).format(order_book_id=order.order_book_id)
                        order.mark_rejected(reason)
                        continue
                if self._liquidity_limit:
                    if order.side == SIDE.BUY and price_board.get_a1(
                            order_book_id) == 0:
                        reason = _(
                            "Order Cancelled: [{order_book_id}] has no liquidity."
                        ).format(order_book_id=order.order_book_id)
                        order.mark_rejected(reason)
                        continue
                    if order.side == SIDE.SELL and price_board.get_b1(
                            order_book_id) == 0:
                        reason = _(
                            "Order Cancelled: [{order_book_id}] has no liquidity."
                        ).format(order_book_id=order.order_book_id)
                        order.mark_rejected(reason)
                        continue

            if self._volume_limit:
                bar = self._env.bar_dict[order_book_id]
                volume_limit = round(
                    bar.volume *
                    self._volume_percent) - self._turnover[order.order_book_id]
                round_lot = instrument.round_lot
                volume_limit = (volume_limit // round_lot) * round_lot
                if volume_limit <= 0:
                    if order.type == ORDER_TYPE.MARKET:
                        reason = _(
                            u"Order Cancelled: market order {order_book_id} volume {order_volume}"
                            u" due to volume limit").format(
                                order_book_id=order.order_book_id,
                                order_volume=order.quantity)
                        order.mark_cancelled(reason)
                    continue

                unfilled = order.unfilled_quantity
                fill = min(unfilled, volume_limit)
            else:
                fill = order.unfilled_quantity

            ct_amount = account.positions.get_or_create(
                order.order_book_id).cal_close_today_amount(fill, order.side)
            price = self._slippage_decider.get_trade_price(
                order.side, deal_price)
            trade = Trade.__from_create__(
                order_id=order.order_id,
                calendar_dt=self._calendar_dt,
                trading_dt=self._trading_dt,
                price=price,
                amount=fill,
                side=order.side,
                position_effect=order.position_effect,
                order_book_id=order.order_book_id,
                frozen_price=order.frozen_price,
                close_today_amount=ct_amount)
            trade._commission = self._commission_decider.get_commission(
                account.type, trade)
            trade._tax = self._tax_decider.get_tax(account.type, trade)
            order.fill(trade)
            self._turnover[order.order_book_id] += fill

            self._env.event_bus.publish_event(
                Event(EVENT.TRADE, account=account, trade=trade, order=order))

            if order.type == ORDER_TYPE.MARKET and order.unfilled_quantity != 0:
                reason = _(
                    u"Order Cancelled: market order {order_book_id} volume {order_volume} is"
                    u" larger than 25 percent of current bar volume, fill {filled_volume} actually"
                ).format(order_book_id=order.order_book_id,
                         order_volume=order.quantity,
                         filled_volume=order.filled_quantity)
                order.mark_cancelled(reason)
Exemple #7
0
 def __init__(self):        
     self.tradeObject = Trade()       
def __get__trade_list(account_id, trade_array, order_dict):
    trade_list = []
    for trade_info in trade_array:
        trade_db = Trade()
        trade_db.symbol = getattr(trade_info, 'InstrumentID', '')
        if local_server_name == 'huabao':
            if not ('IH' in trade_db.symbol or 'IC' in trade_db.symbol or 'IF' in trade_db.symbol):
                continue
        if local_server_name == 'zhongxin':
            if 'IH' in trade_db.symbol or 'IC' in trade_db.symbol or 'IF' in trade_db.symbol:
                continue

        trade_db.order_id = getattr(trade_info, 'OrderSysID', '')
        if trade_db.order_id not in order_dict:
            print '[Error]unfind OrderID:', trade_db.order_id
            continue

        trade_db.trade_id = getattr(trade_info, 'TradeID', '')

        trading_day = getattr(trade_info, 'TradeDate', '')
        insert_time = getattr(trade_info, 'TradeTime', '')
        if (trading_day != '') and (insert_time != ''):
            insert_time_str = '%s-%s-%s %s' % (trading_day[0:4], trading_day[4:6], trading_day[6:8], insert_time)
            if insert_time > now_datetime_str:
                insert_time_str = '%s %s' % (last_trading_day, insert_time)
        else:
            insert_time_str = '%s 00:00:00' % (now_date_str,)
        trade_db.time = insert_time_str

        order_db = order_dict[trade_db.order_id]
        qty = getattr(trade_info, 'Volume', '')
        if order_db.direction == '0':
            trade_db.qty = qty
        elif order_db.direction == '1':
            trade_db.qty = 0 - int(qty)

        trade_db.price = getattr(trade_info, 'Price', '')

        # 普通成交:'0'|期权执行:'1'|OTC成交:'2'|期转现衍生成交:'3'|组合衍生成交:'4'
        trade_db.trade_type = getattr(trade_info, 'TradeType', '')
        # 开仓:'0'|平仓:'1'|强平:'2'|平今:'3'|平昨:'4'|强减:'5'|本地强平:'6'
        trade_db.offsetflag = getattr(trade_info, 'OffsetFlag', '')

        trade_db.account = account_id
        trade_db.direction = getattr(trade_info, 'Direction', '')

        hedge_flag = getattr(trade_info, 'HedgeFlag', '')
        trade_db.hedgeflag = const.HEDGE_FLAG_MAP[hedge_flag]
        trade_list.append(trade_db)
    return trade_list
def save_trade(account_id, trade_array):
    for trade_info in trade_array:
        trade_db = Trade()
        trade_db.trade_id = getattr(trade_info, 'TradeID', '')

        trading_day = getattr(trade_info, 'TradingDay', '')
        insert_time = getattr(trade_info, 'InsertTime', '')
        if (trading_day != '') and (insert_time != ''):
            insert_time_str = '%s-%s-%s %s' % (trading_day[0:4], trading_day[4:6], trading_day[6:8], insert_time)
        else:
            insert_time_str = '%s 00:00:00' % (today_str,)
        trade_db.time = insert_time_str

        trade_db.symbol = getattr(trade_info, 'InstrumentID', '')
        trade_db.qty = getattr(trade_info, 'TradeVolume', '')
        trade_db.price = getattr(trade_info, 'TradePrice', '')
        trade_db.account = account_id
        trade_db.order_id = getattr(trade_info, 'OrderSysID', '')
        # 买:'0'|卖:'1'
        trade_db.direction = getattr(trade_info, 'Direction', '')
        # 开仓:'0'|平仓:'1'|强平:'2'|平今:'3'|平昨:'4'
        trade_db.offsetflag = getattr(trade_info, 'OffsetFlag', '')

        hedge_flag = getattr(trade_info, 'HedgeFlag', '1')
        if hedge_flag == '':
            trade_db.hedgeflag = '0'
        else:
            trade_db.hedgeflag = const.HEDGE_FLAG_MAP[hedge_flag]
        trade_list.append(trade_db)
Exemple #10
0
def __get__trade_list(account_id, trade_array, order_dict):
    trade_list = []
    for trade_info in trade_array:
        trade_db = Trade()
        trade_db.symbol = getattr(trade_info, 'stock_code', '')
        trade_db.order_id = getattr(trade_info, 'report_no', '')
        if trade_db.order_id not in order_dict:
            print '[Error]unfind OrderID:', trade_db.order_id
            continue

        trade_db.trade_id = getattr(trade_info, 'business_no', '')

        trading_day = getattr(trade_info, 'date', '')
        insert_time = getattr(trade_info, 'business_time', '').zfill(6)
        if (trading_day != '') and (insert_time != ''):
            insert_time_str = '%s-%s-%s %s:%s:%s' % (trading_day[0:4], trading_day[4:6], trading_day[6:8], \
                                               insert_time[:2], insert_time[2:4], insert_time[4:6])
            if insert_time > now_datetime_str:
                insert_time_str = '%s %s' % (last_trading_day, insert_time)
        else:
            insert_time_str = '%s 00:00:00' % (now_date_str, )
        trade_db.time = insert_time_str

        order_db = order_dict[trade_db.order_id]
        qty = getattr(trade_info, 'business_amount', '')
        if order_db.direction == '0':
            trade_db.qty = qty
        elif order_db.direction == '1':
            trade_db.qty = 0 - float(qty)

        trade_db.price = getattr(trade_info, 'business_price', '')

        # 普通成交:'0'|期权执行:'1'|OTC成交:'2'|期转现衍生成交:'3'|组合衍生成交:'4'
        trade_db.trade_type = 0

        # trade_db.offsetflag = getattr(trade_info, 'm_nOffsetFlag', '')
        trade_db.offsetflag = 0

        trade_db.account = account_id
        trade_db.direction = getattr(trade_info, 'entrust_bs', '')

        # hedge_flag = getattr(trade_info, 'm_nHedgeFlag', '')
        # trade_db.hedgeflag = HEDGE_FLAG_MAP[hedge_flag]
        trade_db.hedgeflag = 0

        trade_list.append(trade_db)
    return trade_list
Exemple #11
0
    def _match(self, account, order):
        order_book_id = order.order_book_id
        price_board = self._env.price_board

        last_price = price_board.get_last_price(order_book_id)

        if np.isnan(last_price):
            instrument = self._env.get_instrument(order_book_id)
            listed_date = instrument.listed_date.date()
            if listed_date == self._env.trading_dt.date():
                reason = _(
                    "Order Cancelled: current security [{order_book_id}] can not be traded in listed date [{listed_date}]"
                ).format(
                    order_book_id=order_book_id,
                    listed_date=listed_date,
                )
            else:
                reason = _(
                    u"Order Cancelled: current bar [{order_book_id}] miss market data."
                ).format(order_book_id=order_book_id)
            order.mark_rejected(reason)
            self._env.event_bus.publish_event(
                Event(EVENT.ORDER_UNSOLICITED_UPDATE,
                      account=account,
                      order=order))
            return

        if order.type == ORDER_TYPE.LIMIT:
            deal_price = order.frozen_price
        else:
            deal_price = last_price

        if self._price_limit:
            """
            在 Signal 模式下,不再阻止涨跌停是否买进,price_limit 参数表示是否给出警告提示。
            """
            if order.side == SIDE.BUY and deal_price >= price_board.get_limit_up(
                    order_book_id):
                user_system_log.warning(
                    _(u"You have traded {order_book_id} with {quantity} lots in {bar_status}"
                      ).format(order_book_id=order_book_id,
                               quantity=order.quantity,
                               bar_status=BAR_STATUS.LIMIT_UP))
                return
            if order.side == SIDE.SELL and deal_price <= price_board.get_limit_down(
                    order_book_id):
                user_system_log.warning(
                    _(u"You have traded {order_book_id} with {quantity} lots in {bar_status}"
                      ).format(order_book_id=order_book_id,
                               quantity=order.quantity,
                               bar_status=BAR_STATUS.LIMIT_DOWN))
                return

        ct_amount = account.positions.get_or_create(
            order_book_id).cal_close_today_amount(order.quantity, order.side)
        trade_price = self._slippage_decider.get_trade_price(
            order.side, deal_price)
        trade = Trade.__from_create__(order_id=order.order_id,
                                      calendar_dt=self._env.calendar_dt,
                                      trading_dt=self._env.trading_dt,
                                      price=trade_price,
                                      amount=order.quantity,
                                      side=order.side,
                                      position_effect=order.position_effect,
                                      order_book_id=order_book_id,
                                      frozen_price=order.frozen_price,
                                      close_today_amount=ct_amount)
        trade._commission = self._commission_decider.get_commission(
            account.type, trade)
        trade._tax = self._tax_decider.get_tax(account.type, trade)
        order.fill(trade)

        self._env.event_bus.publish_event(
            Event(EVENT.TRADE, account=account, trade=trade, order=order))