Библиотеки: Expert - страница 10

 
fxsaber:

Да, не очень красиво. Возможно, надо было делать фейковый нулевой элемент для Names[].

Посчитал это лишним в библиотеке, т.к. бывают еще кастомные ENUM-ы. Более того, не увидел задачи, в которой это могло бы быть нужным.

Свой автооптимизатор делал. Там такое не пригодилось.

Функции ParameterGetRange/ParameterSetRange определены только для типов long и double, соответственно в цикле по параметрам требует анализировать и менять настройки только для чисел.

 
Stanislav Korotky:

Функции ParameterGetRange/ParameterSetRange определены только для типов long и double, соответственно в цикле по параметрам требует анализировать и менять настройки только для чисел.

Целыми типами являются bool, enums.

 
fxsaber:

Целыми типами являются bool, enums.

Это нормально. Ненормально, что сейчас всё представлено строками и нельзя отсеять настоящие строки.

 
Stanislav Korotky:

Это нормально. Ненормально, что сейчас всё представлено строками и нельзя отсеять настоящие строки.

Оптимизируемые параметры заранее являются числами. Так что среди них точно нет строк. Поэтому можно использовать, как фильтр.

 

Привет не могу понять как открыть на эксперт с разрешонной торговлей

такой код открывает нормально с инпутами которые передаю

   Params[0].string_value = "Experts\\Shared Projects\\luipaulo89\\experts\\PullbackEA_v2.ex5";
// Первый входной параметр советника
   Params[1].type = TYPE_STRING;
   Params[1].string_value = "Hello World!";
   Params[2].type = TYPE_INT;
   Params[2].integer_value = 0;
// На новом чарте запускаем советник
   if (inpFirst==1) EXPERT::Run(ChartOpen(_Symbol, _Period), Params);

если я использую такой код 

   Params[0].string_value = "Experts\\Shared Projects\\luipaulo89\\experts\\PullbackEA_v2.ex5";
   Params[0].string_value += "\nexpertmode=5";
// Первый входной параметр советника
   Params[1].type = TYPE_STRING;
   Params[1].string_value = "Hello World!";
   Params[2].type = TYPE_INT;
   Params[2].integer_value = 0;
// На новом чарте запускаем советник
   if (inpFirst==1) EXPERT::Run(ChartOpen(_Symbol, _Period), Params);

он открывает с разрешонной торговлей но не передает параметры

Задача окрыть тогоже самого эксперта на новом чарте

input group "EA Settings"
input int inpFirst = 1;//first instance;

что бы только первый эксперт мог открывать новые передаю 0  в новые , но к сожалению во втором варианте (когда торговля разрешенна) не передаются параметры (или передаются не правильно)

inpFirst = 0;
 

в tpl файле заголовок создает отлично но почемуто не передает параметр

<expert>
name=PullbackEA_v2
path=Experts\Shared Projects\luipaulo89\experts\PullbackEA_v2.ex5
expertmode=5
<inputs>
inpFirst=1

ожидалось что будет inpFirst=0

   Params[1].type = TYPE_INT;
   Params[1].integer_value = 0;
 
Aleksei Beliakov:

Обновите библиотеку.

Тестовый советник.

input group "EA Settings"
input int inpFirst = 1;//first instance;

void OnInit() {}


Пример1.

#include <fxsaber\Expert.mqh>

void OnStart()
{
  MqlParam Params[3];

  // Путь к советнику
  Params[0].string_value = "Experts\\Test6.ex5";
  Params[0].string_value += "\nexpertmode=5";

  // input group "EA Settings"
  Params[1].type = TYPE_STRING;
  Params[1].string_value = NULL;

  // input int inpFirst
  Params[2].type = TYPE_INT;
  Params[2].integer_value = 123;

  EXPERT::Run(ChartOpen(_Symbol, PERIOD_CURRENT), Params); // Не сможет корректно запустить советник на своем же чарте
}


Пример2.

#include <fxsaber\Expert.mqh>

void OnStart()
{
  MqlParam Params[3];

  // Путь к советнику
  Params[0].string_value = "Experts\\Test6.ex5";
  Params[0].string_value += "\nexpertmode=5";
  
  // input group "EA Settings"
  Params[1].type = TYPE_STRING;
  Params[1].string_value = NULL;
  EXPERT::AddInputName(Params[1], " "); // Пробел.

  // input int inpFirst
  Params[2].type = TYPE_INT;
  Params[2].integer_value = 123;
  EXPERT::AddInputName(Params[2], "inpFirst");

  EXPERT::Run(0, Params); // Сможет корректно запустить советник на своем же чарте.
}
 
Спасибо ты как всегда лучший!!!
 
Если знаете названия входных, то лучше второй вариант. Он позволяет не думать о порядке входных в советнике. И технически лучше реализован.
#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/ru/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)); // Текущий советник запускаем на новых чартах-символах.
        Count++;
        
        if (Count == inAmount)
          break;
      }
    }
}
Причина обращения: