程序库: Expert - 页 11

 
如果您知道输入的名称,第二种选择更好。它让您无需考虑智能交易系统中输入的顺序。而且在技术上实现得更好。
#include <fxsaber\Expert.mqh>

void OnStart()
{
  MqlParam Params[2];

  // 辅导员之路
  Params[0].string_value = "Experts\\Test6.ex5";
  Params[0].string_value += "\nexpertmode=5";
  
  Params[1].type = TYPE_INT;
  Params[1].integer_value = 123423;
  EXPERT::AddInputName(Params[1], "inpFirst");

  EXPERT::Run(0, Params);
}


尽管 inpFirst 的顺序是第二位,但它可以被设置为任何顺序(在本例中,它被设置为第一位,也是唯一的一位)。未设置的将作为默认值。

 
在实验中,我需要为几个图表克隆一个机器人。我是通过这个功能完成的。
#include <fxsaber\Expert.mqh> //https://www.mql5.com/zh/code/19003

// 将运行中的智能交易系统和当前设置从一个图表复制到另一个图表
bool ExpertFromTo( const long ChartSource, const long ChartTarget )
{
  bool Res = false;
    
  MqlParam Params[];
  string Names[];

  const int ExpertMode = EXPERT::Parameters(ChartSource, Params, Names);  
  const int Size = ArraySize(Params);
  
  if (Size)
  {
    Params[0].string_value += "\nexpertmode=" + (string)ExpertMode;
    
    for (int i = 1; i < Size; i++)
      EXPERT::AddInputName(Params[i], (Names[i - 1] == NULL) ? " " : Names[i - 1]);

    Res = EXPERT::Run(ChartTarget, Params);
  }
  
  return(Res);
}


我是这样使用它的

#property script_show_inputs

input int inAmount = 5; // 有多少克隆

void OnStart()
{
  const int Size = SymbolsTotal(true);
  
  if (Size > inAmount)
    for (int i = 0, Count = 0; i < Size; i++)
    {
      const string Symb = SymbolName(i, true);
      
      if (Symb != _Symbol)
      {
        ExpertFromTo(0, ChartOpen(Symb, PERIOD_CURRENT)); // 在新图表符号上运行当前 EA。
        Count++;
        
        if (Count == inAmount)
          break;
      }
    }
}
 

在一个以上的终端上重启十几个不同的智能交易系统的任务随之而来。一般来说,这是一个很大的常规工作。

例如,我们修正了一些东西。然后在 ME 中批量编译并重新启动。我为此使用了这样一个脚本。

// 在所有图表上重新加载 EA。
input int inInterval = 5; // 以秒为单位的图表重启间隔

bool ReloadChart( const long Chart )
{
  return (ChartSaveTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") &&
          ChartApplyTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") && // 将任务放入图表队列。
          ChartGetInteger(Chart, CHART_WINDOW_HANDLE));                 // 使队列移动。
}

void OnStart()
{
  const long chartID = ::ChartID();

  for (long Chart = ChartFirst(); (Chart != -1) && !IsStopped(); Chart = ChartNext(Chart))
    if ((Chart != chartID) && (ChartGetString(Chart, CHART_EXPERT_NAME) != NULL) && (ReloadChart(Chart)))    
      Sleep(inInterval * 1000);
}

我在代码中标记了一个重要位置。没有它,模板的应用将不会直到脚本结束。以此类推,您可以解决重新加载终端后启动智能顾问 等问题。

 
fxsaber:

需要在多个终端上重新启动十几个不同的智能交易系统。总的来说,这是一项艰巨的任务。

例如,我们修正了一些东西。然后在 ME 中批量编译并重新启动。我为此使用了这个脚本。

我突出了代码中的一个重要位置。如果没有它,模板将无法使用,直到脚本结束。以此类推,您可以解决重新加载终端后启动智能交易系统 等问题。

如果您能在指定图表上获取 EA 的名称,这将是一套完整的程序。如果这对你来说不难,那就完成它吧。

 
Vladimir Pastushak:

如果您能在指定的图表上填写议员的姓名,则表格完整。如果您不介意,请填写。

ChartGetString(Chart, CHART_EXPERT_NAME)

这里是 MT5。如果您需要跨平台或 Expert Advisor 的完整路径,请通过 Expert.mqh.

 
fxsaber:

这是 MT5。如果您需要跨平台或 Expert Advisor 的完整路径,则可通过 Expert.mqh.

您需要跨平台...

 
Vladimir Pastushak:

需要一个十字平台游戏...

关于交易、自动交易系统和测试交易策略的论坛。

库:专家

fxsaber, 2019.09.12 06:17 pm.

#include <fxsaber\Expert.mqh> //https://www.mql5.com/zh/code/19003

// 输出运行中的 EA 数据
string EAToString( const long Chart_ID = 0 )
{
  string Names[];
  MqlParam Params[];
  
  const int Flag = EXPERT::Parameters(Chart_ID, Params, Names);
  const int Size = ArraySize(Names);
  
  string Str = "Expert " + Params[0].string_value + ", expertmode = " + (string)Flag;
  
  for (int i = 0; i < Size; i++)
    Str += "\n" + Names[i] + " = " + Params[i + 1].string_value;
    
  return(Str);    
}
 
// 使文件输入变量等于所选文件。
bool FileDialogToInput( const string InputName, const long Chart = 0 )
{  
  string FileNames[];
  const bool Res = (FileSelectDialog(MQLInfoString(MQL_PROGRAM_NAME) + " " + _Symbol + " " + EnumToString(_Period) +
                    ": input string " + InputName + " = ",
                    NULL, NULL, FSD_FILE_MUST_EXIST, FileNames, NULL) > 0);
  if (Res)
  {    
    MqlParam Params[];
    string Names[];
  
    const int ExpertMode = EXPERT::Parameters(Chart, Params, Names);  
    const int Size = ArraySize(Params);
    
    if (Size)
    {
      Params[0].string_value += "\nexpertmode=" + (string)ExpertMode;
      
      for (int i = 1; i < Size; i++)
      {
        if (Names[i - 1] == InputName)
          Params[i].string_value = FileNames[0];
        
        EXPERT::AddInputName(Params[i], (Names[i - 1] == NULL) ? " " : Names[i - 1]);
      }
  
      EXPERT::Run(Chart, Params);
    }    
  }
  
  return(Res);
}

该函数允许您选择一个文件作为输入变量。此实现。

input string inFileName = NULL; // 选定文件

#define  TOSTRING(A) #A          

int OnInit()
{
  if (!FileIsExist(inFileName))
    return(FileDialogToInput(TOSTRING(inFileName)) || INIT_FAILED);
    
  // 如果在输入变量中指定了一个有效文件,则编写代码。

  return(INIT_SUCCEEDED);
}


启动。


单击 OK(确定)并选择。


单击 "打开",查看运行中 EA 的属性 (F7)。


同样的方法也适用于任意数量的文件。

input string inFileName1 = NULL; // 选定文件1
input string inFileName2 = NULL; // 选定文件2

#define  TOSTRING(A) #A          

int OnInit()
{
  if (!FileIsExist(inFileName1))
    return(FileDialogToInput(TOSTRING(inFileName1)) || INIT_FAILED);

  if (!FileIsExist(inFileName2))
    return(FileDialogToInput(TOSTRING(inFileName2)) || INIT_FAILED);
    
  // 如果在输入变量中指定了一个有效文件,则编写代码。

  return(INIT_SUCCEEDED);
}
 
据我所知,目前还不支持从设置文件加载参数?
 
traveller00:
据我所知,目前还不支持从设置文件中加载参数?

我不知道。但这很简单。