#!/usr/bin/env python # -*- coding: utf-8 -*- import talib import cross_order as order import 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)100 Step 4: 计算ADX DX是+DI与-DI两者之差的绝对值除以两者之和的百分数。 DX=[(+DI14)-(-DI14)]/[(+DI14)+(-DI14)]*100 ADX是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()
上一篇