初始目的是为了写一条均线,使其在价格大幅跳空时能立刻阶梯式运动到一定位置,
用指数移动平均线来实现这条均线,因为简单算数均线即使中间改变了均线值也不能使其正确移动,
而指数均线是通过均线前一周期值来计算,可以实现。
于是第一步,我先写一条指数均线:(算法参考EMA)
N:=20; //周期长度
DMA1:=close; //如果不写这句,下句会出现 "未定义的变量 DMA1"的错误
DMA1:=if(barpos=1,C,(2*C+(N-1)*ref(DMA1,1))/(N+1));
指数均线:DMA1;
但是这条语句执行出来的结果是错误的,画出的线根本不是一条均线,倒像是一条连接close的线。
从序列变量运算的机制来看,这条语句没有道理执行不正确,即便是在赋值时,引用了本变量的前值,
也应该计算出正确的结果,我觉得这可能是金字塔计算机制的一个严重的问题导致,请教一下这是为什么?
后来有人告诉我是因为序列变量赋值时不能调用自己的前周期值,因此我改了一下,
用一个中间序列变量保存DMA1的前周期值,如下:
N:=20; //周期长度
DMA1:=Close; //如果不写这句,下句会出现 "未定义的变量 DMA1"的错误
if barpos=1 then DMA1:=C;
DMA1pre:=ref(DMA1,1);
if barpos<>1 then DMA1:=(2*C+(N-1)*DMA1pre)/(N+1);
指数均线:DMA1;
但是以上的代码还是没法计算出正确结果,还是跟以前的代码一样,得到的是一个近似于close的线,
请高手指教。
另外提一句,我这里须用逐k线模式,另外,我对于vbs的代码不是很熟悉,不希望这么简单的一个功能还要用vbs来实现,
貌似我无论如何都无法用pel来自己写出一条指数均线?(我必须自己用代码实现,而不能使用EMA,因为我要在上面做处理)
N:=20; //周期长度
DMA1:=close; //如果不写这句,下句会出现 "未定义的变量 DMA1"的错误
DMA1:=if(barpos=1,C,(2*C+(N-1)*ref(DMA1,1))/(N+1));
你这是好像是博易思维,效率较低,技术也落伍。但每个软件都有自己个性的运行机制
充分理解了运行机制,才能运用自如
你的方法不可行的原因是 :ref(dma1,1) 这样获取的是昨天的收盘价而已
用金字塔的精髓技术写,注意采用的是逐K线模式:
variable:dma1=c;
dma1:=(2*c+(n-1)*dma1)/(N+1);
leevolvo,按照你的来写没有输出。。。。。。
另外,在逐k线下,DMA1从第二根k线开始就有了计算出的值,那在第三根k线取取出的就是DMA1的前值了,怎么会是昨收呢?
admin,我想实现的就是,比如:大幅跳空时,均线直接移动到跳空缺口的1/2处
leevolvo,请教一下,variable指的是全局变量,就是说在只在第一根k线初始化,是吗?即便是序列变量,也可以用variable来申明是吗?
而且你怀疑的是因为初始化语句,DMA1:=close; 导致ref(dma1,1) 取出来的是close,但是ref(dma1,1) 应该是取的DMA1的前值,不应该
被初始化DMA1:=close;影响啊
而用了variable的事实是没有得到任何输出了,我怀疑恐怕不能用variable来申明序列变量。您把这段简单的代码执行以下就知道了
实际上,我也希望知道金字塔真正的执行机制,为什么那么简单的一段代码,理论上是不该出错的代码,都会有问题
汗
有空多学学帮助文档
我只是实现。你要输出,就自己加个输出语句啊
runmode:0;
variable:dma1=c;
dma1:=(2*c+(n-1)*dma1)/(N+1);
junxian:dma1;
leevolvo,按照你的来写没有输出。。。。。。
另外,在逐k线下,DMA1从第二根k线开始就有了计算出的值,那在第三根k线取取出的就是DMA1的前值了,怎么会是昨收呢?
当然是昨收了。不信你试试
注意一下,不同的软件有不同的用法。
我看了多少遍的教程,从来没有见过教程里有你这种用法。
如果用其他软件的用法来套在金字塔上,自然不可行了
就像你用vb的语法去写C++,而且还想运行正常,这样不是很可笑吗