以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  严重的问题,关于序列变量引用上周期值的错误  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=9554)

--  作者:antonyxu99
--  发布时间:2011/12/31 11:56:30
--  严重的问题,关于序列变量引用上周期值的错误

初始目的是为了写一条均线,使其在价格大幅跳空时能立刻阶梯式运动到一定位置,

用指数移动平均线来实现这条均线,因为简单算数均线即使中间改变了均线值也不能使其正确移动,

而指数均线是通过均线前一周期值来计算,可以实现。

 

于是第一步,我先写一条指数均线:(算法参考EMA)

N:=20;             //周期长度
DMA1:=close;   //如果不写这句,下句会出现 "未定义的变量 DMA1"的错误
DMA1:=if(barpos=1,C,(2*C+(N-1)*ref(DMA1,1))/(N+1));
指数均线:DMA1;

 

但是这条语句执行出来的结果是错误的,画出的线根本不是一条均线,倒像是一条连接close的线。

从序列变量运算的机制来看,这条语句没有道理执行不正确,即便是在赋值时,引用了本变量的前值,

也应该计算出正确的结果,我觉得这可能是金字塔计算机制的一个严重的问题导致,请教一下这是为什么?

 


--  作者:antonyxu99
--  发布时间:2011/12/31 13:02:31
--  继续研究

后来有人告诉我是因为序列变量赋值时不能调用自己的前周期值,因此我改了一下,

用一个中间序列变量保存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的线,

请高手指教。


--  作者:antonyxu99
--  发布时间:2011/12/31 13:05:52
--  

另外提一句,我这里须用逐k线模式,另外,我对于vbs的代码不是很熟悉,不希望这么简单的一个功能还要用vbs来实现,

貌似我无论如何都无法用pel来自己写出一条指数均线?(我必须自己用代码实现,而不能使用EMA,因为我要在上面做处理)

[此贴子已经被作者于2011-12-31 13:06:24编辑过]

--  作者:admin
--  发布时间:2011/12/31 13:23:05
--  
你干脆把你要想实现的东西,再仔细描述清楚一下
--  作者:阿火
--  发布时间:2011/12/31 15:27:57
--  

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);

 

[此贴子已经被作者于2011-12-31 15:35:15编辑过]

--  作者:antonyxu99
--  发布时间:2012/1/1 13:29:50
--  

leevolvo,按照你的来写没有输出。。。。。。

另外,在逐k线下,DMA1从第二根k线开始就有了计算出的值,那在第三根k线取取出的就是DMA1的前值了,怎么会是昨收呢?

 

admin,我想实现的就是,比如:大幅跳空时,均线直接移动到跳空缺口的1/2处

 


--  作者:antonyxu99
--  发布时间:2012/1/1 13:34:55
--  

leevolvo,请教一下,variable指的是全局变量,就是说在只在第一根k线初始化,是吗?即便是序列变量,也可以用variable来申明是吗?

而且你怀疑的是因为初始化语句,DMA1:=close; 导致ref(dma1,1) 取出来的是close,但是ref(dma1,1) 应该是取的DMA1的前值,不应该

被初始化DMA1:=close;影响啊

而用了variable的事实是没有得到任何输出了,我怀疑恐怕不能用variable来申明序列变量。您把这段简单的代码执行以下就知道了

[此贴子已经被作者于2012-1-1 13:35:48编辑过]

--  作者:antonyxu99
--  发布时间:2012/1/1 13:36:48
--  

实际上,我也希望知道金字塔真正的执行机制,为什么那么简单的一段代码,理论上是不该出错的代码,都会有问题


--  作者:阿火
--  发布时间:2012/1/1 19:51:06
--  

有空多学学帮助文档

我只是实现。你要输出,就自己加个输出语句啊

 

runmode:0;

variable:dma1=c;

dma1:=(2*c+(n-1)*dma1)/(N+1);

junxian:dma1;


--  作者:阿火
--  发布时间:2012/1/1 20:00:01
--  
以下是引用antonyxu99在2012-1-1 13:29:50的发言:

leevolvo,按照你的来写没有输出。。。。。。

另外,在逐k线下,DMA1从第二根k线开始就有了计算出的值,那在第三根k线取取出的就是DMA1的前值了,怎么会是昨收呢?

 

 

当然是昨收了。不信你试试

注意一下,不同的软件有不同的用法。

我看了多少遍的教程,从来没有见过教程里有你这种用法。

如果用其他软件的用法来套在金字塔上,自然不可行了

就像你用vb的语法去写C++,而且还想运行正常,这样不是很可笑吗