程序附加到图表之后,它立即开始与init()函数协同运行。在客户端开始运行和历史数据(仅与智能交易有关,而与指标无关)被另外加载之后、当货币对和图表时段改变了、在MetaEditor里重新编译之后、或者从智能交易或自定义指标的设置窗口改变了输入参数,附加到图表上的智能交易和自定义指标中的init()函数将会运行。当计算结果发生变化时,智能交易同样也会被初始化。
每一个附加到图表上的程序可以借助deinit()函数完成善后工作。当客户端关机、图表被关闭、在货币对或图表时段改变之前、程序重编译成功、改变了输入参数或计算结果改变了,deinit()函数都会运行。在deinit()函数执行期间,用户可以使用UninitializeReason()函数查看未初始化成功的原因。
deinit()函数必须在2.5秒内执行完毕,如果函数在这段时问内没有完成它的工作,它将会被强制结束。脚本是这一条规则的例外,由于它们能正常地自主完成它们的工作,它的运行不取决于任何外界的命令。如果一个脚本工作时间过长(例如,永无止境的死循环),用户可以应用外部命令结束它的运行(从图表的上下文菜单中删除脚本、在原有的图表上添加新的脚本、改变图表的货币对或时段)。 在这种情况下,deinit()函数同样被限制在2.5秒内。
在收到新报价时,智能交易和自定义指标中start()函数将会被执行。当新报价进入时,如果start()函数还在忙着处理前面的报价,智能交易会忽略新报价而不予处理。在start()函数运行期间,所有新收的报价都会被一跳而过,直到当前start()函数运行完成为止。从那之后,仅在收到源源不断的新报价时,start()函数才一会运行。对于自定义的指标,由于收到了新报价,当前图表货币对或时段发生了变化,start()函数将会重新运行。start()函数是否运行还取决于“启用/禁用智能交易”按钮状态,当“启用/禁用智能交易”按钮处于禁用状态时,start()函数不会运行,但是,当通过该按钮切换到禁用状态时,不会中断当前start()函数运行。在智能交易属性窗口打开时,start()函数将停止运行,在其执行期间也不会被打开。
从图表中卸载程序、改变货币对或图表时段、计算结果发生了变化、关闭图表、客户端关机,都将会中断程序的执行。如果这些中断程序执行的指令到来的时候,start()函数此刻还在运行,那留给它的工作时间依然被限制在2.5秒之内。程序知道用内置IsStopped()函数试着把它关闭并正确地结束它的工作。
脚本的执行不依赖收到的报价。在货币对或图表时段发生改变时,脚本将完成它的工作并从客户端上卸载下来。
脚本和智能交易运行在自己的线程里,自定义指标则工作在主接口线程上。但是,如果一个自定义指标被iCustom()函数调用,这个指标就运行在调用它的程序线程中,库(导入)函数也同样工作在调用程序的线程里。
发表评论