Esempio n. 1
0
def lwr(shigh,slow,sclose,n=9,m=3):
    lowv = tmin(slow,n)
    highv = tmax(shigh,n)
    rsv = (highv-sclose)*100 / (highv-lowv)
    lwr1 = sma(rsv,m,1)
    lwr2 = sma(lwr1,m,1)
    return lwr1,lwr2
Esempio n. 2
0
def lwr(shigh, slow, sclose, n=9, m=3):
    lowv = tmin(slow, n)
    highv = tmax(shigh, n)
    rsv = (highv - sclose) * 100 / (highv - lowv)
    lwr1 = sma(rsv, m, 1)
    lwr2 = sma(lwr1, m, 1)
    return lwr1, lwr2
Esempio n. 3
0
def skdj(shigh,slow,sclose,n=9,m=3):
    lowv = tmin(slow,n)
    highv = tmax(shigh,n)
    rsv = cexpma((sclose-lowv)*100/(highv-lowv),m)
    k = cexpma(rsv,m)
    d = ma(k,m)
    return k,d
Esempio n. 4
0
def follow_seller(stock,buy_signal,xstop=25,ret=50,**kwargs):
    '''
        如果价格小于最近5日高点5%,则卖出
        xstop为根据买入价的止损
        ret为从高点向下的回退值
    '''
    t = stock.transaction

    #从顶下落处理,前5天的收盘/开盘的高者和今天的开盘的高者 回落ret之后

    #hhret = gmax(rollx(tmax(gmax(t[OPEN],t[CLOSE]),5),1),t[OPEN])* (1000-ret)/1000
    hhret = gmax(rollx(tmax(t[HIGH],5),1),t[OPEN])* (1000-ret)/1000
    
    #hhret = rollx(tmax(t[HIGH],5),1) * (1000-ret)/1000
    sdl = t[LOW] < hhret
 
    #止损处理2.5%
    stop_price = extend2next(rollx(stock.buyprice,1) * (1000-xstop)/1000)
    stopl = t[LOW] < stop_price

    cut_price = gmin(gmax(hhret,stop_price),t[HIGH])    #首先,止损线和退回线高者先被触及,同时,穿越时可能跳低,所以找与t[HIGH]的低点
    cut_signal = gor(sdl,stopl)

    cut_signal = select([t[VOLUME]>0],[cut_signal]) #默认为0,即未交易的日子卖出信号不能发出,否则会合并到下一交易日

    bs = gand(buy_signal,cut_signal)
    rbs = rollx(bs)

    sell_signal = select([bs],[0],default=cut_signal) + rbs #如果当日冲销,则后推一日,但如果前一日也是当日,则信号被屏蔽

    stock.sellprice = select([cut_signal],[cut_price],default=t[OPEN])
    #止损和退回用cut_price, 当日卖出信号平移用开盘价,停牌平移用开盘价

    return cut_signal
Esempio n. 5
0
def skdj(shigh, slow, sclose, n=9, m=3):
    lowv = tmin(slow, n)
    highv = tmax(shigh, n)
    rsv = cexpma((sclose - lowv) * 100 / (highv - lowv), m)
    k = cexpma(rsv, m)
    d = ma(k, m)
    return k, d
Esempio n. 6
0
def wms(tclose,thigh,tlow,length):
    ''' 威廉指标
        可单独使用,同时也被kdj用到
    '''
    assert len(tclose) == len(thigh) and len(tclose) == len(tlow)
    lmax = tmax(thigh,length)
    lmin = tmin(tlow,length)
    rev = np.zeros_like(tclose)
    for i in xrange(len(tclose)):
        cmax,cmin = lmax[i],lmin[i]
        rev[i] = BASE if cmax==cmin else (tclose[i]-cmin) * BASE/(cmax-cmin)
    return rev   
