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

 

Возникает задача перезапустить десяток разных советников далеко не на одном Терминале. В общем, большая рутина.

Например, подправили что-то. Далее пакетная компиляция в ME и перезапуск. Для него использую такой скрипт.

// Перезагружает советники на всех чартах.
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 и перезапуск. Для него использую такой скрипт.

Важное место в коде выделил. Без него применение шаблона не будет до окончания работы скрипта. По аналогии можно решать запуск советников после перегрузки Терминала и т.д.

Будет полный комплект если можно будет получить имя советника на указанном чарте. Если Вас не затруднит, допилите.

 
Vladimir Pastushak:

Будет полный комплект если можно будет получить имя советника на указанном чарте. Если Вас не затруднит, допилите.

ChartGetString(Chart, CHART_EXPERT_NAME)

Это MT5. Если нужно кроссплатформенно или полный путь к советнику, то через Expert.mqh.

 
fxsaber:

Это MT5. Если нужно кроссплатформенно или полный путь к советнику, то через Expert.mqh.

Нужно крос платформено... 

 
Vladimir Pastushak:

Нужно крос платформено... 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: Expert

fxsaber, 2019.09.12 06:17

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

// Выводит данные запущенного советника
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);    
}
 
// Делает файловую input-переменную равной выбранному файлу.
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);
    
  // Код, если задан корректный файл в input-переменной.

  return(INIT_SUCCEEDED);
}


Запуск.


Жмем OK и выбираем.


Жмем Открыть и смотрим свойства (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);
    
  // Код, если задан корректный файл в input-переменной.

  return(INIT_SUCCEEDED);
}
 
А загрузка параметров из set-файлов пока не поддерживается, как я понимаю?
 
traveller00:
А загрузка параметров из set-файлов пока не поддерживается, как я понимаю?

Не делал. Но там очень просто.

 
Если советник требует загрузки ДЛЛ, этот флажок сам не ставит? Дело в expertmode, похоже. И интерфейса не вижу. Код или шаблон самому править надо?
 
traveller00:
Если советник требует загрузки ДЛЛ, этот флажок сам не ставит? Дело в expertmode, похоже. И интерфейса не вижу. Код или шаблон самому править надо?

Выше были примеры с DLL.

Причина обращения: