Esempio n. 1
0
class NewAnalyze2(object):
    def __init__(self):
        self.__config = Config()
        try:
            if self.__config.get_mongo_config()['load_from_mongo']:
                self.__mongo_client = pymongo.MongoClient(
                    self.__config.get_mongo_config()['mongo_url'])
                self.__mongo_client.admin.command('ismaster')
                self.__config.update_proxy(self.get_t1_from_mongo())
                self.__config.get_mongo_config(
                )['load_time'] = dt.datetime.now()
        except Exception as e:
            MyLog.error('can not connect to mongo, %s' % e)
        self.__buyedCount = 0
        self.__balance = self.__config.get_t1()['trade']['balance']
        if self.__config.get_t1()['trade']['enable']:
            self.__trade = Trade()
        if self.__config.get_t1()['trade']['enableMock']:
            self.__mockTrade = MockTrade()
        self.__engine = create_engine(self.__config.get_DBurl())

    def get_t1_from_mongo(self):
        for doc in self.__mongo_client['stocking']['config'].find(
            {'t1': {
                '$exists': True
            }}):
            return doc
        return None

    def update_config_if_needed(self):
        try:
            if self.__config.get_mongo_config(
            )['load_from_mongo'] and self.__config.get_mongo_config(
            )['load_time'] is not None and (
                    dt.datetime.now() -
                    self.__config.get_mongo_config()['load_time']
            ).seconds > self.__config.get_mongo_config()['load_interval']:
                self.__config.update_proxy(self.get_t1_from_mongo())
                self.__config.get_mongo_config(
                )['load_time'] = dt.datetime.now()
        except Exception as e:
            MyLog.error('failed to update config %s ' % e)

    def printPerformace(self, timestamp):
        deltaSeconds = (dt.datetime.now() - timestamp).seconds
        if deltaSeconds > 3:
            print('calc more than %s seconds' % deltaSeconds)

    def calcMain(self, zs, dh, timestamp, balance, lock):
        self.update_config_if_needed()
        data = dh.get_data()
        finalCode = ''
        result = []
        codes = []
        for code in data:
            if not self.hasNewData(data[code]):
                continue
            if code in dh.get_ignore():
                continue
        #   self.updateStock(data[code],dh)
            if code in dh.get_buyed():
                #self.cancelBuyIfNeed(data[code],dh,timestamp,lock,balance)
                #continue
                pass
            try:
                if self.calc(zs, data[code], dh):
                    result.append(data[code])
            #  self.printPerformace(timestamp)
            except Exception as e:
                last_line = data[code].get_Lastline()
                MyLog.error(last_line['time'] + ' :calc ' + code + ' error')
                MyLog.error(str(e))
        if len(result) != 0:
            for stock in result:
                try:
                    last_line = stock.get_Lastline()
                    return self.outputRes(stock, last_line, timestamp, dh,
                                          balance, lock)
                except Exception as e:
                    MyLog.error('outputRes error %s' % stock.get_code())
                    MyLog.error(str(e))

    def updateStock(self, stock, dh):
        self.updateBreak10(stock)
        max_amount = stock.get_cache('max_b1_amount')
        now_line = stock.get_Lastline()
        stop_price = round(float(now_line['pre_close']) * 1.1, 2)
        if float(now_line['b1_p']) == stop_price:
            now_amount = float(now_line['b1_p']) * self.convertToFloat(
                now_line['b1_v']) * 100
            if max_amount is None or now_amount > max_amount:
                stock.set_cache('max_b1_amount', now_amount)
        if stock.get_code() in dh.get_buyed():
            last_second_line = stock.get_LastSecondline()
            if last_second_line is None or float(
                    last_second_line['b1_p']) != stop_price:
                return
            deal_amount = self.convertToFloat(
                now_line['amount']) - self.convertToFloat(
                    last_second_line['amount'])
            old_deal_amount = stock.get_cache('deal_amount')
            if old_deal_amount is None:
                stock.set_cache('deal_amount', [deal_amount])
            else:
                if len(old_deal_amount) >= 15:
                    old_deal_amount.pop(0)
                old_deal_amount.append(deal_amount)
                stock.set_cache('deal_amount', old_deal_amount)

    def cancelBuyIfNeed(self, stock, dh, timestamp, lock, balance):
        trade = self.__config.get_t1()['trade']
        last_second_line = stock.get_LastSecondline()
        now_line = stock.get_Lastline()
        last_second_buy1_v = self.convertToFloat(last_second_line['b1_v'])
        last_second_buy1_amount = float(
            last_second_line['b1_p']) * last_second_buy1_v * 100
        now_buy1_v = self.convertToFloat(now_line['b1_v'])
        now_buy1_amount = float(now_line['b1_p']) * now_buy1_v * 100
        stop_price = round(float(now_line['pre_close']) * 1.1, 2)
        max_b1_amount = stock.get_cache('max_b1_amount')
        deal_amount = self.convertToFloat(
            now_line['amount']) - self.convertToFloat(
                last_second_line['amount'])
        cancel_b1_amount = self.__config.get_t1()['hit10']['cancel_b1_amount']
        strTime = time.strftime('%H:%M:%S', time.localtime(time.time()))
        if strTime > '13:30:00':
            cancel_b1_amount = self.__config.get_t1(
            )['hit10']['cancel_b1_amount_1']
        if strTime > '14:30:00':
            cancel_b1_amount = self.__config.get_t1(
            )['hit10']['cancel_b1_amount_2']
        if max_b1_amount is None:
            max_b1_amount = -1
        sum_last_10_deal_amount = 0
        last_10_deal_amount = stock.get_cache('deal_amount')
        if last_10_deal_amount is not None:
            sum_last_10_deal_amount = sum(last_10_deal_amount)
        if float(now_line['price']) == stop_price:
            if float(now_line['b1_p']) == stop_price and self.convertToFloat(
                    now_line['a1_v']
            ) == 0 and (
                    now_buy1_amount < cancel_b1_amount
                    or now_buy1_v < last_second_buy1_v *
                    self.__config.get_t1()['hit10']['cancel_ratio']
                    or now_buy1_amount < max_b1_amount *
                    self.__config.get_t1()['hit10']['cancel_ratio_max_amount']
                    or deal_amount >= now_buy1_amount *
                    self.__config.get_t1()['hit10']['cancel_deal_amount_ratio']
                    or sum_last_10_deal_amount > now_buy1_amount *
                    self.__config.get_t1()['hit10']['max_deal_amount']):
                info = '[%s] 在 [%s] 撤单 [%s],b1_v=%s' % (
                    Utils.getCurrentTime(), str(now_line['date']) + ' ' +
                    str(now_line['time']), stock.get_code(), now_buy1_v)
                MyLog.info(info)
                if trade['enable'] or trade['enableMock']:
                    self.cancelBuy(trade, stock, dh, lock, balance)
                # self.printPerformace(timestamp)

    @Utils. async
    def save_to_excel(self, stock):
        try:
            now_line = stock.get_Lastline()
            df = pd.DataFrame(stock.get_data())
            writer = pd.ExcelWriter(
                'D:/aqua/stock/stocking/data/result/%s-%s.xlsx' %
                (stock.get_code(), now_line['time'].replace(':', '-')))
            df.to_excel(writer, 'Sheet1')
            writer.save()
        except Exception as e:
            MyLog.error('save %s error, e = %s' % (stock.get_code(), e))

    def cancelBuy(self, trade, stock, dh, lock, balance):
        status = -1
        if trade['enable']:
            try:
                lock.acquire()
                status = self.__trade.cancel(stock.get_code(), True)
                buyMoney = stock.get_cache('buyMoney')
                if buyMoney is not None:
                    balance.value = balance.value + buyMoney
            except Exception as e:
                pass
            finally:
                lock.release()
        if trade['enableMock']:
            buyMoney = stock.get_cache('buyMoney')
            if buyMoney is not None:
                balance.value = balance.value + buyMoney
            status = self.__mockTrade.cancelBuy(stock.get_code())
        #cancel success
        if status == 0:
            MyLog.info('[%s] 撤单成功' % stock.get_code())
            now_line = stock.get_Lastline()
            now_buy1_v = self.convertToFloat(now_line['b1_v'])
            now_buy1_amount = float(now_line['b1_p']) * now_buy1_v * 100
            stock.set_cache('cancel_b1_amount', now_buy1_amount)
            dh.get_buyed().remove(stock.get_code())
        #cancel failed, already buyed
        else:
            MyLog.info('[%s] 撤单失败' % stock.get_code())
            stock.add_cancelTimes()
            if stock.get_cancelTimes() >= 2:
                dh.add_ignore(stock.get_code())

    def outputRes(self, stock, df_final, timestamp, dh, balance, lock):
        p = (float(df_final['price']) - float(df_final['pre_close'])) / float(
            df_final['pre_close'])
        d_price = round(float(df_final['pre_close']) * (1 + p + 0.005), 2)
        #   d_price = round(float(df_final['price']) + 0.02, 2)
        trade = self.__config.get_t1()['trade']
        buyVolume = trade['volume']
        if trade['dynamicVolume']:
            buyVolume = int(trade['amount'] / d_price / 100) * 100
        buyMoney = d_price * buyVolume
        price = str('%.2f' % d_price)
        try:
            if lock is not None:
                lock.acquire()
            if balance is not None and buyMoney > balance.value or buyVolume == 0:
                return None
            if df_final['code'] in dh.get_buyed():
                dh.add_ignore(df_final['code'])
            info = '在 %s 以 %s 买入 [%s]%s %s 股' % (
                str(df_final['date']) + ' ' + str(df_final['time']), price,
                df_final['code'], df_final['name'], str(buyVolume))
            MyLog.info(info)
            now = dt.datetime.now()
            deltaSeconds = (now - timestamp).seconds
            if deltaSeconds > trade['timestampLimit']:
                MyLog.info('[%s] 行情超时 %s秒 放弃买入' %
                           (df_final['code'], deltaSeconds))
                return None
            if trade['enable']:
                res = str(
                    self.__trade.buy(df_final['code'], buyVolume,
                                     float(price)))
                if 'entrust_no' in res or 'success' in res:
                    if balance is not None:
                        balance.value = balance.value - buyMoney
                    stock.set_cache('buyMoney', buyMoney)
                    stock.set_cache('buy_price', d_price)
                    dh.add_buyed(df_final['code'])
                    return df_final['code'], str(d_price)
                return None
            if trade['enableMock']:
                res = self.__mockTrade.mockTrade(df_final['code'],
                                                 float(price), buyVolume)
                if res == 0:
                    if balance is not None:
                        balance.value = balance.value - buyMoney
                    stock.set_cache('buyMoney', buyMoney)
                    stock.set_cache('buy_price', d_price)
                    dh.add_buyed(df_final['code'])
                    return df_final['code'], str(d_price)
                return None
            stock.set_cache('buy_price', d_price)
            dh.add_buyed(df_final['code'])
            return df_final['code'], str(d_price)
        except Exception as e:
            MyLog.error(e)
            return None
        finally:
            if lock is not None:
                lock.release()
            self.save_to_excel(stock)
        #   self.printPerformace(timestamp)

    def calc(self, zs, stock, dh):
        if not self.canCalc(stock, dh):
            return False
        if stock.get_code() in dh.get_buyed():
            try:
                return self.is_bc_point(stock, dh)
            except Exception as e:
                MyLog.error('bc point error %s' % e)
                return False
        return self.isStockMatch(zs, stock, dh)

    def isOpenMatch(self, row):
        if float(row['pre_close']) == 0 or float(row['open']) == 0:
            return False
        return (float(row['open']) - float(row['pre_close'])) / float(
            row['pre_close']) * 100 >= -1.5

    def hasNewData(self, stock):
        lastLine = stock.get_Lastline()
        if stock.get_time() == lastLine['time']:
            return False
        stock.set_time(lastLine['time'])
        return True

    def canCalc(self, stock, dh):
        if stock.len() < 2:
            return False
        lastLine = stock.get_Lastline()
        lastSecondLine = stock.get_LastSecondline()
        if float(lastLine['open']) == 0.0 or float(
                lastSecondLine['open']) == 0.0:
            return False
        return True

    def convertToFloat(self, str):
        if str == '':
            return 0
        try:
            return float(str)
        except Exception as e:
            MyLog.error('convertToFloat error: ' + str + '\n')
            return 0

    def isStockMatch(self, zs, stock, dh):
        if self.isZSMatch(zs, stock):
            if stock.get_cache('ignore_ydls') is None and self.isYDLS(
                    stock, dh):
                return True
        try:
            return self.is_tail_match(stock, dh)
        except Exception as e:
            MyLog.error('buy tailed error %s' % e)
            return False

    def is_tail_match(self, stock, dh):
        now_line = stock.get_Lastline()
        if now_line['time'] < '14:30:00':
            return False
        cur_p = self.getCurrentPercent(stock)
        if cur_p > self.__config.get_t1()['buy_tail']['p_range'][
                1] or cur_p < self.__config.get_t1()['buy_tail']['p_range'][0]:
            return False
        now_price = self.convertToFloat(now_line['price'])
        lowest_price = self.convertToFloat(now_line['low'])
        highest_price = self.convertToFloat(now_line['high'])
        if now_price == lowest_price or (
                now_price - lowest_price) / self.convertToFloat(
                    now_line['pre_close']) * 100 > self.__config.get_t1(
                    )['buy_tail']['p_limit_lowest']:
            return False
        if (highest_price - lowest_price) / self.convertToFloat(
                now_line['pre_close']) * 100 < self.__config.get_t1(
                )['buy_tail']['high_low_diff']:
            return False
        datas = stock.get_data()
        start = -15
        if len(datas) < start * -1:
            start = len(datas) * -1
        amount = self.convertToFloat(
            datas[-1]['buy_amount']) - self.convertToFloat(
                datas[start]['buy_amount'])
        sell_amount = self.convertToFloat(
            datas[-1]['sell_amount']) - self.convertToFloat(
                datas[start]['sell_amount'])
        amount_ratio = 100
        if sell_amount != 0.0:
            amount_ratio = amount / sell_amount
        tag = amount > self.__config.get_t1(
        )['buy_tail']['min_amount'] and amount_ratio > self.__config.get_t1(
        )['buy_tail']['amount_ratio']
        if tag:
            MyLog.info(
                'buy tail match : time = %s, lowest_price = %s, buy_amount = %s, sell_amount = %s, amount_ratio = %s'
                % (now_line['date'] + ' ' + now_line['time'], lowest_price,
                   amount, sell_amount, amount_ratio))
        return tag

    def get_data_time(self, data):
        return dt.datetime.strptime(data['date'] + ' ' + data['time'],
                                    '%Y-%m-%d %H:%M:%S')

    def is_bc_point(self, stock, dh):
        now_line = stock.get_Lastline()
        now_second_line = stock.get_LastSecondline()
        buyed_price = stock.get_cache('buy_price')
        now_price = self.convertToFloat(now_line['price'])
        if buyed_price is not None and (
                buyed_price - now_price) / self.convertToFloat(
                    now_line['pre_close']) * 100 < self.__config.get_t1(
                    )['bc_point']['p_drop']:
            return False
        lowest_price = stock.get_cache('lowest_price')
        if lowest_price is None or lowest_price > now_price:
            lowest_price = now_price
            stock.set_cache('lowest_price', lowest_price)
        if now_price == lowest_price or (
                now_price - lowest_price) / self.convertToFloat(
                    now_line['pre_close']) * 100 > self.__config.get_t1(
                    )['bc_point']['p_limit_lowest']:
            return False
        datas = stock.get_data()
        start = -15
        if len(datas) < start * -1:
            start = len(datas) * -1
        amount = self.convertToFloat(
            datas[-1]['buy_amount']) - self.convertToFloat(
                datas[start]['buy_amount'])
        sell_amount = self.convertToFloat(
            datas[-1]['sell_amount']) - self.convertToFloat(
                datas[start]['sell_amount'])
        amount_ratio = 100
        if sell_amount != 0.0:
            amount_ratio = amount / sell_amount
        tag = amount > self.__config.get_t1(
        )['bc_point']['min_amount'] and amount_ratio > self.__config.get_t1(
        )['bc_point']['amount_ratio']
        if tag:
            MyLog.info(
                'bc buy match: time = %s, lowest_price = %s, buy_amount = %s, sell_amount = %s, amount_ratio = %s'
                % (now_line['date'] + ' ' + now_line['time'], lowest_price,
                   amount, sell_amount, amount_ratio))
        return tag

    def isYDLS(self, stock, dh):
        now_line = stock.get_Lastline()
        high_limit = round(
            decimal.Decimal(self.convertToFloat(now_line['pre_close']) * 1.1),
            2)
        if self.convertToFloat(now_line['price']) >= float(high_limit):
            stock.set_cache('ignore_ydls', True)
            self.save_to_excel(stock)
            return False
        if self.getOpenPercent(stock) - self.getPercent(
                now_line['price'],
                stock) > self.__config.get_t1()['ydls']['open-low']:
            stock.set_cache('ignore_ydls', True)
            return False
        if self.getPercent(now_line['high'], stock) - self.getPercent(
                now_line['price'],
                stock) > self.__config.get_t1()['ydls']['open-low']:
            stock.set_cache('ignore_ydls', True)
            return False
        if float(now_line['high']) > float(now_line['price']):
            return False
        stop_p = self.__config.get_t1()['ydls']['stop_p']
        current_p = self.getCurrentPercent(stock)
        if current_p < stop_p[0] or current_p > stop_p[1]:
            return False
        datas = stock.get_data_in_len(self.__config.get_t1()['ydls']['in_len'])
        length = len(datas)
        last_datetime = self.get_data_time(datas[-1])
        fist_datetime = self.get_data_time(datas[-1 * length])
        p1 = self.getPercent(datas[-1 * length]['price'], stock)
        p2 = self.getPercent(datas[-1]['price'], stock)
        p = p2 - p1
        amount = self.convertToFloat(
            datas[-1]['buy_amount']) - self.convertToFloat(
                datas[-1 * length]['buy_amount'])
        sell_amount = self.convertToFloat(
            datas[-1]['sell_amount']) - self.convertToFloat(
                datas[-1 * length]['sell_amount'])
        delta = (last_datetime - fist_datetime).seconds
        if delta < 45:
            if delta < 15:
                return False
            if p < self.__config.get_t1()['ydls']['yd_p']:
                return False
            if amount < self.__config.get_t1()['ydls']['min_amount'] or (
                    sell_amount > 0.0 and amount / sell_amount <
                    self.__config.get_t1()['ydls']['amount_ratio']):
                return False
            MyLog.info(
                '%s is match ydls, t1 = %s, t2 = %s, p1 = %s, p2 = %s, p = %s, amount = %s, sell_amount = %s, amount_ratio = %s'
                % (stock.get_code(), datas[-1 * length]['date'] + ' ' +
                   datas[-1 * length]['time'], datas[-1]['date'] + ' ' +
                   datas[-1]['time'], p1, p2, p, amount, sell_amount,
                   100 if sell_amount == 0.0 else amount / sell_amount))
            return True
        else:
            if length > 15:
                step = 2
                i = -15
                while i >= length * -1:
                    p1 = self.getPercent(datas[i]['price'], stock)
                    p2 = self.getPercent(datas[-1]['price'], stock)
                    p = p2 - p1
                    amount = self.convertToFloat(
                        datas[-1]['buy_amount']) - self.convertToFloat(
                            datas[i]['buy_amount'])
                    sell_amount = self.convertToFloat(
                        datas[-1]['sell_amount']) - self.convertToFloat(
                            datas[i]['sell_amount'])
                    fist_datetime_temp = self.get_data_time(datas[i])
                    i = i - step
                    if (last_datetime - fist_datetime_temp).seconds < 45:
                        continue
                    if p >= pow(
                        ((last_datetime - fist_datetime_temp).seconds - 45),
                            self.__config.get_t1()['ydls']
                        ['yd_ratio']) + self.__config.get_t1()['ydls']['yd_p']:
                        if amount >= self.__config.get_t1(
                        )['ydls']['min_amount'] and (
                                sell_amount == 0.0 or amount / sell_amount >=
                                self.__config.get_t1()['ydls']['amount_ratio']
                        ):
                            MyLog.info(
                                '%s is match ydls, t1 = %s , t2 = %s, p1 = %s, p2 = %s, p = %s, amount = %s, sell_amount = %s, amount_ratio = %s'
                                %
                                (stock.get_code(), datas[i + step]['date'] +
                                 ' ' + datas[i + step]['time'],
                                 datas[-1]['date'] + ' ' + datas[-1]['time'],
                                 p1, p2, p, amount, sell_amount, 100 if
                                 sell_amount == 0.0 else amount / sell_amount))
                            return True
            if p >= pow(((last_datetime - fist_datetime).seconds - 45),
                        self.__config.get_t1()['ydls']
                        ['yd_ratio']) + self.__config.get_t1()['ydls']['yd_p']:
                if amount >= self.__config.get_t1()['ydls']['min_amount'] and (
                        sell_amount == 0.0 or amount / sell_amount >=
                        self.__config.get_t1()['ydls']['amount_ratio']):
                    MyLog.info(
                        '%s is match ydls, t1 = %s , t2 = %s, p1 = %s, p2 = %s, p = %s, amount = %s, sell_amount = %s, amount_ratio = %s'
                        %
                        (stock.get_code(), datas[-1 * length]['date'] + ' ' +
                         datas[-1 * length]['time'], datas[-1]['date'] + ' ' +
                         datas[-1]['time'], p1, p2, p, amount, sell_amount,
                         100 if sell_amount == 0.0 else amount / sell_amount))
                    return True
        return False

    def updateBreak10(self, stock):
        if stock.get_cache('status') == 1:
            if stock.get_cache('min_break') is None:
                stock.set_cache('min_break', self.getCurrentPercent(stock))
            elif self.getCurrentPercent(stock) < stock.get_cache('min_break'):
                stock.set_cache('min_break', self.getCurrentPercent(stock))

    def isReach10Again(self, stock):
        now_line = stock.get_Lastline()
        stop_price = round(float(now_line['pre_close']) * 1.1, 2)
        if float(now_line['b1_p']) == stop_price and self.convertToFloat(
                now_line['a1_v']) == 0:
            stock.set_cache('min_break', None)
            stock.set_cache('status', None)
            return False
        else:
            if self.convertToFloat(now_line['a5_v']) != 0:
                return False
            if stock.get_cache('min_break') is None or stock.get_cache(
                    'min_break') > self.__config.get_t1(
                    )['hit10']['min_break']:
                return False
            if stock.get_cache('break_time') is None or (
                    dt.datetime.now() - stock.get_cache('break_time')
            ).seconds > self.__config.get_t1()['hit10']['break_time']:
                return False
            if stock.get_cache('hit_top_time') is None or (
                    stock.get_cache('break_time') -
                    stock.get_cache('hit_top_time')
            ).seconds < self.__config.get_t1()['hit10']['hit_break_inter']:
                return False
            total_sell = 0
            for i in range(1, 6):
                total_sell += self.convertToFloat(
                    now_line['a' + str(i) + '_v']) * self.convertToFloat(
                        now_line['a' + str(i) + '_p']) * 100
            if total_sell > stock.get_cache(
                    'max_b1_amount') * self.__config.get_t1(
                    )['hit10']['max_b1_amount_ratio']:
                return False
            info = '[%s]在[%s][%s] match 10,b1_v=%s' % (
                Utils.getCurrentTime(), str(now_line['date']) + ' ' +
                str(now_line['time']), stock.get_code(), now_line['b1_v'])
            MyLog.info(info)
            return True

    def isbreak10(self, stock, dh):
        now_line = stock.get_Lastline()
        stop_price = round(float(now_line['pre_close']) * 1.1, 2)
        if float(now_line['b1_p']) != stop_price and self.convertToFloat(
                now_line['a1_v']) != 0:
            count = stock.get_cache('break_count')
            if count is None:
                count = 1
            else:
                count = count + 1
            stock.set_cache('break_count', count)
            if count >= self.__config.get_t1()['hit10']['break_count']:
                stock.set_cache('status', 0)
                dh.add_ignore(stock.get_code())
            else:
                stock.set_cache('break_time', dt.datetime.now())
                stock.set_cache('min_break', self.getCurrentPercent(stock))
                stock.set_cache('status', 1)
                MyLog.info('%s is break 10' % stock.get_code())
        return False

    def isReach10(self, stock):
        now_line = stock.get_Lastline()
        stop_price = round(float(now_line['pre_close']) * 1.1, 2)
        if float(now_line['b1_p']) == stop_price and self.convertToFloat(
                now_line['a1_v']) == 0:
            hit_top_time = stock.get_cache('hit_top_time')
            strTime = time.strftime('%H:%M:%S', time.localtime(time.time()))
            if hit_top_time is None and strTime > self.__config.get_t1(
            )['hit10']['hit_top_time']:
                return False
            stock.set_cache('hit_top_time', dt.datetime.now())
            now_b1_amount = self.convertToFloat(now_line['b1_v']) * float(
                now_line['b1_p']) * 100
            if now_b1_amount >= self.__config.get_t1(
            )['hit10']['buy_b1_amount']:
                MyLog.info('%s is reach 10' % stock.get_code())
                stock.set_cache('status', 0)
        return False

    def isZSMatch(self, zs, stock):
        if zs is None:
            return True
        code = stock.get_code()
        i = 0
        if code.startswith('3'):
            i = 5
        line = zs.iloc[i]
        pre_close = line.get('pre_close')
        price = line.get('price')
        p = (float(price) - float(pre_close)) / float(pre_close) * 100
        return p > self.__config.get_t1()['ydls']['zs']

    def getPercent(self, price, stock):
        lastLine = stock.get_Lastline()
        pre_close = lastLine['pre_close']
        open_p = (float(price) - float(pre_close)) / float(pre_close) * 100
        return open_p

    def getCurrentPercent(self, stock):
        lastLine = stock.get_Lastline()
        price = lastLine['price']
        return self.getPercent(price, stock)

    def getOpenPercent(self, stock):
        ocp = stock.get_cache('ocp')
        if ocp is not None:
            return ocp
        lastLine = stock.get_Lastline()
        open = lastLine['open']
        ocp = self.getPercent(open, stock)
        stock.set_cache('ocp', ocp)
        return ocp
