通过指标句柄获取指标设置

有时,MQL 程序需要获取运行中指标实例的参数。这些指标可以是图表上的第三方指标,也可以是从主程序传递到 或头文件的句柄。为此,MQL5 提供了 IndicatorParameters函数。

int IndicatorParameters(int handle, ENUM_INDICATOR &type, MqlParam &params[])

该函数通过指定句柄返回指标输入参数数量及其类型和值。

成功时,该函数将填充传入的 params数组,并将指标类型保存在 type 参数中。

如果出现错误,该函数将返回 -1。

作为使用该函数的示例,我们将改进 删除指标实例章节中展示的UseDemoAllLoop.mq5 指标。新版本命名为 UseDemoAllParams.mq5

你应该还记得,我们曾在循环中依次创建列表中的内置指标,并将参数列表留空,这导致指标使用某些未知的默认值。为此,我们曾在图表注释中显示一个通用原型:仅包含指标名称,而没有具体参数值。

// UseDemoAllLoop.mq5
void OnTimer()
{
   ...
   Comment("DemoAll: ", (IndicatorSelector == iCustom_ ? IndicatorCustom : s),
      "(default-params)");
   ...
}

现在,我们可以基于指标句柄获取其参数并向用户显示。

// UseDemoAllParams.mq5
void OnTimer()
{
   ...   
   // read the parameters applied by the indicator by default
   ENUM_INDICATOR itype;
   MqlParam defParams[];
   const int p = IndicatorParameters(HandleitypedefParams);
   ArrayPrint(defParams);
   Comment("DemoAll: ", (IndicatorSelector == iCustom_ ? IndicatorCustom : s),
      "(" + MqlParamStringer::stringify(defParams) + ")");
   ...
}

MqlParam数组转换为字符串的功能通过 MqlParamStringer 特殊类实现(请参阅文件 MqlParamStringer.mqh)。

class MqlParamStringer
{
public:
   static string stringify(const MqlParam &param)
   {
      switch(param.type)
      {
      case TYPE_BOOL:
      case TYPE_CHAR:
      case TYPE_UCHAR:
      case TYPE_SHORT:
      case TYPE_USHORT:
      case TYPE_DATETIME:
      case TYPE_COLOR:
      case TYPE_INT:
      case TYPE_UINT:
      case TYPE_LONG:
      case TYPE_ULONG:
         return IntegerToString(param.integer_value);
      case TYPE_FLOAT:
      case TYPE_DOUBLE:
         return (string)(float)param.double_value;
      case TYPE_STRING:
         return param.string_value;
      }
      return NULL;
   }
   
   static string stringify(const MqlParam &params[])
   {
      string result = "";
      const int p = ArraySize(params);
      for(int i = 0i < p; ++i)
      {
         result += stringify(params[i]) + (i < p - 1 ? "," : "");
      }
      return result;
   }
};

编译并运行新指标后,你会发现当前渲染指标的特定参数列表显示在图表左上角。

对于列表中的单个自定义指标 (LifeCycle),第一个参数将包含指标的路径和文件名。第二个参数在源代码中被描述为整数类型。但第三个参数有点不同,它隐式定义了所有使用简化版OnCalculate处理程序的指标所共有的“Apply to”特性。在此处,指标默认应用于 PRICE_CLOSE(值 1)。

Initializing LifeCycle() EURUSD, PERIOD_H1

Handle=10

[type] [integer_value] [double_value] [string_value]

[0] 14 0 0.00000 "Indicators\MQL5Book\p5\LifeCycle.ex5"

[1] 7 0 0.00000 null

[2] 7 1 0.00000 null

Initializing iAlligator_jawP_jawS_teethP_teethS_lipsP_lipsS_method_price() EURUSD, PERIOD_H1

iAlligator_jawP_jawS_teethP_teethS_lipsP_lipsS_method_price requires 8 parameters, 0 given

Handle=10

[type] [integer_value] [double_value] [string_value]

[0] 7 13 0.00000 null

[1] 7 8 0.00000 null

[2] 7 8 0.00000 null

[3] 7 5 0.00000 null

[4] 7 5 0.00000 null

[5] 7 3 0.00000 null

[6] 7 2 0.00000 null

[7] 7 5 0.00000 null

Initializing iAMA_period_fast_slow_shift_price() EURUSD, PERIOD_H1

iAMA_period_fast_slow_shift_price requires 5 parameters, 0 given

Handle=10

[type] [integer_value] [double_value] [string_value]

[0] 7 9 0.00000 null

[1] 7 2 0.00000 null

[2] 7 30 0.00000 null

[3] 7 0 0.00000 null

[4] 7 1 0.00000 null

 

根据日志记录,内置指标的设置也与默认值相符。