Торговые системы: Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота (Продолжение) - страница 2

 
Kadet:
Хотел бы повторить свой вопрос.

А возможна ли реализация автоматическая-циклическая реализация бэк-тэстинга? Т.е. есть такая идея. Попробую описать.

1-й цикл - Идёт обычная оптимизация по 0-му периоду (т.е. по периоду оптимизации - 3 мес. как это реализовано у Вас). После его окончания - автоматически запускается 2-й цикл.

2-й цикл - Идёт вторичная оптимизация, но уже по периоду тестирования (4-й и 5-й месяцы), и параметры берутся не огульно по ГА, а из результатов первой оптимизации.

Т.е. получится как бы двойной прогон на одних и тех же параметрах.

Возможна ли реализация в MQ-4 такой задачи?

Я приношу свои извинения! Вы были абсолютно правы  В код попала лишняя переменная не туда, куда надо и по этой причине получился косяк! я её убрал в коде, который был расположен ниже. Но всё равно, постах много лишней воды, поневоле озвереешь! Что касается двойных прогонов, то это реализуется только на двух метатрейдерах. Для этого во втором метатрейдере в тестере работает такой же эксперт, но функция для определения периода оптимизации малость другая. после первого цикла сохраняем оптимизированные параметры эксперта в файл и загружаем их во второй тестер и оптимизируем их там по второму циклу. Только во втором тестере параметр  Start_Time следует подвинуть на величину Opt_Period и поставить нужный Test_Period. Вот вариант функции:

//+==================================================================+
//| IsOptimizationTime.mqh |
//| Copyright © 2008, Nikolay Kositsin | 
//| Khabarovsk, farria@mail.redcom.ru | 
//+==================================================================+
//---- Объявления внешних переменных для бэктестинга
extern datetime Start_Time = D'2007.01.01'; // время старта нулевой 
//оптимизации
extern int Opt_Period = 3; // период оптимизации в месяцах, если 
//значение периода меньше нуля, то все параметры измеряются в днях
extern int Period_Shift = 1; //шаг сдвига периода оптимизации в 
//месяцах
extern int Opt_Number = 0; // номер оптимизации 
//+==================================================================+
//| IsOptimizationTime() |
//+==================================================================+
bool IsOptimizationTime()
{
//----+
//---- Объявления статических переменных времени
static datetime OptStart_Time, OptEnd_Time;
//---- Объявления статических логических переменных
static bool SecondStart;
if (!SecondStart)
{
//----+ БЭКТЕСТИНГ ДЛЯ ДНЕВНЫХ ИНТЕРВАЛОВ 
if (Opt_Period > 0)
{ 
//----+ ИНИЦИАЛИЗАЦИЯ КОНСТАНТ ДЛЯ ОПТИМИЗАЦИИ
int newmonth, newyear;
string StartTime, OptDay; 
//---
StartTime = TimeToStr(Start_Time, TIME_DATE);
OptDay = StringSubstr(StartTime, 8, 9);
newyear = 
StrToInteger(StringSubstr(StartTime, 0, 4));
newmonth = 
StrToInteger(StringSubstr(StartTime, 5, 6));
//---
newmonth += Opt_Number * Period_Shift;
OptStart_Time = 
CountTime(newmonth, newyear, OptDay);
//----
newmonth += MathAbs(Opt_Period);
OptEnd_Time = 
CountTime(newmonth, newyear, OptDay); 
//----
SecondStart = true;
} 
//----+ БЭКТЕСТИНГ ДЛЯ ЧАСОВЫХ ИНТЕРВАЛОВ 
if (Opt_Period < 0)
{
//----+ ИНИЦИАЛИЗАЦИЯ КОНСТАНТ ДЛЯ ОПТИМИЗАЦИИ
OptStart_Time = 
Start_Time + Opt_Number
* Period_Shift * 3600 * 24;
OptEnd_Time = 
OptStart_Time 
+ MathAbs(Opt_Period) * 3600 * 24;
SecondStart = true;
} 
} 
//----+ ПРОВЕРКА ВЫПОЛНЕНИЯ УСЛОВИЙ ОПТИМИЗАЦИИ
//----+ +--------------------------------------------------------+
datetime TimeCar = TimeCurrent(); 
if (IsOptimization() || IsTesting())
if (TimeCar < OptStart_Time 
|| TimeCar > OptEnd_Time)
return(false);
//----+ +--------------------------------------------------------+
return(true);
//----+
}
//+==================================================================+
//| CountTime() |
//+==================================================================+
datetime CountTime(int& newmonth, int&newyear, string OptDay)
{
//----+
string sResaltTime;
datetime dResaltTime;
//---
if (newmonth > 12)
{
newyear += MathFloor(newmonth / 12.0);
newmonth = MathMod(newmonth, 12); 
}
//--- 
if (newmonth > 9)
sResaltTime = StringConcatenate
(newyear, ".", newmonth, ".", OptDay);
else
sResaltTime = StringConcatenate
(newyear, ".0", newmonth, ".", OptDay);
//--- 
dResaltTime = StrToTime(sResaltTime);
return(dResaltTime);
//----+
}
//----+ +---------------------------------------------------------------+
 
