def analyze(stock_code, date, period): signal = "" score = 0.0 BR = getBR(stock_code, date) AR = getAR(stock_code, date) if (BR < AR) and (BR < 100): score += 1 signal += "[1]BR<AR,且BR<100,可考虑逢低买进;" if (BR < AR) and (AR < 50): score += 1 signal += "[1]BR<AR,而AR<50时,是买进信号;" BRs = getBRs(stock_code, date, period) ARs = getARs(stock_code, date, period) BR_K = mu.getPoly(BRs, 1)[0] AR_K = mu.getPoly(ARs, 1)[0] if (BR_K >= UP_RATIO_THREHOLD) and (AR_K >= UP_RATIO_THREHOLD): score -= 1 signal += "[-1]AR和BR同时急速上升,意味着股价已近顶部,持股者应逢高卖出;" print score print signal.decode("utf-8").encode("gbk") bd.updateAnalysisData("BRAR", str(score) + ";" + signal, stock_code, date) return [score, signal]
def analyze(stock_code, date, period): score = 0 signal = "" WR = getWR(stock_code, date) if WR >= 80: score += 1 signal += "[1]当%R线达到80时,市场处于超卖状况,股价走势随时可能见底。因此,80的横线一般称为买进线,投资者在此可以伺机买入;" if WR <= 20: score -= 1 signal += "[-1]当%R线达到20时,市场处于超买状况,走势可能即将见顶,20的横线被称为卖出线;" WRs = bd.getTechDataInPeriod("WR", stock_code, date, period) WR_K = mu.getPoly(WRs, 1)[0] if WR > 50 and WR_K > 0: score += 1 signal += "[1]当%R向下跌破50中轴线时,市场由弱转强,是买进信号;" if WR < 50 and WR_K < 0: score -= 1 signal += "[-1]当%R从超买区向上爬升,突破50中轴线后,可以确认强势转弱,是卖出信号;" print score print signal.decode("utf-8").encode("gbk") bd.updateAnalysisData("WR", str(score) + ";" + signal, stock_code, date) return [score, signal]
def calcROC(stock_code, date, period): pday = bd.getStockDate(stock_code, date, period) BX = bd.getBasicData("CLOSE_TODAY", stock_code, pday) close_today = bd.getBasicData("CLOSE_TODAY", stock_code, date) AX = close_today - BX ROC = AX / BX * 100 return round(ROC, 3)
def analyze(stock_code, date, period): score = 0.0 signal = "" RSI = getRSI(stock_code, date) if 90 > RSI > 80: score -= 1 signal += "[-1]当六日指标上升到达80时,表示股市已有超买现象;" if RSI > 90: score -= -1 signal += "[-1]超过90以上时,则表示已到严重超买的警戒区,股价已形成头部,极可能在短期内反转回转;" if 10 < RSI < 20: score += 1 signal += "[1]六日强弱指标下降至20时,表示股市有超卖现象;" if RSI < 10: score += 1 signal += "[1]一旦继续下降至10以下时则表示已到严重超卖区域,股价极可能有止跌回升的机会;" close_in_period = bd.getBasicDataInPeriod("CLOSE_TODAY", stock_code, date, period) RSI_in_period = bd.getTechDataInPeriod("CCI", stock_code, date, period) close_k = mu.getPoly(close_in_period, 1)[0] RSI_k = mu.getPoly(RSI_in_period, 1)[0] if close_k > 0 and RSI_k < 0: signal += "强弱指标下降而股价反趋上涨,产生的背离现象;" if close_k < 0 and RSI_k > 0: signal += "强弱指标上升而股价反而下跌, 产生的背离现象;" print score print signal.decode("utf-8").encode("gbk") bd.updateAnalysisData("RSI", str(score) + ";" + signal, stock_code, date) return [score, signal]
def analyze(stock_code, date, period1, period2): signal = "" score = 0.0 recent_high_price = bd.getHighPriceInPeriod("CLOSE_TODAY", stock_code, date, period1) recent_low_price = bd.getLowPriceInPeriod("CLOSE_TODAY", stock_code, date, period1) close_today = bd.getBasicData("CLOSE_TODAY", stock_code, date) BBI = getBBI(stock_code, date) if (abs(close_today - recent_high_price) / recent_high_price <= HIGH_OFFSET / 100) and (BBI > close_today): score = score - 1 signal = signal + "[-1]股价在高价区以收市价跌破多空线为卖出信号;" if (abs(close_today - recent_low_price) / recent_low_price <= LOW_OFFSET / 100) and (BBI < close_today): score = score + 1 signal = signal + "[1]股价在低价区以收市价突破多空线为买入信号;" BBIs = getBBIs(stock_code, date, period2) K = mu.getPoly(BBIs, 1)[0] if (K > 0) and (BBI > close_today): score += 1 signal += "[1]多空指数由下向上递增,股价在多空线上方,表明多头势强,可以继续持股;" if (K < 0) and (BBI < close_today): score -= 1 signal += "[-1]多空指数由上向下递减,股价在多空线下方,表明空头势强,一般不宜买入;" print score print signal.decode("utf-8").encode("gbk") bd.updateAnalysisData("BBI", str(score) + ";" + signal, stock_code, date) return [score, signal]
def analyze(stock_code, date, period): score = 0 signal = "" print score print signal.decode("utf-8").encode("gbk") bd.updateAnalysisData("DMI", str(score) + ";" + signal, stock_code, date) return [score, signal]
def analyze(stock_code, date): score = 0 signal = "" pday = bd.getStockDate(stock_code, date, 1) KDJ_K, KDJ_D, KDJ_J = getKDJ(stock_code, date) KDJ_K_pday, KDJ_D_pday, KDJ_J_pday = getKDJ(stock_code, pday) if KDJ_K >= 90: score -= 1 signal += "[-1]K线是快速确认线——数值在90以上为超买;" if KDJ_K <= 10: score += 1 signal += "[1]K线是快速确认线——数值在10以下为超卖;" if KDJ_D >= 80: score -= 1 signal += "[-1]D线是慢速主干线——数值在80以上为超买;" if KDJ_D <= 20: score += 1 signal += "[1]D线是慢速主干线——数值在20以下为超卖;" if KDJ_J >= 90: score -= 1 signal += "[-1]J线为方向敏感线,当J值大于90,特别是连续5天以上,股价至少会形成短期头部;" if KDJ_J <= 10: score += 1 signal += "[1]J线为方向敏感线,当J值小于10,特别是连续数天以上,股价至少会形成短期底部;" if KDJ_K_pday < KDJ_D_pday and KDJ_K > KDJ_D: score += 1 signal += "[1]K线从下方上穿D线,所以在图形上K线向上突破D线时,俗称金叉,即为买进的讯号;" if KDJ_K < 20 and KDJ_D < 20: score += 1 signal += "[1]当K,D线在20以下交叉向上,此时的短期买入的信号较为准确;" # TODO 如果K值在50以下,由下往上接连两次上穿D值,形成右底比左底高的“W底”形态时,后市股价可能会有相当的涨幅。 if KDJ_K_pday > KDJ_D_pday and KDJ_K < KDJ_D: score -= 1 signal += "[-1]K线从上方下穿D线,显示趋势是向下的,所以在图形上K线向下突破D线时,俗称死叉,即为卖出的讯号;" if KDJ_K > 20 and KDJ_D > 20: score -= 1 signal += "[-1]当K,D线在80以上交叉向下,此时的短期卖出的信号较为准确;" # TODO 如果K值在50以上,由上往下接连两次下穿D值,形成右头比左头低的“M头”形态时,后市股价可能会有相当的跌幅。。 # TODO 4. 通过KDJ与股价背离的走势,判断股价顶底也是颇为实用的方法:4.1股价创新高,而KD值没有创新高,为顶背离,应卖出;4.2股价创新低,而KD值没有创新低,为底背离,应买入 ''' print KDJ_K print KDJ_D print KDJ_J print KDJ_K_pday print KDJ_D_pday print KDJ_J_pday ''' print score print signal.decode("utf-8").encode("gbk") bd.updateAnalysisData("KDJ", str(score) + ";" + signal, stock_code, date) return [score, signal]
def analyze(stock_code, date, period): score = 0.0 signal = "" pday = bd.getStockDate(stock_code, date, 1) CCI = getCCI(stock_code, date) CCI_pday = getCCI(stock_code, pday) CCIs = getCCIs(stock_code, date, period) CCI_K1 = mu.getPoly(CCIs, 1)[0] CCI_K2 = mu.getPoly(CCIs, 2)[0] print CCI print CCI_pday print CCIs print CCI_K1 print CCI_K2 if CCI > 100: score -= 0.5 signal += "[-0.5]当CCI>﹢100时,表明股价已经进入非常态区间—超买区间;" if CCI_K1 > 0: score += 1 signal += "[1]CCI曲线向上突破﹢100线而进入非常态区间后,只要CCI曲线一直朝上运行,就表明股价强势依旧,中短线应及时买入,如果有比较大的成交量配合,买入信号则更为可靠;" if CCI_K2 < 0 and (CCI -100) >= CCI_THREHOLD: score -= 1 signal += "[-1]当CCI曲线在﹢100线以上的非常态区间,在远离﹢100线的地方开始掉头向下时,表明股价的强势状态将难以维持,是股价比较强的转势信号。如果前期的短期涨幅过高时,更可确认。此时,投资者应及时逢高卖出股票;" if CCI < -100: score += 0.5 signal += "[0.5]当CCI<﹣100时,表明股价已经进入另一个非常态区间—超卖区间;" if CCI_K1 < 0: score -= 1 signal += "[-1]当CCI曲线向下突破﹣100线而进入另一个非常态区间后,只要CCI曲线一路朝下运行,就表明股价弱势依旧,投资者可一路观望;" if CCI_K2 > 0: score += 0.5 signal += "[0.5]当CCI曲线向下突破﹣100线而进入另一个非常态区间,如果CCI曲线在超卖区运行了相当长的一段时间后开始掉头向上,表明股价的短期底部初步找到,投资者可少量建仓。CCI曲线在超卖区运行的时间越长,越可以确认短期的底部;" if CCI_pday >= 100 and CCI < 100: score -= 1 signal += "[-1]当CCI指标从上向下突破﹢100线而重新进入常态区间时,表明股价的上涨阶段可能结束,将进入一个比较长时间的盘整阶段。投资者应及时逢高卖出股票;" if CCI_pday <= -100 and CCI > -100: score += 0.5 signal += "[0.5]当CCI指标从下向上突破﹣100线而重新进入常态区间时,表明股价的探底阶段可能结束,又将进入一个盘整阶段。投资者可以逢低少量买入股票;" print score print signal.decode("utf-8").encode("gbk") bd.updateAnalysisData("CCI", str(score) + ";" + signal, stock_code, date) return [score, signal]
def calcEMA(stock_code, date, period): if ITERATOR_COUNT >= MAX_ITERATOR: EXPMA = MA.calcMA(stock_code, date, period) # print "MIN Date: " +date+ " MA:"+ str(EXPMA) return EXPMA else: global ITERATOR_COUNT ITERATOR_COUNT = ITERATOR_COUNT + 1 close_today = bd.getBasicData("CLOSE_TODAY", stock_code, date) pday = du.convertDateToString(bd.getStockDate(stock_code, date, 1), "%Y-%m-%d") EXPMA_pday = calcEMA(stock_code, pday, period) EXPMA = 2 * (close_today - EXPMA_pday) / (period + 1) + EXPMA_pday # print date + ": EXPMA: "+str(EXPMA_PDAY)+" CLOSE: " + str(CLOSE_TODAY) + " EXPMA = " +str(EXPMA) return round(EXPMA, 3)
def calcAverageLoss(stock_code, date, period): global iterator_count price_changed = bd.getBasicData("PRICE_CHANGED", stock_code, date) current_loss = 0.0 if price_changed < 0: current_loss = price_changed if iterator_count >= max_iterator: return calcFirstAverageLoss(stock_code, date, period) else: iterator_count += 1 average_loss = (calcAverageLoss(stock_code, bd.getStockDate(stock_code, date, 1), period) * ( period - 1) + abs(current_loss)) / period # print date + " " + str(average_loss) + " Current Loss: " + str(current_loss) return round(average_loss, 3)
def calcAverageGain(stock_code, date, period): global iterator_count price_changed = bd.getBasicData("PRICE_CHANGED", stock_code, date) current_gain = 0.0 if price_changed > 0: current_gain = price_changed if iterator_count >= max_iterator: return calcFirstAverageGain(stock_code, date, period) else: iterator_count += 1 average_gain = (calcAverageGain(stock_code, bd.getStockDate(stock_code, date, 1), period) * ( period - 1) + abs(current_gain)) / period # print date + " Average Gain: " + str(average_gain) + " Current Gain: " + str(current_gain) return round(average_gain, 3)
def __init__(self, parent): wx.Panel.__init__(self, parent) panel = wx.Panel(self, size=(WINDOW_WIDTH, WINDOW_HEIGHT)) nb = wx.Notebook(panel) bd = BasicData(nb) cl = CharacterList(nb) vs = VersusScreen(nb) gui = GUITab(nb) ci = CommonImages(nb) sp = SparksGUI(nb) ht = HitStates(nb) nb.AddPage(bd, "Basic Data") nb.AddPage(cl, "Character List") nb.AddPage(vs, "Versus Screen") nb.AddPage(gui, "GUI") nb.AddPage(ci, "Common Images") nb.AddPage(sp, "Sparks") nb.AddPage(ht, "HitStates") sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(nb, 1, wx.EXPAND) self.SetSizer(sizer)
def calcPSY(stock_code, date, period): result_set = bd.getBasicDataInPeriod("CLOSE_TODAY, CLOSE_PERVIOUS_DAY", stock_code, date, period) count = 0.0 for each in result_set: if each[0] > each[1]: count += 1 PSY = count / period * 100 return round(PSY, 3)
def calcOBV(stock_code, date, period): global ITERATOR_COUNT close_today = bd.getBasicData("CLOSE_TODAY", stock_code, date) close_pervious_day = bd.getBasicData("CLOSE_PERVIOUS_DAY", stock_code, date) volumn = bd.getBasicData("VOLUMN", stock_code, date) today_volumn = 0.0 if close_today > close_pervious_day: today_volumn = volumn if close_today < close_pervious_day: today_volumn = today_volumn*-1 if ITERATOR_COUNT >= MAX_ITERATOR: return today_volumn else: ITERATOR_COUNT = ITERATOR_COUNT + 1 pday = bd.getStockDate(stock_code, date, 1) OBV = today_volumn + calcOBV(stock_code, pday, period) return round(OBV, 3)
def calcROCMA(stock_code, date, period): ROCs = bd.getTechDataInPeriod("ROC", stock_code, date, period) ROCMA = 0.0 for ROC in ROCs: ROCMA += ROC[0] ROCMA = ROCMA / period return round(ROCMA, 3)
def calcFirstAverageGain(stock_code, date, period): price_changes_in_period = bd.getBasicDataInPeriod("PRICE_CHANGED", stock_code, date, period) first_average_gain = 0.0 for each in price_changes_in_period: if first_average_gain > 0: first_average_gain += each[0] first_average_gain = first_average_gain / period print "First Average Gain: " + str(first_average_gain) return round(first_average_gain, 3)
def calcFirstAverageLoss(stock_code, date, period): price_changes_in_period = bd.getBasicDataInPeriod("PRICE_CHANGED", stock_code, date, period) first_average_loss = 0.0 for each in price_changes_in_period: if first_average_loss < 0: first_average_loss += each[0] first_average_loss = abs(first_average_loss) / period print "First Average Loss: " + str(first_average_loss) return round(first_average_loss, 3)
def calcAMA(stock_code, date, period1, period2, period3): AMA = calcDMA(stock_code, date, period2, period3) # print AMA for i in range(1, period1): next_date = bd.getStockDate(stock_code, date, i) # print next_date + " " + str(calcDMA(stock_code, next_date, period2, period3)) AMA += calcDMA(stock_code, next_date, period2, period3) AMA = AMA / period1 return round(AMA, 3)
def calcCCI(stock_code, date, period): high_today = bd.getBasicData("HIGH_TODAY", stock_code, date) low_today = bd.getBasicData("LOW_TODAY", stock_code, date) close_today = bd.getBasicData("CLOSE_TODAY", stock_code, date) MAn = 0.0 price_in_period = bd.getBasicDataInPeriod("CLOSE_TODAY, HIGH_TODAY, LOW_TODAY", stock_code, date, period) for each in price_in_period: MAn += (each[0] + each[1] + each[2])/3 MAn = MAn / period MD = 0.0 TP = (high_today + low_today + close_today) / 3 for each in price_in_period: MD += abs(MAn - (each[0] + each[1] + each[2])/3) MD = MD / period CCI = (TP - MAn) / MD / 0.015 return round(CCI, 3)
def analyze(stock_code, date): total_score = 0.0 total_score += BBI.analyze(stock_code, date, BBI_PARM_PERIOD_TRACE_FOR_HIGH, BBI_PARM_PERIOD_TRACE_HIS)[0] total_score += BIAS.analyze(stock_code, date)[0] total_score += BOLL.analyze(stock_code, date, BOLL_PARM_PERIOD)[0] total_score += BRAR.analyze(stock_code, date, BRAR_PARM_PERIOD_HIS)[0] total_score += CCI.analyze(stock_code, date, CCI_PARM_PERIOD)[0] total_score += DMA.analyze(stock_code, date, DMA_PARM_PERIOD)[0] total_score += DMI.analyze(stock_code, date, DMI_PARM_PERIOD)[0] total_score += KDJ.analyze(stock_code, date)[0] total_score += MA.analyze(stock_code, date, MA_PARM_PERIOD)[0] total_score += OBV.analyze(stock_code, date, OBV_PARM_PERIOD_TRACE_HIS)[0] total_score += PSY.analyze(stock_code, date)[0] total_score += ROC.analyze(stock_code, date, ROC_PARM_PERIOD_TRACE_HIS)[0] total_score += RSI.analyze(stock_code, date, RSI_PARM_PERIOD_TRACE_HIS)[0] total_score += VR.analyze(stock_code, date)[0] total_score += WR.analyze(stock_code, date, WR_PARM_PERIOD_TRACE_HIS)[0] bd.updateAnalysisData("TOTAL_SCORE", str(total_score), stock_code, date)
def calcVR(stock_code, date, period): result_set = bd.getBasicDataInPeriod("CLOSE_TODAY, CLOSE_PERVIOUS_DAY, VOLUMN", stock_code, date, period) rise_volumn = 0.0 decline_volumn = 0.0 for each in result_set: if each[0] > each[1]: rise_volumn += each[2] else: decline_volumn += each[2] VR = rise_volumn / decline_volumn * 100 return round(VR, 3)
def analyze(stock_code, date): score = 0.0 signal = "" VR = getVR(stock_code, date) if 40 < VR < 70: score += 1 signal += "[1]低价区域40-70可以买进;" if 80 < VR < 150: score += 1 signal += "[1]安全区域80-150持有股票;" if 160 < VR < 450: score -= 1 signal += "[-1]获利区域160-450根据情况获利了结;" if VR > 450: score -= 1 signal += "[-1]警戒区域450以上伺机卖出;" print score print signal.decode("utf-8").encode("gbk") bd.updateAnalysisData("VR", str(score) + ";" + signal, stock_code, date) return [score, signal]
def analyze(stock_code, date): score = 0.0 signal = "" PSY = getPSY(stock_code, date) if PSY > 75: score -= 1 signal += "[-1]心理线公式计算出来的百分比值,超过75时为超买,但在涨升行情时,应将卖点提高到75之上;" if PSY < 25: score += 1 signal += "[1]心理线公式计算出来的百分比值,低于25时为超卖,但在跌落行情时,应将买点降低至45以下;" if PSY < 10: score += 1 signal += "[1]当百分比值降低至10或10以下时,是真正的超买,此时是一个短期抢反弹的机会,应立即买进;" print score print signal.decode("utf-8").encode("gbk") bd.updateAnalysisData("PSY", str(score) + ";" + signal, stock_code, date) return [score, signal]
def calcTRIX(stock_code, date, period): global ITERATOR_COUNT TR = calcEMA(stock_code, date, period) pday = du.convertDateToString(bd.getStockDate(stock_code, date, 1), "%Y-%m-%d") ITERATOR_COUNT = 0 TR_pday = calcEMA(stock_code, pday, period) print TR print pday print TR_pday return (TR - TR_pday) / TR_pday * 100
def updateWithoutRF(end_date): stocks = bd.getStockCodes() for each in stocks: stock_code = each[0] stock_code_163 = each[3] start_date = each[5] if start_date is None: start_date = du.convertStringToDate("1990-01-01", "%Y-%m-%d") elif start_date == end_date: continue else: start_date = start_date + timedelta(1) data = bd.getStockData(stock_code_163, start_date, end_date) last_updated_date = data[0].split(",")[0] bd.insertBasicData(stock_code, data) bd.insertTechData(stock_code, data) bd.insertAnalysisData(stock_code, data) bd.updateMasterDate("LAST_UPDATED_DATE", last_updated_date, stock_code_163)
def getROCEMAs(stock_code, date, period): ROCEMAs = [] count = 0 last_day = date while count < period: ROCEMA = calcROCEMA(stock_code, last_day, ROCEMA_PARAM) #print last_day + " " + str(ROCEMA) count += 1 last_day = bd.getStockDate(stock_code, last_day, 1) ROCEMAs.append(ROCEMA) return ROCEMAs
def analyze(stock_code, date, period): score = 0 signal = "" pday = bd.getStockDate(stock_code, date, 1) ROC = getROC(stock_code, date) ROCMA = calcROCMA(stock_code, date, ROCMA_PARAM) ROCEMA = calcROCEMA(stock_code, date, ROCEMA_PARAM) ROC_pday = getROC(stock_code, pday) ROCMA_pday = calcROCMA(stock_code, pday, ROCMA_PARAM) ROCEMA_pday = calcROCEMA(stock_code, pday, ROCEMA_PARAM) ROCs = getROCs(stock_code, date, period) ROCMAs = getROCMAs(stock_code, date, period) ROCEMAs = getROCEMAs(stock_code, date, period) ROC_K = mu.getPoly(ROCs, 1)[0] ROCMA_K = mu.getPoly(ROCMAs, 1)[0] ROCEMA_K = mu.getPoly(ROCEMAs, 1)[0] if ROC < 0 and ROCEMA < 0 and ROCMA < 0: if ROC > ROC_pday: if ROC > ROCEMA and ROC > ROCEMA and ROC_pday < ROCEMA_pday and ROC_pday < ROCMA_pday: if (ROC - ROC_pday)/ROC_pday >= ROC_RAISE_RATE and (ROCMA - ROCMA_pday)/ROCMA_pday >= ROCMA_RAISE_RATE \ and (ROCEMA - ROCEMA_pday)/ROCEMA_pday >= ROCEMA_RAISE_RATE: score += 1 signal += "[1]当ROC,ROCMA,ROCEMA三条线均小于零轴时,ROC迅速同时上穿ROCMA和ROCEMA两条线,而且ROCMA和ROCEMA两条线也处于缓缓上行中,为短线黑马买入信号;" if ROC > ROCMA > ROCEMA and ROC_K > ROCMA_K > ROCEMA_K: score += 1 signal += "[1]当ROC,ROCMA,ROCEMA三条线是处于多头排列中,成交量处于间隙式放大或温和放大过程时,表明股价正运行于上升趋势中,仍有继续上涨趋势;" if ROC < ROCMA < ROCEMA and ROC_K < ROCMA_K < ROCEMA_K: score -= 1 signal += "[-1]当ROC,ROCMA,ROCEMA三条线是处于空头排列中,表明股价正运行于下行趋势中,仍有继续下跌趋势;" print score print signal.decode("utf-8").encode("gbk") bd.updateAnalysisData("ROC", str(score) + ";" + signal, stock_code, date) return [score, signal]
def analyze(stock_code, date, period): score = 0 signal = "" OBVs = bd.getTechDataInPeriod("OBV", stock_code, date, period) close_in_period = bd.getBasicDataInPeriod("CLOSE_TODAY", stock_code, date, period) OBV_K = mu.getPoly(OBVs, 1)[0] CLOSE_K = mu.getPoly(close_in_period, 1)[0] # 1.OBV线下降,而此时股价上升,是卖出股票的信号。 if OBV_K < 0 and CLOSE_K > 0: score -= 1 signal += "[-1]OBV线下降,而此时股价上升,是卖出股票的信号;" # 2.OBV线上升,而此时股价下跌,是买进股票的信号。 if OBV_K > 0 and CLOSE_K < 0: score += 1 signal += "[1]OBV线上升,而此时股价下跌,是买进股票的信号;" # 3.OBV线从正的累积数转为负数时,为下跌趋势,应该卖出持有股票;反之,OBV线从负的累积数转为正数,应该买进股票。 OBV_today = OBVs[0] OBV_pday = OBVs[1] if OBV_today > 0 and OBV_pday < 0: score += 1 signal += "[1]OBV线从负的累积数转为正数,应该买进股票;" if OBV_today < 0 and OBV_pday > 0: score -= 1 signal += "[-1]OBV线从正的累积数转为负数时,为下跌趋势,应该卖出持有股票;" # 4.OBV线呈缓慢上升时,为买进信号,但是若OBV线急速上升,隐含着能量不可能长久维持大成交量,非但不是买进信号,尚是卖出时机。 if OBV_K > 0: if OBV_K > UP_RATIO_THREHOLD: score -= 1 signal += "[-1]若OBV线急速上升,隐含着能量不可能长久维持大成交量,非但不是买进信号,尚是卖出时机;" else: score += 1 signal += "[1]OBV线呈缓慢上升时,为买进信号;" print score print signal.decode("utf-8").encode("gbk") bd.updateAnalysisData("OBV", str(score) + ";" + signal, stock_code, date) return [score, signal]
def getDMI(stock_code, date): DMI_ADX = bd.getTechData("DMI_ADX", stock_code, date) DMI_ATR = bd.getTechData("DMI_ATR", stock_code, date) DMI_PDM = bd.getTechData("DMI_PDM", stock_code, date) DMI_NDM = bd.getTechData("DMI_NDM", stock_code, date) DMI_PDI = bd.getTechData("DMI_PDI", stock_code, date) DMI_NDI = bd.getTechData("DMI_NDI", stock_code, date) return [DMI_ADX, DMI_ATR, DMI_PDM, DMI_NDM, DMI_PDI, DMI_NDI]
def calcBRAR(stock_code, date, period): result_set = bd.getBasicDataInPeriod( "HIGH_TODAY, OPEN_TODAY, LOW_TODAY, CLOSE_PERVIOUS_DAY", stock_code, date, period ) AR_Nn = AR_Dn = BR_Nn = BR_Dn = 0.0 for each in result_set: AR_Nn = AR_Nn + each[0] - each[1] AR_Dn = AR_Dn + each[1] - each[2] if each[0] > each[3]: BR_Nn = BR_Nn + each[0] - each[3] if each[3] > each[2]: BR_Dn = BR_Dn + each[3] - each[2] AR = round(AR_Nn / AR_Dn * 100, 3) BR = round(BR_Nn / BR_Dn * 100, 3) return [BR, AR]
def getCCIs(stock_code, date, period): return bd.getTechDataInPeriod("CCI", stock_code, date, period)