Esempio n. 7
0
def wms(tclose, thigh, tlow, length):
    ''' 威廉指标
        可单独使用,同时也被kdj用到
    '''
    assert len(tclose) == len(thigh) and len(tclose) == len(tlow)
    lmax = tmax(thigh, length)
    lmin = tmin(tlow, length)
    rev = np.zeros_like(tclose)
    for i in xrange(len(tclose)):
        cmax, cmin = lmax[i], lmin[i]
        rev[i] = BASE if cmax == cmin else (tclose[i] - cmin) * BASE / (cmax -
                                                                        cmin)
    return rev
Esempio n. 8
0
def mm_ratio(sclose,shigh,slow,satr,covered=1):
    ''' 计算标准化的最大有利变动(MFE)/最大不利变动(MAE)
        即以当日为基准,计算covered内AMFE=(最大值-当日值)/atr和(当日值-最小值)/atr
        用于优势率e_ratio的计算:
            所有信号的CMFE之和/所有信号的CMAE之和 (信号次数被约掉)
            应当用这种方式,而不是单独计算CMFE/CMAE然后求平均
            比如一次是2/1,另一次是1/2,如果单独求比例然后平均,则e_ratio=(2+0.5)/2=1.25
                而先求平均再除,则是 (2+1)/(1+2) = 1
                显然后者是正常情形
        这是一个future函数, 正因为有左移的原因,所以最后covered的数据是失准的,需要处理掉,失灭为准
    '''
    m_max = rollx(tmax(sclose,covered),-covered)  #未来数据左移
    m_min = rollx(tmin(sclose,covered),-covered)  #未来数据左移
    #print m_min,tmin(sclose,covered)
    amfe = (m_max - sclose) * BASE / satr      #可能出现m_max[i] < sclose[i]的情况,如当日之后的covered内sclose一直下行
    amae = (sclose - m_min) * BASE / satr      #可能出现m_min[i] > sclose[i]的情况,如当日之后的covered内sclose一直上行
    amfe[-covered:] = amae[-covered:] = 0
    #print amfe.tolist(),amae.tolist()
    return amfe,amae
Esempio n. 9
0
def fupf(stock):
    '''
        本次上叉比上次上叉的位置高,同时价格也高
    '''

    t = stock.transaction
    linelog('%s:%s' % (fupf.__name__,stock.code))

    pdiff,pdea = cmacd(stock.hour)

    upcross2 = gand(cross(pdea,pdiff)>0,strend(pdiff)>0)

    dsub = rsub(pdea,upcross2)
    #csub = rsub(stock.hour,upcross2)
    #ssub = rsub(rollx(strend(pdea)),upcross2)   #上叉前一天的strend(pdea)

    vz = tmax(np.abs(pdiff),60) / 5 #pdiff不能超过0线太高

    hsignal = gand(dsub>0,pdiff<vz)


    xatr = stock.atr * BASE / t[CLOSE]
    mxatr = ma(xatr,13)
    xr = gand(xatr<50,xatr<mxatr)#,strend(xatr-mxatr)<0)

    nd = bnot(gand(stock.ma1<stock.ma2,stock.ma2<stock.ma3))

    rt = gand(stock.ref.t3)

    vma_s = ma(t[VOLUME],13)
    vma_l = ma(t[VOLUME],30)

    vfilter = vma_s < vma_l * 3/4

    gr = gand(stock.g20<3000,stock.g20>stock.g60,stock.g60>stock.g120)

    signal = gand(hour2day(hsignal),strend(stock.diff)>0,xr,rt,nd,vfilter,gr)

    return signal
