等级: 超级版主
- 注册:
- 2021-5-18
- 曾用名:
- FireScript
|
本帖最后由 技术009 于 2023-3-31 10:13 编辑
金叉区间最高值到死叉区间最低值连线
因为使用了BACKSET函数。指标必须在序列模式下
[PEL] 复制代码
ma10:ma(c,10);
ma20:ma(c,20);
majc:cross(ma10,ma20);
masc:cross(ma20,ma10);
LEN1:=BARSLAST(majc)+1;
LEN2:=BARSLAST(masc)+1;
redH_location:=HHVBARS(c,len1);
greenL_location:=LLVBARS(c,LEN2);
S1:BACKSET(masc,redH_location+1);//在死叉时候 将前面金叉区间最高值所在位置到当前位置的S1重置为1 这样 在高点位置实际存在一个S1的金叉
S2:BACKSET(majc,greenL_location+1);
DRAWICON(cross(s1,0),h,1);
DRAWICON(cross(s2,0),L,2);
DRAWLINE(cross(s1,0),H,cross(s2,0) OR ISLASTBAR,L,0);
DRAWLINE(cross(s2,0),L,cross(s1,0) OR ISLASTBAR,H,0);
实际效果:
macd小引用大调用无未来的处理方式
这里以小周期调用日线macd为例:
原理很简单就是利用日线上一周期的结果 和小周期当前的C 按照macd和ema算法二次构造来实现,其他的类似ma,kdj均可以按照这个思路重构代码。(其实现在的内存保留模式,即6.23之后的逐K+仅刷最后一个K模式 是会保存当时调用到的实时的大周期指标的数值的,但是图表上一旦触发重刷,这些调用结果就会被最新的大周期数值覆盖掉了。因此可以说盘中运行时候调用的值其实是没有未来的,但是历史信号是纯回测结果,用本例的代码处理下能使得历史和最新信号保存逻辑一致性)
[PEL] 复制代码 input:p(26,20,100,8),s(12,5,40,4),m(9,2,60,6);
EMA_S1:="EXPMA.M1##DAY"(S);
EMA_P1:="EXPMA.M1##DAY"(P);
DEA1:="MACD.DEA##DAY";
EMA_S0:=(2*C+(S-1)*EMA_S1)/(S+1);//当前的EMA(CLOSE,S)
EMA_P0:=(2*C+(P-1)*EMA_P1)/(P+1);//当前的EMA(CLOSE,p)
DIFF0:=EMA_S0-EMA_P0;//当前的DIFF
DEA0:=(2*DIFF0+(M-1)*DEA1)/(M+1);
MACD0 :2*(DIFF0-DEA0), COLORSTICK;
kdj也能做类似的处理,不过稍微麻烦点,需要新建一个指标XZ,作为被调用指标:
XZ:
[PEL] 复制代码 input:n(9,1,100,10),p1(3,2,40,4),p2(3,2,40,4);//参数设置
RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;
K:SMA(RSV,P1,1);
D:SMA(K,P2,1);
J:3*K-2*D,NODRAW;
llv1:llv(l,N-1);
hhv1:hhv(h,N-1);
然后进行算法拆解重组的代码如下:
[PEL] 复制代码 input:n(9,1,100,10),p1(3,2,40,4),p2(3,2,40,4);//参数设置
k1:="XZ.K##DAY"(n,p1,p2);
d1:="XZ.D##DAY"(n,p1,p2);
llv1:="XZ.llv1##DAY"(n,p1,p2);
hhv1:="XZ.hhv1##DAY"(n,p1,p2);
rsv2:=(c-min(llv1,l))/(max(h,hhv1)-min(llv1,l))*100;
k2:(rsv2+(P1-1)*k1)/P1;
D2:(k2+(P2-1)*d1)/P2;
j2:(3*k2-2*d2);
系统自带的DMI 指标也可以拆解,以小周期调用30分钟大周期为例。先新建一个mx作为被调用指标:
[PEL] 复制代码 INPUT:P(14,1,200,1),M(6,1,200,1);
T:TIME;
V1:MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1)));
TR1:SUM(V1,P);//调用1
HD := HIGH-REF(HIGH,1);
LD := REF(LOW,1)-LOW;
DMP: SUM(IF(HD>0 AND HD>LD,HD,0),P);//调用2-3
DMM: SUM(IF(LD>0 AND LD>HD,LD,0),P);
PDI: DMP*100/TR1;
MDI: DMM*100/TR1;
ADX: MA(ABS(MDI-PDI)/(MDI+PDI)*100,M);
RADX:REF(ADX,M);
然后当前周期下进行调用:
[PEL] 复制代码 LAST_C:=CALLSTOCK('',vtCLOSE,4,-1);
LAST_H:=CALLSTOCK('',vtHIGH,4,-1);
LAST_L:=CALLSTOCK('',vtLOW,4,-1);
INPUT:P(14,1,200,1),M(6,1,200,1);
T:="MX.T#MIN30";
TR1X:="MX.TR1##MIN30"(P-1,M);
LEN:=BARSLAST(REF(T,1)<>T)+1;
H1:=HHV(H,LEN);
L1:=LLV(L,LEN);
TR1:=TR1X+MAX(MAX(H1-L1,ABS(H1-LAST_C)),ABS(L1-LAST_C));
HD := H1-LAST_H;
LD := LAST_L-L1;
DMPX:="MX.DMP##MIN30"(P-1,M);
DMP:DMPX+IF(HD>0 AND HD>LD,HD,0);
DMMX:="MX.DMM##MIN30"(P-1,M);
DMM:DMMX+IF(LD>0 AND LD>HD,LD,0);
PDI: DMP*100/TR1;
MDI: DMM*100/TR1;
ADXX:="MX.ADX##MIN30"(P,M-1);
ADX:(ADXX*(M-1)+(ABS(MDI-PDI)/(MDI+PDI)*100))/M;
RADX:="MX.RADX#MIN30";
ADXR:(ADX+RADX)/2
需要注意是的DMI算法的拆解,如果要调整为其他周期:
1.其中涉及到的跨周期调用都要改周期,包括调用K数据的周期以及若干个跨周期跨指标调用的。都必须调整为相应的目标周期。
2.不适用于调用日线。日线周期则需要进一步调整代码。这个建议客户自行理解了其中思路之后,自行尝试下,并不是很复杂。
N周期内成交量第M大的K对应的收盘价
[PEL] 复制代码 INPUT:N(20,1,100,1),M(1,1,20,1);
NV:VOL*10000+c;//合成的数,保证成交量大的一定排序优先
CM:LARGE(nv,N ,M)-LARGE(vol,N ,M)*10000;//把c解出来
根据品种情况要调整NV的算法,保证成交量大的一定排序在前面。尤其是某些品种价格高的,成交量低的情况下,NV里面就乘10000可能都不够。
仅使用当日数据计算MACD
这个算法 涉及到对ema算法的拆解,参考了前面的3.1的例子。首先新建一个指标A1,这个指标是单纯计算当日的ema数值用的:
[PEL] 复制代码 INPUT:N(10,1,100,1);
X:=C;//相当于ema参数x
VARIABLE:ema_:=0;
//ema
if BARPOS=1 or TODAYBAR=1 then ema_:=X;
ema_:=if(BARPOS>1,(2*x+(N-1)*ema_)/(N+1),ema_);
ema1:ema_;//最后结果
然后计算当日macd数值的代码,这里是基于1分钟周期的:
[PEL] 复制代码 input:p(26,20,100,8),s(12,5,40,4),m(9,2,60,6);
EMA_P:="A1.ema1#MIN1"(p);
EMA_S:="A1.ema1#MIN1"(s);
DIFF :EMA_S - EMA_P;//快线
VARIABLE:DEA_:=0;
if BARPOS=1 or TODAYBAR=1 then DEA_:=DIFF;
DEA_:=if(BARPOS>1,(2*DIFF+(m-1)*DEA_)/(m+1),DEA_);
DEA : DEA_;
MACD1 :2*(DIFF-DEA), COLORSTICK;
|
|