欢迎您光临博庭社区!

 找回密码
 立即注册
查看: 9060|回复: 29

关于引用指标,引用数据的用法   [复制链接]

Rank: 8Rank: 8

发表于 2012-11-20 11:19:03 |显示全部楼层
本帖最后由 ptLibert 于 2013-10-27 08:28 编辑

【引用的概念】
引用的概念有广义和狭义的分别。
广义的引用泛指一切访问数据的方式,既包括对其他品种和周期的访问吗,也可以指对本chart上,本品种、本周期的数据的访问。例如ref,hhv,data2,data10甚至ma函数都可以归入广义的引用函数。

而狭义的“引用”,是指调用非本图上的,其他股票的,其他周期的数据。本帖主要讨论狭义的引用。下面提到引用时只要不特别说明,都是指狭义引用。

引用分为两大类,第一类是引用原始K线数据,第二类是引用指标数据
其实引用指标也可以理解为引用数据的一种。引用指标可以理解为对引用数据直接加工再返回的方式。

【引用函数】
服务于引用的函数有以下这些
refData
refIndi
refDLL
OpenD、HighD、LowD、CloseD系列
RefDataEx
RefIndiEx

除此之外,还有为了兼容而支持的stkindi、"xxx.yyy#min5"、“close##day”等引用方式,其实都是用refData和refIndi实现的。尽管部分功能相同,但博庭鼓励大家使用参数意义更明确、功能更强的refData、refIndi、refDataEx、refIndiEx等函数。

【用途】
refData,refIndi主要用于逐行模式的指标显示。
refDataEx,refIndiEx主要用于逐根模式的交易策略。
OpenD,HighD等主要是为了兼容easyLanguage,如果不是必须,建议使用refDataEx来代替。

【参数】
refData包括五个参数。
   Symbol品种代码,如'600001.SH'。也可以写'',代表当前品种。
   DataType引用的数据类型,包括开、高、低、收、量、额、持仓
   Period,包括 default,分笔、1分钟5分钟等。
   Align, 对齐模式。1代表对齐,0代表不对齐。
   nCount,数据量。

【对齐】
我们都知道,一份历史数据是有很多根的。对于股票,1天会产生1根日线和240根1分钟线。
我们处理数据时通常是以下标的形式对这些数据顺序逐个处理的。
这就产生一个问题,同样是下标1,在1分钟线是指向今天的时间,而日线就可能指向昨天。
为了让相同的下标下,1分钟和日线都同样指向今天,就需要对今天日线进行复制,并填充到下标1,以便让下标1依然是今天的日线。
例如,当1分钟与日线相对,那么就要填充239根相同的日线。

以上为了让时间落在同一范围内的动作就称之为对齐。

  • refIndiEx中的对齐
在refIndiEx中,不是采用一次把大周期数据计算好,然后对齐取数的方式,而是不断去生成大周期数据,然后取最新值。refDataEx和refindiEx总是不对齐的。既然如此,用户自己就可以决定是否对齐----如果每次返回大周期数量为1,则每根K线上的大周期数据时间都是能对上的(完全对齐)。如果每次返回2根以上大周期数据,那就是不对齐的。

【refData不对齐的用法】
以下公式,在任意周期一次返回其他周期2000根的数据,用于画其他周期的K线和均线
  1. Input:
  2.   periodType(15,0, 100000,1);

  3. Switch( periodType )Begin
  4.    case 0:period:=P_Day;
  5.    case 1:period:=P_Min1;
  6.    case 5:period:=P_Min5;
  7.    Default:period:=P_Min1*periodType;
  8. end  


  9. cc:=RefData('', D_Close, period, 0, 2000);
  10. hh:=RefData('', D_High, period, 0, 2000);
  11. ll:=RefData('', D_Low, period, 0, 2000);
  12. oo:=RefData('', D_Open, period, 0, 2000);
  13. KLine( oo, hh, ll, cc , 0);

  14. ma5:ma( cc, 5);
复制代码



【OpenX,CloseX,HighX,LowX,VolX,AmountX系列函数】
这个系列的函数只能用在逐根模式
跟普通的引用不同,它们并非直接引用大周期数据,而是用1分钟数据产生的。

【refDataEx和refIndiEx】
同样的,这两个函数也是只能用在逐根模式。
  • 与refData的区别:
     在引用到大周期数据时,
     refData和refIndi是直接用大周期历史数据计算而成。
     refDataEx和refIndiEx用到的数据,是由主图的小周期类型数据拼接成大周期,再进行计算。
     因为不存在所谓的填充问题,所以refDataEx,refIndiEx都是不对齐的。

这么做的目的是,测评的时候能得到当时精确的大周期值。
例如,1分钟引用日线,那么,每一个1分钟,都能得到当时那1分钟的日线的收盘,而不是那1分钟所在那一天的最后一分钟的日线收盘。这样就杜绝了未来数据,让历史信号精确匹配。

例如,主图是5分钟K线,引用“沪深300”日线的5日均线。
refIndiEx( '399300', 'ma.m1', P_DAY,1);
那么,首先取出沪深300的5分钟线,然后用这些5分钟线合成日线,然后用合成的日线计算5日均线。

【注意事项】在逐根时,不要引用逐行指标。
上例中的refIndiEx( '399300', 'ma.m1', P_DAY,1);是个不好的例子,因为它引用了逐行的ma指标。
有可能的话,自己写一个#run_by_bar的ma指标,然后引用它。

【refDataEx和refIndiEx的局限】
由于数据是由小周期数据(典型应用里都是分钟数据)组合而成,那么有可能所有分钟得到的最高最低值,不一定能和日线的最高最低值匹配。原因是日线的最高最低是由交易所提供,而分钟线的最高最低,是从分笔得来,而分笔是一个均值,不一定能达到真正的最高最低。

