数据输入
将数据传输到 MQL 程序的基本方法是使用输入参数。从许多方面来看,它们类似于函数的参数,本质上就是变量,特别是在描述语法和在代码中后续使用的原则方面。
此外,输入参数说明有一些重要区别:
- 放在所有代码块之外的文本中(我们已经学习了组成函数体的代码块,我们将在后面学习其他代码块),或者换句话说,在任何一对花括号之外;
- 以 input 关键字开头;
- 用默认值初始化。
通常建议将输入参数放在源代码的开头。
例如,要在我们的脚本中定义一个输入参数以输入小时数,需在那三行指令 #property 后面直接添加以下字符串:
input int GreetingHour = 0; |
这条记录有多重含义。
- 首先,脚本中现在有了 GreetingHour 变量,可以在源代码的任何位置使用,包括从任何函数内部使用。这个定义被称为全局级定义,这是由于执行了以上列表中的第 1 项。
- 其次,使用 input 关键字会使该变量在程序内部和 MQL5 程序属性对话框的用户界面中可见(该对话框在启动时打开)。因此,程序启动时,用户设置必要的参数值(本例中是一个参数 GreetingHour),这些值在程序执行过程中成为相应变量的值。
再次需要注意的是,我们在代码中指定的默认值将在对话框中显示给用户。不过用户能够更改这个值。在这种情况下,这个新的、手动输入的值(非初始值)将包含在程序中。
输入参数的初始值受多种因素的影响:代码中的初始化方式、用户在启动它们时选择的交互方式、MQL5 程序类型以及程序启动方式。问题是不同类型的 MQL5 程序在图表上启动后会有不同的生命周期。因此,指标和 EA 交易在图表中进行一次加载后,便会在其中永久等级,直到用户明确移除它们。因此,终端会记住最近选择的设置并自动使用,例如,在终端重启后。不过在不同终端会话之间,脚本不会保存在图表中。因此,当我们启动脚本时,可能只向我们显示默认值。
遗憾的是,由于某种原因,输入参数的说明无法保证在脚本开始时会调用设置对话框(仅针对作为独立 MQL5 程序类型的脚本)。要实现这一点,必须在代码中再添加一个特定于脚本的 #property 指令:
#property script_show_inputs |
正如我们将看到的,其他类型的 MQL5 程序无需使用该指令。
我们需要 GreetingHour 以将它的值传入 Greeting 函数。为此,只需在 Greeting 函数调用中插入此变量,而不是 0:
void OnStart()
|
考虑到我们为描述输入参数所做的更改,我们将新的脚本版本保存在 GoodTime1.mq5 文件中。如果我们编译并启动这个文件,将看到数据输入对话框:
用于为 GoodTime1.mq5 脚本输入参数的对话框
例如,如果我们将值 GreetingHour 编辑为 10,那么脚本将显示以下问候语:
GoodTime1 (EURUSD,H1) Good afternoon, EURUSD |
这个结果是正确的,也是预期的。
为了好玩儿,我们再运行一次脚本并输入 100。我们得到的不是任何有意义的回应,而是:
GoodTime1 (EURUSD,H1) array out of range in 'GoodTime1.mq5' (19,18) |
我们遇到了一个新现象,即运行时错误。在这种情况下,终端提示,在第 19 行第 18 列的位置,我们的脚本尝试读取一个索引不存在的数组元素值(超出数组大小)。
由于程序员始终且必然会遇到各种错误,我们必须学习如何修复它们,所以让我们进行更加细致的探讨。