5.3 Program Run程序运行

5.3  Program Run程序运行

若使MQL4程序运行,必须进行程序编译(”编译”按钮或FS )。编译过程中不允许出现任何错误,必须在terminal_dir \ experts , terminal_dir \ ex-perts \indicators或terminal_dir \ experts \scripts有相同名称和引申E X4的文件中创建,这样可以开启这个文件。

智能交易、客户指标和脚本的相应图表(Drag'n'Drop技术)需要从客户端内的导航窗口打开。MQL4程序只有在客户端开启的基础上运行。

若使智能交易停止运行,必须从图表使用的菜单中删除它。“智能交易开启”的状态栏将会直接影响智能交易的运行。

若使客户指标停止运行,必须将它从图表中删除。

客户指标和智能交易在图中的管理直到被删除。关于附属在客户指标和智能交易的信息将储存于客户端内。脚本在完成执行一次任务后或者当前图表发生改变/关闭时,再或者客户端中断,脚本被自动删除。相应的附属信息不被保存。

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

5.3.1  Program Run程序运行

程序加载到图表后,会先运行init)模块内容。改变货币对、图表周期或者重新设置预设参数,该init)都会重新运行一次。

当关闭终端、删除程序时,deinit)模块会执行一次。改变货币对、图表周期等操作也会运行一次deinit)模块。使用UninitializeReason)可以查看到撤销程序的状态。deinit)模块在2. 5秒之内运行完毕。如果2. 5秒之内还不能完成的,指令将被强制执行。脚本程序不受此规则限制。如果一个程序周循环等原因不能完成,将被强制中断。

每当新到来一个价格信息,start)模块都会执行一次。如果start()模块没有执行完就到来一个新价格,该新价格将被忽略。所有新到价格都被忽略,除非start)模块执行完毕。执行完毕后,start( )模块仅处理最新的价格信息。在客户指标中,start)模块会优先处理新来的价格信息。在程序预设窗口开启状态下,start)不执行。

从图中拆卸程序、改变商品或图表周期、改变账户、关闭图表、客户端的改变将会中断程序的执行。如果start)函数在给出停止命令的时刻执行,时间限制在2. 5秒,程序能够尝试关闭IsStopped)函数并结束。

脚本的执行不取决于报价格输人。在商品或图表周期发生改变时,脚本将停止运行,并且中断从客户端上下载。

脚本和交易运行在自己的界面。客户指标则是在主界面上运行。如果客户指标中出现iCustom()函数,这个指标的运行会是在程序中显示的。

5.3.2  Imported functions call输入函数调用

输入函数在MQL4程序中执行,即所谓的约束应用。这就意味着,直到输人函数被应用,相应的模板(ex4 or d11)将不会加载。MQL4和DLL资料在模板的命令下被调用。

本书不推荐使用模板被加载的全名Drive ; \ Directory \ FileName. Ext 。MQL4资料是从terminal_ dir\experts\libraries文件夹中下载的。如果资料未找到,将会接受来自terminal_dir \ experts文件夹的下载。

库文件系统(DLLs)按照以下规则运行。如果DLL已经被加载(从其他智能交易,例如,从其他相同时间开启的客户端下载),资料下载已满。会按照以下规则命令执行:

(1) terminal_ dir\experts\libraries目录。

(2) 从terminal_dir客户端开启的目录。

(3) 当前目录。

(4) windows_dir \ SYSTEM32的目录系统(或是对于windows_dir \ SYS-TEM for Win98)。

(5) 在windows dir执行系统中安装的目录。

(6) 录中列出的PATH环境系统变量。

如果DLL应用另一个DLL运行,在后者省缺的情况下前者不会加载。

与资料系统不同,客户资料(MQL4)加载是对于每个分开模板的,并且独立地从模板上加载。例如,ex4模板可以从lib 1. ex4和lib2. ex4资料中调用,反过来,libl. ex4资料可以从lib2. ex4资料中调用函数。在这种情况下,需要复制一份libl. ex4资料和两份lib2. ex4资料,所有资料均来自相同的·ex4模板。

