首页学院交易策略EA智能交易文章详细

MQL4程序运行

外汇网2021-06-17 09:40:37 279
汇外网 - 全球专业的黄金外汇门户导航行情资讯网站

  • 程序运行
  • 导入函数调用

想让MQL4程序运行起来,就务必对它执行编译(按“编译”按钮或F5键)。在程序编译过程中不允许显现任何错误(允许有警示信息,但一定要对它执行具体分析)。编译成功之后,将令在相应的目录terminal_dir/experts,terminal_dir/experts/indicatorsterminal_dir/experts/scripts 中,自动创建一个扩展名叫.EX4的可实施文件,只有创建了相应的.EX4文件,MQL4程序(EA,脚本,自定义指标)才可够被用户运行起来。

用户通过鼠标可以将智能交易、自定义指标和脚本从客户端“导航”窗口拖动到相应的图表上(拖曳技术),它们会附加到已打开的任一图表上。MQL4程序只有在客户端已起步的基础上才可运行。

要停止智能交易运行,务必从图表的上下文菜单中删除它(智能交易系统-取消)。“启用智能交易”按钮状态将令直接影响智能交易的运行。

要使自定义指标停止运行,应当将它从图表中删除。

自定义指标和智能交易一直运行着,直到用户从图表中清晰地删除它们为止。相关附加的智能交易和自定义指标的信息在客户端起步之时保存于客户端内。

在脚本己经完成操作之后、目前图表被关闭或其状态己经发生更改、或当客户端中止运行时,脚本都只实施一次任务,并被自动删除掉。受于不保存运行状态信息,当客户端又一次从新起步时脚本并没有自动运行。

在与一个图表内,智能交易、脚本和许多数量的指标可以同期运行。

程序运行

程序附加到图表之后,它立刻开始与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()函数调用,这个指标就运行在调用它的程序线程中,库(导入)函数也同样工作在调用程序的线程里。

导入函数调用

为了在mql4程序实施阶段导入函数,采取了所谓的“落后联编”。这就代表着,导入函数被调用前,不会被加载相应的模块(EX4或DLL)。 MQL4和DLL库在调用模块线程下运行。

这里不推荐运用全路径模块名 Drive:/Directory/FileName.Ext 加载模块。MQL4库是从 terminal_dir/experts/libraries 文件夹中载入进来。假使库中未寻到,将令试图从terminal_dir/experts 文件夹下加载。

系统动态链接库(DLL)依照操作系统规则加载。假使一个DLL已经加载过(比如,被其余智能交易系统,或从同期起步的其他客户端程序加载),则将直接引用已加载过的库,否则,搜索会依照下方顺序执行:

  • 1. terminal_dir/experts/libraries 目录 。
  • 2. terminal_dir 目录,客户端程序起步的目录。
  • 3. 目前目录。
  • 4. windows_dir/SYSTEM32 系统目录 (或是Win98下 windows_dir/SYSTEM 目录 )。
  • 5. windows_dir 目录,即操作系统安装的目录。
  • 6. 系统环境变量PATH中列出的目录。

假使一个DLL运行时调用了其他DLL,而后者又不可用,那么前者就不会被加载。

与系统库不同,自定义库(MQL4)是每个调用模块各自单独加载,而不管能否被其它模块独立地加载过。比如,调用.ex4模块可以从lib1.ex4和lib2.ex4库中调用函数,倒过来,lib1.ex4库也可以从lib2.ex4库中调用函数。在该种情形下,一个以上lib1.ex4副本和两份lib2.ex4副本被加载,根本不考虑所有的调用都来自同一个调用.ex4模块。

从DLL导入到MQL4程序的函数务必符合万得ows 美国石油协会函数的链接规则。为了保证在程序源码里符合如此的规定,我们用C或C++语言编程时运用核心字_stdcall给予表明,表明是用微软公司编译器编译。上述链接规定有下方特点:

  • 为了将函数参数以适当的方式置入堆栈,调用函数(该种情形下,是一个MQL4程序)务必“看得见”被调用函数的原型(来自DLL导入函数);
  • 调用函数(该种情形下,是一个MQL4程序)以逆序方式将参数置入堆栈,也就是说,从右到左;它就是以该种顺序让导入函数读取传递给它的参数;
  • 参数通过值传递,除那些清晰表明通过引用传递之外;
  • 在读取传递给它的参数后,导入函数自身将令自行清除堆栈。

在描述导入函数原型时,受于所有的参数务必清晰地传递给导入函数,所以参数的默认值是无用的。

假使调用导入函数失利(智能交易设置不允许DLL导入,或是受于一部分原因致使无法加载相应的库),智能交易会停止运行并把有关信息输出到“智能交易停止”日志。此外,智能交易只有在从新初始化之后才可起步。从新编译或打开智能交易属性表并按OK键,其结果就是智能交易系统从新初始化。

标签:

随机快审展示
加入快审,优先展示

加入VIP