执行模式
第1行: | 第1行: | ||
− | + | =逐根和逐行= | |
+ | |||
+ | 星语言中,公式有两种执行模式,一种叫逐行模式,一种叫逐根模式。关于这两种模式的运行机制,请点击链接: | ||
[[逐行和逐根]] | [[逐行和逐根]] | ||
第6行: | 第8行: | ||
#Run_By_Series | #Run_By_Series | ||
− | 其中,# | + | 其中,#Run_By_Bar表示使用逐根模式,#Run_By_Series表示使用逐行模式。 |
+ | |||
这两个开关也可以不写,在不同的指标类型中,分别有不同的默认值。 | 这两个开关也可以不写,在不同的指标类型中,分别有不同的默认值。 | ||
+ | |||
在“技术指标”、“条件选股”、“交易系统”、“五彩K线”这四种指标中,默认是逐行模式。 | 在“技术指标”、“条件选股”、“交易系统”、“五彩K线”这四种指标中,默认是逐行模式。 | ||
+ | |||
在“智能策略”、“公共函数”、“优化评价”这三种指标中,默认是逐根模式(而且只能是逐根,指定逐行开关无效)。 | 在“智能策略”、“公共函数”、“优化评价”这三种指标中,默认是逐根模式(而且只能是逐根,指定逐行开关无效)。 | ||
+ | |||
+ | =计算频率开关= | ||
+ | |||
+ | 对于逐根模式,我们知道,每次都是只计算一根。 | ||
+ | |||
+ | 现在问题来了,K线的最后一根,并非是一次成型的,是在一段时间内不断变化的。 | ||
+ | |||
+ | 那么,是在每次变化时,都计算,还是最后成型时才计算呢?为此,准备了开关来控制这个行为。 | ||
#Run_Every_Tick | #Run_Every_Tick | ||
#Run_Every_Bar | #Run_Every_Bar | ||
− | + | #Run_Every_Tick 表示,最后一根K线每次变化的时候,都重新计算。而#Run_Every_Bar,则在下一根K线产生的一瞬间,才计算当前的K线。 | |
+ | |||
+ | =事件触发= | ||
+ | |||
+ | 在公式中,可以编写一小段代码,这段代码是在某些事件发生的时候才执行。 | ||
+ | |||
+ | 这类事件包括'''初始化'''和'''执行完毕''' | ||
+ | |||
+ | ===初始化=== | ||
+ | 只要编写一个内置函数,并且命名为OnInit,那么它就会在初始化时执行。 | ||
+ | |||
+ | fucntion OnInit | ||
+ | Begin | ||
+ | //做一些只需要做一次,没有必要每次行情来时都做的工作。例如,设置画线的颜色,设置账号。等等。 | ||
+ | End | ||
+ | |||
+ | |||
+ | 那么,OnInit究竟具体在什么时候会发生呢。 | ||
+ | 包括并不限于以下情况,例如: | ||
+ | 1.切换成其他品种; | ||
+ | |||
+ | 2.切换成其他周期; | ||
+ | |||
+ | 3.服务器推送来一些旧的历史数据(某种情况下,可能客户端会先请求最新一段数据,再请求旧的数据) | ||
+ | |||
+ | 初始化事件会让OnInit清除所有状态重新运行计算1次,后续行情到来不再计算。 | ||
+ | |||
+ | ===执行完毕=== | ||
+ | 只要编写一个内置函数,并且命名为OnExit,那么它就会在公式执行到末尾时执行。 | ||
+ | |||
+ | function OnExit | ||
+ | Begin | ||
+ | //做一些收尾工作 | ||
+ | End | ||
+ | |||
+ | 为什么需要OnExit呢,是因为目前公式引擎支持“中断”。所谓中断,就是如果某些公式计算一次时间特别长,有时公式运行到一半,还没计算完,用户切换到其他品种了,那之前的计算就没有必要继续下去,这时候,系统就会强行中断计算。 | ||
+ | |||
+ | 但是,用户可能希望某些计算是必须要执行的,例如,这个公式可能是调用DLL的,DLL可能在开始分配了一些资源,而且必须在运算完毕后释放,这部分计算就可以写在OnExit中,正常情况下它们会在公式主体运行结束之后被执行。如果公式主体被中断,它们会在中断后执行。 | ||
+ | |||
+ | ===公式主体=== | ||
+ | 公式的主体是名为OnStart的函数,象这样: | ||
+ | |||
+ | Function OnStart | ||
+ | Begin | ||
+ | mm:ma(c, close ); | ||
+ | End | ||
− | + | 但是,为了方便编写,上述的“Function OnStart”可以省略。 | |
+ | 也就是可以只写 | ||
+ | mm: ma( c, Close ); | ||
− | + | 凡是没有包在其它函数体里面的代码都被认为是 OnStart 函数的内容。除非显式声明了 OnStart 函数。如果既声明了OnStart函数,又写了一段没有被任何函数包裹的代码,那么没有被包裹的代码被直接忽略,认为是空白。 | |
若品种,周期发生变化时,公式将会触发重算, DLL需要自己判断变换发生。可以把BarPos传给DLL, 如果BarPos变成1了,那就是发生重算了; | 若品种,周期发生变化时,公式将会触发重算, DLL需要自己判断变换发生。可以把BarPos传给DLL, 如果BarPos变成1了,那就是发生重算了; |
2013年5月21日 (二) 15:04的版本
目录 |
逐根和逐行
星语言中,公式有两种执行模式,一种叫逐行模式,一种叫逐根模式。关于这两种模式的运行机制,请点击链接: 逐行和逐根
那么,语言里,是怎样选择运行模式的呢?是通过编译开关来控制的:
#Run_By_Bar #Run_By_Series
其中,#Run_By_Bar表示使用逐根模式,#Run_By_Series表示使用逐行模式。
这两个开关也可以不写,在不同的指标类型中,分别有不同的默认值。
在“技术指标”、“条件选股”、“交易系统”、“五彩K线”这四种指标中,默认是逐行模式。
在“智能策略”、“公共函数”、“优化评价”这三种指标中,默认是逐根模式(而且只能是逐根,指定逐行开关无效)。
计算频率开关
对于逐根模式,我们知道,每次都是只计算一根。
现在问题来了,K线的最后一根,并非是一次成型的,是在一段时间内不断变化的。
那么,是在每次变化时,都计算,还是最后成型时才计算呢?为此,准备了开关来控制这个行为。
#Run_Every_Tick #Run_Every_Bar
- Run_Every_Tick 表示,最后一根K线每次变化的时候,都重新计算。而#Run_Every_Bar,则在下一根K线产生的一瞬间,才计算当前的K线。
事件触发
在公式中,可以编写一小段代码,这段代码是在某些事件发生的时候才执行。
这类事件包括初始化和执行完毕
初始化
只要编写一个内置函数,并且命名为OnInit,那么它就会在初始化时执行。
fucntion OnInit Begin //做一些只需要做一次,没有必要每次行情来时都做的工作。例如,设置画线的颜色,设置账号。等等。 End
那么,OnInit究竟具体在什么时候会发生呢。
包括并不限于以下情况,例如:
1.切换成其他品种;
2.切换成其他周期;
3.服务器推送来一些旧的历史数据(某种情况下,可能客户端会先请求最新一段数据,再请求旧的数据)
初始化事件会让OnInit清除所有状态重新运行计算1次,后续行情到来不再计算。
执行完毕
只要编写一个内置函数,并且命名为OnExit,那么它就会在公式执行到末尾时执行。
function OnExit Begin //做一些收尾工作 End
为什么需要OnExit呢,是因为目前公式引擎支持“中断”。所谓中断,就是如果某些公式计算一次时间特别长,有时公式运行到一半,还没计算完,用户切换到其他品种了,那之前的计算就没有必要继续下去,这时候,系统就会强行中断计算。
但是,用户可能希望某些计算是必须要执行的,例如,这个公式可能是调用DLL的,DLL可能在开始分配了一些资源,而且必须在运算完毕后释放,这部分计算就可以写在OnExit中,正常情况下它们会在公式主体运行结束之后被执行。如果公式主体被中断,它们会在中断后执行。
公式主体
公式的主体是名为OnStart的函数,象这样:
Function OnStart Begin mm:ma(c, close ); End
但是,为了方便编写,上述的“Function OnStart”可以省略。 也就是可以只写
mm: ma( c, Close );
凡是没有包在其它函数体里面的代码都被认为是 OnStart 函数的内容。除非显式声明了 OnStart 函数。如果既声明了OnStart函数,又写了一段没有被任何函数包裹的代码,那么没有被包裹的代码被直接忽略,认为是空白。
若品种,周期发生变化时,公式将会触发重算, DLL需要自己判断变换发生。可以把BarPos传给DLL, 如果BarPos变成1了,那就是发生重算了;