Библиотеки: MultiTester - страница 9

 
fxsaber:

Теперь полная свобода в автоматизации Тестера.

Один из реальных примеров применения (все делается автоматически)

  1. Берутся все символы и следующие пункты проделываются для каждого символа.
  2. Запускаю Оптимизацию.
  3. По завершении берутся данные лучших проходов и из них формируются (задаются диапазоны входных параметров) несколько заданий для оптимизации.
  4. Проводятся все оптимизации из п.3.
  5. Из всех оптимизаций из п.4 берутся лучшие проходы и сохраняются в виде сетов для портфельной торговли.


Получился очень мощный сканер рынка и настройщик ТС. Исходники ТС для таких манипуляций не требуются.

 
// Пример загрузки Set-файла в Тестер.
#property script_show_inputs

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132

input string inFileName = "SetFile.set"; // Set-file

string FileToString( const string FileName )
{
  ushort Buffer[];
  
  return(FileLoad(FileName, Buffer) ? ShortArrayToString(Buffer) : NULL);
}

void OnStart()
{  
  MTTESTER::SetSettings("[TesterInputs]\n" + FileToString(inFileName));
}
Аналогично с ini-файлами Тестера.
 
Спасибо
 
Библиотека обновлена под MT5 build2209+.
 
fxsaber:

Получился очень мощный сканер рынка и настройщик ТС.

#property script_show_inputs

#include <fxsaber\MultiTester\MultiTester.mqh> // https://www.mql5.com/ru/code/26132
#include <fxsaber\MultiTester\Task.mqh>

input bool OnlyCustomSymbols = true; // Только кастомные символы
input bool AllSymbols = false;       // Все символы или текуший

void Add( const string SymbName )
{
  TesterSettings.Add(NULL, SymbName, 0, 0, 0, TASK::InitBase, TASK::DeinitBase);

  for (int i = 0; i < ::inAmount; i++)
    TesterSettings.Add(NULL, NULL, 0, 0, 0, TASK::InitSub, TASK::DeinitSub);
}

// Эта функция отвечает за формирование списка заданий.
void SetTesterSettings()
{
  if (AllSymbols)
    // Перебираем все символы из Обзора рынка.
    for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
    {
      const string Name = SymbolName(i, true);

      if (!OnlyCustomSymbols || SymbolInfoInteger(Name, SYMBOL_CUSTOM))
        Add(Name);
    }
  else if (!OnlyCustomSymbols || SymbolInfoInteger(_Symbol, SYMBOL_CUSTOM))
    Add(_Symbol);
}


В советнике должен быть

sinput int inMinTrades = 500; // Минимальное количество трейдов (позиций).
sinput int inMaxTrades = 90000; // Максимальное количество трейдов (позиций).

double OnTester()
{
  return(((TesterStatistics(STAT_TRADES) >= inMinTrades) && (TesterStatistics(STAT_TRADES) <= inMaxTrades)) ? TesterStatistics(STAT_PROFIT) : 0);
}
 
Получилось обойти несколько подводных камней. Обновлено.
 

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

В логе появляется Done, затем пусто (Start не появляется), а терминал в это время запустил новый проход. Похоже, дело в том, что else if (IsRun = (Init = TesterSettings.Init(Pos)) && TesterSettings.Run(Pos)) возвращает false, поскольку TesterSettings.Run(Pos) вернул false. А уже на следующем проходе таймера else if (MTTESTER::IsReady()) вернёт false, что заставит его крутиться в цикле, ожидая. Сам же TesterSettings.Run(Pos)) возвращает false похоже банально из-за таймаута, т.е. просто не дожидается и выходит.

 

traveller00:

TesterSettings.Run(Pos)) возвращает false похоже банально из-за таймаута, т.е. просто не дожидается и выходит.

Если так, попробуйте увеличить это число

  static bool ClickStart( const bool Check = true, const int Attempts = 5 )

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


Запускал на сотню символов Example3, все отлично отрабатывало.

 
Да, так для себя и сделал, увеличил до 50. Но на всякий случай сообщил, вдруг у кого ещё будет аналогичная проблема или захотите в общей версии подправить.
 
traveller00:
Да, так для себя и сделал, увеличил до 50. Но на всякий случай сообщил, вдруг у кого ещё будет аналогичная проблема или захотите в общей версии подправить.

Поставьте логирование количества попыток, которые потребовались на изменение статуса кнопки. Интересны результаты.


ЗЫ Возможно, этот баг еще влияет.

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