Esempio n. 2
0
class NewAnalyze(object):
    def __init__(self):
        self.__config = Config()
        self.__buyedCount = 0
        self.__balance = self.__config.get_t1()['trade']['balance']
        if self.__config.get_t1()['trade']['enable']:
            self.__trade = Trade()
        if self.__config.get_t1()['trade']['enableMock']:
            self.__mockTrade = MockTrade()
        self.__engine = create_engine(self.__config.get_DBurl())

    def printPerformace(self, timestamp):
        deltaSeconds = (dt.datetime.now() - timestamp).seconds
        if deltaSeconds > 3:
            print('calc more than %s seconds' % deltaSeconds)

    def calcMain(self, zs, dh, timestamp, buyCount):
        data = dh.get_data()
        finalCode = ''
        result = []
        codes = []
        for code in data:
            if code in dh.get_buyed() or code in dh.get_ignore():
                continue
            try:
                if self.calc(zs, data[code], dh):
                    result.append(data[code])
            #  self.printPerformace(timestamp)
            except Exception as e:
                last_line = data[code].get_Lastline()
                MyLog.error(last_line['time'] + ' :calc ' + code + ' error')
                MyLog.error(str(e))
        if len(result) != 0:
            for stock in result:
                try:
                    last_line = stock.get_Lastline()
                    res = self.outputRes(last_line, timestamp, buyCount)
                    if res is not None:
                        codes.append(stock.get_code())
                except Exception as e:
                    MyLog.error('outputRes error %s' % stock.get_code())
                    MyLog.error(str(e))
        return codes

    def outputRes(self, df_final, timestamp, buyCount):
        trade = self.__config.get_t1()['trade']
        if buyCount <= 0:
            return None
        buyMoney = (float(df_final['price']) +
                    trade['addPrice']) * trade['volume']
        if buyMoney > self.__balance:
            return None
        price = str('%.2f' % (float(df_final['price']) + trade['addPrice']))
        info = '[%s] 在 %s 以 %s 买入 [%s]%s %s 股' % (
            Utils.getCurrentTime(),
            str(df_final['date']) + ' ' + str(df_final['time']), price,
            df_final['code'], df_final['name'], str(trade['volume']))
        MyLog.info(info)
        now = dt.datetime.now()
        deltaSeconds = (now - timestamp).seconds
        if deltaSeconds > trade['timestampLimit']:
            MyLog.info('[%s] 行情超时 %s秒 放弃买入' % (df_final['code'], deltaSeconds))
            return None
        if trade['enable']:
            res = str(
                self.__trade.buy(df_final['code'], trade['volume'],
                                 float(price)))
            if 'entrust_no' in res:
                self.__buyedCount = self.__buyedCount + 1
                self.__balance = self.__balance - buyMoney
                return df_final['code']
            return None
        if trade['enableMock']:
            res = self.__mockTrade.mockTrade(df_final['code'], float(price),
                                             trade['volume'])
            if res == 0:
                self.__buyedCount = self.__buyedCount + 1
                self.__balance = self.__balance - buyMoney
                return df_final['code']
            return None
        return df_final['code']

    def calc(self, zs, stock, dh):
        if not self.canCalc(stock, dh):
            return False
        open_p = self.getOpenPercent(stock)
        conf = self.getConfig(open_p)
        if conf is None:
            dh.add_ignore(stock.get_code())
            return False
        if not stock.is_inited():
            self.initStockData(stock, open_p, conf)
        self.updateStock(stock, conf)
        return self.isStockMatch(zs, stock, conf, dh)

    def isOpenMatch(self, row):
        if float(row['pre_close']) == 0 or float(row['open']) == 0:
            return False
        return (float(row['open']) - float(row['pre_close'])) / float(
            row['pre_close']) * 100 >= -1.0

    def canCalc(self, stock, dh):
        if stock.len() < 0:
            return False
        lastLine = stock.get_Lastline()
        if float(lastLine['open']) == 0.0:
            return False
        lastSecondLine = stock.get_LastSecondline()
        if lastSecondLine is None:
            return False
        if float(lastSecondLine['open']) == 0.0:
            return False
        return True

    def initStockData(self, stock, open_p, conf):
        r_line = self.__config.get_t1()['R_line']
        for key in r_line:
            if stock.get_r_val(key) == -10:
                val = open_p + (10 - open_p) * r_line[key]
                stock.set_r_val(key, val)
        stock.set_inited()

    def updateStock(self, stock, conf):
        self.updateBreakRtimes(stock, conf)

    def convertToFloat(self, str):
        if str == '':
            return 0
        try:
            return float(str)
        except Exception as e:
            MyLog.error('convertToFloat error: ' + str + '\n')
            return 0

    def updateBreakRtimes(self, stock, conf):
        now_p = self.getCurrentPercent(stock)
        lastSecondLine = stock.get_LastSecondline()
        last_p = self.getPercent(lastSecondLine['price'], stock)
        for key in ['R1', 'R2', 'R3', 'R4']:
            val = stock.get_r_val(key)
            if last_p > val and now_p < val:
                stock.add_rBreakTimes(key)
        minR = stock.get_minR()
        if minR is None:
            minR = conf['min_R']
        if stock.get_rBreakTimes(minR) > 0:
            for i in [1, 2, 3, 4, 5]:
                if i > int(minR[-1]) and stock.get_rBreakTimes('R' +
                                                               str(i)) == 0:
                    stock.set_minR('R' + str(i))
                    break
        else:
            stock.set_minR(minR)

    def getConfig(self, open_p):
        t1 = self.__config.get_t1()
        keys = ['A', 'B', 'C']
        for key in keys:
            if t1[key]['open_p'][0] <= open_p and open_p < t1[key]['open_p'][1]:
                return t1[key]

    def isStockMatch(self, zs, stock, conf, dh):
        if 'time' in self.__config.get_t1(
        )['strategy'] and not self.isTimeMatch(stock, conf):
            return False
        if 'xspeed' in self.__config.get_t1(
        )['strategy'] and not self.isXSpeedMatch(dh, stock):
            return False
        if 'sellWindow' in self.__config.get_t1(
        )['strategy'] and not self.isSellWindowMatch(zs, stock):
            return False
        if 'minR' in self.__config.get_t1(
        )['strategy'] and not self.isReachMinR(stock):
            return False
        return self.isLastTwoMatch(stock)

    def isZSMatch(self, zs, stock):
        if zs is None:
            return True
        code = stock.get_code()
        i = 0
        if code.startswith('3'):
            i = 5
        line = zs.iloc[i]
        pre_close = line.get('pre_close')
        price = line.get('price')
        p = (float(price) - float(pre_close)) / float(pre_close) * 100
        if p < -0.3:
            return False
        if code in self.__config.get_conceptCodes():
            return True
        return p > 0

    def isSellWindowMatch(self, zs, stock):
        data = stock.get_data()
        size = len(data)
        if size > self.__config.get_t1()['big_money']['count']:
            size = self.__config.get_t1()['big_money']['count']
        temp = data[size * -1:]
        nowAmount = self.convertToFloat(temp[-1]['amount'])
        lastAmount = self.convertToFloat(temp[0]['amount'])
        avgAmount = (nowAmount - lastAmount) / size
        if avgAmount < self.__config.get_t1()['big_money']['amount']:
            return False
        if avgAmount < self.__config.get_t1()['big_money']['amount_2']:
            if 'zs' in self.__config.get_t1(
            )['strategy'] and not self.isZSMatch(zs, stock):
                return False
        MyLog.info('[%s] average amount = %s' % (stock.get_code(), avgAmount))
        now_line = stock.get_Lastline()
        totalAmountInSell = 0.0
        for i in range(1, 6):
            temp = self.convertToFloat(
                now_line['a' + str(i) + '_p']) * self.convertToFloat(
                    now_line['a' + str(i) + '_v']) * 100
            totalAmountInSell = totalAmountInSell + temp
        ratio = totalAmountInSell / (nowAmount - lastAmount)
        MyLog.info('[%s] sell window ratio = %s' % (stock.get_code(), ratio))
        return ratio <= self.__config.get_t1()['sellWindow']['threshold']

    def isXSpeedMatch(self, dh, stock):
        now_line = stock.get_Lastline()
        ccp = self.getCurrentPercent(stock)
        ocp = self.getOpenPercent(stock)
        #   if ocp - ccp >= self.__config.get_t1()['x_speed']['lowerThanBefore']:
        #      stock.add_lowerThanBeforeTimes()
        #      if stock.get_lowerThanBeforeTimes() > self.__config.get_t1()['x_speed']['lowerThanBeforeTimes']:
        #         dh.add_ignore(stock.get_code())
        #         return False
        ct = dt.datetime.strptime(now_line['date'] + ' ' + now_line['time'],
                                  '%Y-%m-%d %H:%M:%S')
        pcpArray = self.generatePCPArray(stock)
        i = 0
        while i < len(pcpArray):
            line = pcpArray[i]
            if line['time'] == now_line['time']:
                break
            price = float(line['price'])
            pcp = (float(pcpArray[i]['price']) -
                   float(pcpArray[i]['pre_close'])) / float(
                       pcpArray[i]['pre_close']) * 100
            # if pcp - ccp >= self.__config.get_t1()['x_speed']['lowerThanBefore']:
            #    stock.add_lowerThanBeforeTimes()
            #    if stock.get_lowerThanBeforeTimes() > self.__config.get_t1()['x_speed']['lowerThanBeforeTimes']:
            #       dh.add_ignore(stock.get_code())
            #       return False
            if ccp - pcp >= (10 -
                             pcp) * self.__config.get_t1()['x_speed']['a']:
                if ccp - pcp >= (ccp - ocp) * self.__config.get_t1(
                )['x_speed']['b'] and pcp > ocp:
                    pt = dt.datetime.strptime(
                        line['date'] + ' ' + line['time'], '%Y-%m-%d %H:%M:%S')
                    c = self.__config.get_t1()['x_speed']['c'][0]
                    if ocp >= 2 and ocp < 5:
                        c = self.__config.get_t1()['x_speed']['c'][1]
                    elif ocp >= -1 and ocp < 2:
                        c = self.__config.get_t1()['x_speed']['c'][2]
                    if (ct - pt).seconds / 60 < (ccp - pcp) * c:
                        MyLog.info('[%s] match cond a, ccp = %s, pcp = %s' %
                                   (stock.get_code(), ccp, pcp))
                        MyLog.info('[%s] match cond b, ccp = %s, ocp = %s' %
                                   (stock.get_code(), ccp, ocp))
                        MyLog.info('[%s] match cond c, ct = %s, pt = %s' %
                                   (stock.get_code(), ct, pt))
                        last_second_line = stock.get_LastSecondline()
                        stock.add_buySignal()
                        if stock.get_buySignal() >= self.__config.get_t1(
                        )['trade']['maxBuySignal']:
                            return True
                        return False
            i = i + 1

    #   stock.reset_buySignal()
        return False

    def generatePCPArray(self, stock):
        pcpArray = []
        len = stock.len()
        start = 0
        step = 1
        if len > 30:
            if len > 250:
                start = -250
                len = 250
            step = math.ceil(len / 30)
        data = stock.get_data()
        for val in data[start::step]:
            pcpArray.append(val)
        return pcpArray

    def isLastTwoMatch(self, stock):
        data = stock.get_data()
        if stock.len() < 3:
            return False
        price = float(data[-1]['price'])
        price2 = float(data[-2]['price'])
        price3 = float(data[-2]['price'])
        return price - price2 >= 0 and price2 - price3 >= 0

    def isTimeMatch(self, stock, conf):
        lastLine = stock.get_Lastline()
        timeStr = lastLine['time']
        return timeStr <= conf['time']

    def getPercent(self, price, stock):
        lastLine = stock.get_Lastline()
        pre_close = lastLine['pre_close']
        open_p = (float(price) - float(pre_close)) / float(pre_close) * 100
        return open_p

    def getCurrentPercent(self, stock):
        lastLine = stock.get_Lastline()
        price = lastLine['price']
        return self.getPercent(price, stock)

    def getOpenPercent(self, stock):
        ocp = stock.get_cache('ocp')
        if ocp is not None:
            return ocp
        lastLine = stock.get_Lastline()
        open = lastLine['open']
        ocp = self.getPercent(open, stock)
        stock.set_cache('ocp', ocp)
        return ocp

    def isReachMinR(self, stock):
        now_p = self.getCurrentPercent(stock)
        minR = stock.get_minR()
        return now_p > stock.get_r_val(minR) or now_p >= 9.0