从DLL转人到MQL4程序的输人函数必须提供接受Windows API函数。提供这样的公约,关键词__stdcall专属于微软公司的编译器,在编写的C或C+十语言源代码中使用。上述公约有以下特点:

——呼叫函数(这种情况下,是MQL4程序)必须“参见”(来自DLL输人函数)适应参量。

——呼叫函数(这种情况下,是MQL4程序)在反向命令中放置参量等等,从左到右;它是在读输人函数参量通过的命令。

——参量根据它们的价格值传递,除了一些直接的界限(存在一些界限)。

——函数从堆栈中读取传递参量数值。

如果调用输人函数失败(智能交易设置不允许D LL输人,或相关的资料由于一些原因不能下载),智能交易会停止运行,并在“停止运行”处提出相关信息。另外,智能交易只有在重新初始化之后才会开启。智能交易的初始化在需要重新编译或开启属性时可以按确定键。

5.3.3  Runtime errors运行错误

如果是由于一个关键错误停止了程序的运行,这个错误代码可以在下次开启时使用GetLastError)函数获取。在未开启之前,错误变量不会归零。在客户终端执行子系统时,其发生在MQL4程序执行时错误代码可以储存。对于每一个MQL4程序执行,存在一个特殊的最后错误信息。在init函数运行之前,last_   error变量自动归零。如果在计算过程中或内建函数时发生错误,last_ error变量会给出相应的错误代码。存储在这个变量中的值可以应用GetLastError函数获取。

以下几个重要的错误会造成程序直接停止运行:

如果在错误生成时程序停止工作,这些错误代码可能被下一个开启的程序读取。应用GetLastError)函数,在程序开始之前last_error变量不会归零。

以下是一些相关输人函数调用的错误,会立即停止智能交易或客户指标的起初执行,直至被初始化。

其他错误,不中断程序执行。

有一些错误可能只是由于软件或硬件故障。如果一些错误文本反复出现,应与开发商联络。包括:

以下函数会经常出现列表中的错误代码:

以下函数只可能有一个错误信息:

以下函数不会改变“最后错误信息”:AccountBalance, AccountCompany,AccountCredit,AccountCurrency,AccountEquity,AccountFreeMargin,AccountLeverage , AccountMargin,AccountName,AccountNumber, AccountProfit,AccountServer,Alert, CharToStr,Comment,Day,DayOfWeek,DayOfYear, DoubleToStr,Get-TickCouni,HideTestlndicators,Hour, IndicatorCounted,IsConnected,IsDemo,Is-D11sAllowed,IsExpertEnabled,IsLibrariesAllowed,IsOptimization,IsStopped,IsT-esting,IsTradeAllowed,IsTradeContextBusy,IsVisualMode,MathAbs,M a-thArctan,MathCeil,MathCos,MathExp,MathFloor,MathLog,MathMax,MathMin,MathPow,MathRand,MathRound,MathSin,MathSrand,MathTan,Minute,Month,NormalizeDouble,ObjectsDeleteAll,ObjectsTotal,OrderSelect,OrdersHistoryTo-tal,Period,Print,RefreshRates,Seconds,SetLevelStyle,StringConcatenate,StrTo-Time,StrToDouble,Symbol,TerminalCompany,TerminalName,TerminalPath,TimeCurrent , TimeDay,TimeDayOfWeek,TimeDayOfYear, TimeHour, TimeLocal,TimeMinute,TimeMonth,TimeSeconds,TimeToStr,TimeYear, UninitializeReason,WindowBarsPerChart,WindowFirstVisibleBar, WindowPriceOnDropped,W indow-Redraw,WindowTimeOnDropped,W indowsTotal,WindowOnDropped,WindowX-OnDropped,WindowYOnDropped,Year。