Skip to content

技术分析

米筐平台引入的信号计算方式能够让您更方便地进行技术分析。在技术分析过程中,您既可以使用我们预先提供的常用技术指标,也可以使用自定义指标来产生信号供策略内使用。

def MA_SIGNAL():
    # 5周期移动平均上穿10周期移动平均
    return CROSS(MA(CLOSE, 5), MA(CLOSE, 10))

def BOLL_SIGNAL():
    # 收盘价上传布林通道上轨
    MID, TOP, BOTTOM = BOLL(20, 2)
    return CROSS(CLOSE, TOP)

def init(context):
    context.s1 = '000001.XSHE'
    # 在初始化阶段注册指标函数
    # 计算5分钟线金叉信号
    reg_indicator('ma', MA_SIGNAL, '5m', win_size=20)
    # 计算日线布林通道
    reg_indicator('boll', BOLL_SIGNAL, '1d', win_size=20)

def handle_bar(context, bar_dict):
    # 获取指标结果
    ma_cross = get_indicator(context.s1, 'ma')
    boll_cross = get_indicator(context.s1, 'boll')

    # 设置入场条件
    if ma_cross and boll_cross:
        order_percent(context.s1, 0.1)

自定义技术指标

为满足用户对指标要求的多样性,米筐支持用户使用类似通达信公式的方式计算自定义指标,具体方法可以参考如下步骤:

首先,定义指标函数体本身。例如,

def KDJ_SIGNAL()):
    # 连续两个周期J值一直在超买区
    K, D, J = KDJ()
    return EVERY(J > 80, 2)

其次,在 init 阶段调用reg_indicator对所需取用的指标进行注册。注册时,需要指定指标名称、参数、适用的周期(比如,5 分钟线还是日线)以及初始回溯获取数据的窗口长度。例如,

reg_indicator('kdj', KDJ_SIGNAL, '1d', win_size=20)

最后,调用get_indicator获取指标计算结果。此时需要指定获取的指标名称以及所需计算的合约代码。例如,

get_indicator('000001.XSHE', 'kdj')

需要注意的是,目前技术指标计算并未包括当前“不完整”分钟线。举例来说,在 09:48 计算以 5 分钟线为周期的移动平均时,并不包括 09:45~09:48 这一“不完整”的 5 分钟线。

系统预定义指标

  • MACD 指数平滑移动平均
python
def MACD(SHORT=12, LONG=26, M=9):
    """
    MACD 指数平滑移动平均线
    """
    DIFF = EMA(CLOSE, SHORT) - EMA(CLOSE, LONG)
    DEA = EMA(DIFF, M)
    MACD = (DIFF - DEA) * 2

    return MACD
  • KDJ 随机指标
python
def KDJ(N=9, M1=3, M2=3):
    """
    KDJ 随机指标
    """
    RSV = (CLOSE - LLV(LOW, N)) / (HHV(HIGH, N) - LLV(LOW, N)) * 100
    K = EMA(RSV, (M1 * 2 - 1))
    D = EMA(K, (M2 * 2 - 1))
    J = K * 3 - D * 2

    return K, D, J
  • RSI 相对指标
python
def RSI(N1=6, N2=12, N3=24):
    """
    RSI 相对强弱指标
    """
    LC = REF(CLOSE, 1)
    RSI1 = SMA(MAX(CLOSE - LC, 0), N1, 1) / SMA(ABS(CLOSE - LC), N1, 1) * 100
    RSI2 = SMA(MAX(CLOSE - LC, 0), N2, 1) / SMA(ABS(CLOSE - LC), N2, 1) * 100
    RSI3 = SMA(MAX(CLOSE - LC, 0), N3, 1) / SMA(ABS(CLOSE - LC), N3, 1) * 100

    return RSI1, RSI2, RSI3
  • BOLL 布林带
python
def BOLL(N=20, P=2):
    """
    BOLL 布林带
    """
    MID = MA(CLOSE, N)
    UPPER = MID + STD(CLOSE, N) * P
    LOWER = MID - STD(CLOSE, N) * P

    return UPPER, MID, LOWER
  • WR 威廉指标
python
def WR(N=10, N1=6):
    """
    W&R 威廉指标
    """
    WR1 = (HHV(HIGH, N) - CLOSE) / (HHV(HIGH, N) - LLV(LOW, N)) * 100
    WR2 = (HHV(HIGH, N1) - CLOSE) / (HHV(HIGH, N1) - LLV(LOW, N1)) * 100

    return WR1, WR2
  • DMI 趋向指标