Esempio n. 3
0
       start = 0
       codeList = []
       length = len(df_todayAll)
       while start < length:
             end = start + step
             if end >= length:
                end = length 
             df_temp = df_todayAll.iloc[start:end]
             df = ts.get_realtime_quotes(df_temp['code'].tolist())
             df = df[df.apply(analyze.isOpenMatch, axis=1)]
             for code in df['code'].tolist():
                 codeList.append(code)
             start = end
       return codeList

   pool = mp.Pool(setting.get_t1()['process_num'])
   manager = mp.Manager()

   codeLists = init(False)
   MyLog.info('calc stocks %s' % codeLists)
   codeSplitMaps = {} 
   queueMaps = {}
   interDataHolder = {
      'currentTime' : dt.datetime.now()
   }
   if setting.get_t1()['trade']['enableMock']:
      mockTrade.relogin() 
   for code in setting.get_ignore():
       if code in codeLists:
          codeLists.remove(code)  
   length = len(codeLists)
Esempio n. 4
0
        start = 0
        codeList = []
        length = len(df_todayAll)
        while start < length:
            end = start + step
            if end >= length:
                end = length
            df_temp = df_todayAll.iloc[start:end]
            df = ts.get_realtime_quotes(df_temp['code'].tolist())
            df = df[df.apply(analyze.isOpenMatch, axis=1)]
            for code in df['code'].tolist():
                codeList.append(code)
            start = end
        return codeList

    pool = mp.Pool(setting.get_t1()['process_num'])
    manager = mp.Manager()

    codeLists = init(False)
    MyLog.info('calc stocks %s' % codeLists)
    codeSplitMaps = {}
    queueMaps = {}
    interDataHolder = {
        'currentTime': dt.datetime.now(),
        'hygn': None,
        'netMoney': None
    }
    if setting.get_t1()['trade']['enableMock']:
        mockTrade.relogin()
    for code in setting.get_ignore():
        if code in codeLists:
