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
попробовал, находясь в директории ( "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"
Результат тот же! То есть отрицательный. Не берет терминал оттуда параметры!
Сама идея запуска ОПТИМИЗАЦИИ прямо из самого советника - и при этом использовать штатный тестер меня занимала чуть ли не с 2006
Когда решал задачу выбрал изначально идею нажимать кнопки тестера в том же самом терминале где и живет эксперт который хочет само - оптимизироваться.
Запускать второй терминал как это в основном все и решают - не стал - мне эта идея не понравилась, хотя она вполне жизнеспособна.
Приведу рабочий пример кучок кода из одного проекта - чуть позже как найду выложу код нажатий кнопок:
Как отследить работу ТЕСТЕРА ну не завис ли он и т п и если он подвис или не смог прогон оптимизации провести за примелемый срок - можно тормознуть его работу.
//+------------------------------------------------------------------+//| Пример зауска по событиям//| Юрий yzh тут должна быть собака м - а - i - l ... рус рус -- это защита от негодяев //+------------------------------------------------------------------+#property strict// Поиск процесса - поиск ОКНА!#import "user32.dll"int FindWindowW(string lpClassName,string lpWindowName);
#import
// в МТ4 теперь можно писать шикарные событийные коды // Можно зациклить и по таймеру - что намного эффективней с точки зрения тормозов// после появления шикарных событий EventKillTimer EventSetTimer// логично такие вещи организовать по таймеру// OnTimer()// данный эксперт как бы будет зацикленный но по таймеру // А работа в цикле вызывает дикие тормоза// Эти строки формируем сами я тестирован на МТ5string 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 часа - т е суткиstaticdatetime gBeginWork=0; // Время начала работы тестераstaticint gCode=0;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+intOnInit() // Бывший Init
{
gCode=idTestNoWorkТестеСейчасНеРЕаботает;
EventSetTimer(1); // Запускаем таймер раз в секундуreturn(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//--- destroy timerEventKillTimer();
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick() // Бывший старт
{
//---/*
эта хрень ниже тоже работает и это старый метот работы он вызыват дикие тормоза т к все зацикленные программы это ЖОППА
теперь в МТ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 |//+------------------------------------------------------------------+voidOnTimer()
{
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 |//+------------------------------------------------------------------+doubleOnTester()
{
//---double ret=0.0;
//---//---return(ret);
}
//+------------------------------------------------------------------+//| ChartEvent function |//+------------------------------------------------------------------+voidOnChartEvent(constint id,
constlong &lparam,
constdouble &dparam,
conststring &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
staticint pusk = 0;
intOnInit()
{
printf( " Init ");
EventSetTimer(1); // скажем так 1 раз в секунду будем вызывать таймер и красиво тикать время return(INIT_SUCCEEDED);
}
voidOnDeinit(constint reason)
{
EventKillTimer();
}
voidOnTick()
{
}
voidOnTimer()
{
// ПРОВЕРЯЕМ СОБЫТИЕ - А МОЖЕТ НАСТУПИЛО ВРЕМЯ ДЛЯ ОПТИМИЗАЦИИ// одно из самых прикольных это оптимизация раз в неделю // но никто не мешает оптимизировать один раз в 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 |//+------------------------------------------------------------------+doubleOnTester()
{
//---double ret=0.0;
//---//---return(ret);
}
//+------------------------------------------------------------------+//| ChartEvent function |//+------------------------------------------------------------------+voidOnChartEvent(constint id,
constlong &lparam,
constdouble &dparam,
conststring &sparam)
{
//---
}
//+------------------------------------------------------------------+
Увы и ах! Я и так как вы пишете пробовал. ( 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 можем написать уже совместно
И наверно стоит обсудить минусы и плюсы этой идеи ( имеется ввиду пуск не второго экземпляра терминала - а просто пуск тестера в текущем терминале )
один из плюсов который вижу - это более удобный контроль процесса
Все таки попробуй отказаться от пуска ЕЩЕ одного экземпляра терминала!
Пробуй следующую идею
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 значений и далее оперировать в ней
прикрепите полный ини файл
Ну полный наверное не стоит, только тестерную часть:
[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
Читал, может чего не понимаю, но:
попробовал, находясь в директории ( "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:terminal1.iniНесколько раз уже Вам сказали, как надо
terminal.exe "C:\Users\MySelf\AppData\Roaming\MetaQuotes\Terminal\1FC724C8C211BFE8ECF8B599A855301E\config\terminal1.ini" terminal.exe terminal1.iniЧто читал? Как читал? Плохо читал
Из какой справки эта строка взялась?
а эта?
Несколько раз уже Вам сказали, как надо
Увы и ах! Я и так как вы пишете пробовал. ( 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
Когда решал задачу выбрал изначально идею нажимать кнопки тестера в том же самом терминале где и живет эксперт который хочет само - оптимизироваться.
Запускать второй терминал как это в основном все и решают - не стал - мне эта идея не понравилась, хотя она вполне жизнеспособна.
Приведу рабочий пример кучок кода из одного проекта - чуть позже как найду выложу код нажатий кнопок:
Как отследить работу ТЕСТЕРА ну не завис ли он и т п и если он подвис или не смог прогон оптимизации провести за примелемый срок - можно тормознуть его работу.
Простой код для изучениея
запускаем тестер по событию
Увы и ах! Я и так как вы пишете пробовал. ( 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, отличная идея и примеры!! Просто блеск!!
Обязательно буду пробовать! Время нужно.
А запуск второго терминала из первого я уже сделал.
Все таки попробуй отказаться от пуска ЕЩЕ одного экземпляра терминала!
Пробуй следующую идею
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 модуль который обработает полученные результаты - выбирающий лучшие параметры и подсовывающий эти параметры советнику),...
Тут я делал достаточно просто !
обычная сортировка по максимальному совпадению
Например:
если выборка давала 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 значений и далее оперировать в ней
и так далее в том же духе
Тут я делал достаточно просто !
обычная сортировка по максимальному совпадению
Интересный подход.
В то же время, я обычно смотрю еще на число сделок. Оно может быть либо очень малым, либо большим.
Как правило в этих случаях forward тест неудачный.
Кстати, Юрий, форвард в автооптимизации используете?