Esempio n. 10
0
def fupf(stock):
    '''
        本次上叉比上次上叉的位置高,同时价格也高
    '''

    t = stock.transaction
    linelog('%s:%s' % (fupf.__name__, stock.code))

    pdiff, pdea = cmacd(stock.hour)

    upcross2 = gand(cross(pdea, pdiff) > 0, strend(pdiff) > 0)

    dsub = rsub(pdea, upcross2)
    #csub = rsub(stock.hour,upcross2)
    #ssub = rsub(rollx(strend(pdea)),upcross2)   #上叉前一天的strend(pdea)

    vz = tmax(np.abs(pdiff), 60) / 5  #pdiff不能超过0线太高

    hsignal = gand(dsub > 0, pdiff < vz)

    xatr = stock.atr * BASE / t[CLOSE]
    mxatr = ma(xatr, 13)
    xr = gand(xatr < 50, xatr < mxatr)  #,strend(xatr-mxatr)<0)

    nd = bnot(gand(stock.ma1 < stock.ma2, stock.ma2 < stock.ma3))

    rt = gand(stock.ref.t3)

    vma_s = ma(t[VOLUME], 13)
    vma_l = ma(t[VOLUME], 30)

    vfilter = vma_s < vma_l * 3 / 4

    gr = gand(stock.g20 < 3000, stock.g20 > stock.g60, stock.g60 > stock.g120)

    signal = gand(hour2day(hsignal),
                  strend(stock.diff) > 0, xr, rt, nd, vfilter, gr)

    return signal
Esempio n. 11
0
def mm_ratio(sclose, shigh, slow, satr, covered=1):
    ''' 计算标准化的最大有利变动(MFE)/最大不利变动(MAE)
        即以当日为基准,计算covered内AMFE=(最大值-当日值)/atr和(当日值-最小值)/atr
        用于优势率e_ratio的计算:
            所有信号的CMFE之和/所有信号的CMAE之和 (信号次数被约掉)
            应当用这种方式,而不是单独计算CMFE/CMAE然后求平均
            比如一次是2/1,另一次是1/2,如果单独求比例然后平均,则e_ratio=(2+0.5)/2=1.25
                而先求平均再除,则是 (2+1)/(1+2) = 1
                显然后者是正常情形
        这是一个future函数, 正因为有左移的原因,所以最后covered的数据是失准的,需要处理掉,失灭为准
    '''
    m_max = rollx(tmax(sclose, covered), -covered)  #未来数据左移
    m_min = rollx(tmin(sclose, covered), -covered)  #未来数据左移
    #print m_min,tmin(sclose,covered)
    amfe = (
        m_max - sclose
    ) * BASE / satr  #可能出现m_max[i] < sclose[i]的情况,如当日之后的covered内sclose一直下行
    amae = (
        sclose - m_min
    ) * BASE / satr  #可能出现m_min[i] > sclose[i]的情况,如当日之后的covered内sclose一直上行
    amfe[-covered:] = amae[-covered:] = 0
    #print amfe.tolist(),amae.tolist()
    return amfe, amae
Esempio n. 12
0
def follow_seller(stock, buy_signal, xstop=25, ret=50, **kwargs):
    '''
        如果价格小于最近5日高点5%,则卖出
        xstop为根据买入价的止损
        ret为从高点向下的回退值
    '''
    t = stock.transaction

    #从顶下落处理,前5天的收盘/开盘的高者和今天的开盘的高者 回落ret之后

    #hhret = gmax(rollx(tmax(gmax(t[OPEN],t[CLOSE]),5),1),t[OPEN])* (1000-ret)/1000
    hhret = gmax(rollx(tmax(t[HIGH], 5), 1), t[OPEN]) * (1000 - ret) / 1000

    #hhret = rollx(tmax(t[HIGH],5),1) * (1000-ret)/1000
    sdl = t[LOW] < hhret

    #止损处理2.5%
    stop_price = extend2next(rollx(stock.buyprice, 1) * (1000 - xstop) / 1000)
    stopl = t[LOW] < stop_price

    cut_price = gmin(gmax(hhret, stop_price),
                     t[HIGH])  #首先,止损线和退回线高者先被触及,同时,穿越时可能跳低,所以找与t[HIGH]的低点
    cut_signal = gor(sdl, stopl)

    cut_signal = select([t[VOLUME] > 0],
                        [cut_signal])  #默认为0,即未交易的日子卖出信号不能发出,否则会合并到下一交易日

    bs = gand(buy_signal, cut_signal)
    rbs = rollx(bs)

    sell_signal = select(
        [bs], [0], default=cut_signal) + rbs  #如果当日冲销,则后推一日,但如果前一日也是当日,则信号被屏蔽

    stock.sellprice = select([cut_signal], [cut_price], default=t[OPEN])
    #止损和退回用cut_price, 当日卖出信号平移用开盘价,停牌平移用开盘价

    return cut_signal
