def testMAX(self): barDs = self.__loadBarDS() self.assertTrue( compare( indicator.MAX(barDs.getOpenDataSeries(), 252, 14)[13], 98.815)) self.assertTrue( compare( indicator.MAX(barDs.getOpenDataSeries(), 252, 14)[14], 98.815)) self.assertTrue( compare( indicator.MAX(barDs.getOpenDataSeries(), 252, 14)[-1], 110.69))
def testMAX(self): barDs = self.__loadBarDS() self.assertAmountsAreEqual(indicator.MAX(barDs.getOpenDataSeries(), 252, 14)[13], 98.815, precision=1) self.assertAmountsAreEqual(indicator.MAX(barDs.getOpenDataSeries(), 252, 14)[14], 98.815, precision=1) self.assertAmountsAreEqual( indicator.MAX(barDs.getOpenDataSeries(), 252, 14)[-1], 110.69)
def select_instruments(self, instruments, period): selected_instruments = [] for instrument in instruments: hist_h = self.history(instrument, 'high', period) hist_l = self.history(instrument, 'low', period) hist_c = self.history(instrument, 'close', period) hist_o = self.history(instrument, 'open', period) hist_v = self.history(instrument, 'volume', period) ''' { 30个交易日内最低点到最高点涨幅超过50%,30日内最少有两个涨停板,上市日期超过60日 } HP:=HHV(HIGH,N);{N日内最高价} LP:=LLV(LOW,N);{30日内最低价} HD:=HHVBARS(HIGH,N);{出现最高价离现在的时间} LD:=LLVBARS(LOW,N);{出现最低价离现在的时间} OP1 := ((HP-LP)/LP > M/100);{N内涨幅超过M%} OP2 := (COUNT(CLOSE/REF(CLOSE,1)>1.097,N)>=2);{N日内出现2个以上涨停板} OP3 := LD>HD;{30日内最低点出现在最高点前面} OP4 := (BARSCOUNT(C)+1)>60;{排除最近60天上市的次新股} OP5 := DYNAINFO(4)>0; 条件选股:OP1 AND OP2 AND OP3 AND OP4 AND OP5; ''' hp_arr = indicator.MAX(hist_h, period) hp = hp_arr[-1] lp_arr = indicator.MIN(hist_l, period) lp = lp_arr[-1] hd_arr = indicator.MAXINDEX(hist_h, period) ld_arr = indicator.MININDEX(hist_l, period) hd = len(hist_h) - hd_arr[-1] ld = len(hist_l) - ld_arr[-1] if (hp - lp) / lp < 0.4: continue if self.count_limit_up(hist_c) < 2: continue if hd > ld: continue last_open = hist_o[-1] last_close = hist_c[-1] pre_last_close = hist_c[-2] raise_percent = (pre_last_close - last_close) / pre_last_close raise_percent2 = (last_close - last_open) / last_open if raise_percent > 0.03 or raise_percent < -0.03: continue if raise_percent2 > 0.03 or raise_percent2 < -0.02: continue ''' OP1 := ABS((LOW-TROUGH(2,15,1))/TROUGH(2,15,1))<=0.03; OP11 := ABS((LOW-TROUGH(2,15,2))/TROUGH(2,15,2))<=0.03 AND (TROUGH(2,15,2) <= TROUGH(2,15,1)); OP111 := ABS((LOW-TROUGH(2,15,3))/TROUGH(2,15,3))<=0.03 AND (TROUGH(2,15,3) <= TROUGH(2,15,1)); OP2 := V < MA(V,30) OR V < HHV(V,30)/3; OP3 := TROUGHBARS(2,15,1) > 3; 条件选股:(OP1 OR OP11 OR OP111) AND OP2 AND OP3; ''' ma_volume = indicator.MA(hist_v, period) max_volume = indicator.MAX(hist_v, period) if hist_v[-1] >= ma_volume[-1] and hist_v[-1] >= max_volume[-1] / 3: continue trough, troughbars = self.get_trough(instrument) if len(trough) == 0 or len(troughbars) == 0: continue if troughbars[0] <= 3: continue last_low = hist_l[-1] op1 = abs((last_low - trough[0]) / trough[0]) <= 0.03 op2 = len(trough) >= 2 and abs( (last_low - trough[1]) / trough[1]) <= 0.03 op3 = len(trough) >= 3 and abs( (last_low - trough[2]) / trough[2]) <= 0.03 if op1: self.__stop_loss_price[instrument] = trough[0] else: continue ''' elif op2: self.__stop_loss_price[instrument] = trough[1] elif op3: self.__stop_loss_price[instrument] = trough[2] ''' selected_instruments.append(instrument) return selected_instruments