Esempio n. 5
0
from t1.datas.DataHolder import DataHolder
from t1.analyze.Analyze import Analyze

dh = DataHolder(codes)
analyze = Analyze()

for code in codes:
    try:
       src_datas[code] = pd.read_sql_table('live_' + code, con=engine)
    except Exception as e:
           MyLog.error('read mock data error \n')
           MyLog.error(str(e) +  '\n')   

def run(i):
    df = pd.DataFrame()
    for code in src_datas:
        if i < len(src_datas[code]):
           df = df.append(src_datas[code].iloc[i])
    dh.addData(df)
    analyze.calcMain(dh)
    i = i + 1    
    global timer 
    timer = threading.Timer(setting.get_t1()['get_data_inter'], run,[i])
    timer.start()

timer = threading.Timer(setting.get_t1()['get_data_inter'], run,[0])
timer.start()

while True:
      time.sleep(1)
pass
Esempio n. 6
0
            dh.addSellData(df)
            analyze.calcMain(zs, dh)
            MyLog.debug('process %s, calc data time = %d' %
                        (os.getpid(), (int(round(time.time() * 1000)) - s)))
            data = queue.get(True)
    except Exception as e:
        MyLog.error('error %s' % str(e))


if __name__ == '__main__':
    MyLog.info('main process %s.' % os.getpid())
    strTime = time.strftime('%H:%M:%S', time.localtime(time.time()))
    while strTime < '09:30:01':
        time.sleep(0.1)
        strTime = time.strftime('%H:%M:%S', time.localtime(time.time()))
    if setting.get_t1()['trade']['enableMock']:
        mockTrade.relogin()
    pool = mp.Pool(1)
    manager = mp.Manager()
    queue = manager.Queue()
    pool.apply_async(run, (queue, ))
    sched = BlockingScheduler()
    interDataHolder = {'currentTime': dt.datetime.now()}

    @sched.scheduled_job('interval',
                         seconds=setting.get_t1()['get_data_inter'])
    def getData():
        if setting.get_t1()['trade']['enableMock']:
            now = dt.datetime.now()
            if (now - interDataHolder['currentTime']).seconds > 60:
                interDataHolder['currentTime'] = now
