def findTopN(top=20,condition=settings.HIGHER): if condition == settings.HIGHER: result = findByYearLow(top) else: result = findByYearHigh(top) stocks = [] for stock in result: code = stock.get('code') s = Stock(code) if condition == settings.HIGHER: s.PercentChangeFromYearLow = stock.get('percentFromYearLow') else: s.PercentChangeFromYearHigh = stock.get('percentFromYearHigh') s.yearHigh = stock.get('yearHigh') s.yearLow = stock.get('yearLow') s.current = stock.get('current') s.ma50 = stock.get('ma50') s.ma200 = stock.get('ma200') s.name = stock.get('name') if code.startswith('6'): s.isInSh = True; #triggered = checkStockWithMA(code,40,10,condition) #print triggered stocks.append(s) return stocks
def findTopN(top=20, condition=settings.HIGHER): if condition == settings.HIGHER: result = findByYearLow(top) else: result = findByYearHigh(top) stocks = [] for stock in result: code = stock.get('code') s = Stock(code) if condition == settings.HIGHER: s.PercentChangeFromYearLow = stock.get('percentFromYearLow') else: s.PercentChangeFromYearHigh = stock.get('percentFromYearHigh') s.yearHigh = stock.get('yearHigh') s.yearLow = stock.get('yearLow') s.current = stock.get('current') s.ma50 = stock.get('ma50') s.ma200 = stock.get('ma200') s.name = stock.get('name') if code.startswith('6'): s.isInSh = True #triggered = checkStockWithMA(code,40,10,condition) #print triggered stocks.append(s) return stocks
def parseTickers(begin=600000,end=603366): nonExistentTickers = findAllNonExistentTickers() existingTickers = findAllExistentTickers() print nonExistentTickers print existingTickers #parse shanghai tickers for code in range(begin,end+1): if (str(code) in nonExistentTickers): print 'Non-existent ticker***'+str(code) continue; elif (str(code) in existingTickers): print 'Existing ticker***'+str(code) continue; code2 = str(code) +'.SS' url = 'http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22'+code2+'%22)&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys' print url page = parse(url).getroot() if page is None: print "Fail to query for "+str(code) return r = page.xpath('//errorindicationreturnedforsymbolchangedinvalid'); errorMsg = r[0].text stock = Stock(str(code)) if (errorMsg is None): stock.name = '' high = page.xpath('//dayshigh')[0].text if (high is None): print 'Non-existent ticker***'+str(code) saveNonExistentTicker(stock) continue; stock.high = float(high) stock.low = float(page.xpath('//dayslow')[0].text) stock.yearHigh = float(page.xpath('//yearhigh')[0].text) stock.yearLow = float(page.xpath('//yearlow')[0].text) close = page.xpath('//bid')[0].text; # print close # print type(close) if close is not None: stock.close = float(close) if (stock.high>=stock.yearHigh): print 'stock trigger new high index*****'+code2 with io.open('nh.xml','wb') as f: f.writelines(code2) elif (stock.low <=stock.yearLow): print 'stock trigger new low index*****'+code2 with io.open('nl.xml','wb') as f: f.writelines(code2) #print stock saveTicker(stock) #parse key statistics data from reuters from reutersparser import parseKeyStatData parseKeyStatData(code) else: saveNonExistentTicker(stock) print 'Non-existent ticker***'+str(code) print 'Finish parseTickers******'
def parseTickers(begin=600000, end=603366): nonExistentTickers = findAllNonExistentTickers() existingTickers = findAllExistentTickers() print nonExistentTickers print existingTickers #parse shanghai tickers for code in range(begin, end + 1): if (str(code) in nonExistentTickers): print 'Non-existent ticker***' + str(code) continue elif (str(code) in existingTickers): print 'Existing ticker***' + str(code) continue code2 = str(code) + '.SS' url = 'http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22' + code2 + '%22)&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys' print url page = parse(url).getroot() if page is None: print "Fail to query for " + str(code) return r = page.xpath('//errorindicationreturnedforsymbolchangedinvalid') errorMsg = r[0].text stock = Stock(str(code)) if (errorMsg is None): stock.name = '' high = page.xpath('//dayshigh')[0].text if (high is None): print 'Non-existent ticker***' + str(code) saveNonExistentTicker(stock) continue stock.high = float(high) stock.low = float(page.xpath('//dayslow')[0].text) stock.yearHigh = float(page.xpath('//yearhigh')[0].text) stock.yearLow = float(page.xpath('//yearlow')[0].text) close = page.xpath('//bid')[0].text # print close # print type(close) if close is not None: stock.close = float(close) if (stock.high >= stock.yearHigh): print 'stock trigger new high index*****' + code2 with io.open('nh.xml', 'wb') as f: f.writelines(code2) elif (stock.low <= stock.yearLow): print 'stock trigger new low index*****' + code2 with io.open('nl.xml', 'wb') as f: f.writelines(code2) #print stock saveTicker(stock) #parse key statistics data from reuters from reutersparser import parseKeyStatData parseKeyStatData(code) else: saveNonExistentTicker(stock) print 'Non-existent ticker***' + str(code) print 'Finish parseTickers******'
def parseFinanceData(code): from lxml import etree from lxml.html import parse if (len(code) == 9): code2 = code elif (code.startswith('6')): code2 = code +".SS" else: code2 = code +".SZ" url = 'http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22'+code2+'%22)&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&diagnostics=true' logger.debug(url) try: page = parse(url).getroot() result = etree.tostring(page) print result r = page.xpath('//errorindicationreturnedforsymbolchangedinvalid'); errorMsg = r[0].text if (errorMsg is None): print 'OK' stock = Stock(code) stock.name = '' else: print 'error' quote = page.xpath('/html/body/query/results/quote'); #print len(quote) #print len(page.xpath('//ask')) #print page.xpath('/html/body/query/results/quote/ask[1]/text()') #print page.xpath('//ask[1]/text()')[0]#both works yearLow = page.xpath('//yearlow[1]/text()')[0] logger.debug('yearLow'+yearLow) yearHigh = page.xpath('//yearhigh[1]/text()')[0] print 'yearHigh'+yearHigh PercentChangeFromYearLow = page.xpath('//percentchangefromyearlow[1]/text()')[0] print 'PercentChangeFromYearLow'+PercentChangeFromYearLow PercebtChangeFromYearHigh = page.xpath('//percebtchangefromyearhigh[1]/text()')[0] print 'PercebtChangeFromYearHigh'+PercebtChangeFromYearHigh FiftydayMovingAverage = page.xpath('//fiftydaymovingaverage[1]/text()')[0] print 'FiftydayMovingAverage'+FiftydayMovingAverage TwoHundreddayMovingAverage = page.xpath('//twohundreddaymovingaverage[1]/text()')[0] print 'TwoHundreddayMovingAverage'+TwoHundreddayMovingAverage PercentChangeFromTwoHundreddayMovingAverage = page.xpath('//percentchangefromtwohundreddaymovingaverage[1]/text()')[0] print 'PercentChangeFromTwoHundreddayMovingAverage'+PercentChangeFromTwoHundreddayMovingAverage PercentChangeFromFiftydayMovingAverage = page.xpath('//percentchangefromfiftydaymovingaverage[1]/text()')[0] print 'PercentChangeFromFiftydayMovingAverage'+PercentChangeFromFiftydayMovingAverage logger.debug(page.xpath('//DaysLow[1]/text()')) LastTradePriceOnly = page.xpath('//lasttradepriceonly[1]/text()')[0] stock = Stock(code) stock.yearHigh = float(yearHigh) stock.yearLow = float(yearLow) #stock.PercebtChangeFromYearHigh = float(PercebtChangeFromYearHigh.rstrip('%')) stock.PercentChangeFromYearHigh = float(PercebtChangeFromYearHigh.lstrip('-').rstrip('%')) stock.PercentChangeFromYearLow = float(PercentChangeFromYearLow.lstrip('+').rstrip('%')) stock.ma50 = float(FiftydayMovingAverage) stock.ma200 = float(TwoHundreddayMovingAverage) if LastTradePriceOnly is not None: logger.debug("{} current: {}".format(code,LastTradePriceOnly)) stock.current = float(LastTradePriceOnly) close = page.xpath('//bid')[0].text; if close is not None: stock.close = float(close) return stock except Exception as ex: logger.error('Fail to download latest update from yahoo API:'+code) traceback.print_exc(file=sys.stdout) logger.exception(ex) return None
def parseFinanceData(code): from lxml import etree from lxml.html import parse if (len(code) == 9): code2 = code elif (code.startswith('6')): code2 = code + ".SS" else: code2 = code + ".SZ" url = 'http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22' + code2 + '%22)&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&diagnostics=true' logger.debug(url) try: page = parse(url).getroot() result = etree.tostring(page) print result r = page.xpath('//errorindicationreturnedforsymbolchangedinvalid') errorMsg = r[0].text if (errorMsg is None): print 'OK' stock = Stock(code) stock.name = '' else: print 'error' quote = page.xpath('/html/body/query/results/quote') #print len(quote) #print len(page.xpath('//ask')) #print page.xpath('/html/body/query/results/quote/ask[1]/text()') #print page.xpath('//ask[1]/text()')[0]#both works yearLow = page.xpath('//yearlow[1]/text()')[0] logger.debug('yearLow' + yearLow) yearHigh = page.xpath('//yearhigh[1]/text()')[0] print 'yearHigh' + yearHigh PercentChangeFromYearLow = page.xpath( '//percentchangefromyearlow[1]/text()')[0] print 'PercentChangeFromYearLow' + PercentChangeFromYearLow PercebtChangeFromYearHigh = page.xpath( '//percebtchangefromyearhigh[1]/text()')[0] print 'PercebtChangeFromYearHigh' + PercebtChangeFromYearHigh FiftydayMovingAverage = page.xpath( '//fiftydaymovingaverage[1]/text()')[0] print 'FiftydayMovingAverage' + FiftydayMovingAverage TwoHundreddayMovingAverage = page.xpath( '//twohundreddaymovingaverage[1]/text()')[0] print 'TwoHundreddayMovingAverage' + TwoHundreddayMovingAverage PercentChangeFromTwoHundreddayMovingAverage = page.xpath( '//percentchangefromtwohundreddaymovingaverage[1]/text()')[0] print 'PercentChangeFromTwoHundreddayMovingAverage' + PercentChangeFromTwoHundreddayMovingAverage PercentChangeFromFiftydayMovingAverage = page.xpath( '//percentchangefromfiftydaymovingaverage[1]/text()')[0] print 'PercentChangeFromFiftydayMovingAverage' + PercentChangeFromFiftydayMovingAverage logger.debug(page.xpath('//DaysLow[1]/text()')) LastTradePriceOnly = page.xpath('//lasttradepriceonly[1]/text()')[0] stock = Stock(code) stock.yearHigh = float(yearHigh) stock.yearLow = float(yearLow) #stock.PercebtChangeFromYearHigh = float(PercebtChangeFromYearHigh.rstrip('%')) stock.PercentChangeFromYearHigh = float( PercebtChangeFromYearHigh.lstrip('-').rstrip('%')) stock.PercentChangeFromYearLow = float( PercentChangeFromYearLow.lstrip('+').rstrip('%')) stock.ma50 = float(FiftydayMovingAverage) stock.ma200 = float(TwoHundreddayMovingAverage) if LastTradePriceOnly is not None: logger.debug("{} current: {}".format(code, LastTradePriceOnly)) stock.current = float(LastTradePriceOnly) close = page.xpath('//bid')[0].text if close is not None: stock.close = float(close) return stock except Exception as ex: logger.error('Fail to download latest update from yahoo API:' + code) traceback.print_exc(file=sys.stdout) logger.exception(ex) return None
def getStock(code): #Sina API if (code.startswith('60')): code = 'sh'+code else: code = 'sz'+code url = "http://hq.sinajs.cn/list="+code logger.debug(url) #Google Finance API #url = 'http://finance.google.com/finance/info?q=600030' import urllib2,os,sys pg = urllib2.urlopen(url) cont = pg.read() #print cont test = cont.split(',') if (len(test) <9): logger.error('error passe:'+code) return yesterday = float(test[2]) current = float(test[3]) high = float(test[4]) low = float(test[5]) volume = float(test[8]) percent = (current-yesterday)/yesterday*100 name = test[0].split('"')[1] logger.debug(name) # logger.debug(str(name)) enc = "gbk" u_content = name.decode(enc) # decodes from enc to unicode utf8_name = u_content.encode("utf8") logger.debug(utf8_name) stock = Stock(code,current,percent,low,high,volume) stock.name = utf8_name #check threshold if (current == 0.0): pass elif (percent >=2): #Alarm stock.alert = True; stock.state = 'UP' elif (percent <=-5): #Alarm stock.alert = True; stock.state = 'CRITICAL' elif (percent <=-2): #Alarm stock.alert = True; stock.state = 'WARNING' elif (stock.code == 'sh000001' and (percent >=1 or percent <=-1)): stock.state = 'WARNING' #check whether state changed state = stateCache.get(code) #print state if (state!= stock.state): stateCache[code] = stock.state; pass else: stock.alert = False; logger.info( '****Download latest price from SINA finished****'+stock.code) #logger.info(stock) return stock