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