Предложение по улучшению многопоточности тестирования

 

Уникальность тестера стратегий 5 заключается во-первых в возможности использования истинного мультитестирования, а во вторых в возможности подключения сразу всех имеющихся ядер, сразу на всех доступных процессорах. Это гиганский скачок вперед в плане распределенных вычислений. Но такая колоссальная вычислительная мощь доступна только в режиме перебора параметров. Как и прежде, для одного прогона  задействуется только одно ядро. Как известно, сложность экспертов возрастает. Отныне один единственных эксперт может торговать десятками торговых стратегий, сразу на всех доступных инструментах, сразу на всех возможных таймфреймах. Эта задача требует недюжей вычислительной мощи, но тем более обидно, что такая мощь есть, но она простаивает без дела, т.к. задействован только один поток (перебора ведь нет).

Так почему бы средствами самого языка MQL5 не распараллелить вычисления внутри одного эксперта? Как это можно было бы сделать?  Например ввести поддержку специальных функций похожих на OnTrade(). Особенность бы в этих функциях была бы в том, что каждая из них обрабатывалась бы своим ядром. Например что-то типа такого:

void Core1()
{
   //Здесь обрабатываем стратегию #1 на символе №1
}

void Core2()
{
   //Здесь обрабатываем стратегию #2 на символе №2
}

void CoreN()
{
   //Здесь обрабатываем стратегию #N на символе №N
}
...
Я не силен в вопросах распараллеливания процессов, но уверен, что что-то подобное сделать можно, учитывая что тот же переборщик уже задействует аппаратные мощности на полную катушку.
 
C-4:

Так почему бы средствами самого языка MQL5 не распараллелить вычисления внутри одного эксперта? Как это можно было бы сделать?  Например ввести поддержку специальных функций похожих на OnTrade(). Особенность бы в этих функциях была бы в том, что каждая из них обрабатывалась бы своим ядром. Например что-то типа такого:

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

Например вместо этого:

{
//---
for(int i=0;i<10000;i++)
  b[i]=F();
//--
}

double F()
{
//--
}

использовать что то типа такого:

{
//---
for(int i=0;i<10000;i++)
  b[i]=_OnCore F();
//--
}

double F()
{
//--
}
где _OnCore - инструкция пускать функцию отдельным потоком.


Но, что то я очень сомневаюсь, что это будет реализовано. Это слишком сложно помоему - предаётся переписывать компилятор.

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

 

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

Все бы ни чего, но окружения у них будут разные, в силу организации песочницы. А нужна прозрачная работа внутри одного окружения (переменные, торговые модели, общие системы ММ), но при этом распараллеленная на многие потоки.

 

Но, что то я очень сомневаюсь, что это будет реализовано. Это слишком сложно помоему - предаётся переписывать компилятор.

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

 
C-4:

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

Дело в том, что, как я подозреваю - разработчики могут подтвердить/опровергнуть моё предположение, распараллеливание при оптимизации в тестере есть ни что иное, как создание "виртуальных" отдельных экспертов которые и работают в разных потоках.

А нам нужно что бы распараллеливание происходило в логике эксперта в нём самом - есть разница? А это сделать технически гораздо сложнее, чем реализовать многопоточную  оптимизацию в тестере. Выход как я сказал - реализация спец. префиксов перед отдельными "тяжёлыми" функциями в коде.

 
C-4:

Все бы ни чего, но окружения у них будут разные, в силу организации песочницы. А нужна прозрачная работа внутри одного окружения (переменные, торговые модели, общие системы ММ), но при этом распараллеленная на многие потоки.

Залейте код вычислений которые предполагаете делать в отдельном потоке в индикатор,

передайте всё окружение в виде структуры в этот индикатор,

и вызывайте индикатор в нужном месте советника.

 
Urain:

Залейте код вычислений которые предполагаете делать в отдельном потоке в индикатор,

передайте всё окружение в виде структуры в этот индикатор,

и вызывайте индикатор в нужном месте советника.

Хотите сказать, что код индикаторов и самого эксперта выполняются в разных потоках и на разных ядрах параллельно?
 
C-4:
Хотите сказать, что код индикаторов и самого эксперта выполняются в разных потоках и на разных ядрах параллельно?

Насчёт ядер точно не знаю но что в разных потоках это точно, сам тестер кажется ведёт распараллеливание потоков по ядрам, это процесс автоматический.

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

Вообще хотелось бы услышать комментарий начальника транспортного цеха :о)

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

 
Тут еще и проблема в том что выполнение идет пошагово, Тоесть нельзя к примеру запускать сразу несколько вычислений а приходится дожидаться всех последовательно - паровозиком, тут по идее другая логика должна быть что то вроде граблей.  Одна часть запускает сразу несколько вычислений на доступных ядрах и после уже собирает вычисленные данные и дальше программа снова идет паровозиком.
 
olyakish:
Тут еще и проблема в том что выполнение идет пошагово, Тоесть нельзя к примеру запускать сразу несколько вычислений а приходится дожидаться всех последовательно - паровозиком, тут по идее другая логика должна быть что то вроде граблей.  Одна часть запускает сразу несколько вычислений на доступных ядрах и после уже собирает вычисленные данные и дальше программа снова идет паровозиком.
Вот как раз разъяснения по этому вопросу и хочется услышать от разработчиков.
 
Насчет индикаторов, запущенных из эксперта не уверен, а вот скрипты и эксперты на разных чартах точно в разных потоках - вот на них и можно передавать вычисления. Но тогда не получится использовать тестер.

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