Example #1
0
    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()
Example #2
0
    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()
Example #3
0
    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()
Example #4
0
    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
Example #5
0
    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))
Example #7
0
    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
Example #9
0
    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')
        ]
Example #10
0
    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)
Example #11
0
    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)
Example #12
0
 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
Example #13
0
    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'
Example #14
0
 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)
Example #15
0
    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
Example #16
0
    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