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

 
fxsaber:

В Маркете неоднократно видел, что авторы прикладывают сет-файлы своих ТС для каждого символа. Соответственно, покупатели используют их.


Предлагаю для Маркет-ТС использовать следующую логику

  • Добавляется один входной параметр
  • Если эта папка задана пользователем, то советник автоматом подхватывает все сеты из этой папки и запускает свои соответствующие версии.
  • Пользователю нужно только поместить сет-файл в папку и прописать путь к этой папке при запуске советника (вшить этот путь сразу может и автор советника).
  • Если пользователь ошибся и запускает дважды, то можно автоматически не давать этого делать.

Такой подход удобен и для запуска своих ТС одним нажатием.

Конечно, решение может быть универсальным для обеих платформ. Грубо говоря, в исходный код любого советника потребуется добавить только одну строку.


Скорее всего, именно так теперь буду запускать советники. Если кто-то видит изъян в таком методе или вариант улучшения, дайте знать.

Запуск в тестере будет отличаться от онлайна (папки ведь разные), чтобы сопоставить конкретную копию советника сету нужно дополнительно что-то делать.

Ну и просто управление этим стадом советников без собственной визуализации представляется затруднительным.

Плюс изменения набора сетов будет сопровождаться перезапуском всех советников.


Отдельные чарты МТ служат "прозрачными файликами", которые подшиваются в "твердую папку" профайла. Это позволяет положить в каждый файлик необходимую информацию или без труда вытащить/заменить нужный файл. А перейти на другую "твердую папку" можно сменой профиля. Вроде удобно.

Я сталкивался с необходимостью заменить один параметр у всех советников (например, риск). Делал это путем массовой замены в файлах шаблонов или через специальную гл. переменную. Вот это было бы удобно обернуть в удобную функцию.

 
Andrey Khatimlianskii:

Запуск в тестере будет отличаться от онлайна (папки ведь разные), чтобы сопоставить конкретную копию советника сету нужно дополнительно что-то делать.

Отличия не будет.

Ну и просто управление этим стадом советников без собственной визуализации представляется затруднительным.

Не сложнее, чем сейчас.

Плюс изменения набора сетов будет сопровождаться перезапуском всех советников.

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

Отдельные чарты МТ служат "прозрачными файликами", которые подшиваются в "твердую папку" профайла. Это позволяет положить в каждый файлик необходимую информацию или без труда вытащить/заменить нужный файл. А перейти на другую "твердую папку" можно сменой профиля. Вроде удобно.

Безусловно, можно даже автоматически читать/писать профили в MQL5\Profiles\Charts\... Но профили - это все же совсем другое.

Я сталкивался с необходимостью заменить один параметр у всех советников (например, риск). Делал это путем массовой замены в файлах шаблонов или через специальную гл. переменную. Вот это было бы удобно обернуть в удобную функцию.

Такой функционал есть среди примеров к библиотеке.


Однако, нужно различать изменение входных параметров методом перезапуска и через F7 руками. Первый- полноценный перезапуск, второй - нет. Бывает, когда нужен именно второй. Но это через MQL не реализовать.

 
fxsaber:

Отличия не будет.

Каким образом? Путем выбора одного нужного сета?


fxsaber:

Не сложнее, чем сейчас.

Сейчас каждый запущенный советник со своим сетом.

А как поведет себя "менеджер", запустивший 10 советников, если какому-то из них поменять параметры вручную? И что будет после перезапуска менеджера? Запустятся оригинальные сеты?

 
Andrey Khatimlianskii:

Каким образом? Путем выбора одного нужного сета?

MQL_TESTER.

Сейчас каждый запущенный советник со своим сетом.

А как поведет себя "менеджер", запустивший 10 советников, если какому-то из них поменять параметры вручную? И что будет после перезапуска менеджера? Запустятся оригинальные сеты?

Менеджера не предполагается. Видимо, только кодом смогу показать, что же имел в виду. Спасибо за участие.

 
fxsaber:

MQL_TESTER.

Можно чуть более подробный ответ?

Определить, что запуск в тестере, можно, конечно. Но при этом нет ни доступа к папке сетов (или есть, если камон), и нет смысла эти сеты читать — нужно ведь протестировать только один из них.

А после теста нужно сопоставить его с запущенным советником (например, чтобы остановить его или поменять какой-то параметр). Для этого что — лезть в папку с сетами, искать нужный и править?


Тогда уже разумнее выглядит торговля по всем сетам из одного советника. С возможностью выбрать одну или несколько стратегий (сетов).

 
Andrey Khatimlianskii:

