当前平台:标准版
主要想法:逐周期运行;1分钟周期引用3分钟周期的SMA(Close,5,1),避免未来数据;完成后,将引用类似的 - 1分钟引用5分,15分。。。日,周SMA数据;
问题是现在测试1分钟周期引用3分钟周期时,避免未来数据,写了半天都有问题,发在公式问题区,尽管非常感谢Jinzhi兄的回复,但最终还没有可操作下去的结果。
我初步写了点代码,如下,但是有错,我想请教哪位老大能帮忙改下公式:
TVar1_LHL:close;
VARIABLE:S3[3]=TVar1_LHL; //我这里想定义3个全局变量,存N,N+1,N+2的累计值,不过好像不太对,求教
VAR1:=TVar1_LHL; //序列变量
IF NOT(ISLASTBAR) THEN EXIT;
If barpos =1 then exit;
FOR J=2 TO DATACOUNT DO BEGIN
IF Mod(J,3)=2 Then BEGIN
S3[1]:=(S3[1]*4+ VAR1[J])/5; // 发现VAR1一直是最后一根BARPOS的值,不是Var1[J],请教怎么回事
TVAR1[J]:3*S3[1],coloryellow;
END
IF Mod(J,3)=0 Then BEGIN
S3[2]:=(S3[2]*4+ VAR1[J])/5;
TVAR1[J]:3*S3[2],coloryellow;
END
IF Mod(J,3)=1 Then BEGIN
S3[3]:=(S3[3]*4+ VAR1[J])/5;
TVAR1[J]:3*S3[3],coloryellow; // TAR1无显示,为什么呀
END
END
SMA的原始推算公式为
SMA(C,N,M)= M*C/(N+1)+(N+1-M)*REF(C,1)/(N+1);
对应楼主的,可简化为
SMA(C,5,1)= C/6+5*REF(C,1)/6;
1分钟下取无未来数据的5分钟MA5均线算法实例http://www.weistock.com/bbs/dispbbs.asp?boardid=10&Id=15388
参考该帖,原理雷同
自己本地尝试一下,有困难继续发帖求助
多谢FLY兄的回复。
小弟的问题是:那个1分钟引用5分钟的MA小弟研究,也按该思路想写SMA。基于该思路,如果是1分钟引用3分钟,所以3分钟周期下的Ref(close,1)是1分钟周期下的Ref(close,3). 因为SMA是要用全局变量计算累计值的,所以小弟的笨办法是定义3个全局变量分别累计1分钟周期下的N,N+1,N+2笔,这3笔对应3分钟下的1笔。
问题是,1分钟引用3分钟如果测试成功后,我还准备在1分钟下引用5分钟,15分钟,120分钟,日,周,这样的话,没办法直接定义若干个全局变量,所以我是想定义全局变量数组的,然后用For循环的。
但是我写的那堆代码一直调试得不对,设断点看循环里的数字都没有按我的想法计算。因为我刚练习金字塔,所以想还烦请老师帮忙看看具体代码怎么实现(可以参见原贴的代码),多谢!
给的帖子中,不需要使用全局变量,就可实现.
VARIABLE需要用在逐周期下,你1楼的代码中,还有FOR循环,效率上会打折扣的,推荐放弃1楼使用全局变量的思路
这个已经解决了,一直纠结于用全局变量累计,其实还是逐K算遍来得简单,多谢Fly兄指点,奉上金币,呵呵
FLY大哥,再请教下:
我已经改了1分钟周期调用3分钟周期的无未来SMA,代码如下:
INPUT:N(5,2,500);
variable:S3[3]=0;
VAR1:=C; Index:=0;
XBarpos:Barpos,linethick0;
Index:=if(mod(barpos,3)=0,3,mod(barpos,3));
For J=Index to Barpos Do begin
If J=Index then S3[Index]:=VAR1[Index];
else S3[Index]:=(S3[Index]*4+VAR1[J])/5;
J:=J+2;
End
TSMA1:S3[Index],coloryellow;
但是,策略关系,我用的是逐K模式,然后用如上代码,因为是For循环,所以效率不高,如果图表4000根以上有延迟。
看了半天那个1分钟引用5分钟MA的贴,我琢磨把代码优化下,但没想出办法,原来用全局变量,也是想减少计算量,似乎不行。老师能帮我看看如何优化吗?