python
def DMI(M1=14, M2=6):
    """
    DMI 趋向指标
    """
    TR = SUM(MAX(MAX(HIGH - LOW, ABS(HIGH - REF(CLOSE, 1))), ABS(LOW - REF(CLOSE, 1))), M1)
    HD = HIGH - REF(HIGH, 1)
    LD = REF(LOW, 1) - LOW

    DMP = SUM(IF((HD > 0) & (HD > LD), HD, 0), M1)
    DMM = SUM(IF((LD > 0) & (LD > HD), LD, 0), M1)
    DI1 = DMP * 100 / TR
    DI2 = DMM * 100 / TR
    ADX = MA(ABS(DI2 - DI1) / (DI1 + DI2) * 100, M2)
    ADXR = (ADX + REF(ADX, M2)) / 2

    return DI1, DI2, ADX, ADXR
  • BIAS 乖离率
python
def BIAS(L1=5, L4=3, L5=10):
    """
    BIAS 乖离率
    """
    BIAS = (CLOSE - MA(CLOSE, L1)) / MA(CLOSE, L1) * 100
    BIAS2 = (CLOSE - MA(CLOSE, L4)) / MA(CLOSE, L4) * 100
    BIAS3 = (CLOSE - MA(CLOSE, L5)) / MA(CLOSE, L5) * 100

    return BIAS, BIAS2, BIAS3
  • ASI 震动升降指标
python
def ASI(M1=26, M2=10):
    """
    ASI 震动升降指标
    """
    LC = REF(CLOSE, 1)
    AA = ABS(HIGH - LC)
    BB = ABS(LOW - LC)
    CC = ABS(HIGH - REF(LOW, 1))
    DD = ABS(LC - REF(OPEN, 1))
    R = IF((AA > BB) & (AA > CC), AA + BB / 2 + DD / 4, IF((BB > CC) & (BB > AA), BB + AA / 2 + DD / 4, CC + DD / 4))
    X = (CLOSE - LC + (CLOSE - OPEN) / 2 + LC - REF(OPEN, 1))
    SI = X * 16 / R * MAX(AA, BB)
    ASI = SUM(SI, M1)
    ASIT = MA(ASI, M2)

    return ASI, ASIT
  • VR 容量比率
python
def VR(M1=26):
    """
    VR容量比率
    """
    LC = REF(CLOSE, 1)
    VR = SUM(IF(CLOSE > LC, VOL, 0), M1) / SUM(IF(CLOSE <= LC, VOL, 0), M1) * 100

    return VR
  • ARBR 人气意愿指标
python
def ARBR(M1=26):
    """
    ARBR人气意愿指标
    """
    AR = SUM(HIGH - OPEN, M1) / SUM(OPEN - LOW, M1) * 100
    BR = SUM(MAX(0, HIGH - REF(CLOSE, 1)), M1) / SUM(MAX(0, REF(CLOSE, 1) - LOW), M1) * 100

    return AR, BR
  • DPO
python
def DPO(M1=20, M2=10, M3=6):
    DPO = CLOSE - REF(MA(CLOSE, M1), M2)
    MADPO = MA(DPO, M3)

    return DPO, MADPO
  • TRIX 三重指数平滑均线
python
def TRIX(M1=12, M2=20):
    TR = EMA(EMA(EMA(CLOSE, M1), M1), M1)
    TRIX = (TR - REF(TR, 1)) / REF(TR, 1) * 100
    TRMA = MA(TRIX, M2)

    return TRIX, TRMA

工具函数及行情变量

请注意, 由于 python 实现方式的问题, 逻辑与使用 '&' 进行判断, 逻辑或使用 '|' 进行判断。 并且逻辑判断的条件语句需要添加括号, 以明确逻辑判断的先后顺序。例如, (CLOSE > 10.2) & (VOLUME > 100).

名称
收盘价C, CLOSE
开盘价O, OPEN
最高价H, HIGH
最低价L, LOW
成交量V, VOLUME
10 周期前收盘价REF(CLOSE, 10)
10 周期均线MA(CLOSE, 10)
金叉CROSS(MA(CLOSE, 5),MA(CLOSE,10))
最大值MAX(CLOSE, OPEN)
最小值MIN(CLOSE, OPEN)
10 周期满足条件EVERY(CLOSE > MA(CLOSE, 5), 10)
10 周期收阳线数量COUNT(CLOSE > OPEN, 10)
10 周期收盘价最大值HHV(CLOSE, 10)
10 周期收盘价最小值LLV(CLOSE, 10)
10 周期成交量加总SUM(VOLUME, 10)
绝对值ABS
标准差STD
IF 逻辑判断IF(X, A, B) 表示 X 不为 0 则返回 A, 否则返回 B