def riseStopCheck(self, stocks):
     # 连续3个涨停板,三个涨停必须满足: 1,连续; 2,只有3个,不能多。
     check_period = 10
     selected_stocks = []
     for stock in stocks:
         close_prices = history_bars(stock, check_period+1, '1d', 'close')
         if (Utility.isContinueRiseStop(close_prices, max_co_present=3) 
                 and not Utility.isContinueRiseStop(close_prices, max_co_present=4)):
             selected_stocks.append(stock)
             self.logger.debug('选出三连板的股票%s' % (stock))
     return selected_stocks
 def _avgCrossFind(self, open_price, close_price, avg20, avg30, avg60):
     break_through = []
     if Utility.avgCrossCheck(open_price, close_price, avg60):
         # 突破60日均线
         break_through.append(60)
     if Utility.avgCrossCheck(open_price, close_price, avg30):
         # 突破30日线
         break_through.append(30)
     if Utility.avgCrossCheck(open_price, close_price, avg20):
         # 突破20日线
         break_through.append(20)
     return break_through
 def riseStopCheck(self, stocks):
     # 选出日涨停,且不是连续涨停
     check_period = 10
     selected_stocks = []
     for stock in stocks:
         high_prices = history_bars(stock, check_period+1, '1d', 'high')
         close_prices = history_bars(stock, check_period+1, '1d', 'close')
         # 要求收盘价等于最高价,但要求收盘价高于9.95%
         if (Utility.isRiseStopNow(close_prices) and close_prices[-1] == high_prices[-1]
                 and not Utility.isContinueRiseStop(close_prices, max_co_present=2)):
             selected_stocks.append(stock)
             self.logger.debug('选出当日涨停,且不连续涨停的股票%s' % stock)
     return selected_stocks
 def fallStopCheck(self, stocks):
     # 一月内不能出现连续跌停,且选出当日不能跌停
     check_period = 20
     selected_stocks = []
     for stock in stocks:
         close_prices = history_bars(stock, check_period+1, '1d', 'close')
         if not (Utility.isContinueFallStop(close_prices, min_co_present=2)
                 or
                 Utility.isFallStopNow(close_prices)):
             selected_stocks.append(stock)
         else:
             self.logger.debug('%s股票一月内存在连续跌停,剔除' % stock)
     return selected_stocks
 def volShrinkCheck(self, stocks):
     check_period = 3
     selected_stocks = []
     for stock in stocks:
         close_prices = history_bars(stock, check_period+1, '1d', 'volume')
         if Utility.isabsoluteDesc(close_prices[:-1]):
             selected_stocks.append(stock)
             self.logger.debug('%s股票选出日前连续3天缩量下跌' % stock)
     return selected_stocks
Beispiel #6
0
 def filterBuySuspend(self, select_stocks, bar_dict):
     # 过滤正在持仓的股票
     # 过滤当天停盘的股票
     # 过滤处于空头市场的股票
     hold_stocks = self.tdb.getHoldStocks()
     for buy_reason in select_stocks.keys():
         stocks = select_stocks[buy_reason]
         buy_candidate = []
         for stock in stocks:
             # 过滤停盘和持仓的股票
             if not (bar_dict[stock].suspended or stock in hold_stocks):
                 # 只保留多头市场下的候选股票, 过滤处于空头市场的股票
                 if self.bp_sh and Utility.isSHZstock(stock):
                     # pdb.set_trace()
                     buy_candidate.append(stock)
                 elif self.bp_sz and Utility.isSZCstock(stock):
                     buy_candidate.append(stock)
         select_stocks[buy_reason] = buy_candidate
     return select_stocks
 def tunoverRateCheck(self, stocks):
     # 换手率数据取不到,因此采用成交量数据代替
     # 换手率=当日成交额/流通股本
     check_period = 3
     selected_stocks = []
     for stock in stocks:
         vols = history_bars(stock, check_period, '1d', 'volume')
         if Utility.isabsoluteIncr(vols):
             selected_stocks.append(stock)
             self.logger.debug('选出成交量逐渐放大的股票%s' % (stock))
     return selected_stocks
 def _strengthCheck(self, break_through, open_price, close_price, avg20, avg30, avg60):
     if len(break_through) == 0:
         # 没有上穿任何一条中期均线,直接忽略
         return False
     elif len(break_through) < 3:
         # 只突破了2条或者1条中期均线,则必须是强势突破形态,上方不能有明显的均线压制
         if close_price < avg20 and Utility.incraceRate(avg20, close_price) < 0.03:
             # 判断是否被20日线压制(20日线距离收盘价小于3%)
             return False
         if close_price < avg30 and Utility.incraceRate(avg30, close_price) < 0.03:
             # 判断是否被30日线压制(30日线距离收盘价小于3%)
             return False
         if close_price < avg60 and Utility.incraceRate(avg60, close_price) < 0.03:
             # 判断是否被60日线压制(60日线距离收盘价小于3%)
             return False
     # 判断上穿均线和收盘价的位置关系:
     #     1,如果长阳线的位置太靠上,那么突破当天所透支的能量太多,有回调需求, 不能选择。
     #     2,一阳穿三阴,超级强势形态
     mp = {20: avg20, 30: avg30, 60: avg60}
     return Utility.avgPositionCheck(close_price, open_price, [mp[key] for key in break_through], 0.4)
 def seekBoardCheck(self, sc_dict):
     # 涨停卖出规则:买入条件为打板时,只要不能连续涨停就卖出
     sell_stocks = []
     for stock in sc_dict.keys():
         close = history_bars(stock, self.period, '1d', 'close')
         buy_reason = sc_dict[stock][2]
         if buy_reason == '打板' \
            and not Utility.isRiseStopNow(close):
             sell_stocks.append(stock)
     # 从可卖股票中删除打板股票,以免对后续处理造成影响
     for stock in sell_stocks:
         sc_dict.pop(stock)
     return sell_stocks