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

 

Посмотрел у себя, действительно по некоторым символам не появились файлы с тиковой историей, просмотрел лог а там такое:

2020.02.12 16:02:30.144 Core 1  NZDUSD : real ticks begin from 2017.01.02 00:00:00

Теперь понятно, остальное было симуляцией.


Кстати MultiTester не переключает символ на свернутом терминале, лучше добавить открытие окна перед началом нового прохода. Я пока такую функцию в fInit добавил.

bool ActivateTerminalWindow(){
   HANDLE ChartWindow = (HANDLE)ChartGetInteger(0, CHART_WINDOW_HANDLE);
   if(ChartWindow){
      HANDLE TerminalWindow = GetParent(ChartWindow);
      TerminalWindow = GetParent(TerminalWindow);
      TerminalWindow = GetParent(TerminalWindow);
      if(TerminalWindow){
         ShowWindow(TerminalWindow, 3);
         return true;
      }
   }
   return false;
}
 
Evgenii Kuznetsov:

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

Не проверял, не сталкивался.

 
fxsaber:

В итоге сделал такое. Формируем пачку заданий из ini-файлов и шлем ее на выполнение.

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

Советники: Validate

fxsaber, 2020.02.22 10:46

Когда нужно выполнить много различных Тестерных заданий, то пользуюсь такой возможностью Validate.


1. Настраиваю задание в Тестере, которую хочу запустить.

2. Во вкладке Настройки нажимаю CTRL+C. Тем самым в буфере обмена появляются все настройки.

3. Через CTRL+V копирую эти настройки в ini-файл, который помещаю в папку с заданиями.

4. Так создают нужное количество заданий - ini-файлы (на скрине четыре задания).


5. При запуске Validate указываю название папки, где лежат задания.


Все, теперь Validate со всеми своими фишками выполнит эти задания.


MultiTester-производные использую только в специфических случаях, когда нужно создавать задания по ходу выполнения.

Для запуска пачки любых готовых заданий рекомендую использовать Validate.

 

Просьба поделиться опытом, как правильно делать ГА. Столкнулся с ситуацией, когда ГА находит только один из нужных локальных экстремумов.

Для конкретной ТС/символа понимаю, где искать, поэтому делаю ГА по разным диапазонам. Но в общем виде - не ясно, как действовать.

 
fxsaber:

Просьба поделиться опытом, как правильно делать ГА. Столкнулся с ситуацией, когда ГА находит только один из нужных локальных экстремумов.

Для конкретной ТС/символа понимаю, где искать, поэтому делаю ГА по разным диапазонам. Но в общем виде - не ясно, как действовать.

Вот тут, кажется, было что-то по теме - https://www.mql5.com/ru/forum/87536

Ну, или автора позвать (@Andrey Dik)

Чемпионат Алгоритмов Оптимизации.
Чемпионат Алгоритмов Оптимизации.
  • 2016.06.09
  • www.mql5.com
Чемпионат алгоритмов оптимизации задуман как соревнование для людей ищущих, любознательных, для которых стоять на месте означает движение назад...
 
Andrey Khatimlianskii:

Вот тут, кажется, было что-то по теме - https://www.mql5.com/ru/forum/87536

Ну, или автора позвать (@Andrey Dik)

Вопросы задаю в контексте использования MT5-Тестера. Поэтому кастомные алгоритмы Оптимизации не подходят.

 
fxsaber:

Просьба поделиться опытом, как правильно делать ГА. Столкнулся с ситуацией, когда ГА находит только один из нужных локальных экстремумов.

Для конкретной ТС/символа понимаю, где искать, поэтому делаю ГА по разным диапазонам. Но в общем виде - не ясно, как действовать.

я сейчас останавливаю тестирование если просадка большая

ну и чтобы ГА чуть "взбодрить" делаю сейчас так:

#define TESTER_STOP(ret) { EA_STOP = true; TesterStop(); return ret; }
double OnTester()
{
   srand((int)TimeCurrent());
//  if(StartHour==20 && CountHours==22) return (-(rand() % 1000));                                      // это использую если ГА начал по времени работы вокруг одного максимума сходиться

   if(EA_STOP) return (-(rand() % 1000));                                                               // неудачный тест, прерываю по большой просадке

   int o_count = 0;
   for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderType() < 2) o_count++;
   }
   if(o_count < 160) return (-(rand() % 1000));                                                         // не менее 160 сделок за полгода ищу

   return(AccountInfoDouble(ACCOUNT_BALANCE));
}


void OnTick()
{
   if(IS_OPTIMIZATION)
   {
      double balance = AccountInfoDouble(ACCOUNT_BALANCE);
      MaxBalance = fmax(MaxBalance, balance);
      if(MaxBalance - balance > 200) TESTER_STOP();                                                     // останавливаю тест при просадке в 200$
   }


по такой методе тестирую последнюю неделю, сейчас очень доволен ГА

 

Я в своём оптимизаторе повторяю GA пока за 4 раза не будет улучшения последнего результата. Может получиться с десяток или более попыток. Обычно получаю хорошие результаты. Хоть и долго.

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

Кроме того, ввёл микроштрафы (доп. мутаген) в OnTester. При этом GA выполняет большее число проходов из-за более частых мутаций, и в результате чаще всего находятся новые максимумы.

// Микроштрафы, чтобы выбирать меньшее значение параметра при равных результатах
res -= BP * 0.0001 / 200;       // Делим на диапазон оптимизации (0...200)
 
Igor Makanu:

я сейчас останавливаю тестирование если просадка большая

ну и чтобы ГА чуть "взбодрить" делаю сейчас так:

по такой методе тестирую последнюю неделю, сейчас очень доволен ГА

Примерно так же делаю. Контроль просадки - чтобы быстрее шла Оптимизация, а контроль количества сделок - чтобы лучше направлять ГА, отсеивая мусор.

Но этого мало.


ЗЫ Так дешевле.

TesterStatistics(STAT_TRADES)
 
Edgar Akhmadeev:

ввёл микроштрафы (доп. мутаген) в OnTester. При этом GA выполняет большее число проходов из-за более частых мутаций, и в результате чаще всего находятся новые максимумы.

Просьба пояснить.