#!/usr/bin/env python# -*- coding: utf-8 -*-import talibimport cross_order as orderimport time# ADX、DMI指标数据周期
adx_period = 14
dmi_period = 14
ma_short_period = 5
ma_long_period = 20'''ADX、DMI指标策略示例[什么是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)100Step 4: 计算ADXDX是+DI与-DI两者之差的绝对值除以两者之和的百分数。 DX=[(+DI14)-(-DI14)]/[(+DI14)+(-DI14)]*100ADX是DX的14天平滑平均线。 ADX = SMA(DX, 14)[ADX和DMI的一些解读]不论上升趋势或下降趋势,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()
adx_period = 14
dmi_period = 14
ma_short_period = 5
ma_long_period = 20'''ADX、DMI指标策略示例[什么是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)100Step 4: 计算ADXDX是+DI与-DI两者之差的绝对值除以两者之和的百分数。 DX=[(+DI14)-(-DI14)]/[(+DI14)+(-DI14)]*100ADX是DX的14天平滑平均线。 ADX = SMA(DX, 14)[ADX和DMI的一些解读]不论上升趋势或下降趋势,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()