def gen_pf_bollinger(dl, ol, hl, ll, cl, vl, need_y=True):
    span = 25
    # vspan = 5
    period = 52
    futspan = 20
    pointsnum = 7
    # div_num = 9

    calc_past = max(span, period)
    invalid_past = max(span * 2, span + period)
    invalid_fut = futspan

    if len(dl) < invalid_past + invalid_fut:
        return []

    ###########################
    # Get history             #
    ###########################
    # om = vct.add_history(ol, calc_past)
    hm = vct.add_history(hl, calc_past)
    lm = vct.add_history(ll, calc_past)
    cm = vct.add_history(cl, calc_past)
    vm = vct.add_history(vl, calc_past)

    ###########################
    # Modify data             #
    ###########################
    pmfi = idc.mfi(hm, lm, cm, vl, span)
    me = idc.moving_average(cm, span)
    # vme = idc.moving_average(vm, vspan)
    std = idc.moving_std(cm, span)
    sz = idc.get_size(std, me)
    uboll = me + std * 2.0
    dboll = me - std * 2.0

    # ds = idc.moving_average(((hm-lm)/lm)[:,-span:], span)
    (joints, subjoints, indexes) = vct.get_pnf_plus(cm, hm, lm, pointsnum, [uboll, dboll, pmfi])
    # (joints, subjoints, indexes) = vct.get_pnf(cm, hm, lm, pointsnum, [uboll, dboll, pmfi, vme])
    # (vjoints, vindexes) = vct.get_vpnf(vm, pointsnum)
    uboll = idc.add_history(uboll, calc_past)
    dboll = idc.add_history(dboll, calc_past)
    ma = np.max(np.c_[uboll, hm], axis=1)
    mi = np.min(np.c_[dboll, lm], axis=1)
    # vma = np.max(vm, axis=1)
    # vmi = np.min(vm, axis=1)

    doplot = False
    if doplot:
        tmp = pmfi[invalid_past:]
        pl.plot_kabuka(range(0, len(tmp)), [tmp], ["mfi"])

    ###########################
    # Cut invalid past        #
    ###########################
    ma = ma[invalid_past:]
    mi = mi[invalid_past:]
    # vma = vma[invalid_past:]
    # vmi = vmi[invalid_past:]
    joints = joints[invalid_past:, :]
    dl = dl[invalid_past:]
    indexes = indexes[invalid_past:]
    for i in range(0, len(subjoints)):
        subjoints[i] = subjoints[i][invalid_past:, :]

    sz = sz[invalid_past:]

    # vjoints = vjoints[invalid_past:,:]
    # vindexes = vindexes[invalid_past:]

    ###########################
    # Normalization           #
    ###########################
    # subjoints = [uboll, dboll, pmfi, vme]
    joints = vct.rate_norm(joints, ma, mi)
    subjoints[0] = vct.rate_norm(subjoints[0], ma, mi)
    subjoints[1] = vct.rate_norm(subjoints[1], ma, mi)
    # subjoints[3] = vct.rate_norm(subjoints[3], vma, vmi)
    indexes = indexes / period

    # vjoints = vct.rate_norm(vjoints, vma, vmi)

    ###########################
    # Plot                    #
    ###########################
    doplot = False
    if doplot:
        y1 = []
        x1 = indexes[-1]
        y1.append(joints[-1, :])
        for i in range(0, len(subjoints)):
            tmp = subjoints[i][-1, :]
            y1.append(subjoints[i][-1, :])
        labels1 = ["p&f", "plus theta", "minus theta", "mfi", "volume"]

        pl.plot_kabuka([x1], [y1], [labels1])

    # X = np.c_[indexes, joints]
    # sz = sz
    X = np.array(joints)
    for s in subjoints:
        X = np.c_[X, s]

    ###########################
    # Emphasize main points   #
    ###########################
    joints[:, -1] = 4 * joints[:, -1]
    joints[:, -2] = 3 * joints[:, -2]
    for i in range(0, len(subjoints)):
        subjoints[i][:, -1] = 2 * subjoints[i][:, -1]

    # i = 0
    # for i in range(len(X)):
    #    X[i] = X[i].tolist()
    if need_y == False:
        return (dl, sz, X)

    ###########################
    # Get max/min prices      #
    ###########################
    fut = add_history(cl, futspan, False)
    # (m, n) = fut.shape
    max_prices = (np.max(fut, axis=1) - fut[:, 0]) * 1.0 / fut[:, 0]
    min_prices = (fut[:, 0] - np.min(fut, axis=1)) * 1.0 / fut[:, 0]

    max_prices = _cut_invalid(max_prices, invalid_past, invalid_fut)
    min_prices = _cut_invalid(min_prices, invalid_past, invalid_fut)

    # for i in range(len(Y)):
    #    Y[i] = Y[i].tolist()

    return (dl, sz, X, max_prices * 100, min_prices * 100)
