以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://weistock.com/bbs/index.asp) -- 金字塔软件问题提交 (http://weistock.com/bbs/list.asp?boardid=2) ---- [讨论]逐k模式下,有些统计函数不能用在if 后面 (http://weistock.com/bbs/dispbbs.asp?boardid=2&id=91342) |
-- 作者:sadrick -- 发布时间:2016/2/20 20:00:41 -- [讨论]逐k模式下,有些统计函数不能用在if 后面 逐k模式下,有些统计函数或者要用到回溯函数,比如ref ma ema这些不能用在if 内, 为什么要做这样的限制 比如 if c>o then BEGIN value1:=ref(c,1); value2:=ma(c,2); end; 逐k下 满足条件就执行 不满足条件就返回上一个值 ,逻辑很正常呀,可为什么软件要做这样的限制
|
-- 作者:王锋 -- 发布时间:2016/2/21 13:53:53 -- 限制的目的是让你的PEL代码更健壮的工作,如果不限制很容易在控制语句中出现统计函数的计算错误 |
-- 作者:sadrick -- 发布时间:2016/2/21 17:37:56 -- 疑惑 if c>o then BEGIN value1:=ref(c,1); value2:=ma(c,2); end; 如果上面的例子变成 if c>o then BEGIN value1:=ref(c,100); value2:=ma(c,200); end; 不做限制的话是担心满足条件的时候图里少于200根bar ,算不了,产生错误吗 但变成规范的 ,一样面临这样的问题呀 value3=ref(c,100); value4=ma(c,200); if c>o then BEGIN value1:=value3; value2:=value4; end; 不知道这个健壮如何理解 |
-- 作者:马良 -- 发布时间:2016/2/21 18:10:44 -- 简单理解就是你必须要保证MA函数每根bar都能执行得到,不能被控制语句跳开去执行。 |
-- 作者:sadrick -- 发布时间:2016/2/22 10:52:33 -- 疑惑 那就证明金字塔的ma 函数 比如ma(c,10) 是采用加最新的值再减去最最早的值的算法 那如果我自己编一个函数最原始的算法就是向前循环累加再求平均 那么,就可以了( 只要采取仅刷最后一根k的模式 ,实时效率不会差太远) |
-- 作者:sadrick -- 发布时间:2016/2/22 11:02:53 -- 疑惑 可是ref完全没有这样的必要呀,反正都是要往前回溯 |
-- 作者:sadrick -- 发布时间:2016/2/22 11:52:33 -- 疑惑 其实用excel vba 来分别算两种算法,如果是只计算一根bar 的平均值 ,两种算法的时间基本没差别,对应软件里仅刷最后一根bar 的模式 Sub average() tr = ActiveSheet.UsedRange.Rows.Count For x = 1 To 501 If x >= 500 Then a = 0 For y = x To (x - 499) Step -1 a = a + Cells(y, 3) Next Cells(x, 5) = a / 500 End If Next End Sub Sub averagefc() tr = ActiveSheet.UsedRange.Rows.Count For x = 1 To 501 If x = 500 Then For y = x To (x - 499) Step -1 a = a + Cells(y, 3) Next Cells(x, 6) = a / 500 ElseIf x > 500 Then a = a + Cells(x, 3) - Cells(x - 500, 3) Cells(x, 6) = a / 500 End If Next End Sub 所以我的建议是与其将那些带有回溯的函数都列出来,说不能放在控制语句之下 还不如在编译公式时将这些这些函数的计算值在底层拿数组存起来 这样客户在使用的时候就没有那么多顾虑,这是参考其他两款软件的做法
|
-- 作者:王锋 -- 发布时间:2016/2/22 12:11:25 -- Ref 这种用法实际上你可以通过数组来实现,效率还高比如: REF(CLOSE,1) = CLSOE[BARPOS-1] |