Esempio n. 7
0
class DataHolder(object):
    def __init__(self, codes):
        self.__data = {}
        self.__buyed = []
        self.__selled = []
        self.__setting = Config()
        self.__tpe = ThreadPoolExecutor(5)
        self.__engine = create_engine(self.__setting.get_DBurl())
        if self.__setting.get_t1(
        )['need_recover_data'] and self.needRecoverData():
            self.recoverData(codes)

    def recoverData(self, codes):
        for code in codes:
            try:
                src_data = pd.read_sql_table('live_' + code, con=self.__engine)
                if src_data is not None and len(src_data) > 0:
                    last = src_data.iloc[-1]
                    now_date = time.strftime('%Y-%m-%d',
                                             time.localtime(time.time()))
                    if now_date == last['date']:
                        self.__data[code] = Stock(code, src_data)
            except Exception as e:
                MyLog.error('recover data error \n')
                MyLog.error(str(e) + '\n')

    def needRecoverData(self):
        now = dt.datetime.now()
        return now > dt.datetime(now.year, now.month, now.day, 9, 15)

    def get_buyed(self):
        return self.__buyed

    def get_selled(self):
        return self.__selled

    def add_selled(self, code, save=False):
        self.__selled.append(code)
        if save:
            self.__tpe.submit(self.saveData, self.__data[code].get_data())

    def add_buyed(self, code, save=False):
        self.__buyed.append(code)
        if save:
            self.__tpe.submit(self.saveData, self.__data[code].get_data())

    def get_data(self):
        return self.__data

    def addDataHandler(self, row):
        code = row['code']
        if code in self.get_buyed():
            return
        if code in self.__data and self.__data[code].len() > 0:
            self.__data[code].add_Line(row)
        else:
            self.__data[code] = Stock(code, row)
        if float(row['pre_close']) != 0 and (float(row['price']) - float(
                row['pre_close'])) / float(row['pre_close']) * 100 >= 9.9:
            if not (code in self.get_buyed()):
                MyLog.info('[%s] reach 10' % code)
                self.add_buyed(code, True)

    def addSellDataHandler(self, row):
        code = row['code']
        if code in self.get_selled():
            return
        if code in self.__data and self.__data[code].len() > 0:
            self.__data[code].add_Line(row)
        else:
            self.__data[code] = Stock(code, row)

    def addData(self, df):
        df.apply(self.addDataHandler, axis=1)

    def addSellData(self, df):
        df.apply(self.addSellDataHandler, axis=1)

    def saveData(self, data):
        try:
            line = data.iloc[0]
            code = line['code']
            data.to_sql('live_' + code,
                        con=self.__engine,
                        if_exists='replace',
                        index=False)
            MyLog.info('[%s] save data' % code)
        except Exception as e:
            MyLog.error('[%s %s] save [%s] data error \n' %
                        (line['date'], line['time'], code))
            MyLog.error(str(e) + '\n')
Esempio n. 8
0
def delete_log():
    path = os.path.join(os.path.dirname(__file__), '../log') 
    for file in os.listdir(path):
        try:
            os.remove(path + '/' + file)
        except Exception as e:
               pass           



if __name__ == '__main__':
   delete_log() 
   MyLog.info('main process %s.' % os.getpid()) 
   engine = create_engine(setting.get_DBurl()) 
   mockTrade = MockTrade()
   if setting.get_t1()['trade']['enable']:
      trade = Trade()

   def init(forceUpdate):
       def cb(**kw):
           df = ts.get_today_all()
           df['pick'] = 0
           return df
       df_todayAll = Utils.queryData('today_all','code',engine, cb, forceUpdate=forceUpdate, sql='select * from today_all where pick = 1', load_if_empty=False)
       strTime = time.strftime('%H:%M:%S',time.localtime(time.time()))
       while strTime < '09:30:01':
             time.sleep(0.1)
             strTime = time.strftime('%H:%M:%S',time.localtime(time.time()))
       step = 880
       start = 0
       codeList = []
