引用数据和指标
(→注意事项) |
(→参数说明) |
||
(未显示1个用户的13个中间版本) | |||
第14行: | 第14行: | ||
服务于引用的函数有以下这些 | 服务于引用的函数有以下这些 | ||
− | + | refData、refIndi | |
OpenD、HighD、LowD、CloseD系列 | OpenD、HighD、LowD、CloseD系列 | ||
第24行: | 第24行: | ||
− | ''' | + | '''用途:''' |
+ | |||
refData,refIndi主要用于逐行模式的指标显示。 | refData,refIndi主要用于逐行模式的指标显示。 | ||
第31行: | 第32行: | ||
OpenD,HighD等主要是为了兼容easyLanguage,如果不是必须,建议使用refDataEx来代替。 | OpenD,HighD等主要是为了兼容easyLanguage,如果不是必须,建议使用refDataEx来代替。 | ||
− | |||
=策略中跨周期引用= | =策略中跨周期引用= | ||
第46行: | 第46行: | ||
refData和refIndi是直接用大周期历史数据计算而成。 | refData和refIndi是直接用大周期历史数据计算而成。 | ||
− | + | refDataEx和refIndiEx用到的数据,是由主图的小周期类型数据,在每一个小周期,不断插值拼接成大周期,再进行计算。由于Ex函数是用本周期数据合成被引用的数据,所以在大周期用Ex引用小周期是没有意义的;数据只能通过合并由多变少,不能变多。 | |
− | + | 这么做的目的是,测评的时候能得到当时精确的大周期值。当然,交易时,如果在小周期引用大周期进行交易,那么只要使用nextBar模式,也保证了历史信号是正确的。 | |
例如,1分钟引用日线,那么,每一个1分钟,都能得到当时那1分钟的日线的收盘,而不是那1分钟所在那一天的最后一分钟的日线收盘。 | 例如,1分钟引用日线,那么,每一个1分钟,都能得到当时那1分钟的日线的收盘,而不是那1分钟所在那一天的最后一分钟的日线收盘。 | ||
第62行: | 第62行: | ||
那么,首先取出沪深300的5分钟线,然后用这些5分钟线合成日线,然后用合成的日线计算5日均线。 | 那么,首先取出沪深300的5分钟线,然后用这些5分钟线合成日线,然后用合成的日线计算5日均线。 | ||
− | + | 注意: | |
− | + | 在实际使用中,上例中的refIndiEx( '399300', 'ma.m1', P_DAY,1);是个不好的例子,因为它引用了逐行的ma指标。 | |
− | + | 在逐根时,不要引用逐行指标。逐根引用逐行,带来一个dataCount*dataCount次的循环,会导致公式运行非常缓慢。 | |
− | + | ||
− | + | ||
有可能的话,自己写一个#run_by_bar的ma指标,然后引用它。 | 有可能的话,自己写一个#run_by_bar的ma指标,然后引用它。 | ||
+ | |||
+ | |||
+ | 例如这样:建一个指标myma | ||
+ | #Run_By_Bar | ||
+ | ma5:ma(c,5); | ||
+ | |||
+ | 然后引用公式是: | ||
+ | #Run_By_Bar | ||
+ | _refIndiEx : RefIndiEx( ' ', 'myma.ma5', P_Day, 1 ); | ||
+ | |||
+ | |||
+ | 让我们对比一下 | ||
+ | _refIndi :RefIndi( ' ', 'ma.m1', P_Day, 1 ); | ||
+ | |||
+ | [[文件:refVSrefEx.jpg]] | ||
+ | |||
+ | 白色横线是原引用函数refIndi的结果,它直接取了日线最后的结果填到每一根1分钟里。 | ||
+ | 黄色锯齿状线是新引用函数refIndiEx的结果,它的数值是日线在当时每1分钟下的ma5值。 | ||
==refDataEx和refIndiEx的局限== | ==refDataEx和refIndiEx的局限== | ||
第86行: | 第102行: | ||
=参数说明= | =参数说明= | ||
− | + | refData、refIndi包含以下参数 | |
− | '''Symbol''':品种代码,如'600001.SH'。也可以写'',代表当前品种。 | + | '''Symbol''':品种代码,如'600001.SH'。也可以写' ',代表当前品种。 |
'''DataType''':引用的数据类型,包括开、高、低、收、量、额、持仓 | '''DataType''':引用的数据类型,包括开、高、低、收、量、额、持仓 | ||
'''Period''':包括 default,分笔、1分钟5分钟等。 | '''Period''':包括 default,分笔、1分钟5分钟等。 | ||
− | '''Align''' | + | '''Align''':数据是否对齐 |
− | '''nCount''' | + | '''nCount''':每次返回的数据数量。 |
'''关于nCount''': | '''关于nCount''': | ||
nCount这个参数在不对齐模式下才有用。 | nCount这个参数在不对齐模式下才有用。 | ||
+ | 建议直接取1。 | ||
'''关于对齐''': | '''关于对齐''': | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
我们都知道,一份历史数据是有很多根的。对于股票,1天会产生1根日线和240根1分钟线。 | 我们都知道,一份历史数据是有很多根的。对于股票,1天会产生1根日线和240根1分钟线。 | ||
第120行: | 第129行: | ||
以上为了让时间落在同一范围内的动作就称之为对齐。 | 以上为了让时间落在同一范围内的动作就称之为对齐。 | ||
− | + | refDataEx和refIndiEx大部分参数与refData,refIndi相同,但没有对齐选项。这两个函数总是不对齐的。 | |
− | + | =refData不对齐的应用= | |
− | + | 有时我们想在同一图上的副图显示另一周期的K线和指标。这时我们其实想要的是看其他周期的图形、形态和信号,不需要时间对齐。 | |
+ | 以下公式在副图显示一份其他周期的K线。并且在上面画5分钟和10分钟均线 | ||
+ | Input: | ||
+ | periodType(15,0, 100000,1); | ||
+ | |||
+ | Switch( periodType )Begin | ||
+ | case 0:period:=P_Day; | ||
+ | case 1:period:=P_Min1; | ||
+ | case 5:period:=P_Min5; | ||
+ | Default:period:=P_Min1*periodType; | ||
+ | end | ||
+ | |||
+ | |||
+ | cc:=RefData('', D_Close, period, 0, 2000); | ||
+ | hh:=RefData('', D_High, period, 0, 2000); | ||
+ | ll:=RefData('', D_Low, period, 0, 2000); | ||
+ | oo:=RefData('', D_Open, period, 0, 2000); | ||
+ | KLine( oo, hh, ll, cc , 0); | ||
+ | |||
+ | ma5:ma( cc, 5); | ||
+ | ma10:ma(cc, 10); | ||
+ | =refIndiEx高级用法= | ||
+ | 有问到,引用时是否每引用一次都要计算一次,每次都计算是否浪费时间?能否一次返回多个不同的数据? | ||
− | + | 回答是: | |
+ | 1.确实每引用一次都要计算一次。不过对于逐根模式,计算一根的开销通常都比较小,可忽略不计。 | ||
− | + | 2.虽然多计算一次不耗费什么时间,但是要写多个refIndiEX确实也让人感到比较浪费,最好还是可以一次返回多个值。目前我们不支持“结构”这样的数据类型,但确实是可以一次返回多种数据的,因为在逐根模式下,即使是序列,实际上每次也只是计算一根,只不过后台把每次计算的数据累积起来而已。既然如此,在引用的时候,就可以把当次计算的多个变量组合到一个数组里返回。返回之后,再另外找变量累积就可以了。 | |
+ | |||
+ | 例如,想把macd的三个变量diff、dea、macd三个值一次性返回。那么只需要这样做。 | ||
+ | 首先新建一个指标myMacd,代码如下 | ||
+ | #Run_By_Bar | ||
+ | Input:p(26,20,100,1),s(12,5,40,1),m(9,2,60,1); | ||
+ | |||
+ | DIFF : EMA(CLOSE,S) - EMA(CLOSE,P); | ||
+ | DEA : EMA(DIFF,M); | ||
+ | MACD : 2*(DIFF-DEA), COLORSTICK; | ||
+ | cc:0; | ||
+ | cc[0]:=diff; | ||
+ | cc[1]:=dea; | ||
+ | cc[2]:=macd; | ||
+ | 上面的代码,把diff,dea和macd三个值组合到一个变量cc里,那么引用的时候,让cc每次返回3个值,就刚好是最近一次计算的diff,dea和macd了。 | ||
+ | |||
+ | 引用代码如下: | ||
+ | #Run_By_Bar | ||
+ | cc := RefIndiEx( ' ', 'myMACD.cc', P_Day, 3 ); | ||
+ | 大周期diff:cc[0]; | ||
+ | 大周期dea:cc[1]; | ||
+ | 大周期macd:cc[2]; | ||
+ | 这个写法,跟 | ||
+ | #RUN_BY_BAR | ||
+ | 大周期diff:RefIndiEx( ' ', 'myMACD.diff', P_Day, 1 ); | ||
+ | 大周期dea:RefIndiEx( ' ', 'myMACD.dea', P_Day, 1 ); | ||
+ | 大周期macd:RefIndiEx( ' ', 'myMACD.macd', P_Day, 1 | ||
+ | 是等价的 | ||
=easyLanguage兼容引用函数= | =easyLanguage兼容引用函数= | ||
OpenX,CloseX,HighX,LowX,VolX,AmountX系列函数 | OpenX,CloseX,HighX,LowX,VolX,AmountX系列函数 | ||
+ | |||
这个系列的函数只能用在逐根模式。 | 这个系列的函数只能用在逐根模式。 | ||
+ | |||
跟RefDataEx不同,它们并非使用本周期数据合成日线,而是直接取现成日线,所以有可能的话最好用RefDataEx来代替。 | 跟RefDataEx不同,它们并非使用本周期数据合成日线,而是直接取现成日线,所以有可能的话最好用RefDataEx来代替。 |
2013年10月26日 (六) 22:54的最后版本
目录 |
[编辑] 引用的概念
引用的概念有广义和狭义的分别。
广义的引用泛指一切访问数据的方式,既包括对其他品种和周期的访问吗,也包括对本图表上,本品种、本周期的数据的访问。例如ref,hhv,data2,data10甚至ma函数都可以归入广义的引用函数。
而狭义的“引用”,是指调用非本图上的,其他品种的,其他周期的数据。这里主要讨论狭义的引用。下面提到引用时只要不特别说明,都是指狭义引用。
引用分为两大类,第一类是引用原始K线数据,第二类是引用指标数据。
其实引用指标也可以理解为引用数据的一种。引用指标可以理解为对引用数据直接加工再返回的方式。
[编辑] 引用函数
服务于引用的函数有以下这些
refData、refIndi
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来代替。
[编辑] 策略中跨周期引用
[编辑] refDataEx和refIndiEx
在策略中引用数据或指标需要用到refDataEx和refIndiEx函数
同样的,这两个函数也是只能用在逐根模式。
refDataEx与refData的区别:
在引用到大周期数据时,
refData和refIndi是直接用大周期历史数据计算而成。
refDataEx和refIndiEx用到的数据,是由主图的小周期类型数据,在每一个小周期,不断插值拼接成大周期,再进行计算。由于Ex函数是用本周期数据合成被引用的数据,所以在大周期用Ex引用小周期是没有意义的;数据只能通过合并由多变少,不能变多。
这么做的目的是,测评的时候能得到当时精确的大周期值。当然,交易时,如果在小周期引用大周期进行交易,那么只要使用nextBar模式,也保证了历史信号是正确的。
例如,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指标。
在逐根时,不要引用逐行指标。逐根引用逐行,带来一个dataCount*dataCount次的循环,会导致公式运行非常缓慢。
有可能的话,自己写一个#run_by_bar的ma指标,然后引用它。
例如这样:建一个指标myma
#Run_By_Bar ma5:ma(c,5);
然后引用公式是:
#Run_By_Bar _refIndiEx : RefIndiEx( ' ', 'myma.ma5', P_Day, 1 );
让我们对比一下
_refIndi :RefIndi( ' ', 'ma.m1', P_Day, 1 );
白色横线是原引用函数refIndi的结果,它直接取了日线最后的结果填到每一根1分钟里。 黄色锯齿状线是新引用函数refIndiEx的结果,它的数值是日线在当时每1分钟下的ma5值。
[编辑] refDataEx和refIndiEx的局限
由于数据是由小周期数据(典型应用里都是分钟数据)组合而成,那么有可能所有分钟得到的最高最低值,不一定能和日线的最高最低值匹配。原因是日线的最高最低是由交易所提供,而分钟线的最高最低,是从分笔得来,而分笔是一个均值,不一定能达到真正的最高最低。
对于nextBar交易,小周期拼接可以大大提升策略的进入时机的精确性;
而对于运行在thisBar模式下的交易,小周期拼接的精确性,依然无法达到分笔插值的程度。
[编辑] refIndiEx实例
rr:RefIndiEx('000001.SZ', 'RSI.RSI1', P_Day, 2, 20); //计算深发展的参数为20的日线的RSI rr1:rr[1];//深发展昨天收盘时的RSI值 rr0:rr[0];//深发展这一刻的日线RSI值
[编辑] 参数说明
refData、refIndi包含以下参数
Symbol:品种代码,如'600001.SH'。也可以写' ',代表当前品种。 DataType:引用的数据类型,包括开、高、低、收、量、额、持仓 Period:包括 default,分笔、1分钟5分钟等。 Align:数据是否对齐 nCount:每次返回的数据数量。
关于nCount:
nCount这个参数在不对齐模式下才有用。 建议直接取1。
关于对齐:
我们都知道,一份历史数据是有很多根的。对于股票,1天会产生1根日线和240根1分钟线。
我们处理数据时通常是以下标的形式对这些数据顺序逐个处理的。
这就产生一个问题,同样是下标1,在1分钟线是指向今天的时间,而日线就可能指向昨天。
为了让相同的下标下,1分钟和日线都同样指向今天,就需要对今天日线进行复制,并填充到下标1,以便让下标1依然是今天的日线。
例如,当1分钟与日线相对,那么就要填充239根相同的日线。
以上为了让时间落在同一范围内的动作就称之为对齐。
refDataEx和refIndiEx大部分参数与refData,refIndi相同,但没有对齐选项。这两个函数总是不对齐的。
[编辑] refData不对齐的应用
有时我们想在同一图上的副图显示另一周期的K线和指标。这时我们其实想要的是看其他周期的图形、形态和信号,不需要时间对齐。 以下公式在副图显示一份其他周期的K线。并且在上面画5分钟和10分钟均线
Input: periodType(15,0, 100000,1); Switch( periodType )Begin case 0:period:=P_Day; case 1:period:=P_Min1; case 5:period:=P_Min5; Default:period:=P_Min1*periodType; end cc:=RefData(, D_Close, period, 0, 2000); hh:=RefData(, D_High, period, 0, 2000); ll:=RefData(, D_Low, period, 0, 2000); oo:=RefData(, D_Open, period, 0, 2000); KLine( oo, hh, ll, cc , 0); ma5:ma( cc, 5); ma10:ma(cc, 10);
[编辑] refIndiEx高级用法
有问到,引用时是否每引用一次都要计算一次,每次都计算是否浪费时间?能否一次返回多个不同的数据?
回答是:
1.确实每引用一次都要计算一次。不过对于逐根模式,计算一根的开销通常都比较小,可忽略不计。
2.虽然多计算一次不耗费什么时间,但是要写多个refIndiEX确实也让人感到比较浪费,最好还是可以一次返回多个值。目前我们不支持“结构”这样的数据类型,但确实是可以一次返回多种数据的,因为在逐根模式下,即使是序列,实际上每次也只是计算一根,只不过后台把每次计算的数据累积起来而已。既然如此,在引用的时候,就可以把当次计算的多个变量组合到一个数组里返回。返回之后,再另外找变量累积就可以了。
例如,想把macd的三个变量diff、dea、macd三个值一次性返回。那么只需要这样做。 首先新建一个指标myMacd,代码如下
#Run_By_Bar Input:p(26,20,100,1),s(12,5,40,1),m(9,2,60,1); DIFF : EMA(CLOSE,S) - EMA(CLOSE,P); DEA : EMA(DIFF,M); MACD : 2*(DIFF-DEA), COLORSTICK; cc:0; cc[0]:=diff; cc[1]:=dea; cc[2]:=macd;
上面的代码,把diff,dea和macd三个值组合到一个变量cc里,那么引用的时候,让cc每次返回3个值,就刚好是最近一次计算的diff,dea和macd了。
引用代码如下:
#Run_By_Bar cc := RefIndiEx( ' ', 'myMACD.cc', P_Day, 3 ); 大周期diff:cc[0]; 大周期dea:cc[1]; 大周期macd:cc[2];
这个写法,跟
#RUN_BY_BAR 大周期diff:RefIndiEx( ' ', 'myMACD.diff', P_Day, 1 ); 大周期dea:RefIndiEx( ' ', 'myMACD.dea', P_Day, 1 ); 大周期macd:RefIndiEx( ' ', 'myMACD.macd', P_Day, 1
是等价的
[编辑] easyLanguage兼容引用函数
OpenX,CloseX,HighX,LowX,VolX,AmountX系列函数
这个系列的函数只能用在逐根模式。
跟RefDataEx不同,它们并非使用本周期数据合成日线,而是直接取现成日线,所以有可能的话最好用RefDataEx来代替。