三十五、ADX+DMI 组合策略

发布时间 2023-07-07 17:34:48作者: 金记缘
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import talib
import cross_order as order
import time

# ADXDMI指标数据周期
adx_period = 14
dmi_period = 14
ma_short_period = 5
ma_long_period = 20

'''
ADXDMI指标策略示例
[什么是ADX] ADX(average directional indicator) 平均趋向指数,常用的趋势衡量指标。通常与趋向系统(DMI)一起使用,
利用多空趋向之变化差离与总和判定平均趋势,ADX数值不能显示趋势的发展方向。 但是如果趋势存在,ADX可以衡量趋势的强度。
[ADX的计算方法(默认区间14)] Step 1. 计算Directional movement (动向变化值)
+DM:当日最高价比昨日最高价高并且当日最低价比昨日最低价高,即为上升动向+DM。上升幅度为:当日最高价减去昨日最高价。
-DM:当日最高价比昨日最高价低并且当日最低价比昨日最低价低,即为下降动向-DM。下降幅度为:昨日最低价减去今日最低价。
Step 2 . 计算True Range (真实波幅)
TR =∣最高价-最低价最高价-昨收昨收-最低价三者之中的最高值
Step 3: 计算Directional Movment Index (动向指数)
+DI(14) = +DM(14)/TR(14)100 -DI(14) = -DM(14)/TR(14)100
Step 4: 计算ADX
DX+DI-DI两者之差的绝对值除以两者之和的百分数。 DX[(+DI14)-(-DI14)]/[(+DI14)+(-DI14)]*100
ADXDX14天平滑平均线。 ADX = SMA(DX, 14)
[ADXDMI的一些解读]
不论上升趋势或下降趋势,ADX的读数越大,趋势越明显。
衡量趋势强度时,需要比较几天的ADX 读数,观察ADX究竟是上升或下降。ADX读数上升,代表趋势转强;如果ADX读数下降,意味着趋势转弱。
+DI14从下向上递增突破-DI14时,显示市场内部有新的多头买家进场,愿意以较高的价格买进,因此入场信号。当-DI14从下向上递增突破+DI14时,
显示市场内部有新的空头卖家出货,愿意以较低卖出,为离场信号
策略逻辑: 使用ADX的相对上升下降来判断趋势。配合双均线信号一起用。 在这里ADX更多是作为验证趋势是否会增强的信号使用,以避免在横盘中多次交易。
'''


def main():
print("任务开始时间:", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))

for symbol in order.symbol_pool:
# 设置杠杆倍数
order.set_leverage(symbol=symbol, leverage='18')
df = order.get_candlesticks(symbol=symbol, interval='15m', limit=str(ma_long_period + 1))
adx = talib.ADX(df['high'], df['low'], df['close'], timeperiod=adx_period)
plus_di = talib.PLUS_DI(df['high'], df['low'], df['close'], timeperiod=dmi_period)
minus_di = talib.MINUS_DI(df['high'], df['low'], df['close'], timeperiod=dmi_period)
short_ma = talib.SMA(df['close'], timeperiod=ma_short_period)
long_ma = talib.SMA(df['close'], timeperiod=ma_long_period)
if short_ma.values[-1] > long_ma.values[-1] and short_ma.values[-2] < long_ma.values[-2] and adx.values[-1] > \
adx.values[-2] and plus_di.values[-1] > minus_di.values[-1]:
order.up_cross_order(symbol=symbol, ordtype='market', message='ADX+DMI策略提示做多')
print('ADX+DMI策略提示做多: ' + symbol)
if short_ma.values[-1] < long_ma.values[-1] and short_ma.values[-2] > long_ma.values[-2] and adx.values[-1] < \
adx.values[-2] and plus_di.values[-1] < minus_di.values[-1]:
order.down_cross_order(symbol=symbol, ordtype='market', message='ADX+DMI策略提示做空')
print('ADX+DMI策略提示做空: ' + symbol)
time.sleep(2)

print("任务结束时间:", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))


if __name__ == '__main__':
main()