GODZILLA:
Но всё равно, постах много лишней воды, поневоле озвереешь!

Извините... В дальнейшем постараюсь быть более лаконичным.

 
Николай, возможно мы друг друга не поняли.

Я внимательно проанализировал код Вашей программы, но не нашёл в ней того чего искал. Насколько я понял предлагаемая Вами программа просто варирует синтервалами оптимизации и тестирования. Возможно Вы не поняли суть моего вопроса.

Эх, придётся опять водички налить. :)

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

Я же предлагал другой вариант. После выполнения первой оптимизации в окне "результаты оптимизации" тестового терминала выдаётся таблица в которой выдаются результаты всех положительных проходов. Вот если бы ВСЕ эти результаты загрузить как шаги повторной оптимизации.

Извините, но ещё больше детализирую на цифрах. Допустим советник оптимизируется по трём переменным - х1, х2, х3.

После первой оптимизации выдаются наборы параметров, типа:

1-й проход - х1=5, х2=15, х3=30... и прочая информация: прибыль, просадка и т.д.;

2-й проход - х1=20, х2=4, х3=18... ;

3-й проход - х1=43, х2=26, х3=8... ;

... и т.д.

Та вот, вторую оптимизацию по следующему периоду хотелось бы проводить не на случайных параметрах х1, х2, х3, а брать только те комбинации этих параметров, которые уже были предложены после первой оптимизации, а все прочие - просто опустить.

Вот я что имел ввиду...

 
Kadet:
Николай, возможно мы друг друга не поняли.

Я внимательно проанализировал код Вашей программы, но не нашёл в ней того чего искал. Насколько я понял предлагаемая Вами программа просто варирует синтервалами оптимизации и тестирования. Возможно Вы не поняли суть моего вопроса.

Эх, придётся опять водички налить. :)

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

Я же предлагал другой вариант. После выполнения первой оптимизации в окне "результаты оптимизации" тестового терминала выдаётся таблица в которой выдаются результаты всех положительных проходов. Вот если бы ВСЕ эти результаты загрузить как шаги повторной оптимизации.

Извините, но ещё больше детализирую на цифрах. Допустим советник оптимизируется по трём переменным - х1, х2, х3.

После первой оптимизации выдаются наборы параметров, типа:

1-й проход - х1=5, х2=15, х3=30... и прочая информация: прибыль, просадка и т.д.;

2-й проход - х1=20, х2=4, х3=18... ;

3-й проход - х1=43, х2=26, х3=8... ;

... и т.д.

Та вот, вторую оптимизацию по следующему периоду хотелось бы проводить не на случайных параметрах х1, х2, х3, а брать только те комбинации этих параметров, которые уже были предложены после первой оптимизации, а все прочие - просто опустить.

Вот я что имел ввиду...


Увы! Сударь! Но эту идею, как не изголайся, а в более менее приличном виде реализовать средствами Метатрейдера едва ли удастся! Я сожалею и весьма!
 

Николай! Вот использую любезно предоставленные Вашими библиотекой функций (INCLUDE). Вроде бы всё нормально.

Только иногда возникает какия-то ошибка при оптимизации. Оптимизационный процесс просто останавливается и всё. Не могу понять почему.

Если меняю функции открытия и закрытия ордеров на более простые (без полной проверки) - всё работает.

А подключу Ваши Опены - опять зависает почему-то.

При работе - вроду бы нормально.

 
Kadet:

Николай! Вот использую любезно предоставленные Вашими библиотекой функций (INCLUDE). Вроде бы всё нормально.

Только иногда возникает какия-то ошибка при оптимизации. Оптимизационный процесс просто останавливается и всё. Не могу понять почему.

Если меняю функции открытия и закрытия ордеров на более простые (без полной проверки) - всё работает.

А подключу Ваши Опены - опять зависает почему-то.

При работе - вроду бы нормально.

Kadet, вам следовало бы немного детализировать ситуацию. Что значит "функции без полной проверки"? Дело в том, что я с подобным явлением не сталкивался абсолютно. Так что уточните ситуацию: Из каких функций и что вы из функций убираете, на счёте какого дилера оптимизируете, какой инструмент используете? Я, кстати, сразу после опубликовании статьи поменял файлы библиотек, немного исправив код, может вы используете самую старую библиотеку? Я вчера ещё раз заменил инклюдник Lite_EXPERT1.mqh дописав в него пару функций, совсем мамость код подправил и сделал новые пояснения к функциям в первой статье.

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