龙听期货论坛's Archiver

龙听 发表于 2018-12-3 10:54

开拓者求N天前的收盘价closD(N)原理,源码[开拓者公式]

[code]
//------------------------------------------------------------------------
// 简称: CloseD
// 名称: 求N天前的收盘价
// 类别: 用户函数
// 类型: 内建函数
// 输出: 数值型
//------------------------------------------------------------------------

Params
        Numeric daysAgo(2);
Vars
        NumericSeries barCnt;
        NumericSeries dayClose;
        Numeric i;
        Numeric j;
        Numeric nIndex(0);
        Numeric CBIndex;
Begin
        CBIndex = CurrentBar;
        If(CBIndex == 0 || Date != Date[1])
        {
                barCnt = 1;
        }Else
        {
                barCnt = barCnt + 1;
        }
        dayClose = Close;
               
        If(daysAgo == 0)
        {
                return dayClose;
        }Else
        {
                For i = 1 To daysAgo
                {
                        If( i == 1)
                        {      
                                j = 0;
                        }Else
                        {
                                j = j + BarCnt[j];                              
                        }
                        If (j > CBIndex )
                                Return InvalidNumeric;
                        nIndex = nIndex + BarCnt[j];
                }
                Return dayClose[nIndex];
        }
End

//------------------------------------------------------------------------
// 编译版本        GS2010.12.08
// 版权所有        TradeBlazer Software 2003-2010
// 更改声明        TradeBlazer Software保留对TradeBlazer平
//                        台每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
[/code]

[list][*][b]TB技术人员:[/b]
BarCnt记录的是从当天第一根K线到当前K线的K线数
所以回溯BarCnt就可得到前一天最后一K的收盘价,也就是CloseD(1)
当回溯天数大于1,比如2:[list=1][*]For i = 1 To daysAgo
[*]                {
[*]                        If( i == 1)
[*]                        {
[*]                                j = 0;
[*]                        }Else
[*]                        {
[*]                                j = j + BarCnt[j];
[*]                        }
[*]                        If (j > CBIndex )
[*]                                Return InvalidNumeric;
[*]                        nIndex = nIndex + BarCnt[j];[/list]复制代码i = 1时,j=0,nIndex = 0 + BarCnt[0] = BarCnt(cxh99.com),也就是回溯到前一天的最后一K;
i = 2,j = 0 + BarCnt[0] = BarCnt
nIndex = BarCnt+BarCnt[BarCnt]
也就是回溯到前一天的前一天的最后一K;

OK,以此类推。

[*][b]TB客服:[/b] 谢谢楼上,有一点懂了;
但是还有一点不明白,barCnt是NumericSeries,也就是序列,但是barCnt的每个元素并没有初始赋值呀,真是奇怪了。
比如:nIndex = BarCnt+BarCnt[BarCnt];
BarCnt[BarCnt]没有初始赋值,就使用,不会出错吗?
[*][b]网友回复:[/b] 比如以下代码:
Begin
        CBIndex = CurrentBar;
        If(CBIndex == 0 || Date != Date[1])
        {
                barCnt = 1;
        }Else
        {
                barCnt = barCnt + 1;
        }//www.cxh99.com

如果第一次执行Else里面的代码,barCnt = barCnt + 1;而barCnt没有初始值,不会出错吗?
[*][b]网友回复:[/b] 程序是从图上第一根K线开始执行的

此时CBIndex == 0成立,barCnt = 1,没有问题[/list]

页: [1]