запуск терминала с автоматическим запуском оптимизации - страница 2

 
Vladislav Andruschenko:
прикрепите полный ини файл 

Ну полный наверное не стоит, только тестерную часть:

[Tester]
; имя файла эксперта, который должен быть запущен на тестирование (оптимизацию). Если этот параметр отсутствует, тестирование не будет запущено.
Expert=MyExp.ex4
; имя файла с параметрами советника. Данный файл должен лежать в папке \tester в каталоге установки платформы.
ExpertParameters=MyExp_opt01.set
; название инструмента, который будет использоваться в качестве основного символа тестирования. В случае отсутствия данного параметра будет использован последний выбранный символ в тестере.
Symbol=GBPUSD
; период графика тестирования (любой период из 21 доступного в платформе). Если данный параметр отсутствует, используется период H1.
Period=3
; с помощью данного параметра советнику можно передать значение счета, на котором якобы происходит его тестирование. Необходимость данного параметра закладывается в исходном MQL5-коде советника (при помощи функции AccountInfoInteger).
;Login=
; режим генерации тиков (0 - "Все тики", 1 - "OHLC на M1", 2 - "Только цены открытия", 3 - "Математические вычисления"). Если данный параметр не указан, будет использован режим генерации всех тиков.
Model=3
; режим торговли, которая эмулируется тестером стратегий (0 -  обычный режим, 1 - включена произвольная задержка выполнения торговых приказов).
ExecutionMode=0
; включение/отключение оптимизации и указание ее вида (0 - оптимизация отключена, 1 - "Медленная (Полный перебор параметров)", 2 - "Быстрая (Генетический алгоритм)", 3 - "Все символы, выбранные в окне 'Обзор рынка'").
Optimization=2
; критерий оптимизации для поиска оптимальных параметров: (0 - максимальное значение баланса, 1 - максимальное значение произведения баланса на прибыльность, 2 - произведение баланса на матожидание выигрыша, 3 - максимальное значение выражения  (100% - Просадка)*Баланс, 4 - произведение баланса на фактор восстановления, 5 - произведение баланса на коэффициент Шарпа, 6 - пользовательский критерий оптимизации, получаемый из функции OnTester() в советнике).
OptimizationCriterion=0
; нет в описании:
DateEnable=1
; дата начала диапазона тестирования в формате ГГГГ.ММ.ДД. Если этот параметр не указан, будет использована дата, указанная в соответствующем поле тестера стратегий.
FromDate=2015.02.02
; дата конца диапазона тестирования в формате ГГГГ.ММ.ДД. Если этот параметр не указан, будет использована дата, указанная в соответствующем поле тестера стратегий.
ToDate=2016.02.02
; режим форвард-тестирования (0 - отключено, 1 - 1/2 от периода тестирования, 2 - 1/3 от периода, 3 - 1/4 периода тестирования, 4 - пользовательский период, указанный при помощи параметра ForwardDate).
ForwardMode=0
; начальная дата форвард-тестирования в формате ГГГГ.ММ.ДД. Параметр действует, только если ForwardMode=4.
; ForwardDate
; имя файла, в который будет сохранен отчет о результатах тестирования или оптимизации. Файл будет создан в директории торговой платформы. Относительно данной директории может быть указан путь сохранения файла, например \reports\tester.htm. Если в имени файла не указано его расширение, для отчета о тестировании автоматически будет использовано расширение ".htm", а для отчета об оптимизации - *.xml. В случае отсутствия данного параметра отчет тестирования не будет сохранен в виде файла. При включении форвард-тестирования его результаты будут сохранены отдельным файлом с суффиксом ".forward". Например, tester.forward.htm.
Report=CI_LZma_v3_20160202_opt01.htm
; разрешить/запретить перезапись файла отчета (0 - запретить, 1 - разрешить). Если перезапись запрещена и файл отчета с таким же именем уже существует, то к имени файла будет добавлен порядковый номер в квадратных скобках. Например, tester[1].htm. Если данный параметр отсутствует, используется значение "0" (перезапись запрещена).
ReplaceReport=1
; разрешить/запретить выключение торговой платформы по завершении тестирования (0 - запретить, 1 - разрешить). Если данный параметр отсутствует, используется значение "0" (выключение запрещено). Если процесс тестирования/оптимизации прерывается пользователем вручную, значение данного параметра автоматически сбрасывается на "0".
ShutdownTerminal=1
;  сумма начального депозита для тестирования/оптимизации. Сумма указывается в валюте депозита счета. При отсутствии данного параметра используется сумма, указанная в соответствующем поле тестера стратегий.
Deposit=15000
; кредитное плечо, которое будет использовано при тестировании/оптимизации. Например, 1:100. При отсутствии данного параметра используется плечо, указанное в соответствующем поле тестера стратегий.
Leverage=1:500
; включение/отключения возможности использования локальных агентов для тестирования и оптимизации (0 - отключить, 1 - включить). При отсутствии данного параметра используются текущие настройки платформы.
UseLocal=0
; включение/отключения возможности использования удаленных агентов для тестирования и оптимизации (0 - отключить, 1 - включить). При отсутствии данного параметра используются текущие настройки платформы.
UseRemote=0
; включение/отключения возможности использования агентов сети облачных вычислений MQL5 Cloud Network (0 - отключить, 1 - включить). При отсутствии данного параметра используются текущие настройки платформы.
UseCloud=0
;  включить (1) или выключить (0) тестирование в визуальном режиме. Если параметр не указан, используется текущая настройка.
Visual=0
; нет в описании:
Spread=31

 
mt5trade:

