# 技术分析
米筐平台引入的信号计算方式能够让您更方便地进行技术分析。在技术分析过程中,您既可以使用我们预先提供的常用技术指标,也可以使用自定义指标来产生信号供策略内使用。
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 指数平滑移动平均
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 随机指标
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 相对指标
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 布林带
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 威廉指标
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 趋向指标
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 乖离率
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 震动升降指标
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 容量比率
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 人气意愿指标
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
def DPO(M1=20, M2=10, M3=6):
DPO = CLOSE - REF(MA(CLOSE, M1), M2)
MADPO = MA(DPO, M3)
return DPO, MADPO
- TRIX 三重指数平滑均线
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 |