Exemple #1
0
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')
Exemple #2
0
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
Exemple #3
0
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
Exemple #4
0
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
Exemple #5
0
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)
Exemple #6
0
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)
Exemple #7
0
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    
Exemple #8
0
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
Exemple #9
0
def test_check_db_exist(request, p_stk_no):
    return HttpResponse(p_stk_no + ': ' +
                        str(StockModel.check_db_exist(p_stk_no)))
Exemple #10
0
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))
Exemple #11
0
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