def gen_pf_pnf(dl, ol, hl, ll, cl, vl, need_y=True):
    span = 25
    #vspan = 5
    period = 52
    futspan = 20
    pointsnum = 7
    #div_num = 9
    

    calc_past = max(span, period)
    invalid_past = max(span*2, span+period)
    invalid_fut = futspan
    
    if len(dl) < invalid_past + invalid_fut:
        return []
    
    ###########################
    # Get history             #
    ###########################
    #om = vct.add_history(ol, calc_past)
    hm = vct.add_history(hl, calc_past)
    lm = vct.add_history(ll, calc_past)
    cm = vct.add_history(cl, calc_past)
    vm = vct.add_history(vl, calc_past)
        
    
    ###########################
    # Modify data             #
    ###########################    
    me = idc.moving_average(cm, span)
    std = idc.moving_std(cm, span)
    sz = idc.get_size(std, me)
    uboll = me + std*2.0
    dboll = me - std*2.0
    
    (joints, subjoints, indexes) = vct.get_pnf(cm, hm, lm, pointsnum, [uboll, dboll])
    uboll = idc.add_history(uboll, calc_past)
    dboll = idc.add_history(dboll, calc_past)
    ma = np.max(np.c_[uboll,hm], axis=1)
    mi = np.min(np.c_[dboll,lm], axis=1)

        
    
    ###########################
    # Cut invalid past        #
    ###########################
    ma = ma[invalid_past:]
    mi = mi[invalid_past:]
    joints = joints[invalid_past:,:]
    dl = dl[invalid_past:]
    indexes = indexes[invalid_past:]
    for i in range(0, len(subjoints)):
        subjoints[i] = subjoints[i][invalid_past:,:]
    
    sz = sz[invalid_past:]
    
        
    ###########################
    # Normalization           #
    ###########################
    joints = vct.rate_norm(joints, ma, mi)
    subjoints[0] = vct.rate_norm(subjoints[0], ma, mi)
    subjoints[1] = vct.rate_norm(subjoints[1], ma, mi)
    indexes = indexes/period
    

    ###########################
    # Plot                    #
    ###########################
    doplot = False
    if doplot:
        y1 = []
        x1 = indexes[-1]
        y1.append(joints[-1,:])
        for i in range(0, len(subjoints)):
            tmp = subjoints[i][-1,:]
            y1.append(subjoints[i][-1,:])
        labels1 = ["p&f", "plus theta", "minus theta", "mfi", "volume"]

        pl.plot_kabuka([x1], [y1], [labels1])

    X = np.array(joints)*2
    X = np.c_[X, indexes]

    if need_y == False:
        return (dl, sz, X)
    
    ###########################
    # Get max/min prices      #
    ###########################     
    fut = add_history(cl, futspan, False)
    #(m, n) = fut.shape
    max_prices = (np.max(fut, axis=1)-fut[:,0])*1.0/fut[:,0]
    min_prices = (fut[:,0] - np.min(fut, axis=1))*1.0/fut[:,0]
    
    max_prices = _cut_invalid(max_prices, invalid_past, invalid_fut)
    min_prices = _cut_invalid(min_prices, invalid_past, invalid_fut)
    
    
    return (dl, sz, X, max_prices*100, min_prices*100)