 
等级: 超级版主
- 注册:
- 2021-5-18
- 曾用名:
- FireScript
|
本帖最后由 技术009 于 2023-3-31 10:13 编辑
金叉区间最高值到死叉区间最低值连线
因为使用了BACKSET函数。指标必须在序列模式下
[PEL] 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | 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 );
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] 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 | 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_P0:=( 2 * C +(P- 1 )*EMA_P1)/(P+ 1 );
DIFF0:=EMA_S0-EMA_P0;
DEA0:=( 2 *DIFF0+(M- 1 )*DEA1)/(M+ 1 );
MACD0 : 2 *(DIFF0-DEA0), COLORSTICK ;
|
kdj也能做类似的处理,不过稍微麻烦点,需要新建一个指标XZ,作为被调用指标:
XZ:
[PEL] 复制代码 1 2 3 4 5 6 7 8 | 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] 复制代码 01 02 03 04 05 06 07 08 09 10 | 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] 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 | 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);
HD := HIGH - REF ( HIGH , 1 );
LD := REF ( LOW , 1 )- LOW ;
DMP: SUM ( IF (HD> 0 AND HD>LD,HD, 0 ),P);
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] 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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] 复制代码 1 2 3 | 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 ;
|
根据品种情况要调整NV的算法,保证成交量大的一定排序在前面。尤其是某些品种价格高的,成交量低的情况下,NV里面就乘10000可能都不够。
仅使用当日数据计算MACD
这个算法 涉及到对ema算法的拆解,参考了前面的3.1的例子。首先新建一个指标A1,这个指标是单纯计算当日的ema数值用的:
[PEL] 复制代码 1 2 3 4 5 6 7 8 | INPUT :N( 10 , 1 , 100 , 1 );
X:= C ;
VARIABLE :ema_:= 0 ;
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] 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 | 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 ;
|
|
|