1.策略介绍及逻辑
策略介绍
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更多是作为验证趋势是否会增强的信号使用,以避免在横盘中多次交易。
2.策略代码
2.1配置文件【adx_dmi_stock.ini】(提示ini配置文件,需要保存成UTF8格式)
2.2策略文件【adx_dmi_stock.py】(代码过长无法上传,具体内容见证经社——
http://***/q/forum.php?mod=viewthread&tid=58&extra=page%3D1 )
3.代码涉及的函数代码
3.1 python函数及package
| 功能 | 函数原型 | 参数 | 返回值 |
参数名 | 含义 |
sys | 提供了一系列有关Python运行环境的变量和函数。 |
|
|
| sys.argv[0] | 当前程序名 |
|
sys.argv | 获取当前正在执行的命令行参数的参数列表(list)。 | sys.argv | sys.argv[1] | 第一个参数 |
|
sys.argv[2] | 第二个参数 |
|
arrow | 标准的时间日期库。 |
ta-lib | 被广泛应用的金融市场数据分析的库 |
pandas | Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的 |
time | 返回当前时间的时间戳 | time.time() |
|
| 返回当前时间的时间戳 |
len | 返回对象(字符、列表、元组等)长度或项目个数。 | len(s) | s | 对象 | 返回对象长度。 |
append | 用于在列表末尾添加新的对象。 | list.append(obj) | obj | 添加到列表末尾的对象。 | 该方法无返回值,但是会修改原来的列表。 |
3.2掘金接口函数
| 功能 | 函数原型 | 参数 | 返回值 |
参数名 | 类型 | 说明 |
on_bar | 响应Bar事件,收到Bar数据后本函数被调用。 | on_bar(bar) | bar | bar | bar数据 | 无 |
open_long | 异步开多仓,以参数指定的symbol、价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口 | open_long(exchange, sec_id, price, volume) | exchange | string | 交易所代码, 如上交所SHSE | 委托下单生成的Order对象 |
sec_id | string | 证券代码,如浦发银行600000 |
price | float | 委托价,如果price=0,为市价单,否则为限价单 |
volume | float | 委托量 |
close_long | 异步平多仓接口,以参数指定的exchange, 证券代码sec_id, 价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口。 | close_long(exchange, sec_id, price, volume) | exchange | string | 交易所代码, 如上交所SHSE | 委托下单生成的Order对象 |
sec_id | string | 证券代码,如浦发银行600000 |
price | float | 委托价,如果price=0,为市价单,否则为限价单 |
volume | float | 平仓量 |
open_short | 异步开空仓,以参数指定的symbol、价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口 | open_short(exchange, sec_id, price, volume) | exchange | string | 交易所代码, 如上交所SHSE | 委托下单生成的Order对象 |
sec_id | string | 证券代码,如浦发银行600000 |
price | float | 委托价,如果price=0,为市价单,否则为限价单 |
volume | float | 委托量 |
close_short | 异步平空仓接口,以参数指定的exchange, 证券代码sec_id, 价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口。 | close_long(exchange, sec_id, price, volume) | exchange | string | 交易所代码, 如上交所SHSE | 委托下单生成的Order对象 |
sec_id | string | 证券代码,如浦发银行600000 |
price | float | 委托价,如果price=0,为市价单,否则为限价单 |
volume | float | 平仓量 |
get_last_n_dailybars | 提取单个代码的最新n条DailyBar数据, 策略类和行情服务类都提供该接口。 | get_last_n_dailybars(symbol, n, end_time='') | symbol | string | 证券代码, 带交易所代码以确保唯一,如SHSE.600000 | Bar列表 |
n | int | 提取的数据条数 |
end_time | string | 指定截止时间, 如2015-10-30 15:00:00 |
get_dailybars | 提取指定时间段的历史Bar数据,支持单个代码提取或多个代码组合提取。策略类和行情服务类都提供该接口。 | get_dailybars(symbol_list, begin_time, end_time) | symbol_list | string | 证券代码, 带交易所代码以确保唯一,如SHSE.600000,同时支持多只代码 | DailyBar列表 |
begin_time | string | 开始日期, 如2015-10-19 |
end_time | string | 结束日期, 如2015-10-30 |
get_position | 查询当前策略指定symbol(由交易所代码和证券ID组成)和买卖方向的持仓信息。策略类和交易服务类都提供该接口。 | get_position(exchange, sec_id, side); | exchange | string | 交易所代码 | Position对象,持仓信息 |
sec_id | string | 证券代码 |
side | int | 买卖方向 |