def account_record_creat(token, report_date, db): """资产每日记录""" if not is_report: return True # 查询账户信息 raw_data = {} raw_data['flt'] = {"account_id": token} db_data = DBData(db_name=SETTINGS['ACCOUNT_DB'], db_cl=token, raw_data=raw_data) account = db.on_query_one(db_data) if not account: return False # 创建每日账户记录 account_daily = AccountRecord(account_id=account['account_id'], check_date=report_date, assets=account['assets'], available=account['available'], market_value=account['market_value']) raw_data = {} raw_data['flt'] = {'check_date': report_date} raw_data['data'] = account_daily db_data = DBData(db_name=SETTINGS['ACCOUNT_RECORD'], db_cl=token, raw_data=raw_data) db.on_replace_one(db_data)
def on_account_delete(token: str, db): """账户删除""" try: account = DBData(db_name=SETTINGS['ACCOUNT_DB'], db_cl=token, raw_data={}) db.on_collection_delete(account) position = DBData(db_name=SETTINGS['POSITION_DB'], db_cl=token, raw_data={}) db.on_collection_delete(position) order = DBData(db_name=SETTINGS['TRADE_DB'], db_cl=token, raw_data={}) db.on_collection_delete(order) account_record = DBData(db_name=SETTINGS['ACCOUNT_RECORD'], db_cl=token, raw_data={}) db.on_collection_delete(account_record) pos_record = DBData(db_name=SETTINGS['POS_RECORD'], db_cl=token, raw_data={}) db.on_collection_delete(pos_record) return True except BaseException: return False
def calculate_result(token, db, start: str = None, end: str = None): """计算结果""" # 查询账户信息 raw_data = {} raw_data['flt'] = {"account_id": token} db_data = DBData(db_name=SETTINGS['ACCOUNT_DB'], db_cl=token, raw_data=raw_data) account = db.on_query_one(db_data) if not account: return False captial = account['captial'] cost = account['cost'] tax = account['tax'] slipping = account['slipping'] # 资产记录表 account_df = load_account_record(token, db, captial, start, end) # 持仓记录表 pos_df = load_pos_record(token, db, start, end) # 交易记录表 trade_df = load_trade_record(token, db, cost, tax, start, end) return captial, account_df, pos_df, trade_df
def pos_record_update_sell(token, db, symbol, pos): """更新持仓记录--卖出减仓""" if not is_report: return True query_flt = {'pt_symbol': symbol, 'is_clear': 0} data = query_pos_record_one(token, db, query_flt) if data: max_vol = data['max_vol'] sell_price = data['sell_price_mean'] + ( (pos['vol'] / max_vol) * pos['sell_price']) else: raise ValueError("持仓记录不存在") raw_data = {} raw_data["flt"] = {'pt_symbol': symbol, 'is_clear': 0} raw_data["set"] = { '$set': { 'sell_price_mean': round(sell_price, P), 'profit': pos['profit'], 'last_sell_date': pos['date'] } } db_data = DBData(db_name=SETTINGS['POS_RECORD'], db_cl=token, raw_data=raw_data) return db.on_update(db_data)
def on_account_add(account_info: dict, db): """创建账户""" token = get_token() # 账户参数 param = { 'capital': SETTINGS['CAPITAL'], 'cost': SETTINGS['COST'], 'tax': SETTINGS['TAX'], 'slippoint': SETTINGS['SLIPPOINT'], 'info': "" } # 更新账户参数 param.update(account_info) account = Account(account_id=token, assets=round(float(param['capital']), P), available=round(float(param['capital']), P), market_value=round(0.0, P), capital=round(float(param['capital']), P), cost=float(param['cost']), tax=float(param['tax']), slippoint=float(param['slippoint']), account_info=param['info']) account_dict = copy.copy(account.__dict__) raw_data = {} raw_data['flt'] = {'account_id': token} raw_data['data'] = account db_data = DBData(db_name=SETTINGS['ACCOUNT_DB'], db_cl=token, raw_data=raw_data) if db.on_insert(db_data): return account_dict
def on_position_insert(order: Order, cost: float, db): """持仓增加""" profit = cost * -1 available = order.traded if order.trade_type == TradeType.T_PLUS1.value: available = 0 pos = Position(code=order.code, exchange=order.exchange, account_id=order.account_id, buy_date=order.order_date, volume=order.traded, available=available, buy_price=order.trade_price, now_price=order.trade_price, profit=profit) raw_data = {} raw_data['flt'] = {'pt_symbol': pos.pt_symbol} raw_data['data'] = pos db_data = DBData(db_name=SETTINGS['POSITION_DB'], db_cl=order.account_id, raw_data=raw_data) if db.on_insert(db_data): # 保存持仓记录 return pos_record_creat(order.account_id, db, pos)
def pos_record_update_buy(token, db, symbol, pos: dict): """更新持仓记录--买入加仓""" if not is_report: return True # 查询持仓记录 flt = {'pt_symbol': symbol, 'is_clear': 0} data = query_pos_record_one(token, db, flt) if data: new_max_vol = data['max_vol'] + pos['vol'] else: raise ValueError("持仓记录不存在") raw_data = {} raw_data["flt"] = flt raw_data["set"] = { '$set': { 'max_vol': new_max_vol, 'buy_price_mean': pos['buy_price'], 'profit': pos['profit'] } } db_data = DBData(db_name=SETTINGS['POS_RECORD'], db_cl=token, raw_data=raw_data) return db.on_update(db_data)
def on_orders_clear(token, db): """订单数据清空""" raw_data = {} raw_data['flt'] = {} db_data = DBData(db_name=SETTINGS['TRADE_DB'], db_cl=token, raw_data=raw_data) db.on_collection_delete(db_data)
def on_position_delete(data: dict, db): """持仓删除事件""" raw_data = {} raw_data["flt"] = {'pt_symbol': data["symbol"]} db_data = DBData(db_name=SETTINGS['POSITION_DB'], db_cl=data['token'], raw_data=raw_data) db.on_delete(db_data)
def pos_record_clear(token, db): """持仓记录清空""" raw_data = {} raw_data['flt'] = {} db_data = DBData(db_name=SETTINGS['POS_RECORD'], db_cl=token, raw_data=raw_data) db.on_collection_delete(db_data)
def account_record_clear(token, db): """账户记录清空""" raw_data = {} raw_data['flt'] = {} db_data = DBData(db_name=SETTINGS['ACCOUNT_RECORD'], db_cl=token, raw_data=raw_data) db.on_collection_delete(db_data)
def on_position_clear(token: str, db): """持仓清空事件""" raw_data = {} raw_data['flt'] = {} db_data = DBData(db_name=SETTINGS['POSITION_DB'], db_cl=token, raw_data=raw_data) db.on_collection_delete(db_data)
def account_record_insert_many(token, record_list, db): """批量保存账户记录数据""" raw_data = {} raw_data['flt'] = {} raw_data['data'] = record_list db_data = DBData(db_name=SETTINGS['ACCOUNT_RECORD'], db_cl=token, raw_data=raw_data) return db.on_insert_many(db_data)
def account_record_creat(account_record, db): """资产每日记录""" raw_data = {} raw_data['flt'] = {'check_date': account_record.check_date} raw_data['data'] = account_record db_data = DBData(db_name=SETTINGS['ACCOUNT_RECORD'], db_cl=account_record.account_id, raw_data=raw_data) db.on_replace_one(db_data)
def pos_record_creat(pos_record, db): """创建持仓记录""" raw_data = {} raw_data['flt'] = {} raw_data['data'] = pos_record db_data = DBData(db_name=SETTINGS['POS_RECORD'], db_cl=pos_record.account_id, raw_data=raw_data) return db.on_insert(db_data)
def pos_record_insert_many(token, record_list, db): """批量保存持仓记录数据""" raw_data = {} raw_data['flt'] = {} raw_data['data'] = record_list db_data = DBData(db_name=SETTINGS['POS_RECORD'], db_cl=token, raw_data=raw_data) return db.on_insert_many(db_data)
def on_position_insert(pos: Position, db): """持仓增加""" raw_data = {} raw_data['flt'] = {'pt_symbol': pos.pt_symbol} raw_data['data'] = pos db_data = DBData(db_name=SETTINGS['POSITION_DB'], db_cl=pos.account_id, raw_data=raw_data) db.on_insert(db_data)
def pos_record_update_liq(data, db): """更新持仓记录--清仓""" raw_data = {} raw_data["flt"] = {'pt_symbol': data['symbol'], 'is_clear': 0} raw_data["set"] = {'$set': {'is_clear': 1}} db_data = DBData(db_name=SETTINGS['POS_RECORD'], db_cl=data['token'], raw_data=raw_data) return db.on_update(db_data)
def on_orders_insert_many(token, order_list, db): """批量保存订单数据""" raw_data = {} raw_data['flt'] = {} raw_data['data'] = order_list db_data = DBData(db_name=SETTINGS['TRADE_DB'], db_cl=token, raw_data=raw_data) return db.on_insert_many(db_data)
def on_account_avl_update(data: dict, db): """账户可用资金更新""" raw_data = {} raw_data["flt"] = {'account_id': data['token']} raw_data["set"] = {'$set': {'available': data['avl']}} db_data = DBData(db_name=SETTINGS['ACCOUNT_DB'], db_cl=data['token'], raw_data=raw_data) return db.on_update(db_data)
def on_position_avl_update(data: dict, db): """可用证券更新""" raw_data = {} raw_data["flt"] = {'pt_symbol': data['symbol']} raw_data["set"] = {'$set': {'available': data['avl']}} db_data = DBData(db_name=SETTINGS['POSITION_DB'], db_cl=data['token'], raw_data=raw_data) return db.on_update(db_data)
def on_buy_frozen(account, pay: float, db): """买入资金冻结""" available = account["available"] - pay raw_data = {} raw_data["flt"] = {'account_id': account["account_id"]} raw_data["set"] = {'$set': {'available': available}} db_data = DBData(db_name=SETTINGS['ACCOUNT_DB'], db_cl=account["account_id"], raw_data=raw_data) return db.on_update(db_data)
def on_sell_frozen(pos, vol: float, db): """卖出证券冻结""" available = pos["available"] - vol raw_data = {} raw_data["flt"] = {'pt_symbol': pos['pt_symbol']} raw_data["set"] = {'$set': {'available': available}} db_data = DBData(db_name=SETTINGS['POSITION_DB'], db_cl=pos["account_id"], raw_data=raw_data) return db.on_update(db_data)
def on_sell_cancel(order: Order, db): """卖出取消""" result, pos = query_position_one(order.account_id, order.pt_symbol, db) available = pos["available"] + order.volume - order.traded raw_data = {} raw_data["flt"] = {'pt_symbol': pos["pt_symbol"]} raw_data["set"] = {'$set': {'available': available}} db_data = DBData(db_name=SETTINGS['POSITION_DB'], db_cl=pos["account_id"], raw_data=raw_data) return db.on_update(db_data)
def query_pos_record_one(token, db, flt): """获取持仓记录""" raw_data = {} raw_data['flt'] = flt db_data = DBData(db_name=SETTINGS['POS_RECORD'], db_cl=token, raw_data=raw_data) pos_record = db.on_query_one(db_data) if pos_record: return pos_record else: return False
def pos_record_update_liq(token, db, symbol): """更新持仓记录--清仓""" if not is_report: return True raw_data = {} raw_data["flt"] = {'pt_symbol': symbol, 'is_clear': 0} raw_data["set"] = {'$set': {'is_clear': 1}} db_data = DBData(db_name=SETTINGS['POS_RECORD'], db_cl=token, raw_data=raw_data) return db.on_update(db_data)
def on_orders_exist(token: str, order_id: str, db): """查询订单是否存在""" raw_data = {} raw_data["flt"] = {'order_id': order_id} db_data = DBData(db_name=SETTINGS['TRADE_DB'], db_cl=token, raw_data=raw_data) order = db.on_select(db_data) if order.count(): return True else: return False
def query_position_one(token: str, symbol: str, db): """查询某一只证券的持仓""" raw_data = {} raw_data["flt"] = {'pt_symbol': symbol} db_data = DBData(db_name=SETTINGS['POSITION_DB'], db_cl=token, raw_data=raw_data) pos = db.on_query_one(db_data) if pos: return True, pos else: return False, ""
def on_orders_status_modify(self, order): """更新订单状态""" raw_data = {} raw_data['flt'] = {'order_id': order.order_id} raw_data["set"] = {'$set': {'status': Status.NOTTRADED.value}} db_data = DBData( db_name=SETTINGS['ORDERS_BOOK'], db_cl=self.market_name, raw_data=raw_data ) return self.db.on_update(db_data)
def query_order_status(token: str, order_id: str, db): """查询订单情况""" raw_data = {} raw_data["flt"] = {'order_id': order_id} db_data = DBData(db_name=SETTINGS['TRADE_DB'], db_cl=token, raw_data=raw_data) order = db.on_query_one(db_data) if order: return True, order["status"] else: return False, "无此订单"