def test_stock_update_from_web(request): if (StockModel.update_from_web()): t_model = StockModel.get_model() t_content = '' for t_id in t_model.csv_dict: t_content += u'{}:{},{}<br/>\n'.format( t_id, t_model.csv_dict[t_id][StockModel.CSV_COL_ABBRE_NAME], t_model.csv_dict[t_id][StockModel.CSV_COL_MARKET]) return HttpResponse(t_content) else: return HttpResponse('test_stock_update_from_web fail')
def cron_stk_update_taskhandler(request): ''' design for cron schedule updating all stock in CONFIG_STOCK_LIST ''' fname = '{} {}'.format(__name__,'cron_stk_update_taskhandler') response = HttpResponse(fname) t_stk_list = twse_gae.models_stock.CONFIG_STOCK_LIST + TW50Model.get_id_list() logging.info('{}: CONFIG_STOCK_LIST {}'.format(fname,t_stk_list)) for t_stk_no in t_stk_list: if StockModel.check_db_exist(t_stk_no): taskqueue.add(method = 'GET', url = os.path.dirname(os.path.dirname(request.get_full_path())) + "/stk_update/" , countdown = datetime.now().second % 5, params = { 'stk_no': t_stk_no, }) else: #-> first update, use reload instead of update taskqueue.add(method = 'GET', url = os.path.dirname(os.path.dirname(request.get_full_path())) + "/stk_reload/" , countdown = datetime.now().second % 5, params = { 'stk_no': t_stk_no, }) response.status_code = httplib.OK return response
def reload_stk_task_handler(request): ''' remove stock entity from db if exist start update task for stock ''' fname = '{} {}'.format(__name__,'reload_stk_task_handler') response = HttpResponse(fname) t_stk_no = request.GET['stk_no'] logging.info('{}: with stock {}'.format(fname,t_stk_no)) #-> delete db entity if exist t_stk_type = StockModel.get_type_by_stk_no(t_stk_no) if t_stk_type == StockModel.MARKET_TYPE_TWSE: t_entity = TWSEStockModel.get_by_key_name(TWSEStockModel.compose_key_name(t_stk_no)) elif t_stk_type == StockModel.MARKET_TYPE_OTC: t_entity = OTCStockModel.get_by_key_name(TWSEStockModel.compose_key_name(t_stk_no)) else: response.content = 'stk_no {} ERROR'.format(t_stk_no) logging.warning('{}: stk_no {} ERROR'.format(fname,t_stk_no)) return response if not t_entity is None: t_entity.delete() #-> start chain task taskqueue.add(method = 'GET', url = os.path.dirname(os.path.dirname(request.get_full_path())) + "/stk_update/" , countdown = datetime.now().second % 5, params = { 'stk_no': t_stk_no, }) response.status_code = httplib.OK return response
def cupdate_stk_taskhandler(request): fname = '{} {}'.format(__name__,'cupdate_stk_taskhandler') response = HttpResponse(fname) logging.debug('{} active'.format(fname)) try: t_stk_no = request.GET['stk_no'] t_year_month = request.GET['year_month'] t_type = '' if 'type' in request.GET.keys(): t_type = request.GET['type'] logging.info('{}: chain update task for stock {} with month {} and type {}'.format(fname, t_stk_no, t_year_month, t_type)) t_stk_type = StockModel.get_type_by_stk_no(t_stk_no) if t_stk_type is None: t_msg = '{}: stock {} type unknown'.format(fname,t_stk_no) logging.warning(t_msg) response.content = t_msg return response if t_stk_type == StockModel.MARKET_TYPE_TWSE: t_update_result = TWSEStockModel.update_monthly_csv_from_web(t_stk_no,t_year_month,True) else: #->StockModel.MARKET_TYPE_OTC t_update_result = OTCStockModel.update_monthly_csv_from_web(t_stk_no,t_year_month,True) if t_update_result is None: logging.warning('{}: chain update task fail!'.format(fname)) response.status_code = httplib.INTERNAL_SERVER_ERROR else: logging.info('{}: chain update success.'.format(fname)) response.status_code = httplib.OK #-> add next chain task for next month if t_type == 'all': t_update_date = parser.parse(t_year_month[0:4]+'/'+t_year_month[4:]+'/01') t_next_month = t_update_date.date() + relativedelta(months=1) t_next_yearmonth = t_next_month.strftime('%Y%m') if t_next_yearmonth <= date.today().strftime('%Y%m'): taskqueue.add(method = 'GET', url = os.path.dirname(request.get_full_path()) + "/", countdown = 5, params = { 'stk_no': t_stk_no, 'year_month': t_next_yearmonth, 'type': t_type, }) logging.info('{}: add next chain update task; stock {}, month {}, type {}'.format(fname, t_stk_no, t_next_yearmonth, t_type)) else: logging.info('{}: chain update complete for stock {}'.format(fname,t_stk_no)) return response except Exception, e: err_msg = str(e) logging.warning('{}: ERR {}'.format(fname,err_msg)) response.status_code = httplib.OK return response
def default_view(request, p_bb_level=''): tw50_id_list = TW50Model.get_id_list() content_head_list = [ 'ID', 'Name', 'Price', 'Weekly BB Area', 'Weekly BB', 'Daily BB' ] content_rows = [] t_model = MFModle.get_model() for t_stk_no in tw50_id_list: if t_stk_no in t_model.dict_data: t_bb_state = t_model.dict_data[t_stk_no]['state'] else: t_bb_state = 'NA' if t_bb_state in ['TB3', 'TB2']: t_bb_state_html = '<p class="text-danger"><strong>{}</strong></p>'.format( t_bb_state) elif t_bb_state in ['BB2', 'BB3']: t_bb_state_html = '<p class="text-success"><strong>{}</strong></p>'.format( t_bb_state) else: t_bb_state_html = '<p class="text-muted"><strong>{}</strong></p>'.format( t_bb_state) if ((p_bb_level == '') or ((p_bb_level == 'BB2') and (t_bb_state in ['BB2', 'BB3'])) or ((p_bb_level == 'BB3') and (t_bb_state == 'BB3')) or ((p_bb_level == 'TP2') and (t_bb_state in ['TP2', 'TP3'])) or ((p_bb_level == 'TP3') and (t_bb_state == 'TP3'))): content_rows.append([ t_stk_no, StockModel.get_name_by_stk_no(t_stk_no), t_model.dict_data[t_stk_no]['closed'], t_bb_state_html, '<a href="/mf/twse/bb/' + t_stk_no + '/weekly2/">BB Weekly View</a>', '<a href="/mf/twse/bb/' + t_stk_no + '/daily/">BB Daily View</a>', ]) if p_bb_level == "": content_rows.sort(key=lambda x: (x[3], x[0])) else: content_rows.sort(key=lambda x: x[0]) tbl_content = { 'heads': content_head_list, 'rows': content_rows, } args = { 'tpl_section_title': _("HEAD_TW50_BB_REVIEW"), 'tbl_content': tbl_content, } return render_to_response('mf_simple_table.tpl.html', args)
def bb_view(request, p_stk_no, p_b_type, p_timeframe=None, p_sdw=None, p_month=18): t_stock = StockModel.get_stock(p_stk_no) t_stk_name = StockModel.get_name_by_stk_no(p_stk_no) t_stk_title = u'{} {}'.format(p_stk_no, t_stk_name) if p_b_type == bb_tool.BB_TYPE_DAILY: if p_timeframe is None: p_timeframe = 130 p_sdw = 100 p_month = 2 return bb_tool._bb_view(t_stock, t_stk_title, p_b_type, p_timeframe, p_sdw, p_month) else: if p_timeframe is None: p_timeframe = 26 p_sdw = 100 p_month = 6 return bb_tool._bb_view(t_stock, t_stk_title, p_b_type, p_timeframe, p_sdw, p_month)
def update_model_taskhandler(request): ''' designed for TWSE and OTC stock id update ''' fname = '{} {}'.format(__name__,'update_model_taskhandler') response = HttpResponse(fname) if (StockModel.update_from_web()): logging.info('{}: success'.format(fname)) response.status_code = httplib.OK else: logging.warning('{}: failed'.format(fname)) response.status_code = httplib.INTERNAL_SERVER_ERROR return response
def update_stk_taskhandler(request): ''' start chain update task since last update date ''' fname = '{} {}'.format(__name__,'update_stk_taskhandler') response = HttpResponse(fname) response.status_code = httplib.OK t_stk_no = request.GET['stk_no'] logging.info('{}: with stock {}'.format(fname,t_stk_no)) t_stk_type = StockModel.get_type_by_stk_no(t_stk_no) if t_stk_type == StockModel.MARKET_TYPE_TWSE: t_last_ym = TWSEStockModel.get_stk_update_ym(t_stk_no) elif t_stk_type == StockModel.MARKET_TYPE_OTC: t_last_ym = OTCStockModel.get_stk_update_ym(t_stk_no) else: response.content = 'stk_no {} ERROR'.format(t_stk_no) logging.warning('{}: stk_no {} ERROR'.format(fname,t_stk_no)) return response #-> start chain update task if t_last_ym == date.today().strftime('%Y%m'): logging.info('{}: stock {} already updted, task skipped'.format(fname,t_stk_no)) else: taskqueue.add(method = 'GET', url = os.path.dirname(os.path.dirname(request.get_full_path())) + "/stk_cupdate/" , countdown = datetime.now().second % 5, params = { 'stk_no': t_stk_no, 'year_month': t_last_ym, 'type': 'all', }) response.status_code = httplib.OK return response
def test_check_db_exist(request, p_stk_no): return HttpResponse(p_stk_no + ': ' + str(StockModel.check_db_exist(p_stk_no)))
def test_get_type_by_stk_no(request, p_stk_no): return HttpResponse(p_stk_no + ': ' + StockModel.get_type_by_stk_no(p_stk_no))
def task_tw50_chain_update_bb_state(request): fname = '{} {}'.format(__name__, 'task_tw50_chain_update_bb_state') if 'index' in request.GET: t_index = request.GET['index'] else: t_index = 0 logging.info('{}: with index {}'.format(fname, t_index)) tw50_list = TW50Model.get_id_list() if int(t_index) >= len(tw50_list) or int(t_index) < 0: t_msg = '{}: param index {} exceed max length'.format(fname, t_index) logging.warning(t_msg) else: t_stk_no = tw50_list[int(t_index)] if StockModel.check_db_exist(t_stk_no) == False: t_msg = '{}: stock {} index model not exist'.format( fname, t_stk_no) logging.warning(t_msg) else: t_stock = StockModel.get_stock(t_stk_no) p_timeframe = 26 p_sdw = 100 t_date_since = date.today() + relativedelta( days=-(7 * p_timeframe)) t_offset = 2 - t_date_since.weekday() t_date_since += relativedelta(days=t_offset) t_date_list = [] while t_date_since <= date.today(): t_date_list.append(t_date_since) t_date_since += relativedelta(days=+7) t_value_list = t_stock.get_sample_index_list(t_date_list) t_current_nav = t_value_list[-1][1] sma, tb1, tb2, bb1, bb2 = get_bollingerbands( t_value_list, p_timeframe, float(p_sdw) / 100) if t_current_nav < bb2[-1][1]: t_bb_state = 'BB3' elif t_current_nav < bb1[-1][1]: t_bb_state = 'BB2' elif t_current_nav < sma[-1][1]: t_bb_state = 'BB1' elif t_current_nav < tb1[-1][1]: t_bb_state = 'TB1' elif t_current_nav < tb2[-1][1]: t_bb_state = 'TB2' else: t_bb_state = 'TB3' t_model = MFModle.get_model() t_model.dict_data[t_stk_no] = {} t_model.dict_data[t_stk_no]['state'] = t_bb_state t_model.dict_data[t_stk_no]['closed'] = t_current_nav t_model.save_dict_data() t_msg = '{} {} with state {}'.format(fname, t_stk_no, str(t_model.dict_data)) logging.info(t_msg) t_next_index = int(t_index) + 1 if t_next_index < len(tw50_list): logging.debug('{}: add next chain task with index {}'.format( fname, t_next_index)) taskqueue.add(method='GET', url="/mf/task/tw50_cupdate/", countdown=datetime.now().second % 5, params={ 'index': t_next_index, }) if t_next_index == len(tw50_list): send_tw50_wk_bb_review_report() response = HttpResponse(t_msg) response.status_code = httplib.OK return response