Esempio n. 13
0
def up_seller(stock, buy_signal, xstop=25, ret=50, **kwargs):
    '''
        如果买入日为阴线,则开盘卖出
        如果价格小于最近5日高点5%,则卖出
        xstop为根据买入价的止损
        ret为从高点向下的回退值
    '''
    t = stock.transaction

    #阴线处理
    sol = rollx(gand(buy_signal, t[CLOSE] < t[OPEN]), 1)

    #从顶下落处理,前5天的收盘/开盘的高者和今天的开盘的高者 回落ret之后

    #hhret = gmax(rollx(tmax(gmax(t[OPEN],t[CLOSE]),5),1),t[OPEN])* (1000-ret)/1000
    hhret = gmax(rollx(tmax(t[HIGH], 5), 1), t[OPEN]) * (1000 - ret) / 1000

    sdl = t[LOW] < hhret

    #止损处理2.5%
    stop_price = extend2next(rollx(stock.buyprice, 1) * (1000 - xstop) /
                             1000)  #要求buyprice只有在buyer日才有数据,否则extend2next无意义
    stopl = t[LOW] < stop_price

    cut_price = gmin(gmax(hhret, stop_price),
                     t[HIGH])  #首先,止损线和退回线高者先被触及,同时,穿越时可能跳低,所以找与t[HIGH]的低点
    cut_signal = gor(sdl, stopl)

    cut_signal = select([t[VOLUME] > 0],
                        [cut_signal])  #默认为0,即未交易的日子卖出信号不能发出,否则会合并到下一交易日

    ssignal = gor(sol, cut_signal)
    stock.sellprice = select([cut_signal], [cut_price], default=t[OPEN])
    #止损和退回用cut_price, 阴线出局和停牌平移都用开盘价

    return ssignal
Esempio n. 14
-1
def up_seller(stock,buy_signal,xstop=25,ret=50,**kwargs):
    '''
        如果买入日为阴线,则开盘卖出
        如果价格小于最近5日高点5%,则卖出
        xstop为根据买入价的止损
        ret为从高点向下的回退值
    '''
    t = stock.transaction

    #阴线处理
    sol = rollx(gand(buy_signal,t[CLOSE] < t[OPEN]),1)

    #从顶下落处理,前5天的收盘/开盘的高者和今天的开盘的高者 回落ret之后

    #hhret = gmax(rollx(tmax(gmax(t[OPEN],t[CLOSE]),5),1),t[OPEN])* (1000-ret)/1000
    hhret = gmax(rollx(tmax(t[HIGH],5),1),t[OPEN])* (1000-ret)/1000
   
    sdl = t[LOW] < hhret
 
    #止损处理2.5%
    stop_price = extend2next(rollx(stock.buyprice,1) * (1000-xstop)/1000)   #要求buyprice只有在buyer日才有数据,否则extend2next无意义
    stopl = t[LOW] < stop_price

    cut_price = gmin(gmax(hhret,stop_price),t[HIGH])    #首先,止损线和退回线高者先被触及,同时,穿越时可能跳低,所以找与t[HIGH]的低点
    cut_signal = gor(sdl,stopl)

    cut_signal = select([t[VOLUME]>0],[cut_signal]) #默认为0,即未交易的日子卖出信号不能发出,否则会合并到下一交易日


    ssignal = gor(sol,cut_signal)
    stock.sellprice = select([cut_signal],[cut_price],default=t[OPEN])
    #止损和退回用cut_price, 阴线出局和停牌平移都用开盘价

    return ssignal