Читал, может чего не понимаю, но:

попробовал, находясь в директории ( "C:\Program Files (x86)\Alpari Limited MT4\"  ) и положив в C:\Users\MySelf\AppData\Roaming\MetaQuotes\Terminal\1FC724C8C211BFE8ECF8B599A855301E\config\ файл terminal1.ini:
Команда:     terminal.exe /config:"C:\Users\MySelf\AppData\Roaming\MetaQuotes\Terminal\1FC724C8C211BFE8ECF8B599A855301E\config\terminal1.ini"

Результат тот же! То есть отрицательный. Не берет терминал оттуда параметры!

Попробовал и так :

terminal.exe /config:"C:\Users\MySelf\AppData\Roaming\MetaQuotes\Terminal\1FC724C8C211BFE8ECF8B599A855301E\config\terminal1.ini"

То же самое!!

Также пробовал и terminal.exe /config:terminal1.ini

Не работает!

Что читал? Как читал? Плохо читал

Из какой справки эта строка взялась?

terminal.exe /config:"C:\Users\MySelf\AppData\Roaming\MetaQuotes\Terminal\1FC724C8C211BFE8ECF8B599A855301E\config\terminal1.ini"

а эта?

terminal.exe /config:terminal1.ini

Несколько раз уже Вам сказали, как надо

terminal.exe "C:\Users\MySelf\AppData\Roaming\MetaQuotes\Terminal\1FC724C8C211BFE8ECF8B599A855301E\config\terminal1.ini"
terminal.exe terminal1.ini
 
Slawa:

Что читал? Как читал? Плохо читал

Из какой справки эта строка взялась?

а эта?

Несколько раз уже Вам сказали, как надо

Увы и ах! Я и так как вы пишете пробовал. ( terminal.exe terminal1.ini ) И сейчас вновь попробовал.

НЕ РАБОТАЕТ!

Спред в terminal.ini выставлен 18, он и отображается, не смотря на то, что команду я даю: terminal.exe terminal1.ini

В terminal1.ini спред выставлен 31.

Сейчас еще с полным путем попробую.

Попробовал: terminal.exe "C:\Users\MySelf\AppData\Roaming\MetaQuotes\Terminal\1FC724C8C211BFE8ECF8B599A855301E\config\terminal1.ini"

Всё так же!

 

Сама идея запуска ОПТИМИЗАЦИИ прямо из самого советника - и при этом использовать штатный тестер меня занимала чуть ли не с 2006

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

Запускать второй терминал как это в основном все и решают - не стал - мне эта идея не понравилась, хотя она вполне жизнеспособна.

Приведу рабочий пример кучок кода из одного проекта - чуть позже как найду выложу код нажатий кнопок:

Как отследить работу ТЕСТЕРА ну не завис ли он и т п и если он подвис или не смог прогон оптимизации провести за примелемый срок - можно тормознуть его работу.

 
//+------------------------------------------------------------------+
//| Пример зауска по событиям
//| Юрий     yzh  тут должна быть собака   м - а - i - l  ... рус рус   -- это защита от негодяев  
//+------------------------------------------------------------------+
#property strict

// Поиск процесса -  поиск ОКНА!
#import "user32.dll"
int      FindWindowW(string lpClassName,string lpWindowName);
#import

// в МТ4 теперь можно писать шикарные событийные коды 
// Можно зациклить и по таймеру - что намного эффективней с точки зрения  тормозов
// после появления шикарных событий EventKillTimer  EventSetTimer
// логично такие вещи организовать по таймеру
// OnTimer()

// данный эксперт как бы будет зацикленный но по таймеру 
// А работа в цикле вызывает дикие тормоза


// Эти строки формируем сами я тестирован на МТ5
string sClassName="MetaQuotes::MetaTrader::5.00"; // "MetaQuotes::MetaTrader::4.00";

                                                  // у себя организуй формирование этой  строки
// Ты знаешь на каком ТФ  будешь тестить -  знаешь СИМВОЛ который теситишь и знаешь номер счета  к которому цепляешься 
// ( и так же реал или демка ) - как правило боевые тесты -  оптимизации гоняют на реалах
//

//
// C помощью SPY.EXE найди в списке MT4
// правой кнопкой посмотри свойства Windows Caption - закладука GENERAL 
// и Class Name  на закладке Class 
//
string sWindowsCaption="1783900 - MetaQuotes-Demo - Демо-счет - [NZDUSD,M15]";
//
// ВНИМАНИЕ!!! т терминал на котором будет крутиться данный советик
// должен стоять на другом счете или хотя бы на другом символе который никогда не будешь тестировать
//


// состояния событий
#define  idTestestТестерПОДВИС                 -1
#define  idTestNoWorkТестеСейчасНеРЕаботает     0 
#define  idTestBeginWorkТестерЗапустили         1 
#define  idTesterWorkТестерРаботает             2
#define  idTestOKТестерШикарноОтработал         3 


#define  gHOUR_СколькоВремениМожетРаботать      3600  // 1-час

// #define  gHOUR_СколькоВремениМожетРаботать   1800  // 30-минут
// #define  gHOUR_СколькоВремениМожетРаботать   600   // 10-минут и т д
// #define  gHOUR_СколькоВремениМожетРаботать   600   // 10-минут и т д
// #define  gHOUR_СколькоВремениМожетРаботать   84600 // 24 часа - т е сутки

static datetime gBeginWork=0; // Время начала работы тестера

static int gCode=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit() // Бывший Init
  {
   gCode=idTestNoWorkТестеСейчасНеРЕаботает;
   EventSetTimer(1);  //  Запускаем таймер раз в секунду
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() // Бывший старт
  {
//---

/* 
эта хрень ниже тоже работает и это старый метот работы он вызыват дикие тормоза т к все зацикленные программы это ЖОППА
теперь в МТ4  есть класнная штука OnTimer()
и теперь настоящие мужчины пишут коды событийные  

   int h=-1;

   datetime BeginWork=TimeCurrent();
   for(;;) // Ждем бесконечно пока выгрузиться наш терминал который тестор запустил на определенном счете инструменте и тф
     {
      h=FindWindowW(sClassName,sWindowsCaption);  //,"MetaQuotes::MetaTrader::5.00"); // 
      if(h!=0)
        {
         Sleep(500);
         Comment("Работает   "+DecToHex(h)+" "+sClassName+" "+sWindowsCaption); // 

         if(BeginWork+gHOUR_СколькоВремениМожетРаботать <=TimeCurrent()) // нужно предусмотреть аварийный выход ( через заранее БОЛЬШОЕ определенное время в случае зависания ТЕСТЕРНОГО терминала
           {
            gCode=idTestestТестерПОДВИС;
            break;
           }
         gCode=idTesterWorkТестерРаботает;
        }
      else
        {
         Comment("выгружен ");
         gCode=idTestOKТестерШикарноОтработал;
         break; // выходим        
        }
     }
   Comment(" ВЫГРУЗИЛИ ");

*/

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string DecToHex(int n)
  {
   string s="",c;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   while(n!=0)
     {
      if(n%16<10)
         c=CharToStr(n%16+'0');
      else
         c=CharToStr(n%16+'A'-10);
      s = c + s;
      n = n / 16;
     }
   return(s);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   int h=-1;
   h=FindWindowW(sClassName,sWindowsCaption);
   if(h!=0)
     {
      if(gCode == idTestNoWorkТестеСейчасНеРЕаботает )
         gCode = idTestBeginWorkТестерЗапустили;

      Comment("Работает   "+DecToHex(h)+" "+sClassName+" "+sWindowsCaption); // 
      if(gCode==idTesterWorkТестерРаботает)
        {
         if(gBeginWork+gHOUR_СколькоВремениМожетРаботать<=TimeLocal())
           {
            // ПРОШЕЛ 1 час - нужно предусмотреть аварийный выход свер лимита
            //( через заранее БОЛЬШОЕ определенное время в случае зависания ТЕСТЕРНОГО терминала
            gCode=idTestestТестерПОДВИС;  // Поставил дял примера 1 час  gHOUR_СколькоВремениМожетРаботать  = 3600 это час
           }
        }

     }
   else
     {
      if(gCode== idTesterWorkТестерРаботает )
         gCode=idTestOKТестерШикарноОтработал;
     }
   gMonitor(); // Запускаем монитор
  }
//+------------------------------------------------------------------+
//| Мониторинг событий                                               |
//+------------------------------------------------------------------+
void   gMonitor(void)
  {
//
// Ниже идет обработка событий
// Анализируем коды событий в таймере - что бы полноценно использовать программу 
// мы все вешаем на таймер что позволит запускать тестирование даже в выходные когда тики не приходят
//
   if(gCode==idTestBeginWorkТестерЗапустили) // Обработаем событи запуска тестера
     {
      gBeginWork=TimeLocal(); // Читаем локальное время  машины т к в выходные тики не приходят и TimeCurrent() не подходит
                              // Тут можно что то проинициализировать разные переменные и какие либо действия предпринять

      gCode=idTesterWorkТестерРаботает; // Переводим событие в новое состояние
     }
   if(gCode==idTestOKТестерШикарноОтработал)
     {
      gCode=idTestNoWorkТестеСейчасНеРЕаботает;
      gBeginWork=TimeLocal();
      // тут можно предпринять следующие шаги - например поднять результаты тестера обработь их 
      // и затем  пустить другую задачу тестирования
     }
   if(gCode==idTestNoWorkТестеСейчасНеРЕаботает)
     {
      gBeginWork=TimeLocal();
      Comment(" Тестер не запущен ");
     }

   if(gCode==idTesterWorkТестерРаботает) // Событие - ураа тестер пашет
     {
      Comment(" Тестер запущен "+TimeToString(TimeLocal(),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+" запустили в это время = "+TimeToString(gBeginWork,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
     }
   if(gCode==idTestestТестерПОДВИС)
     {
      Comment(" Тестер подвис  - теоритически можно вызвать принудительное завершение ТЕРМИНАЛА который завис - но это тема нас пока не волнует ? ");
      // выгрузить  зависший терминал
     }

  }
//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret=0.0;
//---

//---
   return(ret);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---

  }
//+------------------------------------------------------------------+
 

Простой код для изучениея

запускаем тестер по событию


//+------------------------------------------------------------------+
//| Юрий     yzh  тут должна быть собака   м - а - i - l  ... рус рус   -- это защита от негодяев  
//+------------------------------------------------------------------+
#property copyright "Copyright 2006-2016, YURAZ Developer"
#property version   "1.00"
#property strict

#define VK_RETURN 0x0D
#define VK_ESCAPE 0x1B
#define WM_COMMAND                     0x0111


#import "user32.dll"
int   GetAncestor(int hWnd,int gaFlags);
int   GetDlgItem(int hDlg,int nIDDlgItem);
int   SetWindowTextW(int hWnd,string lpString);
int   GetWindowTextW(int hWnd,string &lpString,int nMaxCount);
int   PostMessageW(int hWnd,int Msg,int wParam,int lParam);
#import


static int pusk = 0;

int OnInit()
  {
   printf( " Init ");
   EventSetTimer(1); // скажем так 1 раз в секунду будем вызывать таймер и красиво тикать время 
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   EventKillTimer();
  }
void OnTick()
  {
  }

void OnTimer()
  {
    
//    ПРОВЕРЯЕМ СОБЫТИЕ - А МОЖЕТ НАСТУПИЛО ВРЕМЯ ДЛЯ ОПТИМИЗАЦИИ
// одно из самых прикольных это оптимизация раз в неделю 
// но никто не мешает оптимизировать один раз  в 24 часа - хотя наверно это слишком 
     
     if (  DayOfWeek() == 6 &&  Hour()  == 4  )  // настала суббота  4 утра - по хорошему бы проверить  , но надо   понимать что есть дилинги которые в субботу не прекращают потоко котировок
     {
        TesterPusk();
     }
    if ( pusk == 10 ) // ннну тут прост очто бы не ждать до субботу раз в 10 секунд пробуем нажать оптимизацию - пр иусловии что она не работает
    {
    
        printf( " ПУСК  " );
        TesterPusk();
        
    }
    else
      pusk++;
    
    printf( "Время " );
  }

void TesterPusk()
{
   string sButtonStartName = "      ";

   int hMetaTrader,hTerminal,hTester,hButtonStart;
   hMetaTrader=GetAncestor(WindowHandle(Symbol(),Period()),2); //дескриптор основного окна терминала
   hTerminal=GetDlgItem(hMetaTrader,0xE81E); // Ltcrhbgnjh
   hTester=GetDlgItem(hTerminal,0x53); // дескриптор основного окна ТЕСТЕРА
   hButtonStart=GetDlgItem(GetDlgItem(hTester,0x81BF),0x40A);  //дескриптор кнопки "Старт"
   GetWindowTextW( hButtonStart,  sButtonStartName ,6);                        // Cчитываем текст кнопки запуска тестера

   if ( sButtonStartName == "Старт" || sButtonStartName == "Start" ) 
   {
       printf( " Нажали START " );
       PostMessageW(GetDlgItem(hTester,0x81BF),WM_COMMAND,0x40A,hButtonStart);  // Нажимаем кнопку старт
   }
   else
   (
   
   } // оптимизация уже запущена
}


//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret=0.0;
//---

//---
   return(ret);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---

  }
//+------------------------------------------------------------------+
 
mt5trade:

Увы и ах! Я и так как вы пишете пробовал. ( terminal.exe terminal1.ini ) И сейчас вновь попробовал.

НЕ РАБОТАЕТ!

....


Все таки попробуй  отказаться от пуска ЕЩЕ одного экземпляра  терминала!


Пробуй  следующую идею

MT4

1-есть  советник  , он торгует , в советнике включаем OnTimer - и пишем следующие модули


   1.1 модуль пуска по событию

   1.1.1  Выбираем советник чарт  - период  - модель оптимизации -  период - спред -  нажимаем [x] оптимизация  - выбираем период дату начала и дату конца  [x] отключаем чекбокс  визуализация и давим кнопку старт !

   1.2  Далее - модуль контролирующий работу тестера - и в случае  чего можно даже тормозить встроенный тестер

   1.3 модуль который обработает полученные результаты - выбирающий лучшие параметры и подсовывающий эти параметры советнику

       ( т е мы получаем  САМО ОПТИМИЗИРУЮЩУЮСЯ стратегию  )


2-по событию OnTime отслеживаем  - заданный нами момент начала тестирования

3-Наступает событие - советник запускает ТЕСТЕР причем просто наэжимая кнопку старт в этом же терминале!  т е не запускает еще один экземпляр терминала - с передачей ему параметров  а стартует СВОЙ же тестер     ( ПРИ ЭТОМ САМ СОВЕТНИК продолжает работать и даже может отрывать и закрывать позиции )

--

дал примеры кодов  1.1   , 1.2 

частично дал пример  1.1.1   пока без  детального выбора   параметров ,   

модуль 1.3   можем написать уже совместно 


И наверно стоит обсудить минусы  и плюсы этой идеи ( имеется ввиду пуск не второго экземпляра терминала  - а просто пуск тестера в текущем терминале )

один из плюсов который вижу - это более удобный контроль процесса



 

Yuriy Zaytsev, отличная идея и примеры!! Просто блеск!!

Обязательно буду пробовать! Время нужно.

А запуск второго терминала из первого я уже сделал.

 
Yuriy Zaytsev:


Все таки попробуй  отказаться от пуска ЕЩЕ одного экземпляра  терминала!


Пробуй  следующую идею

MT4

1-есть  советник  , он торгует , в советнике включаем OnTimer - и пишем следующие модули


   1.1 модуль пуска по событию

   1.1.1  Выбираем советник чарт  - период  - модель оптимизации -  период - спред -  нажимаем [x] оптимизация  - выбираем период дату начала и дату конца  [x] отключаем чекбокс  визуализация и давим кнопку старт !

   1.2  Далее - модуль контролирующий работу тестера - и в случае  чего можно даже тормозить встроенный тестер

   1.3 модуль который обработает полученные результаты - выбирающий лучшие параметры и подсовывающий эти параметры советнику

       ( т е мы получаем  САМО ОПТИМИЗИРУЮЩУЮСЯ стратегию  )


2-по событию OnTime отслеживаем  - заданный нами момент начала тестирования

3-Наступает событие - советник запускает ТЕСТЕР причем просто наэжимая кнопку старт в этом же терминале!  т е не запускает еще один экземпляр терминала - с передачей ему параметров  а стартует СВОЙ же тестер     ( ПРИ ЭТОМ САМ СОВЕТНИК продолжает работать и даже может отрывать и закрывать позиции )

--

дал примеры кодов  1.1   , 1.2 

частично дал пример  1.1.1   пока без  детального выбора   параметров ,   

модуль 1.3   можем написать уже совместно 


И наверно стоит обсудить минусы  и плюсы этой идеи ( имеется ввиду пуск не второго экземпляра терминала  - а просто пуск тестера в текущем терминале )

один из плюсов который вижу - это более удобный контроль процесса



На мой взгляд самая востребована часть (1.3 модуль который обработает полученные результаты - выбирающий лучшие параметры и подсовывающий эти параметры советнику), которую еще надо написать.
 
lilita bogachkova:
На мой взгляд самая востребована часть (1.3 модуль который обработает полученные результаты - выбирающий лучшие параметры и подсовывающий эти параметры советнику),...

Тут я делал достаточно просто !


обычная сортировка по максимальному совпадению


Например:

если выборка давала 10 -20  лучших одинаковых результатов! по прибыли

то параметры выбирались те которые  чаще совпадали 

отбрасывались пиковые  а так же отбрасывалось те  которые давали  слишком неприемлемую просадку.

--

например:


профит 1200$ был лучшим и попадал скажем 10 раз


1)  анализ выбирал те параметры которые чаще  совпадали

обычный селект    итак  чаще встречается P4 = 20 -  значит  берем его

P1 = встечается чаще  - как 1.0  значит берем его  P1 = 1

с P2 веселей =  но тут просто берем середину из тех которые ближе к друг другу по значению

и берем среднее  4.01  и так оно ближе к 4.0   - значит   берем  P1 = 4.0


а вот P3  как бы  не имеет проблем - значит  P4 = 3.4



1200$  |   P1 = 1.0  | P2 = 4.0  | P3 = 3.4 | P4=20

1200$  |   P1 = 1.0 | P2 = 4.12  | P3 = 3.4 | P4=20

1200$  |   P1 = 1.1 | P2 = 3.8 | P3 = 3.4 | P4=20

1200$  |   P1 = 1.1 | P2 = 3.2  | P3 = 3.4 | P4=20

1200$  |   P1 = 1.2 | P2 = 4.1  | P3 = 3.4 | P4=20

1200$  |   P1 = 1.3 | P2 = 4.2  | P3 = 3.4 | P4=20

1200$  |   P1 = 1.0 | P2 = 4.21  | P3 = 3.4 | P4=21

1200$  |   P1 = 1.0 | P2 = 4.22  | P3 = 3.4 | P4=19

1200$  |   P1 = 1.0 | P2 = 4.13 | P3 = 3.4 | P4=17

1200$  |   P1 = 1 | P2 = 4.121  | P3 = 3.4 | P4=21

-------------------------

900$  |   P1 = 1 | P2 = 4 | P3 = 1.4 | P4=45

700$  |   P1 = 1 | P2 = 4 | P3 = 2.4 | P4=44

700$  |   P1 = 1 | P2 = 4 | P3 = 8.4 | P4=49

700$  |   P1 = 1 | P2 = 4 | P3 = 2.4 | P4=61

500$  |   P1 = 1 | P2 = 4 | P3 = 3.14 | P4=63

500$  |   P1 = 1 | P2 = 4 | P3 = 3.23 | P4=71

---


Веселей будет играть с ситуацией



1231$  |   P1 = 1.0  | P2 = 4.0  | P3 = 3.4 | P4=20

1221$  |   P1 = 1.0 | P2 = 4.12  | P3 = 3.4 | P4=20

1200$  |   P1 = 1.1 | P2 = 3.8 | P3 = 3.4 | P4=20

1200$  |   P1 = 1.1 | P2 = 3.2  | P3 = 3.4 | P4=20

1200$  |   P1 = 1.2 | P2 = 4.1  | P3 = 3.4 | P4=20

1200$  |   P1 = 1.3 | P2 = 4.2  | P3 = 3.4 | P4=20

1200$  |   P1 = 1.0 | P2 = 4.21  | P3 = 3.4 | P4=21

1200$  |   P1 = 1.0 | P2 = 4.22  | P3 = 3.4 | P4=19

1190$  |   P1 = 1.0 | P2 = 4.13 | P3 = 3.4 | P4=17

1180$  |   P1 = 1 | P2 = 4.121  | P3 = 3.4 | P4=21


тогда предпочитаю тогда играть с выборкой  из 6  значений и далее оперировать в ней

и так далее в том же духе

 
Yuriy Zaytsev:

Тут я делал достаточно просто !

обычная сортировка по максимальному совпадению

Интересный подход.

В то же время, я обычно смотрю еще на число сделок. Оно может быть либо очень малым, либо большим.

Как правило в этих случаях forward тест неудачный.

Кстати, Юрий, форвард в автооптимизации используете?

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