金子塔是不能这样写的
if c>o then
BEGIN
value1:=ref(c,1);
value2:=ma(c,2);
end;
只能这样
value3=ref(c,100);
value4=ma(c,200);
if c>o then
BEGIN
value1:=value3;
value2:=value4;
end;
为什么呢 ,经过和别人讨论的结果:
金字塔的ma 函数 比如ma(c,10) 是肯定是采用加最新的值再减去最最早的值的算法
所以如果在控制语句比如if 的控制下,ma的计算值不连续
但如果采用最原始的每个点都向前循环10根累加再求平均 ,这样就完全没有问题
也有人会觉得这样效率很低,确实在第一次加载公式 到图表时有差别,但在实时行情中搭配仅刷最后一根bar 的模式,其实计算消耗时间都会小到人基本反应不过来,我是拿excel vba 算过500个数的平均做比较,
所以我的建议是与其将那些带有回溯的函数都列出来,说不能放在控制语句之下 还不如在编译公式时软件将这些函数的计算值在底层拿数组存起来
这样客户在使用的时候就没有那么多顾虑,这是参考其他两款软件的做法
金字塔的ma 函数 比如ma(c,10) 是肯定是采用加最新的值再减去最最早的值的算法
这是你一厢情愿的想法,如果你的参数10是个变量的话是做不到的,因此从效率和稳定性上考虑,目前的做法是唯一效率和稳定性兼顾的做法
此外序列运行模式是没有这个限制的,如果你非常讨厌这种模式的编程,你可以考虑将算法代码做成用户函数的模式,然后调用用户函数的结算结果来实现策略买卖。
用户函数有参考编程帮助 #函数#
我的意思是
在编译的时候软件就在底层将这些统计类回溯类的函数预先赋值给一个变量并插在前面
至于老师你说的如果ma(c,10),这个10 是一个变量的问题
金字塔ma函数也无法达到稳定性
举例
varible:x=0;
if c>o then x:=x+1;
value1=ma(h,x);
假设一个情景 ,所有bar 的高 h 相等
可以预知,根据ma的算法,这个value1的值 一定会随着阳线的增多,越来越小,l老师你觉得这样合理吗;
但如果ma的算法是简单的向前累加循环,这个值不变,这个才合理的,因为h是一直相等的
我的建议只是参考了其他两款软件的做法并考虑到一般客户的思维方式,因为你们就算有说明,我相信你们问100个客户为什么要做这样的限制,估计真能说出个所以然的也没几个,毕竟我们不是专业的程序员,还在用金字塔语言。
当然我现在只能自编函数来解决我自己的问题