【refIndiEx实例】
  1. rr:RefIndiEx('000001.SZ', 'RSI.RSI1', P_Day, 2, 20); //计算深发展的参数为20的日线的RSI
  2. rr1:rr[1];//深发展昨天收盘时的RSI值
  3. rr0:rr[0];//深发展这一刻的日线RSI值
复制代码
refIndiEX的高级玩法
有问到,引用时是否每引用一次都要计算一次,每次都计算是否浪费时间?能否一次返回多个不同的数据?

回答是:

1.确实每引用一次都要计算一次。不过对于逐根模式,计算一根的开销通常都比较小,可忽略不计。

2.虽然多计算一次不耗费什么时间,但是要写多个refIndiEX确实也是让人感到比较浪费,最好还是可以一次返回多个值。目前我们不支持“结构”这样的数据类型,但确实是可以一次返回多种数据的,因为在逐根模式下,即使是序列,实际上每次也只是计算一根,只不过后台把每次计算的数据累积起来而已。既然如此,在引用的时候,就可以把当次计算的多个变量组合到一个数组里返回。返回之后,再另外找变量累积就可以了。

例如,想把macd的三个变量diff、dea、macd三个值一次性返回。那么只需要这样做。
首先新建一个指标myMacd,代码如下
  1. #Run_By_Bar
  2. Input:p(26,20,100,1),s(12,5,40,1),m(9,2,60,1);
  3. ma5:ma(c,5);
  4. DIFF : EMA(CLOSE,S) - EMA(CLOSE,P);
  5. DEA  : EMA(DIFF,M);
  6. MACD : 2*(DIFF-DEA), COLORSTICK;
  7. cc:0;
  8. cc[0]:=diff;
  9. cc[1]:=dea;
  10. cc[2]:=macd;
复制代码
上面的代码,把diff,dea和macd三个值组合到一个变量cc里,那么引用的时候,让cc每次返回3个值,就刚好是最近一次计算的diff,dea和macd了。

引用代码如下:
  1. #Run_By_Bar
  2. cc := RefIndiEx( '', 'myMACD.cc', P_Day, 3 );
  3. 大周期diff:cc[0];
  4. 大周期dea:cc[1];
  5. 大周期macd:cc[2];
复制代码
这个写法,跟
  1. #RUN_BY_BAR
  2. 大周期diff:RefIndiEx( '', 'myMACD.diff', P_Day, 1 );
  3. 大周期dea:RefIndiEx( '', 'myMACD.dea', P_Day, 1 );
  4. 大周期macd:RefIndiEx( '', 'myMACD.macd', P_Day, 1
复制代码
是等价的





使用道具 举报

Rank: 3Rank: 3

发表于 2013-4-11 18:28:53 |显示全部楼层
何时有续集?同时请问分笔时如何正确引用前日最高价,上月收盘价,得到的是当日的某个价,为什么

使用道具 举报

Rank: 8Rank: 8

发表于 2013-4-11 19:31:05 |显示全部楼层
本帖最后由 ptLibert 于 2013-4-11 19:48 编辑
cathwill 发表于 2013-4-11 18:28
何时有续集?同时请问分笔时如何正确引用前日最高价,上月收盘价,得到的是当日的某个价,为什么 ...

refdata的实现目前还不是很满意,另外refindi还不支持逐根,所以暂停了。
另外,你问的关于引用的问题是是逐根还是逐行模式下的?
如果是逐根,比较好办,用highD(2);

如果是逐行,比较麻烦,要先建一个指标,输出ref(high,2),
然后refindi()调用这个指标

使用道具 举报

Rank: 3Rank: 3

发表于 2013-4-12 10:52:12 |显示全部楼层
SORRY,两个都没有实现(分笔前提下):highD(2)输出为0;ref(high,2)日内不是前天的价格,求解,多谢


使用道具 举报

Rank: 6Rank: 6

发表于 2013-6-28 02:34:15 |显示全部楼层
这个后续不知什么时间能放出来啊

点评

ptLibert  再过几周  发表于 2013-6-28 11:33

使用道具 举报

Rank: 4

发表于 2013-7-6 11:06:18 |显示全部楼层
认真学习一下,引用的作用很大的

使用道具 举报

Rank: 8Rank: 8

发表于 2013-9-27 12:13:27 |显示全部楼层
续集已更新在一楼

使用道具 举报

Rank: 2

发表于 2013-9-29 11:18:58 |显示全部楼层
refData,Period 取分笔,如何取分笔的最新,买1,卖1?
DataType引用的数据类型,仅包括开、高、低、收、量、额、持仓。

使用道具 举报

Rank: 8Rank: 8

发表于 2013-9-29 11:32:06 |显示全部楼层
victorzhou 发表于 2013-9-29 11:18
refData,Period 取分笔,如何取分笔的最新,买1,卖1?
DataType引用的数据类型,仅包括开、高、低、收、 ...

不支持大周期引用小周期。分笔是最小的周期。

如果不是跑在分笔周期下,只能取到最新的买1,卖1,取不到历史的买1,卖1.
最新的买1是:dynainfo(Q_BIDPX1 ),最新的卖一价是dynaoinfo(Q_ASKPX1)。

如果跑在分笔周期下,可以取到历史的买1,卖1价,函数是:
askprice(1), bidprice(1);

使用道具 举报

Rank: 2

发表于 2013-10-17 22:17:30 |显示全部楼层
谢谢。 顺便问一下, “总手”怎么获取?

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

bottom

Archiver|http://www.patiosoft.com

GMT+8, 2017-12-17 09:00 , Processed in 0.045625 second(s), 12 queries .

花生网 Copyrigh©2012

和讯信息科技有限公司 ALL Rights Reserved 版权所有 复制必究

回顶部