ParameterGetRange

在策略测试优化EA期间,接收范围值的数据和输入变量的改变步骤。有两个函数变量。

1. 接收整型输入参数的数据

bool  ParameterGetRange(
   const string  name,          // 参数 (输入变量) 名称
   bool&         enable,        // 启用参数优化
   long&         value,         // 参数值
   long&         start,         // 初始值
   long&         step,          // 改变步骤
   long&         stop           // 最终值
   );

2. 接收真实类型输入参数的数据

bool  ParameterGetRange(
   const string  name,          // 参数(输入变量)名称
   bool&         enable,        // 启用参数优化
   double&       value,         // 参数值
   double&       start,         // 初始值
   double&       step,          // 改变步骤
   double&       stop           // 最终值
   );

参数

name

[in] 输入变量 ID。这些变量是应用程序的外部参数。它们的值可以在启动图表时或单一测试时指定。

enable

[out]  策略测试优化期间,该参数可以用于枚举值的标识。

value

[out]  参数值。

start

[out]  优化期间的初始参数值。

step

[out]  枚举值时的参数变换步骤。

stop

[out]  优化期间的最终参数值。

返回值

如果成功返回 true,否则 false。若要获得有关错误的信息,请调用GetLastError()函数。

注意

函数仅能从 OnTesterInit()OnTesterPass()OnTesterDeinit() 处理程序调用。它已被引入接收EA输入参数值和策略测试优化期间的变量范围。

当调用OnTesterInit()时,获得的数据可以通过ParameterSetRange()函数被用于重新定义任何输入变量的枚举规则。因此,可以设置新的Start,Stop 和 Step值并且无论策略测试如何设置,输入参数甚至可以完全脱离优化。这可以使您根据EA交易的关键参数值,通过排除一些优化参数,管理优化输入参数的区域。

例如:

#property description "Expert Advisor for ParameterGetRange() function demonstration."
#property description "Should be launched in the optimization mode of the Strategy Tester"
//--- 输入参数
input int                 Input1=1;
input double              Input2=2.0;
input bool                Input3=false;
input ENUM_DAY_OF_WEEK    Input4=SUNDAY;
 
//+------------------------------------------------------------------+
//| 专家初始化函数                                                     |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- EA是只为策略测试操作而设计的
   if(!MQL5InfoInteger(MQL5_OPTIMIZATION))
     {
      MessageBox("Should be launched in the optimization mode of the Strategy Tester!");
      //--- 提前完成EA操作并从图表删除
      return(INIT_FAILED);
     }
//--- 成功完成初始化
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| TesterInit 函数                                                   |
//+------------------------------------------------------------------+
void OnTesterInit()
  {
//--- 长整型输入参数的示例
   string name="Input1";
   bool enable;
   long par1,par1_start,par1_step,par1_stop;
   ParameterGetRange(name,enable,par1,par1_start,par1_step,par1_stop);
   Print("First parameter");
   PrintFormat("%s=%d  enable=%s  from %d to %d with step=%d",
               name,par1,(string)enable,par1_start,par1_stop,par1_step);
//--- 双精度型输入参数的示例
   name="Input2";
   double par2,par2_start,par2_step,par2_stop;
   ParameterGetRange(name,enable,par2,par2_start,par2_step,par2_stop);
   Print("Second parameter");
   PrintFormat("%s=%G  enable=%s  from %G to %G with step=%G",
               name,par2,(string)enable,par2_start,par2_stop,par2_step);
 
//--- 布尔型输入参数的示例
   name="Input3";
   long par3,par3_start,par3_step,par3_stop;
   ParameterGetRange(name,enable,par3,par3_start,par3_step,par3_stop);
   Print("Third parameter");
   PrintFormat("%s=%s  enable=%s  from %s to %s",
               name,(string)par3,(string)enable,
               (string)par3_start,(string)par3_stop);
//--- 枚举型输入参数的示例
   name="Input4";
   long par4,par4_start,par4_step,par4_stop;
   ParameterGetRange(name,enable,par4,par4_start,par4_step,par4_stop);
   Print("Fourth parameter");
   PrintFormat("%s=%s  enable=%s  from %s to %s",
               name,EnumToString((ENUM_DAY_OF_WEEK)par4),(string)enable,
               EnumToString((ENUM_DAY_OF_WEEK)par4_start),
               EnumToString((ENUM_DAY_OF_WEEK)par4_stop));
  }
//+------------------------------------------------------------------+
//| TesterDeinit函数                                                 |
//+------------------------------------------------------------------+
void OnTesterDeinit()
  {
//--- 优化完成后将会显示该信息
   Print(__FUNCTION__," Optimization completed");
  }