Пиши и зарабатывай на MQL5 - страница 50

 
Rashid Umarov:

Например, в статье Визуализируй стратегию в тестере MetaTrader 5 показано как визуализировать оптимизацию, достаточно в код добавить несколько функций

В статье LifeHack для трейдера: один бэк-тест хорошо, а четыре – лучше  показано как запустить тестирование/оптимизацию из другого терминала. Добавляем автоматический парсинг и модификацию исходного кода на лету и в итого объединяем две статьи в одну.

Это чтобы любой советник/индикатор автоматически наделять доп. возможностями, которыми он не обладал?

Для парсинга и модификации исходного кода понадобится DLL. А ведь можно просто инклудник написать и доп. возможности появятся аналогично. По крайней мере в Вашем примере про визуализацию Оптимизации такое подключение всегда будет работать через инклудник.

А вот если в исходнике есть препроцессинг, то парсинг может быть бессилен здесь.

 
fxsaber:

Для парсинга и модификации исходного кода понадобится DLL. А ведь можно просто инклудник написать и доп. возможности появятся аналогично. По крайней мере в Вашем примере про визуализацию Оптимизации такое подключение всегда будет работать через инклудник.

Я не говорил про запрет на DLL, да - он будет использоваться. Парсим мы для того, чтобы автоматическии найти место, куда вставить инклюдник и прописать в нужные обработчики языка MQL5 вызовы из этого инклюдника.

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

 
Rashid Umarov:

Я не говорил про запрет на DLL, да - он будет использоваться. Парсим мы для того, чтобы автоматическии найти место, куда вставить инклюдник и прописать в нужные обработчики языка MQL5 вызовы из этого инклюдника.

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

Возможно, не достаточно досконально вижу потенциальные проблемы, но, наверное, парсить не нужно. Можно по инклуднику в начале и в конце mq5-файла автоматом поставить без парсинга.

Парсинг работать не будет в некоторых случаях - препроцессор. 

 
Если в советнике уже есть функций OnTester(), то просто добавить её нельзя - нужно вставить точно кусок кода в уже имеющуюся функцию OnTester().
 
Rashid Umarov:
Если в советнике уже есть функций OnTester(), то просто добавить её нельзя - нужно вставить точно кусок кода в уже имеющуюся функцию OnTester().

Как раз в этом проблем нет никаких. Проблема определить, существует ли OnTester или нет в исходном коде. 

 
fxsaber:

Как раз в этом проблем нет никаких. Проблема определить, существует ли OnTester или нет в исходном коде. 

Это не проблема -  распарсить код с помощью регулярных выражений.
 
Rashid Umarov:
Это не проблема -  распарсить код с помощью регулярных выражений.
И здесь не будет проблемы?
#define Func OnTester

void Func()
{
}

#undef Func
 
fxsaber:
И здесь не будет проблемы?

Это пока чисто академическая проблема - попробуйте провести голосование и выяснить, каков процент программистом реально пользуется подобными макросами.

Кроме того, можно будет распарсить и такие варианты.

 
На случай, если OnTester существует, всегда будет работать такой подход (и ничего парсить не потребуется совсем)
#define OnTester Tmp_OnTester

// НАЧАЛО ИСХОДНИКА, В КОТОРЫЙ ВМЕШИВАЕМСЯ
double OnTester()
{
  Print("Original");
  
  return(0);
}
// КОНЕЦ ИСХОДНИКА, В КОТОРЫЙ ВМЕШИВАЕМСЯ
#undef OnTester

double OnTester()
{  
  Print("Addon");
  
  return(Tmp_OnTester());
}
На случай, если OnTester отсутствует - еще проще, конечно. Если бы можно было понять, что OnTester определен без парсинга - было бы совсем здорово.
 
Решил задачу без парсинга! Статья не актуальна теперь. Вот так выглядит
#include "Addon_Begin.mqh"
#include "Addon_Body.mqh" // Здесь прописано, что и куда добавляем

//----------------
// Здесь исходник, который подвергнется изменению
//----------------

#include "Addon_End.mqh"
Вместо парсинга нужно только автоматом уметь добавлять две строчки в начале и одну - в конце.