def __init__(self, user_cookie=None, portfolio_cookie=None, strategy_name=None, init_cash=100000000, sell_available=None, market_type=MARKET_TYPE.STOCK_CN, running_environment=RUNNING_ENVIRONMENT.BACKETEST): self.user_cookie = user_cookie # self.portfolio_cookie = QA_util_random_with_topic('Portfolio') self.portfolio_cookie = QA_util_random_with_topic( 'Portfolio') if portfolio_cookie is None else portfolio_cookie self.accounts = {} self.strategy_name = strategy_name # 和account一样的资产类 self.init_cash = init_cash self.cash = [self.init_cash] # 可用资金 self.sell_available = sell_available #self.history = [] self.time_index = [] self.commission_coeff = 0.005 self.market_type = market_type self.running_environment = running_environment self.cash_history = [] self.client = DATABASE.portfolio for cookie in self.accounts.keys(): self.accounts[cookie] = QA_Account(account_cookie=cookie) self.reload()
def __init__(self, DataFrame, dtype='undefined', if_fq='bfq', marketdata_type='None'): ''' :param df: DataFrame 类型 :param dtype: 数据 :param if_fq: 是否复权 :param marketdata_type: ''' if 'volume' not in DataFrame.columns and 'vol' in DataFrame.columns: DataFrame = DataFrame.assign(volume=DataFrame.vol) # 🛠todo 判断DataFame 对象字段的合法性,是否正确 self.data = DataFrame.sort_index() self.data.index = self.data.index.remove_unused_levels() # 🛠todo 该变量没有用到, 是不是 self.data_type = marketdata_type ?? self.data_type = dtype # 数据类型 可能的取值 self.type = dtype self.data_id = QA_util_random_with_topic('DATA', lens=3) # 默认是不复权 self.if_fq = if_fq # dtype 参数 指定类 mongo 中 collection 的名字 , # 🛠todo 检查 dtype 字符串是否合法, 放到抽象类中,用子类指定数据库, 后期可以支持mongodb分片集群 # 🛠todo 子类中没有用到mongodb的数据是通过, QA_data_stock_to_fq 实现数据复权的 # 等价执行 例如:type='stock_min' 则执行 DATABASE.stock_min #self.mongo_coll = eval('DATABASE.{}'.format(self.type)) self.choose_db()
def __init__( self, DataFrame, dtype='undefined', ): ''' :param data: DataFrame 类型 :param dtype: 数据 :param marketdata_type: ''' # 🛠todo 判断DataFame 对象字段的合法性,是否正确 self.data = DataFrame.drop_duplicates() # 数据类型 可能的取值 self.type = dtype self.data_id = QA_util_random_with_topic('DATA', lens=3) # dtype 参数 指定类 mongo 中 collection 的名字 , # 🛠todo 检查 dtype 字符串是否合法, 放到抽象类中,用子类指定数据库, 后期可以支持mongodb分片集群 # 🛠todo 子类中没有用到mongodb的数据是通过, QA_data_stock_to_fq 实现数据复权的 # 等价执行 例如:type='stock_min' 则执行 DATABASE.stock_min # self.mongo_coll = eval('DATABASE.{}'.format(self.type)) self.choose_db()
def __init__(self, account_list): """ ||portfolio|| ||acc1_cookie--acc1||acc2-cookie--acc2||...|| ||cash||assets||hold||history||trade_index|| ||Risk_analysis||Performace_analysis|| """ self.account_cookie = QA_util_random_with_topic('PVIEW', 3) self.account_list = dict( zip([account.account_cookie for account in account_list], account_list)) self.portfolio_cookie = QA_util_random_with_topic('Portfolio') self.user_cookie = None
def __init__(self, name=None, *args, **kwargs): super().__init__(*args, **kwargs) self._stopped = False self._main_loop = self.get_event_loop self.name = QA_util_random_with_topic(topic='QA_AsyncThread', lens=3) if name is None else name
def __init__(self, DataFrame, dtype='undefined', if_fq='bfq', marketdata_type='None'): self.data = DataFrame.sort_index(level=1) self.data_type = dtype self.type = dtype self.data_id = QA_util_random_with_topic('DATA', lens=3) self.if_fq = if_fq self.mongo_coll = eval( 'DATABASE.{}'.format(self.type))
def __init__(self, price=None, date=None, datetime=None, sending_time=None, transact_time=None, amount=None, market_type=None, frequence=None, towards=None, code=None, user=None, account_cookie=None, strategy=None, order_model=None, amount_model=AMOUNT_MODEL.BY_AMOUNT, order_id=None, trade_id=None, status='100', callback=False, *args, **kwargs): """委托字段 price 委托的价格 date 委托的日期 datetime 委托的时间 sending_time 发送委托单的时间 transact_time 委托成交的时间 amount 委托量 market_type 委托的市场 frequence 频率 towards 委托方向 code 委托代码 user 委托股东 account_cookie 委托账户的cookie strategy 策略名 order_model 委托方式(限价/市价/下一个bar/) amount_model 委托量模式(按量委托/按总成交额委托) order_id 委托单id trade_id 成交id status 订单状态 callback 回调函数 """ self.price = price self.datetime = None if datetime is None and date is not None: self.date = date self.datetime = '{} 09:31:00'.format(self.date) elif date is None and datetime is not None: self.date = datetime[0:10] self.datetime = datetime elif date is not None and datetime is not None: self.date = date self.datetime = datetime else: pass self.sending_time = self.datetime if sending_time is None else sending_time # 下单时间 self.transact_time = transact_time self.amount = amount self.towards = towards # side self.code = code self.user = user self.market_type = market_type self.frequence = frequence self.account_cookie = account_cookie self.strategy = strategy self.type = market_type # see below self.order_model = order_model self.amount_model = amount_model self.order_id = QA_util_random_with_topic( topic='Order') if order_id is None else order_id self.trade_id = trade_id self.status = status self.callback = callback
def __init__(self, queue=None, name=None): threading.Thread.__init__(self) self.queue = Queue() if queue is None else queue self.thread_stop = False self.__flag = threading.Event() # 用于暂停线程的标识 self.__flag.set() # 设置为True self.__running = threading.Event() # 用于停止线程的标识 self.__running.set() # 将running设置为True self.name = QA_util_random_with_topic(topic='QAWorker', lens=3) if name is None else name
def callback_message(self): # 这是标准的return back message return [ self.order.account_cookie, self.order.sending_time, self.trade_time, self.order.code, None, self.order.towards, float("%.2f" % float(self.deal_price)), self.order.price, self.status, self.order.amount, self.deal_amount, self.trade_money, 0, self.order.order_id, QA_util_random_with_topic('Trade') ]
def __init__(self, user_cookie=None, strategy_name=None, init_assets=1000000, cash=None, sell_available=None, history=None): self.accounts = {} self.portfolio_cookie = QA_util_random_with_topic('Portfolio') self.user_cookie = user_cookie self.strategy_name = strategy_name # 和account一样的资产类 self.init_assets = 1000000 if init_assets is None else init_assets self.cash = [self.init_assets] if cash is None else cash self.cash_available = self.cash[-1] # 可用资金 self.sell_available = sell_available self.history = [] if history is None else history self.time_index = [] for cookie in self.accounts.keys(): self.accounts[cookie] = QA_Account(account_cookie=cookie)
def __init__(self, user_cookie=None, portfolio_cookie=None, strategy_name=None, init_cash=1000000, sell_available=None): self.user_cookie = user_cookie # self.portfolio_cookie = QA_util_random_with_topic('Portfolio') self.portfolio_cookie = QA_util_random_with_topic( 'Portfolio') if portfolio_cookie is None else portfolio_cookie self.accounts = {} self.strategy_name = strategy_name # 和account一样的资产类 self.init_cash = init_cash self.cash = [self.init_cash] self.cash_available = self.cash[-1] # 可用资金 self.sell_available = sell_available #self.history = [] self.time_index = [] for cookie in self.accounts.keys(): self.accounts[cookie] = QA_Account(account_cookie=cookie)
def callback_message(self): # 这是标准的return back message message = { 'header': { 'source': 'market', 'status': self.status, 'code': self.order.code, 'session': { 'user': self.order.user, 'strategy': self.order.strategy, 'account': self.order.account_cookie }, 'order_id': self.order.order_id, 'trade_id': QA_util_random_with_topic('Trade') }, 'body': { 'order': { 'price': float("%.2f" % float(self.deal_price)), 'code': self.order.code, 'amount': self.deal_amount, 'date': self.order.date, 'datetime': self.order.datetime, 'towards': self.order.towards }, 'market': { 'open': self.market_data['open'], 'high': self.market_data['high'], 'low': self.market_data['low'], 'close': self.market_data['close'], 'volume': self.market_data['volume'], 'code': self.market_data['code'] }, 'fee': { 'commission': self.commission_fee, 'tax': self.tax } } } return message
def __init__(self, price=None, date=None, datetime=None, sending_time=None, trade_time=False, amount=0, market_type=None, frequence=None, towards=None, code=None, user_cookie=None, account_cookie=None, strategy=None, order_model=None, money=None, amount_model=AMOUNT_MODEL.BY_AMOUNT, broker=None, order_id=None, trade_id=False, _status=ORDER_STATUS.NEW, callback=False, commission_coeff=0.00025, tax_coeff=0.001, exchange_id=None, position_id=None, *args, **kwargs): ''' QA_Order 对象表示一个委托业务, 有如下字段 - price 委托价格 (限价单用) - date 委托日期 (一般日线级别回测用) - datetime 当前时间 (分钟线级别和实时用) - sending_time 委托时间 (分钟线级别和实时用) - trade_time 成交时间 [list] (分钟/日线/实盘时用, 一笔订单多次成交会不断append进去) - amount 委托数量 - frequence 频率 (回测用 DAY/1min/5min/15min/30min/...) - towards 买卖方向 - code 订单的品种 - user_cookie 订单发起者 - account_cookie 订单发起账户的标识 - stratgy 策略号 - order_model 委托方式(限价/市价/下一个bar/) type str eg 'limit' - money 订单金额 - amount_model 委托量模式(按量委托/按总成交额委托) type str 'by_amount' - order_id 委托单id - trade_id 成交单id - _status 内部维护的订单状态 - callback 当订单状态改变的时候 主动回调的函数(可以理解为自动执行的OnOrderAction) - commission_coeff 手续费系数 - tax_coeff 印花税系数(股票) - exchange_id 交易所id (一般用于实盘期货) :param args: type tuple :param kwargs: type dict # 2018-08-12 把order变成一个状态机> # 以前的order只是一个信息承载的工具,现在需要让他具备状态的方法 NEW = 100 SUCCESS_ALL = 200 SUCCESS_PART = 203 # success_part 是部分成交 一个中间状态 剩余的订单还在委托队列中 QUEUED = 300 # queued 用于表示在order_queue中 实际表达的意思是订单存活 待成交 CANCEL = 400 CANCEL_PART = 402 # cancel_part是部分撤单(及 下单后成交了一部分 剩余的被撤单 这是一个最终状态) SETTLED = 500 FAILED = 600 ''' self.price = price self.datetime = None # 🛠todo 移动到 Util 类中 时间处理函数 if datetime is None and date is not None: self.date = date self.datetime = '{} 09:31:00'.format(self.date) elif date is None and datetime is not None: self.date = datetime[0:10] self.datetime = datetime elif date is not None and datetime is not None: self.date = date self.datetime = datetime else: pass self.sending_time = self.datetime if sending_time is None else sending_time # 下单时间 self.trade_time = trade_time if trade_time else [] # 成交时间 self.amount = amount # 委托数量 self.trade_amount = 0 # 成交数量 self.cancel_amount = 0 # 撤销数量 self.towards = towards # side self.code = code # 委托证券代码 self.user_cookie = user_cookie # 委托用户 self.market_type = market_type # 委托市场类别 self.frequence = frequence # 委托所在的频率(回测用) self.account_cookie = account_cookie self.strategy = strategy self.type = market_type # see below self.order_model = order_model self.amount_model = amount_model self.order_id = QA_util_random_with_topic( topic='Order') if order_id is None else order_id self.realorder_id = self.order_id self.commission_coeff = commission_coeff self.tax_coeff = tax_coeff self.trade_id = trade_id if trade_id else [] self.market_preset = MARKET_PRESET().get_code(self.code) self.trade_price = 0 # 成交均价 self.broker = broker self.callback = callback # 委托成功的callback self.money = money # 委托需要的金钱 self.reason = None # 原因列表 self.exchange_id = exchange_id self.time_condition = 'GFD' # 当日有效 self._status = _status self.position_id = position_id # 增加订单对于多账户以及多级别账户的支持 2018/11/12 self.mainacc_id = None if 'mainacc_id' not in kwargs.keys( ) else kwargs['mainacc_id'] self.subacc_id = None if 'subacc_id' not in kwargs.keys( ) else kwargs['subacc_id'] self.direction = 'BUY' if self.towards in [ ORDER_DIRECTION.BUY, ORDER_DIRECTION.BUY_OPEN, ORDER_DIRECTION.BUY_CLOSE ] else 'SELL' self.offset = 'OPEN' if self.towards in [ ORDER_DIRECTION.BUY, ORDER_DIRECTION.BUY_OPEN, ORDER_DIRECTION.SELL_OPEN ] else 'CLOSE'
def __init__(self): self.accounts = {} self.portfolio_cookie = QA_util_random_with_topic('Portfolio') for cookie in self.accounts.keys(): self.accounts[cookie] = QA_Account(account_cookie=cookie)
def __init__(self, price=None, date=None, datetime=None, sending_time=None, transact_time=None, amount=None, market_type=None, frequence=None, towards=None, code=None, user=None, account_cookie=None, strategy=None, order_model=None, money=None, amount_model=AMOUNT_MODEL.BY_AMOUNT, order_id=None, trade_id=None, status='100', callback=False, commission_coeff=0.00025, tax_coeff=0.001, *args, **kwargs): ''' QA_Order 对象表示一个委托业务, 有如下字段 :param price: 委托的价格 type float :param date: 委托的日期 type str , eg 2018-11-11 :param datetime: 委托的时间 type str , eg 2018-11-11 00:00:00 :param sending_time: 发送委托单的时间 type str , eg 2018-11-11 00:00:00 :param transact_time: 委托成交的时间 :param amount: 委托量 type int :param market_type: 委托的市场 type str eg 'stock_cn' :param frequence: 频率 type str 'day' :param towards: 委托方向 type int :param code: 委托代码 type str :param user: 委托股东 :param account_cookie: 委托账户的cookietype type str eg 'Acc_4UckWFG3' :param strategy: 策略名 type str :param order_model: 委托方式(限价/市价/下一个bar/) type str eg 'limit' :param money: 金额 type float :param amount_model: 委托量模式(按量委托/按总成交额委托) type str 'by_amount' :param order_id: 委托单id :param trade_id: 成交id :param status: 订单状态 type str '100' '200' '300' :param callback: 回调函数 type bound method eg QA_Account.receive_deal :param commission_coeff: 默认 0.00025 type float :param tax_coeff: 默认 0.0015 type float :param args: type tuple :param kwargs: type dict ''' self.price = price self.datetime = None #🛠todo 移动到 Util 类中 时间处理函数 if datetime is None and date is not None: self.date = date self.datetime = '{} 09:31:00'.format(self.date) elif date is None and datetime is not None: self.date = datetime[0:10] self.datetime = datetime elif date is not None and datetime is not None: self.date = date self.datetime = datetime else: pass self.sending_time = self.datetime if sending_time is None else sending_time # 下单时间 self.transact_time = transact_time self.amount = amount self.towards = towards # side self.code = code self.user = user self.market_type = market_type self.frequence = frequence self.account_cookie = account_cookie self.strategy = strategy self.type = market_type # see below self.order_model = order_model self.amount_model = amount_model self.order_id = QA_util_random_with_topic( topic='Order') if order_id is None else order_id self.commission_coeff = commission_coeff self.tax_coeff = tax_coeff self.trade_id = trade_id self.status = status self.callback = callback self.money = money
def __init__(self, price=None, date=None, datetime=None, sending_time=None, transact_time=None, amount=None, market_type=None, frequence=None, towards=None, code=None, user=None, account_cookie=None, strategy=None, order_model=None, money=None, amount_model=AMOUNT_MODEL.BY_AMOUNT, order_id=None, trade_id=[], _status=ORDER_STATUS.NEW, callback=False, commission_coeff=0.00025, tax_coeff=0.001, *args, **kwargs): ''' QA_Order 对象表示一个委托业务, 有如下字段 :param price: 委托的价格 type float :param date: 委托的日期 type str , eg 2018-11-11 :param datetime: 委托的时间 type str , eg 2018-11-11 00:00:00 :param sending_time: 发送委托单的时间 type str , eg 2018-11-11 00:00:00 :param transact_time: 委托成交的时间 :param amount: 委托量 type int :param trade_amount 成交数量 :param cancel_amount 撤销数量 :param market_type: 委托的市场 type str eg 'stock_cn' :param frequence: 频率 type str 'day' :param towards: 委托方向 type int :param code: 委托代码 type str :param user: 委托股东 :param account_cookie: 委托账户的cookietype type str eg 'Acc_4UckWFG3' :param strategy: 策略名 type str :param order_model: 委托方式(限价/市价/下一个bar/) type str eg 'limit' :param money: 金额 type float :param amount_model: 委托量模式(按量委托/按总成交额委托) type str 'by_amount' :param order_id: 委托单id :param trade_id: 成交id :param _status: 订单状态 type str '100' '200' '300' :param callback: 回调函数 type bound method eg QA_Account.receive_deal :param commission_coeff: 默认 0.00025 type float :param tax_coeff: 默认 0.0015 type float :param args: type tuple :param kwargs: type dict # 2018-08-12 把order变成一个状态机> # 以前的order只是一个信息承载的工具,现在需要让他具备状态的方法 NEW = 100 SUCCESS_ALL = 200 SUCCESS_PART = 203 # success_part 是部分成交 一个中间状态 剩余的订单还在委托队列中 QUEUED = 300 # queued 用于表示在order_queue中 实际表达的意思是订单存活 待成交 CANCEL = 400 CANCEL_PART = 402 # cancel_part是部分撤单(及 下单后成交了一部分 剩余的被撤单 这是一个最终状态) SETTLED = 500 FAILED = 600 ''' self.price = price self.datetime = None # 🛠todo 移动到 Util 类中 时间处理函数 if datetime is None and date is not None: self.date = date self.datetime = '{} 09:31:00'.format(self.date) elif date is None and datetime is not None: self.date = datetime[0:10] self.datetime = datetime elif date is not None and datetime is not None: self.date = date self.datetime = datetime else: pass self.sending_time = self.datetime if sending_time is None else sending_time # 下单时间 self.transact_time = transact_time # 成交时间 self.amount = amount # 委托数量 self.trade_amount = 0 # 成交数量 self.cancel_amount = 0 # 撤销数量 self.towards = towards # side self.code = code # 委托证券代码 self.user = user # 委托用户 self.market_type = market_type # 委托市场类别 self.frequence = frequence # 委托所在的频率(回测用) self.account_cookie = account_cookie self.strategy = strategy self.type = market_type # see below self.order_model = order_model self.amount_model = amount_model self.order_id = QA_util_random_with_topic( topic='Order') if order_id is None else order_id self.realorder_id = self.order_id self.commission_coeff = commission_coeff self.tax_coeff = tax_coeff self.trade_id = trade_id self.trade_price = 0 # 成交均价 self.callback = callback # 委托成功的callback self.money = money # 委托需要的金钱 self.reason = None # 原因列表 self._status = _status