输入变量

输入存储类称作外部变量。input修饰符位于数据类型前。输入修饰符变量不可以在mql5程序中修改,只能只读访问这个变量。用户只能通过程序属性窗口改变输入变量值。

输入变量名的最大长度为63个字符。对于string类型的输入参数,最大值长度(字符串长度)可以从191到253字符(参见注意)。最小长度为0字符(该值未设置)。

示例:

//--- 输入参量
input int            MA_Period=13;
input int            MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMMA;

输入变量决定程序的输入参数。可以在程序属性窗口中得到。

为输入参数设置一个值

 

输入标签中可以通过其他方法显示输入参数名。使用字符注解,放在同行输入参数描述后。因此对于用户来说,与名字匹配的参数更容易理解。

示例:

//--- 输入参量
input int            InpMAPeriod=13;         // 平滑周期
input int            InpMAShift=0;           // 水平移动行
input ENUM_MA_METHOD InpMAMethod=MODE_SMMA;  // 平滑函数

显示输入参数的合理方法

注意:复合型数组和变量不能作为输入变量。

注意:输入变量的字符串注释长度不得超过63个字符。

注意:对于string类型的输入变量,值长度(字符串长度)的限制由以下条件设置:

  • 参数值由"parameter_name=parameter_value"字符串表示(考虑'='),
  • 最大表示长度为255个字符(total_length_max=255或254个字符,不包括'='),
  • parameter_name_length字符串参数的最大长度 = 63个字符。

因此,字符串参数的最大字符串大小使用公式计算:

parameter_value_length=total_length_max-parameter_name_length=254-parameter_name_length

这里最大字符串大小从191 (parameter_name_length=63)到253个字符(parameter_name_length=1)。

 

MQL5程序访问自定义指标时传送参数 #

iCustom()函数访问自定义指标。其名后,参数要与该指标声明的输入变量严格一致。如果参数少于变量,缺失的参数要在变量声明时用特殊值填满。

如果自定义指标使用第一型的OnCalculate函数(例如用同数据数组计算的指标),那么ENUM_APPLIED_PRICE 值或者其他指标处理程序作为访问这个自定义指标的上一个参数被使用。与输入变量一致的所有参赛必须清楚指明。

计数作为输入参数

MQL5提供得嵌入计数和用户指定的变量都可以用作输入变量(mql5程序的输入参数)。例如,可以创建dayOfWeek计数,描述一周的天数,使用输入变量指定某一天,不是数字,用更通常的方法。

示例:

#property script_show_inputs
//--- 一周内每天
enum dayOfWeek 
  {
   S=0,     // 周日
   M=1,     // 周一
   T=2,     // 周二
   W=3,     // 周三
   Th=4,    // 周四
   Fr=5,    // 周五,
   St=6,    // 周六
  };
//--- 输入参量
input dayOfWeek swapday=W;

脚本启动时,为使用户从属性窗口选择必要的值,使用预处理命令#property script_show_inputs。启动脚本并从列表中选择一个dayOfWeek列举值。启动EnumInInput脚本然后去输入标签。默认情况下,swapday值(三个交换日)是周三(W=3),但可以指定另一个值,用这个值改变程序操作。

自定义枚举作为输入参数的示例

列举值有限。因此,若要选择输入值,需使用下拉列表。为列表中显示的值使用列举助记名。如果注释和助记名有关,正如示例显示,注释内容代替助记名。

每个dayOfWeek计数值都是0-6,但是参数列表中,显示每个值的注释。明确描述输入参数使编程更灵活。

 

Sinput变量修饰符 #

输入变量修饰符不仅允许启动程序时设置外部参数值也是策略测试中优化交易策略时所必须的。每个不包括字符串类型的输入变量可用于优化。

有时,需要从测试的所有通过的区域排除一些外部程序参数。这种情况下,就会引入sinput内存修饰符。sinput代表静态外部变量声明(sinput =静态输入)。这意味着EA交易代码的以下声明。

sinput       int layers=6;   // 层数

将相当于全面声明

static input int layers=6;   // 层数

Sinput修饰符声明的变量是MQL5程序的一个输入参数。当启动程序时可以更改该参数的值。然而,这个变量不用于输入参数的优化。换句话说,当寻找适合指定条件的最好的一组参数时不会枚举它的值。

sinput parameter in the Strategy Tester

上面所示的EA交易有5个外部参数。“层数”声明输入并等于6。交易策略优化期间该参数不能改变。我们可以指定必要的值用于进一步使用。开始,步骤和停止字段都不可用于这样的一个变量。

因此,为变量指定sinput修饰符之后用户将无法优化该参数。换句话说,程序端用户将无法在策略测试为其设置初始和最终值用于优化期间指定范围的自动枚举。

然而,该规则有一个例外:sinput变量可以使用ParameterSetRange()函数在优化任务中有所不同。这个函数的引入是专门用于任何输入变量可用值集的程序控制,包括声明为静态输入(sinput)的变量。ParameterGetInput()函数允许接收优化启动(在OnTesterInit()处理程序)时的输入变量值和重置步骤变化值和范围,在这范围内将会枚举优化参数值。

通过这种方式,结合sinput修饰符和输入参数使用的两个函数,根据另一个输入参数值,允许创建一个灵活的设置输入参数优化间隔的规则,。

 

排列输入参数 #

为了便于使用MQL5程序,可以使用group关键字将输入参数划分为命名块。这可以根据嵌入其中的逻辑将一些一些参数与其他参数进行可视化分离。

input group           "Group name"
input int             variable1 = ...
input double          variable2 = ...
input double          variable3= ...

这样声明之后,当在图表或策略测试中启动时,所有输入参数都被可视化地连接到一个指定的组中,从而简化MQL5用户的参数配置。 每个组的规格在一个新组声明出现之前都一直有效:

input group           "Group name #1"
input int             group1_var1 = ...
input double          group1_var2 = ...
input double          group1_var3 = ...
 
input group           "Group name #2
input int             group2_var1 = ...
input double          group2_var2 = ...
input double          group2_var3 = ...

样例EA包含根据用途划分的输入块:

input group           "Signal"
input int             ExtBBPeriod   = 20;       // 布林带周期
input double          ExtBBDeviation2.0;      // 偏差
input ENUM_TIMEFRAMES ExtSignalTF=PERIOD_M15;   // BB 时间周期
 
input group           "Trend"
input int             ExtMAPeriod   = 13;       // 移动平均线周期
input ENUM_TIMEFRAMES ExtTrendTF=PERIOD_M15;    // MA 时间周期
 
input group           "ExitRules"
input bool            ExtUseSL      = true;     // 使用“止损”
input int             Ext_SL_Points = 50;       // “止损”点数
input bool            ExtUseTP      = false;    // 使用“止盈”
input int             Ext_TP_Points = 100;      // “止盈”点数
input bool            ExtUseTS      = true;     // 使用“追踪止损”
input int             Ext_TS_Points = 30;       // “追踪止损”点数
 
input group           "MoneyManagement"
sinput double         ExtInitialLot = 0.1;      // 初始手数值
input bool            ExtUseAutoLot = true;     // 自动手数计算
 
input group           "Auxiliary"
sinput int            ExtMagicNumber = 123456;  // EA幻数
sinput bool           ExtDebugMessagetrue;    // 打印调试信息

当在策略测试中启动这种EA时,您可以双击组名来折叠/扩展输入参数块,也可以点击组复选框来选择其所有参数进行优化。

在策略测试中排列EA输入参数

 

另见

iCustom枚举程序属性