Esempio n. 9
0
class HitBottomAnalyze(object):
    
      def __init__(self):
          self.__config = Config()
          self.__buyedCount = 0
          self.__balance = self.__config.get_t1()['trade']['balance']
          if self.__config.get_t1()['trade']['enable']:
             self.__trade = Trade()
          if self.__config.get_t1()['trade']['enableMock']:
             self.__mockTrade = MockTrade()    
          self.__engine = create_engine(self.__config.get_DBurl())



      def printPerformace(self,timestamp):
          deltaSeconds = (dt.datetime.now() - timestamp).seconds 
          if deltaSeconds > 3: 
             print('calc more than %s seconds' % deltaSeconds)    

      def calcMain(self,dh,timestamp,buyCount):
          data = dh.get_data()
          finalCode = ''
          result = []
          codes = []
          for code in data:
              if code in dh.get_buyed() or code in dh.get_ignore():
                 continue 
              try:  
                 if self.calc(data[code],dh):
                    result.append(data[code])
                #  self.printPerformace(timestamp)  
              except Exception as e:
                     last_line = data[code].get_Lastline()
                     MyLog.error(last_line['time'] + ' :calc ' + code + ' error')
                     MyLog.error(str(e))      
          if len(result) != 0:
             for stock in result: 
                 try:
                     last_line = stock.get_Lastline()
                     res = self.outputRes(last_line,timestamp,buyCount)
                     if res is not None:
                        codes.append(stock.get_code())
                 except Exception as e:
                        MyLog.error('outputRes error %s' % stock.get_code())
                        MyLog.error(str(e))   
          return codes   


      def outputRes(self,df_final,timestamp,buyCount):
          trade = self.__config.get_t1()['trade']
          if buyCount <= 0:
             return None
          buyMoney = (float(df_final['price']) + trade['addPrice']) * trade['volume']  
          if buyMoney > self.__balance:
             return None   
          price = str('%.2f' % (float(df_final['price']) + trade['addPrice']))
          info = '[%s] 在 %s 以 %s 买入 [%s]%s %s 股' % (Utils.getCurrentTime(),str(df_final['date']) + ' ' + str(df_final['time']), price, df_final['code'], df_final['name'], str(trade['volume']))
          MyLog.info(info)
          now = dt.datetime.now()
          deltaSeconds = (now - timestamp).seconds
          if deltaSeconds > trade['timestampLimit']:
             MyLog.info('[%s] 行情超时 %s秒 放弃买入' % (df_final['code'],deltaSeconds)) 
             return None
          if trade['enable']:
             res = str(self.__trade.buy(df_final['code'],trade['volume'],float(price)))
             if 'entrust_no' in res:
                self.__buyedCount = self.__buyedCount + 1
                self.__balance = self.__balance - buyMoney
                return df_final['code']
             return None  
          if trade['enableMock']:
             res = self.__mockTrade.mockTrade(df_final['code'],float(price),trade['volume'])
             if res == 0:
                self.__buyedCount = self.__buyedCount + 1
                self.__balance = self.__balance - buyMoney
                return df_final['code']
             return None  
          return df_final['code']  


              
      def calc(self,stock,dh):
          ccp = self.getCurrentPercent(stock)
          if ccp >= self.__config.get_t1()['hitBottom']['max_p'] or ccp <= self.__config.get_t1()['hitBottom']['min_p']:
             return False
          lastLine = stock.get_Lastline()
          price = float(lastLine['price'])
          openPrice = float(lastLine['open'])
          high = float(lastLine['high'])
          low = float(lastLine['low'])
          if price >= openPrice or price <= low:
             return False
          return price - low <= (high - low) * self.__config.get_t1()['hitBottom']['margin']
                      

      def convertToFloat(self,str):
          if str == '':
             return 0 
          try:
              return float(str)
          except Exception as e:
                 MyLog.error('convertToFloat error: ' + str + '\n') 
                 return 0   


      def getPercent(self,price,stock):
          lastLine = stock.get_Lastline()
          pre_close = lastLine['pre_close']
          open_p = (float(price) - float(pre_close)) / float(pre_close) * 100
          return open_p
      
      def getCurrentPercent(self,stock):
          lastLine = stock.get_Lastline()
          price = lastLine['price']
          return self.getPercent(price,stock)
              

      def getOpenPercent(self,stock):
          ocp = stock.get_cache('ocp')
          if ocp is not None:
             return ocp 
          lastLine = stock.get_Lastline()
          open = lastLine['open']
          ocp = self.getPercent(open,stock)
          stock.set_cache('ocp',ocp)
          return ocp  
Esempio n. 10
0
class Analyze(object):
    def __init__(self, thshy, thsgn):
        self.__config = Config()
        self.__buyedCount = 0
        self.__balance = self.__config.get_t1()['trade']['balance']
        if self.__config.get_t1()['trade']['enable']:
            self.__trade = Trade()
        if self.__config.get_t1()['trade']['enableMock']:
            self.__mockTrade = MockTrade()
        self.__engine = create_engine(self.__config.get_DBurl())
        self.__hygnData = self.initHYGN(thshy, thsgn)

    def initHYGN(self, thshy, thsgn):
        if thshy is None or thsgn is None:
            return
        data = {}
        for index, row in thshy.iterrows():
            if row['code'] not in data:
                data[row['code']] = {'hy': [], 'gn': []}
            if row['hy'] not in data[row['code']]['hy']:
                data[row['code']]['hy'].append(row['hy'])
        for index, row in thsgn.iterrows():
            if row['code'] not in data:
                data[row['code']] = {'hy': [], 'gn': []}
            if row['cont'] not in data[row['code']]['gn']:
                data[row['code']]['gn'].append(row['cont'])
        return data

    def calcMain(self, zs, dh, hygn, netMoney, timestamp):
        data = dh.get_data()
        finalCode = ''
        result = []
        codes = []
        for code in data:
            if len(dh.get_buyed()) > 0:
                if code in dh.get_buyed():
                    continue
            try:
                if self.calc(zs, data[code], dh, hygn, netMoney):
                    result.append(data[code])
            except Exception as e:
                last_line = data[code].get_Lastline()
                MyLog.error(last_line['time'] + ' :calc ' + code + ' error')
                MyLog.error(str(e))
        if len(result) != 0:
            for stock in result:
                try:
                    last_line = stock.get_Lastline()
                    res = self.outputRes(last_line, timestamp)
                    if res is not None:
                        codes.append(stock.get_code())
                        self.saveData(stock)
                except Exception as e:
                    MyLog.error('outputRes error %s' % stock.get_code())
                    MyLog.error(str(e))
        return codes

    def save(self, data):
        try:
            code = data.iloc[0]['code']
            data.to_sql('live_' + code,
                        con=self.__engine,
                        if_exists='replace',
                        index=False)
        except Exception as e:
            MyLog.error('save [%s] data error \n' % code)
            MyLog.error(str(e) + '\n')

    def saveData(self, stock):
        data = stock.get_data()
        t = threading.Thread(target=self.save, args=(data, ))
        t.start()

    def outputRes(self, df_final, timestamp):
        trade = self.__config.get_t1()['trade']
        if self.__buyedCount >= trade['max_buyed']:
            return None
        buyMoney = (float(df_final['price']) +
                    trade['addPrice']) * trade['volume']
        if buyMoney > self.__balance:
            return None
        price = str('%.2f' % (float(df_final['price']) + trade['addPrice']))
        info = '[%s] 在 %s 以 %s 买入 [%s]%s %s 股' % (
            Utils.getCurrentTime(),
            str(df_final['date']) + ' ' + str(df_final['time']), price,
            df_final['code'], df_final['name'], str(trade['volume']))
        MyLog.info(info)
        now = dt.datetime.now()
        deltaSeconds = (now - timestamp).seconds
        if deltaSeconds > trade['timestampLimit']:
            MyLog.info('[%s] 行情超时 %s秒 放弃买入' % (df_final['code'], deltaSeconds))
            return None
        if trade['enable']:
            res = str(
                self.__trade.buy(df_final['code'], trade['volume'],
                                 float(price)))
            if 'entrust_no' in res:
                self.__buyedCount = self.__buyedCount + 1
                self.__balance = self.__balance - buyMoney
                return df_final['code']
            return None
        if trade['enableMock']:
            res = self.__mockTrade.mockTrade(df_final['code'], float(price),
                                             trade['volume'])
            if res == 0:
                self.__buyedCount = self.__buyedCount + 1
                self.__balance = self.__balance - buyMoney
                return df_final['code']
            return None
        return df_final['code']

    def goTopsis(self, result):
        df = pd.DataFrame()
        for stock in result:
            df = self.buildData(df, stock)
        return self.topsisCalc(df)

    def topsisCalc(self, df):
        df = df.fillna(df.mean())
        self.commonCalc(df, 'net',
                        self.__config.get_t1()['topsis']['net'], True)
        self.commonCalc(df, 'v120',
                        self.__config.get_t1()['topsis']['v120'], True)
        self.commonCalc(df, 'v300',
                        self.__config.get_t1()['topsis']['v300'], True)
        self.commonCalc(df, 'v30',
                        self.__config.get_t1()['topsis']['v30'], True)
        self.commonCalc(df, 'r_break',
                        self.__config.get_t1()['topsis']['r_break'], False)
        for index, row in df.iterrows():
            self.calcDi(df, index, row,
                        ['net', 'v120', 'v300', 'v30', 'r_break'], '_best')
            self.calcDi(df, index, row,
                        ['net', 'v120', 'v300', 'v30', 'r_break'], '_worst')
            self.calcCi(df, index, row)
        df = df.sort_values('ci', ascending=False)
        return df

    def calcCi(self, df, index, row):
        if (row['Di_best'] + row['Di_worst']) == 0:
            row['ci'] = 0
            df.loc[index, 'ci'] = 0
        else:
            row['ci'] = row['Di_worst'] / (row['Di_best'] + row['Di_worst'])
            df.loc[index, 'ci'] = row['ci']

    def calcDi(self, df, index, row, columnList, best_worst):
        temp = 0
        for column in columnList:
            temp = temp + np.square(row[column + '_vi'] -
                                    row[column + best_worst])
        row['Di' + best_worst] = cmath.sqrt(temp)
        df.loc[index, 'Di' + best_worst] = row['Di' + best_worst]

    def commonCalc(self, df, columnName, weight, positive):
        temp = cmath.sqrt((df[columnName] * df[columnName]).sum())
        #wi*ri
        if temp == 0:
            df[columnName + '_vi'] = weight * 0
        else:
            df[columnName + '_vi'] = weight * df[columnName] / temp
        #vi+, vi-
        if positive == True:
            df[columnName + '_best'] = df[columnName + '_vi'].max()
            df[columnName + '_worst'] = df[columnName + '_vi'].min()
        else:
            df[columnName + '_best'] = df[columnName + '_vi'].min()
            df[columnName + '_worst'] = df[columnName + '_vi'].max()

    def buildData(self, df, stock):
        data = stock.get_data()
        last_line = stock.get_Lastline()
        data.loc[data['time'] == last_line['time'], 'net'] = stock.get_net()
        data.loc[data['time'] == last_line['time'],
                 'v300'] = stock.get_speed('v300')
        data.loc[data['time'] == last_line['time'],
                 'v120'] = stock.get_speed('v120')
        data.loc[data['time'] == last_line['time'],
                 'v30'] = stock.get_speed('v30')
        minR = stock.get_minR()
        times = 0
        for i in [1, 2, 3, 4]:
            if 'R' + str(i) != minR:
                times = times + stock.get_rBreakTimes('R' + str(i))
            else:
                break
        data.loc[data['time'] == last_line['time'], 'r_break'] = times
        last_line = stock.get_Lastline()
        return df.append([last_line])

    def calc(self, zs, stock, dh, hygn, netMoney):
        if not self.canCalc(stock, dh):
            return False
        open_p = self.getOpenPercent(stock)
        conf = self.getConfig(open_p)
        if conf is None:
            dh.add_buyed(stock.get_code(), False)
            return False
        self.initStockData(stock, open_p, conf)
        self.updateStock(stock, conf)
        return self.isStockMatch(zs, stock, conf, hygn, netMoney, dh)

#   def isJHJJMatch(self,stock,dh):
#       lastLine = stock.get_Lastline()
#       now_time = lastLine['time']
#       if now_time >= '09:30:00':
#          return True
#       if stock.len() >= 2:
#          lastSecondLine = stock.get_LastSecondline()
#          if now_time > '09:17:00' and now_time < '09:20:00':
#             b1_v = self.convertToFloat(lastLine.get('b1_v'))
#             b1_amount = float(lastLine.get('b1_p')) * b1_v * 100
#             lastB1_v = self.convertToFloat(lastSecondLine.get('b1_v'))
#             lastB1_amount = float(lastSecondLine.get('b1_p')) * lastB1_v * 100
#             if b1_v < lastB1_v * 0.5 or b1_amount < lastB1_amount * 0.5:
#                dh.add_buyed(stock.get_code(),True)
#                return False
#          if now_time > '09:24:30' and now_time < '09:25:03':
#             b1_v = self.convertToFloat(lastLine.get('b1_v'))
#             b1_amount = float(lastLine.get('b1_p')) *  b1_v * 100
#             if b1_v <= 1000 or b1_amount <= 3000000:
#                dh.add_buyed(stock.get_code(),True)
#                return False
#          return True
#       return False

    def isOpenMatch(self, row):
        if float(row['pre_close']) == 0 or float(row['open']) == 0:
            return False
        return (float(row['open']) - float(row['pre_close'])) / float(
            row['pre_close']) * 100 >= -1.0

    def isOpenMatch2(self, row):
        if float(row['settlement']) == 0 or float(row['open']) == 0:
            return False
        return (float(row['open']) - float(row['settlement'])) / float(
            row['settlement']) * 100 >= -1.0

    def canCalc(self, stock, dh):
        if stock.len() < 0:
            return False

    #   if not self.isJHJJMatch(stock,dh):
    #      return False
        lastLine = stock.get_Lastline()
        if float(lastLine.get('open')) == 0.0:
            return False
        lastSecondLine = stock.get_LastSecondline()
        if lastSecondLine is None:
            return False
        if float(lastSecondLine.get('open')) == 0.0:
            return False
        return True

    def initStockData(self, stock, open_p, conf):
        r_line = self.__config.get_t1()['R_line']
        for key in r_line:
            if stock.get_r_val(key) == -10:
                val = open_p + (10 - open_p) * r_line[key]
                stock.set_r_val(key, val)

    def updateStock(self, stock, conf):
        self.updateBreakRtimes(stock, conf)

    #   self.updateSpeed(stock)
    #   self.updatePriceVolumeMap(stock)
    #   try:
    #      self.updateBigMoney(stock,conf)
    #   except Exception as e:
    #          MyLog.error('updateBigMoney error \n')
    #          MyLog.error(str(e) +  '\n')

    def updatePriceVolumeMap(self, stock):
        try:
            last_line = stock.get_Lastline()
            time = last_line['time']
            if time > self.__config.get_t1(
            )['stop']['am_stop'] and time < self.__config.get_t1(
            )['stop']['pm_start']:
                return
            stock.addPriceVolumeMap(last_line['date'], last_line['time'],
                                    float(last_line['price']),
                                    float(last_line['volume']))
        except Exception as e:
            MyLog.error('updatePriceVolumeMap error \n')
            MyLog.error(str(e) + '\n')

    def updateSpeed(self, stock):
        data = stock.get_data()
        last_line = stock.get_Lastline()
        now_time = dt.datetime.strptime(
            last_line['date'] + ' ' + last_line['time'], '%Y-%m-%d %H:%M:%S')
        l = stock.len()
        for i in [30, 120, 300]:
            pos = l
            if int(i / 3) + 1 < l:
                pos = int(i / 3) + 1
            df_temp = data.tail(pos)
            for index, row in df_temp.iterrows():
                if float(row['open']) != 0.0:
                    row_time = dt.datetime.strptime(
                        row['date'] + ' ' + row['time'], '%Y-%m-%d %H:%M:%S')
                    deltaS = (now_time - row_time).seconds
                    if deltaS == 0:
                        stock.set_speed('v' + str(i), 0)
                        break
                    if deltaS <= i and deltaS >= i - 6:
                        p = (float(last_line.get('price')) - float(
                            row['price'])) / float(row['pre_close']) * 100
                        stock.set_speed('v' + str(i), p / deltaS)
                        # MyLog.info('speed %s = %f' % ('v' + str(i),p / deltaS))
                        break

    def convertToFloat(self, str):
        if str == '':
            return 0
        try:
            return float(str)
        except Exception as e:
            MyLog.error('convertToFloat error: ' + str + '\n')
            return 0

    def theLastIsSellOrBuy(self, stock):
        lastLine = stock.get_Lastline()
        lastSeconfLine = stock.get_LastSecondline()
        last_amount = float(lastLine.get('amount'))
        last_sec_amount = float(lastSeconfLine.get('amount'))
        if last_sec_amount == last_amount:
            return 'no_deal'
        last_price = float(lastLine.get('price'))
        last_b_p_1 = float(lastLine.get('b1_p'))
        last_b_v_1 = self.convertToFloat(lastLine.get('b1_v'))
        last_a_p_1 = float(lastLine.get('a1_p'))
        last_a_v_1 = self.convertToFloat(lastLine.get('a1_v'))
        last_sec_price = float(lastSeconfLine.get('price'))
        last_sec_b_p_1 = float(lastSeconfLine.get('b1_p'))
        last_sec_b_v_1 = self.convertToFloat(lastSeconfLine.get('b1_v'))
        last_sec_a_p_1 = float(lastSeconfLine.get('a1_p'))
        last_sec_a_v_1 = self.convertToFloat(lastSeconfLine.get('a1_v'))
        if (last_a_p_1 > last_sec_a_p_1 or
            (last_a_p_1 == last_sec_a_p_1 and
             last_a_v_1 < last_sec_a_v_1)) and (last_price >= last_sec_price):
            return 'drive_buy'
        elif (last_b_p_1 < last_sec_b_p_1 or
              (last_b_p_1 == last_sec_b_p_1 and last_b_v_1 < last_sec_b_v_1)
              ) and (last_price <= last_sec_price):
            return 'drive_sell'
        return 'unknown'

    def updateBigMoney(self, stock, conf):
        lastLine = stock.get_Lastline()
        now_time = dt.datetime.strptime(
            lastLine['date'] + ' ' + lastLine['time'], '%Y-%m-%d %H:%M:%S')
        lastSeconfLine = stock.get_LastSecondline()
        last_time = dt.datetime.strptime(
            lastSeconfLine['date'] + ' ' + lastSeconfLine['time'],
            '%Y-%m-%d %H:%M:%S')
        last_amount = float(lastLine.get('amount'))
        last_sec_amount = float(lastSeconfLine.get('amount'))
        last_volume = float(lastLine.get('volume'))
        last_sec_volume = float(lastSeconfLine.get('volume'))
        amount = last_amount - last_sec_amount
        volume = last_volume - last_sec_volume
        big_amount = self.__config.get_t1()['big_money']['amount']
        big_volume = self.__config.get_t1()['big_money']['volume']
        #   MyLog.info('price=%s,amount=%s' % (lastLine['price'],amount))
        #   if amount >= big_amount or volume >= big_volume:
        type = self.theLastIsSellOrBuy(stock)
        if type == 'drive_buy':
            stock.addBigMoneyIn(last_amount - last_sec_amount)
            #  MyLog.info('in = %f' % stock.getBigMoneyIn())
            stock.addNetBuy(last_amount - last_sec_amount)
        #  MyLog.info('net = %f' % stock.get_net())
        elif type == 'drive_sell':
            stock.addBigMoneyOut(last_amount - last_sec_amount)
            stock.addNetBuy(last_sec_amount - last_amount)
        #    MyLog.info('net = %f' % stock.get_net())

    def updateBreakRtimes(self, stock, conf):
        now_p = self.getCurrentPercent(stock)
        lastSecondLine = stock.get_LastSecondline()
        last_p = self.getPercent(lastSecondLine.get('price'), stock)
        for key in ['R1', 'R2', 'R3', 'R4']:
            val = stock.get_r_val(key)
            if last_p > val and now_p < val:
                stock.add_rBreakTimes(key)
        minR = stock.get_minR()
        if minR is None:
            minR = conf['min_R']
        if stock.get_rBreakTimes(minR) > 0:
            for i in [1, 2, 3, 4, 5]:
                if i > int(minR[-1]) and stock.get_rBreakTimes('R' +
                                                               str(i)) == 0:
                    stock.set_minR('R' + str(i))
                    break
        else:
            stock.set_minR(minR)

    def getConfig(self, open_p):
        t1 = self.__config.get_t1()
        keys = ['A', 'B', 'C']
        for key in keys:
            if t1[key]['open_p'][0] <= open_p and open_p < t1[key]['open_p'][1]:
                return t1[key]

    def isStockMatch(self, zs, stock, conf, hygn, netMoney, dh):
        #   if 'zs' in self.__config.get_t1()['strategy'] and not self.isZSMatch(zs,stock):
        #      return False
        if 'time' in self.__config.get_t1(
        )['strategy'] and not self.isTimeMatch(stock, conf):
            return False

    #   if 'hygn' in self.__config.get_t1()['strategy'] and not self.isHygnMatch(stock,hygn):
    #      return False
    #   if 'net' in self.__config.get_t1()['strategy'] and not self.isNetMatch(stock,conf):
    #      return False
    #   if 'speed' in self.__config.get_t1()['strategy'] and stock.get_minR() != 'R5':
    #      if not self.isSpeedMatch(stock,conf):
    #         return False
    #   if 'pvmap' in self.__config.get_t1()['strategy'] and not self.isPriceVolumeMapMatch(stock):
    #      return False
    #   if 'netRatio' in self.__config.get_t1()['strategy'] and not self.netMoneyRatioMatch(stock,netMoney):
    #      return False
        if 'xspeed' in self.__config.get_t1(
        )['strategy'] and not self.isXSpeedMatch(dh, stock):
            return False
        if 'minR' in self.__config.get_t1(
        )['strategy'] and not self.isReachMinR(stock):
            return False
        return self.isLastTwoMatch(stock)

    def isZSMatch(self, zs, stock):
        code = stock.get_code()
        i = 0
        if code.startswith('3'):
            i = 5
        line = zs.iloc[i]
        pre_close = line.get('pre_close')
        price = line.get('price')
        p = (float(price) - float(pre_close)) / float(pre_close) * 100
        return p > 0

    def isXSpeedMatch(self, dh, stock):
        now_line = stock.get_Lastline()
        ccp = self.getCurrentPercent(stock)
        ocp = self.getOpenPercent(stock)
        if ocp - ccp >= self.__config.get_t1()['x_speed']['lowerThanBefore']:
            stock.add_lowerThanBeforeTimes()
            if stock.get_lowerThanBeforeTimes() > self.__config.get_t1(
            )['x_speed']['lowerThanBeforeTimes']:
                dh.add_buyed(stock.get_code(), False)
                return False
        ct = dt.datetime.strptime(now_line['date'] + ' ' + now_line['time'],
                                  '%Y-%m-%d %H:%M:%S')
        len = stock.len()
        i = len - 2
        if i > self.__config.get_t1()['x_speed']['maxStickNum']:
            i = self.__config.get_t1()['x_speed']['maxStickNum']
        while i >= 0:
            line = stock.get_data().iloc[i]
            price = float(line['price'])
            pcp = self.getPercent(price, stock)
            if pcp - ccp >= self.__config.get_t1(
            )['x_speed']['lowerThanBefore']:
                stock.add_lowerThanBeforeTimes()
                if stock.get_lowerThanBeforeTimes() > self.__config.get_t1(
                )['x_speed']['lowerThanBeforeTimes']:
                    dh.add_buyed(stock.get_code(), False)
                    return False
            if ccp - pcp >= (10 -
                             pcp) * self.__config.get_t1()['x_speed']['a']:
                if ccp - pcp >= (ccp - ocp) * self.__config.get_t1(
                )['x_speed']['b'] and pcp > ocp:
                    pt = dt.datetime.strptime(
                        line['date'] + ' ' + line['time'], '%Y-%m-%d %H:%M:%S')
                    if (ct - pt).seconds / 60 <= (
                            ccp -
                            pcp) * self.__config.get_t1()['x_speed']['c']:
                        #   MyLog.info('[%s] match cond a, ccp = %s, pcp = %s' % (stock.get_code(),ccp,pcp))
                        #   MyLog.info('[%s] match cond b, ccp = %s, ocp = %s' % (stock.get_code(),ccp,ocp))
                        #   MyLog.info('[%s] match cond c, ct = %s, pt = %s' % (stock.get_code(),ct,pt))
                        last_second_line = stock.get_LastSecondline()
                        deltaVolume = float(now_line['volume']) - float(
                            last_second_line['volume'])
                        deltaAmount = float(now_line['amount']) - float(
                            last_second_line['amount'])
                        stock.add_buySignal()
                        if stock.get_buySignal() >= self.__config.get_t1(
                        )['trade']['maxBuySignal'] or deltaVolume >= self.__config.get_t1(
                        )['x_speed'][
                                'minimumVolume'] or deltaAmount >= self.__config.get_t1(
                                )['x_speed']['minimumAmount']:
                            return True
                        return False
            i = i - 1
        stock.reset_buySignal()
        #   perform the calc time test
        #   now = dt.datetime.now()
        #   if stock.get_time() is not None:
        #      deltaSeconds = (now - stock.get_time()).seconds
        #      if deltaSeconds > 3:
        #         print('[%s] calc more than %s s' % (stock.get_code(),deltaSeconds))
        #   stock.set_time(now)
        return False

    def netMoneyRatioMatch(self, stock, netMoney):
        if netMoney is None:
            return False
        return stock.get_code() in netMoney

    def isHygnMatch(self, stock, hygn):
        if hygn is None:
            return False
        code = stock.get_code()
        if code not in self.__hygnData:
            return False
        stockHYGN = self.__hygnData[code]
        if 'hy' in stockHYGN:
            shys = stockHYGN['hy']
            for shy in shys:
                for hy in hygn['hy']:
                    if shy == hy:
                        return True
        if 'gn' in stockHYGN:
            sgns = stockHYGN['gn']
            for sgn in sgns:
                for gn in hygn['gn']:
                    if sgn == gn:
                        return True
        return False

    def isPriceVolumeMapMatch(self, stock):
        pvMap = stock.getPriceVolumeMap()
        if len(pvMap) < 2:
            return True
        lastPrice = 0
        maxBuyVolume = 0
        for pv in pvMap:
            if lastPrice != 0:
                if pv['price'] < lastPrice and maxBuyVolume != 0 and pv[
                        'volume'] > maxBuyVolume * self.__config.get_t1(
                        )['pvRatio']:
                    return False
                if pv['price'] > lastPrice and pv['volume'] > maxBuyVolume:
                    maxBuyVolume = pv['volume']
            lastPrice = pv['price']
        return True

    def isLastTwoMatch(self, stock):
        data = stock.get_data()
        if stock.len() < 3:
            return False
        price = float(data.iloc[-1].get('price'))
        price2 = float(data.iloc[-2].get('price'))
        price3 = float(data.iloc[-2].get('price'))
        return price - price2 > 0 and price2 - price3 >= 0

    def isSpeedMatch(self, stock, conf):
        v30 = stock.get_speed('v30')
        v120 = stock.get_speed('v120')
        v300 = stock.get_speed('v300')
        p = self.getCurrentPercent(stock)
        v_list = [v30, v120, v300]
        flag = False
        if v_list[0] * 30 >= (
                10 - p) * self.__config.get_t1()['speed']['v30_ratio']:
            flag = True
        elif v_list[0] >= self.__config.get_t1()['speed']['v30'] and (
                v_list[1] >= self.__config.get_t1()['speed']['v120']
                or v_list[2] >= self.__config.get_t1()['speed']['v300']):
            flag = True
        if flag == True:
            last_line = stock.get_Lastline()
            info = '[%s] *** [%s] match speed at %s %s,v30=%s,v120=%s,v300=%s ***' % (
                Utils.getCurrentTime(), stock.get_code(), last_line['date'],
                last_line['time'], str(v30), str(v120), str(v300))
            MyLog.info(info)
        return flag

    def isBigMoneyMatch(self, stock, conf):
        p = stock.get_net() / stock.getBigMoneyIn()
        flag = p > self.__config.get_t1()['big_money']['threshold']
        if flag == True:
            last_line = stock.get_Lastline()
            info = '[%s] *** [%s] match big_money at %s %s,net=%s,in=%s,p=%s ***' % (
                Utils.getCurrentTime(), stock.get_code(), last_line['date'],
                last_line['time'], str(
                    stock.get_net()), str(stock.getBigMoneyIn()), str(p * 100))
            MyLog.info(info)
        return flag

    def isNetMatch(self, stock, conf):
        last_line = stock.get_Lastline()
        return stock.get_net() >= conf['big_money']['net'] * float(
            last_line['price'])

    def isTimeMatch(self, stock, conf):
        lastLine = stock.get_Lastline()
        timeStr = lastLine['time']
        return timeStr <= conf['time']

    def getPercent(self, price, stock):
        lastLine = stock.get_Lastline()
        pre_close = lastLine.get('pre_close')
        open_p = (float(price) - float(pre_close)) / float(pre_close) * 100
        return open_p

    def getCurrentPercent(self, stock):
        lastLine = stock.get_Lastline()
        price = lastLine.get('price')
        return self.getPercent(price, stock)

    def getOpenPercent(self, stock):
        ocp = stock.get_cache('ocp')
        if ocp is not None:
            return ocp
        lastLine = stock.get_Lastline()
        open = lastLine.get('open')
        ocp = self.getPercent(open, stock)
        stock.set_cache('ocp', ocp)
        return ocp

    def isReachMinR(self, stock):
        now_p = self.getCurrentPercent(stock)
        minR = stock.get_minR()
        return now_p > stock.get_r_val(minR)