Skip to content

数据输入

在MQL程序中,数据传输的基本方式是使用输入参数。这些参数在许多方面类似于函数参数和变量,特别是在描述语法和代码中使用原则方面。

输入参数的特点

输入参数的描述有几个重要区别:

  1. 位置要求
    必须放置在所有代码块之外(即不包含在任何大括号{}内),通常在源代码开头;
  2. 关键字
    使用input关键字声明;
  3. 默认值
    必须初始化默认值。

建议将输入参数放在源代码起始位置,紧接在#property指令之后。

示例代码

cpp
#property script_show_inputs
input int GreetingHour = 0;

关键特性说明

  • 全局变量
    GreetingHour成为全局变量,可在代码任何位置(包括函数内部)访问;
  • 用户界面可见性
    使用input关键字后,该参数会显示在MQL5程序的属性对话框中,用户可在启动时修改值;
  • 默认值机制
    代码中指定的默认值会显示在对话框中,但用户修改后的新值将覆盖默认值;
  • 程序类型差异
    指标(Indicators)和专家顾问(Expert Advisors)会记住最后一次设置,而脚本(Scripts)需要在代码中添加#property script_show_inputs指令才能显示参数对话框。

运行时错误示例

当在Greeting函数中使用输入参数时:

cpp
void OnStart()
{
  Print(Greeting(GreetingHour), ", ", Symbol());
}

如果用户输入100作为小时数,将触发数组越界错误:

GoodTime1 (EURUSD,H1)        array out of range in 'GoodTime1.mq5' (19,18)

错误说明:
程序试图访问数组中不存在的索引位置(第19行第18列),这是因为Greeting函数中的时间判断逻辑未处理非法值。

注意:错误调试是编程的重要环节,需要学会定位和修复这类运行时错误。

参数对话框示例

(原图描述:显示脚本GoodTime1.mq5的参数输入对话框)

当脚本启动时,用户可在此对话框修改GreetingHour的值。例如:

  • 输入10会输出:"Good afternoon, EURUSD"
  • 输入100会导致数组越界错误

最佳实践

  1. 始终为输入参数设置合理的默认值
  2. 在脚本中必须添加#property script_show_inputs指令
  3. 在代码中添加参数合法性检查
  4. 不同程序类型要注意参数持久化特性的差异