Можно чуть более подробный ответ?

Определить, что запуск в тестере, можно, конечно. Но при этом нет ни доступа к папке сетов (или есть, если камон), и нет смысла эти сеты читать — нужно ведь протестировать только один из них.

А после теста нужно сопоставить его с запущенным советником (например, чтобы остановить его или поменять какой-то параметр). Для этого что — лезть в папку с сетами, искать нужный и править?

Для Тестера служит кастомный opt-файл. Из него любой сет запускается одним нажатием. Это супер-удобно.

Если без opt-файла, то работа по-старинке. Т.е. ничего не усложняется совсем.

Тогда уже разумнее выглядит торговля по всем сетам из одного советника. С возможностью выбрать одну или несколько стратегий (сетов).

Такой выбор в Тестере всегда имеется - загрузить сет.

 
Рекомендовал бы встроить подобную проверку в свои советники
// Кроссплатформенный пример защиты от ошибочного запуска клона советника.

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

string GetExpertData( const ulong Chart = 0 ) 
{ 
  string Str = NULL; 

  MqlParam Parameters[]; 
  string Names[]; 

  if (EXPERT::Parameters(Chart, Parameters, Names)) 
  { 
    Str += "\n" + ::ChartSymbol(Chart) + " " + ::EnumToString(::ChartPeriod(Chart)) + " " + Parameters[0].string_value + "\n"; 

    const int Amount = ::ArraySize(Names); 

    for (int i = 0; i < Amount; i++) 
      Str += (string)i + ": "+ Names[i] + " = " + Parameters[i + 1].string_value + "\n"; 
  } 

  return(Str); 
} 

// Запущен ли такой же советник?
long IsRunning( void )
{ 
  long Res = 0;
  const string Str = GetExpertData();
  long Chart = ::ChartFirst(); 

  while (!Res && (Chart != -1)) 
    if ((Chart != ::ChartID()) && EXPERT::Is() && (Str == GetExpertData(Chart)))
      Res = Chart;
    else
      Chart = ::ChartNext(Chart); 

  return(Res); 
}

input int Range1 = 1;
input int Range2 = 1;

int OnInit()
{
  return(!MQLInfoInteger(MQL_TESTER) && IsRunning() &&
         (MessageBox("This EA is already running." +
                     GetExpertData() + "\nRun?", MQLInfoString(MQL_PROGRAM_NAME), MB_YESNO) == IDNO) ?
         INIT_FAILED : INIT_SUCCEEDED);
}
 

// MT4-советник показывает, в каком режиме Long/Short был запущен.

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

int GetLongShortFlag( const int Chart_ID = 0 )
{
  MqlParam Params[];
  string Names[];
  
  const int Res = EXPERT::Parameters(Chart_ID, Params, Names);
  
  return(((Res & 3) << 1) + (Res & 1));
}

string LongShortToString( const int Chart_ID = 0 )
{
  const int Flag = GetLongShortFlag(Chart_ID);
  string Str = NULL;
  
  if ((bool)(Flag & SYMBOL_TRADE_MODE_LONGONLY) && (bool)(Flag & SYMBOL_TRADE_MODE_SHORTONLY))
    Str = "Long & Short";
  else if ((bool)(Flag & SYMBOL_TRADE_MODE_LONGONLY))
    Str = "Only Long";
  else if ((bool)(Flag & SYMBOL_TRADE_MODE_SHORTONLY))
    Str = "Only Short";
    
  return(Str);
}

int OnInit()
{
  Alert(LongShortToString());
  
  return(INIT_FAILED);
}
 

В отличие от MT4, MT5 не выводит в журнал входные параметры советников при его запуске или их изменении. Поэтому по логу невозможно определить, что запускалось в Терминале.

Исправить эту ситуацию может подобная функция.

#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 int inInput1 = 1;
input int inInput2 = 2;

int OnInit()
{
  Print(EAToString());
  
  return(INIT_FAILED);
}


Результат

Test8 (EURUSD,M1)       Expert Experts\Test8.ex5, expertmode = 4
Test8 (EURUSD,M1)       inInput1 = 1
Test8 (EURUSD,M1)       inInput2 = 2


ЗЫ К сожалению, для скриптов не работает. MT4 сам выводит входные параметры скриптов, MT5 - нет.

 
Не получается запустить советника, в котором используются DLL, с помощью данной библиотеки. В логах DLL loading is not allowed. C этим можно, что-то сделать ?