DMI指标测试和代码版本汇总

[复制链接]
查看527 | 回复5 | 王博 | 2020-4-15 13:30:03 | 显示全部楼层 |阅读模式
DMI定义与测试

1)定义DMI的计算公式:
文字描述:表示多空双方力量均衡点的变化所导致的价格变化
量化定义:TR := SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),14);                 
                 HD := HIGH-REF(HIGH,1);
                 LD := REF(LOW,1)-LOW;
                 DMP:= SUM(IFELSE(HD>0 && HD>LD,HD,0),14);
                 DMM:= SUM(IFELSE(LD>0 && LD>HD,LD,0),14);
                 PDI: DMP*100/TR;
                 MDI: DMM*100/TR;
                 ADX: MA(ABS(MDI-PDI)/(MDI+PDI)*100,14);
                 ADXR: (ADX+REF(ADX,14))/2;

2) 定义测试的买卖逻辑:
A. 测试的买入条件:若PDI上穿MDI形成金叉,买入
B. 测试的卖出条件:PDI下穿MDI形成死叉,卖出

3) 定义测试的品种和时间:
测试品种:上证指数
测试周期:2000-02-01 到 2020-01-31

回复

使用道具 举报

王博 | 2020-4-15 13:33:39 | 显示全部楼层
测试一代码

//一、定义仓位
FUND:=10000000;
LOTS:=INTPART(FUND*0.8/(CLOSE+FEE));//计算手数,使每次开仓金额都是800W

TR := SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),14);//最高价与最低价做差,最高价与前一周期收盘价做差,最低价与前一周期收盘价作差,在上述三个数据中取绝对值最大者,对该最大值做N周期累加求和。。
HD := HIGH-REF(HIGH,1);//最高价与前一周期最高价做差
LD := REF(LOW,1)-LOW;//前一周期最低价与最低价做差
DMP:= SUM(IFELSE(HD>0 && HD>LD,HD,0),14);//如果HD>0并且HD>LD,取HD否则取0,对取值做N周期累加求和。
DMM:= SUM(IFELSE(LD>0 && LD>HD,LD,0),14);//如果LD>0并且LD>HD,取LD否则取0,对取值做N周期累加求和。
PDI: DMP*100/TR;
MDI: DMM*100/TR;
ADX: MA(ABS(MDI-PDI)/(MDI+PDI)*100,14);//MDI与PDI差的绝对值与(MDI+PDI)*100做比值,取该比值的M个周期均值。
ADXR: (ADX+REF(ADX,14))/2;

DMIJC:=CROSSUP(PDI,MDI);
DMISC:=CROSSDOWN(PDI,MDI);

DMIJC,BK(LOTS);
DMISC,SP(BKVOL);

回复

使用道具 举报

王博 | 2020-4-15 13:35:12 | 显示全部楼层
测试二代码

//一、定义仓位
FUND:=10000000;
LOTS:=INTPART(FUND*0.8/(CLOSE+FEE));//计算手数,使每次开仓金额都是800W

TR := SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),14);//最高价与最低价做差,最高价与前一周期收盘价做差,最低价与前一周期收盘价作差,在上述三个数据中取绝对值最大者,对该最大值做N周期累加求和。。
HD := HIGH-REF(HIGH,1);//最高价与前一周期最高价做差
LD := REF(LOW,1)-LOW;//前一周期最低价与最低价做差
DMP:= SUM(IFELSE(HD>0 && HD>LD,HD,0),14);//如果HD>0并且HD>LD,取HD否则取0,对取值做N周期累加求和。
DMM:= SUM(IFELSE(LD>0 && LD>HD,LD,0),14);//如果LD>0并且LD>HD,取LD否则取0,对取值做N周期累加求和。
PDI: DMP*100/TR;
MDI: DMM*100/TR;
ADX: MA(ABS(MDI-PDI)/(MDI+PDI)*100,14);//MDI与PDI差的绝对值与(MDI+PDI)*100做比值,取该比值的M个周期均值。
ADXR: (ADX+REF(ADX,14))/2;

DMIJC:=CROSSUP(PDI,MDI);
DMISC:=CROSSDOWN(PDI,MDI);

DMIJC AND MDI>20,BK(LOTS);
DMISC,SP(BKVOL);

回复

使用道具 举报

王博 | 2020-4-15 13:37:02 | 显示全部楼层
测试三代码

//一、定义仓位
FUND:=10000000;
LOTS:=INTPART(FUND*0.8/(CLOSE+FEE));//计算手数,使每次开仓金额都是800W

TR := SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),14);//最高价与最低价做差,最高价与前一周期收盘价做差,最低价与前一周期收盘价作差,在上述三个数据中取绝对值最大者,对该最大值做N周期累加求和。。
HD := HIGH-REF(HIGH,1);//最高价与前一周期最高价做差
LD := REF(LOW,1)-LOW;//前一周期最低价与最低价做差
DMP:= SUM(IFELSE(HD>0 && HD>LD,HD,0),14);//如果HD>0并且HD>LD,取HD否则取0,对取值做N周期累加求和。
DMM:= SUM(IFELSE(LD>0 && LD>HD,LD,0),14);//如果LD>0并且LD>HD,取LD否则取0,对取值做N周期累加求和。
PDI: DMP*100/TR;
MDI: DMM*100/TR;
ADX: MA(ABS(MDI-PDI)/(MDI+PDI)*100,14);//MDI与PDI差的绝对值与(MDI+PDI)*100做比值,取该比值的M个周期均值。
ADXR: (ADX+REF(ADX,14))/2;

DMIJC:=CROSSUP(PDI,MDI);
DMISC:=CROSSDOWN(PDI,MDI);
CJL:=VOL>MA(VOL,M);

DMIJC AND CJL,BK(LOTS);
DMISC,SP(BKVOL);

回复

使用道具 举报

王博 | 2020-4-15 13:38:21 | 显示全部楼层
测试四代码

//一、定义仓位
FUND:=10000000;
LOTS:=INTPART(FUND*0.8/(CLOSE+FEE));//计算手数,使每次开仓金额都是800W

TR := SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),14);//最高价与最低价做差,最高价与前一周期收盘价做差,最低价与前一周期收盘价作差,在上述三个数据中取绝对值最大者,对该最大值做N周期累加求和。。
HD := HIGH-REF(HIGH,1);//最高价与前一周期最高价做差
LD := REF(LOW,1)-LOW;//前一周期最低价与最低价做差
DMP:= SUM(IFELSE(HD>0 && HD>LD,HD,0),14);//如果HD>0并且HD>LD,取HD否则取0,对取值做N周期累加求和。
DMM:= SUM(IFELSE(LD>0 && LD>HD,LD,0),14);//如果LD>0并且LD>HD,取LD否则取0,对取值做N周期累加求和。
PDI:=DMP*100/TR;
MDI:=DMM*100/TR;
ADX:=MA(ABS(MDI-PDI)/(MDI+PDI)*100,14);//MDI与PDI差的绝对值与(MDI+PDI)*100做比值,取该比值的M个周期均值。
ADXR:=(ADX+REF(ADX,14))/2;

DMIJC:=CROSSUP(PDI,MDI);//PDI与MDI金叉
DMISC:=CROSSDOWN(PDI,MDI);//PDI与MDI死叉

UPPER: (1+6/100)*MA(CLOSE,25);//ENE上轨
LOWER: (1-6/100)*MA(CLOSE,25);//ENE下轨
ENE: (UPPER+LOWER)/2;//ENE中轨

DMIJC AND C>LOWER,BK(LOTS);
DMISC OR CROSSDOWN(C,ENE),SP(BKVOL);

回复

使用道具 举报

王博 | 2020-4-15 13:39:41 | 显示全部楼层
测试五代码

//定义仓位
FUND:=10000000;
LOTS:=INTPART(FUND*0.8/(CLOSE+FEE));//计算手数,使每次开仓金额都是800W

//定义ATR
TR:MAX(MAX((H-L),ABS(REF(C,1)-H)),ABS(REF(C,1)-L));//算出(当日最高-当日最低)、(当日最高-昨日收盘)的绝对值、(昨日收盘-当日最低)的绝对值,取这3个值中的最大值为ATR
ATR:MA(TR,26);//求26个周期内的TR的简单移动平均

//定义均线
MA20:MA(C,20);

//定义DMI指标
TR:=SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),14);//最高价与最低价做差,最高价与前一周期收盘价做差,最低价与前一周期收盘价作差,在上述三个数据中取绝对值最大者,对该最大值做N周期累加求和。。
HD:=HIGH-REF(HIGH,1);//最高价与前一周期最高价做差
LD:=REF(LOW,1)-LOW;//前一周期最低价与最低价做差
DMP:= SUM(IFELSE(HD>0 && HD>LD,HD,0),14);//如果HD>0并且HD>LD,取HD否则取0,对取值做N周期累加求和。
DMM:= SUM(IFELSE(LD>0 && LD>HD,LD,0),14);//如果LD>0并且LD>HD,取LD否则取0,对取值做N周期累加求和。
PDI: DMP*100/TR;
MDI: DMM*100/TR;
ADX: MA(ABS(MDI-PDI)/(MDI+PDI)*100,6);//MDI与PDI差的绝对值与(MDI+PDI)*100做比值,取该比值的M个周期均值。
ADXR: (ADX+REF(ADX,6))/2;

DMI:ADXR>25;

//定义k线
k线ST:=ABS(O-C);//k线实体长度
YXCD:=H-L;//k线影线长度
BT:=k线ST>YXCD*0.5;//棒体实体
XX:=k线ST<YXCD*0.5;//星线实体

//定义黄昏之星
//1.定义第三天的下跌棒体
HHZX1:=BT AND YXCD>0.5*ATR AND L=LLV(L,3);
//2.定义第二天的星线
HHZX2:=REF(XX,1) AND REF(H,1)=HHV(H,3) AND REF(L,1)>REF(L,2);
//3.定义第一天的上涨棒体
HHZX3:=REF(BT,2) AND REF(C,2)>REF(C,3) AND REF(YXCD,2)>0.5*ATR;
//4.定义上涨趋势
HHZX4:=REF(C,2)>REF(MA20,2);

//定义黄昏之星
HHZX:=HHZX1 AND HHZX2 AND HHZX3 AND HHZX4;

HHZX AND DMI,BK(LOTS);//出现黄昏之星买入
BARSBK=1,SP(BKVOL);//1日后,卖出

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

媒体报道
大论文配图
刘昱妗大论文配图
大论文所有配图
论文撰写/整合智能体
刘昱妗论文撰写/整合智能体
梁心怡的交易日记与反思
心怡梁心怡的交易日记与反思
总结、学习、改进
揭秘 “5000笔交易胜率90.5%” 轻量组冠军“吾剑”老师 深度访谈 干货满满 交易策略
心怡揭秘 “5000笔交易胜率90.5%” 轻量组冠军“吾剑”老师 深度访谈 干货满满 交易策略
说话人 1 00:00:00本次大赛,他用1,035元的本金在6个月的时间里翻了169倍。而更令人瞠
昱妗交易员日记
刘昱妗昱妗交易员日记
记录教训 吸取教训 前一天提出的问题改进时机:上午的10:30 (和第一次风控一起)
巴菲特眼中的赌博
桥博士巴菲特眼中的赌博
英雄不问出处,巴菲特曾经重注 运通公司 的股票 巴菲特重注运通公司(American E
工科女在线学交易
唯格工科女在线学交易
今天我基于一个明确的技术信号进行了开仓操作:昨天大盘的收盘价和盘中最高价均创出近
工科女的量化学习
唯格工科女的量化学习
今天动手跑了第一次批量回测,测试了5、10、15、30分钟四个时间周期的策略表现。主要
相关课程推荐
K线形态组合解析
k线图基础知识怎么学? 报名宽论VA鱼识别课
没有人可以做万能交易者,但通过不断学习吸收知识从而有一套属于自己交易系统的人,就是走向了盈利的大道。
90%的时间在研究大盘指数,9.9元学习宽论VA
一买就跌,一卖就涨? 股市七亏二平一赚,怎样才能成为赚钱的10%? 看准大盘胜算过半,炒股新手也能掌握的V

83

主题

468

帖子

1189

积分

内部成员

Rank: 6Rank: 6

积分
1189
  • 官方论坛

    提供最新 Discuz! 产品新闻、软件下载与技术交流