English 中文 Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Техника оптимизации (тестирования) и некоторые критерии выбора рабочих параметров эксперта

Техника оптимизации (тестирования) и некоторые критерии выбора рабочих параметров эксперта

MetaTrader 4Тестер | 25 декабря 2009, 09:05
9 267 22
Rider
Rider

Введение

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

А процесс, согласитесь, очень трудоемкий, и затраты времени на него заслуживают попытки, как минимум, максимально автоматизировать все операции и привести их к единому алгоритму. Этот подход и метод и будет изложен в статье.

Идея

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

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

На мой взгляд, заставлять машину принимать стратегические решения - это "не самая хорошая мысль". А выбор параметров (групп параметров) - это стратегия. Считает, торгует, жизнь облегчает - вот пусть этим и занимается, а по каким правилам "железу" работать, решать должен трейдер.

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

Этап 1. Оптимизация. Стандартный вариант, с настройками по желанию пользователя.

Опять-таки, не секрет, но упомянуть об этом необходимо.
Генетика, безусловно, штука полезная, но в разумных пределах. Дело в том, что ее алгоритм может сыграть злую шутку - определится какой-то выигрышный, с её точки зрения, набор параметров, и вся дальнейшая оптимизация будет до самого окончания проходить "вокруг него". Чем это грозит, думаю, понятно. Большинство по-настоящему хороших вариантов, которые будут работать за пределами участка оптимизации, останутся "за бортом" и в таблицу "Результаты оптимизации" не попадут.

Выходов здесь несколько. Один кардинальный - отказаться от применения генетического алгоритма при оптимизации. Но это не всегда, по тем или иным причинам, подходит. Два следующих - это полумеры, но хотя бы что-то:

- провести оптимизацию не один раз, а два или больше. Первый раз, допустим, по "Balance", следующий по "Maximal Drawdown" или чему-то еще. Окно "Оптимизируемый параметр" на вкладке "Тестирование" в свойствах эксперта позволяет сделать такой выбор. После этого объединить полученные таблицы результатов и работать уже с объединенной.

- максимально уменьшить количество комбинаций параметров.

Есть еще один нюанс, который нужно учесть при проведении оптимизации. Возможно, кому-нибудь это окажется полезным.

В свойствах эксперта, на вкладке "Оптимизация" можно выставить различные ограничения, хочу сказать про одно из них: "Максимальная просадка". При использовании этого параметра нужно помнить, что это просадка в процентах от текущего баланса. Что здесь нужно учесть. Если, к примеру, выставить ограничение 10% и взять начальный баланс 10000, то в процессе оптимизации, когда баланс вырастет хотя бы до 15000, первоначальная 1000 превратится в полторы - согласитесь, это разные цифры. И начальный депозит (а где гарантия, что такой просадки не будет в самом начале торговли?) будет реагировать на них по-разному. Если же начальный депозит установить 1000000, а ограничение 0,1%, эта тысяча так и останется приблизительно тысячей.

Этап 2. Работа с "Результатами оптимизации". Все результаты копируются в Excel и обрабатываются уже там. Наборов получится много, их нужно сократить. "Обрезание" можно проводить по любой графе отчета - дело за трейдером.

Этап 3. Тест. Выбирается участок истории для тестирования и "прогоняется" автоматический групповой тест "выживших" после отбраковки на предыдущем этапе наборов. Подчеркиваю: групповой. На этом этапе еще нет необходимости рассматривать каждый тест в отдельности, задача стоит в получении результатов тестирования всех оставшихся наборов разом. Фактически, терминал будет проводить ту же оптимизацию, только ему будут "скармливаться" параметры из предварительно записанного файла.

Аналогично этапу 2, все полученные результаты копируются в Excel, в ту же таблицу, где уже расположены результаты оптимизации.

Этап 4. Анализ и Отбраковка.

Очевидно, что тесты с отрицательными результатом безжалостно отсекаются (строки удаляются). Вопрос в том, как оценить оставшиеся?

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

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

Чтобы обойти эту проблему и еще больше сократить количество наборов, я придумал для себя некий критерий "пропорциональности" сравниваемых участков. Сравниваются три величины: прибыль в день, количество сделок в день и максимальная просадка, соответственно, на участках оптимизации и тестирования. Если они приблизительно, в пределах какого-то допуска, соответствуют друг другу, то набор остается в работе, если нет - исключается из дальнейшего анализа. Кроме того, при определенных условиях, а конкретно - не очень продолжительных участках тестирования, могут, в какой-то степени, дать представление о "гладкости" кривой баланса.

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

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

В общем, это уже вопрос квалификации, вкусов и пристрастий каждого трейдера и выходит за рамки этой статьи.

Техника

Ничего сложного и особо заумного нет, все что требуется - это внимание и аккуратность. Приступим.

1. Подготовка компьютера - Панель управления/Язык и региональные стандарты/Региональные настройки/Русский - настройки/Числа/Разделитель целой и дробной части - вместо "запятой" необходимо выбрать "точку" - это делается для того, чтобы при копировании результатов оптимизации (тестов) из Терминала в таблицу Exсel данные отображались без искажений;

- На компьютере должен быть установлен пакет Microsoft Office (Exсel обязательно) - версия от 2000 и выше.

- В Exсel, в настройках безопасности включены макросы и импортирован модуль Analise.bas (в приложении к статье). Сам модуль и его структура в статье не рассматриваются, т.к. рядовому пользователю нет никакой необходимости в нем что-то изменять или править, а "не рядовые" смогут, при желании, разобраться в нем самостоятельно.

2. Подготовка эксперта

Пример подготовленного эксперта в приложении.

В самом начале кода перед внешними параметрами необходимо вставить следующее:

// Параметры теста и оптимизации
extern int          VarOptimTest    = 0;       // 0 - обычная оптимизация (штатная работа экперта)
                                                                     // 1 - тестовый прогон отобранных наборов        
                                                                     // 2 - формирование сет файлов
extern int          Counter              = 1;       // счетчик    
extern string       nameEA          = "MA";  // имя эксперта

Эти переменные будут управлять режимами оптимизации и тестирования.

Функция init() должна выглядеть так:

int init() 
{
   // БЛОК ВЫЗОВА ФУНКЦИЙ ОПТИМИЗАЦИИ И ТЕСТИРОВАНИЯ
   if(IsOptimization() && VarOptimTest !=0)
      {
      if (VarOptimTest == 1 && Counter !=0) _ReadParametrs();
      if (VarOptimTest == 2 && Counter !=0)
         {_ReadParametrs(); _WriteSet();}
      }   
...........
...........
return (0);
} 

Отсюда вызываются две функции, обеспечивающие автоматизацию всего процесса.

В функцию start() добавлена строка:

int start() 
{
   if(IsOptimization() && VarOptimTest ==2) return(0);
..........

1. Функция чтения параметров из файла, который будет создан в Excel, после анализа результатов оптимизации (тестирования).

Изменяемая часть функции выделена. Здесь необходимо аккуратно и внимательно, с соблюдением аналогичной структуры и синтаксиса, перечислить все входные параметры эксперта, за исключением первых трех, которые отвечают за оптимизацию и тестирование, а также, если имеются, переменных типа bool и string.

void  _ReadParametrs()
{
   string FileName="test.csv";
   int handle=FileOpen(FileName,FILE_READ||FILE_CSV);//,''); 
   if(handle<1) return(0);
   FileSeek(handle,0,SEEK_SET);
   int str = StrToInteger(FileReadString(handle)); 
   int data = StrToInteger(FileReadString(handle)); 
   if (data < Counter) 
      {
      Alert("Введено некорректное количество тестовых проходов. Sorry");
      return(0);
      }
   for (int y=1; y <=Counter; y++)
      {
      for (int x=1; x <= str; x++)
         {
         string s = FileReadString(handle); 
         string ds = FileReadString(handle); 
         if (y != Counter) continue;
         s=StringTrimLeft(s);s=StringTrimRight(s);
         ds = StringTrimLeft(ds);ds=StringTrimRight(ds);
         double d = StrToDouble(ds);

         if (s == "Lots"){Lots=d;continue;}
         if (s == "MaximumRisk"){MaximumRisk=d;continue;}
         if (s == "DecreaseFactor"){DecreaseFactor=d;continue;}
         if (s == "MovingPeriod"){MovingPeriod=d;continue;}
         if (s == "MovingShift"){MovingShift=d;continue;}
         
         }
      }
   FileClose(handle);
  return(0);
}

2. Функция формирования и записи set-файлов. Должна полностью повторять структуру сет-файла эксперта. Изменяемая часть функции выделена.

void  _WriteSet ()
{
   string FileName=nameEA+"_"+Symbol()+Period()+"_"+Counter+".set";
   int handle=FileOpen(FileName,FILE_WRITE|FILE_CSV);
   if(handle<1) return(0);

   FileWrite(handle,"VarOptimTest="+0);
   FileWrite(handle,"VarOptimTest,F="+0);
   FileWrite(handle,"VarOptimTest,1="+0);
   FileWrite(handle,"VarOptimTest,2="+0);
   FileWrite(handle,"VarOptimTest,3="+0);
   
   FileWrite(handle,"Counter="+0);
   FileWrite(handle,"Counter,F="+0);
   FileWrite(handle,"Counter,1="+1);
   FileWrite(handle,"Counter,2="+1);
   FileWrite(handle,"Counter,3="+100);

   FileWrite(handle,"nameEA="+nameEA+"_"+Symbol()+Period()+"_"+Counter);

   FileWrite(handle,"Lots="+Lots);
   FileWrite(handle,"Lots,F="+0);
   FileWrite(handle,"Lots,1="+0.00000000);
   FileWrite(handle,"Lots,2="+0.00000000);
   FileWrite(handle,"Lots,3="+0.00000000);
   
   .................................
   
   FileWrite(handle,"MovingShift="+MovingShift);
   FileWrite(handle,"MovingShift,F="+1);
   FileWrite(handle,"MovingShift,1="+2);
   FileWrite(handle,"MovingShift,2="+1);
   FileWrite(handle,"MovingShift,3="+4);
   
   FileClose(handle);
return(0);
}

3. Процесс

ВНИМАНИЕ! Очень рекомендую, перед выполнением всех операций, сделать дубликат листа или всей книги. Исполнение макросов в Excel - операция необратимая, и в случае ошибки можно потерять результаты оптимизации, а это - потерянное время. Не повредит и периодическое сохранение промежуточных результатов.

3.1. Оптимизация.

Об особенностях написано достаточно, теперь о том, как это сделать. В свойствах эксперта параметры оптимизации и тестирования должны быть выставлены, как на скриншоте:

Рис.1 Свойства эксперта, вкладка "Входные параметры". Параметры оптимизации и тестирования.

3.2. Анализ результатов оптимизации и первичная отбраковка параметров.

После окончания оптимизации необходимо скопировать ее результаты в буфер обмена:

Рис.2 Копирование результатов оптимизации.

открыть Excel и вставить на чистый лист.

После копирования необходимо выполнить макрос Optim_1. Если все правильно сделано, то картинка на листе будет подобная этой:

Рис.3 Выполнение макроса Excel.

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


Рис.4 Диалоговое окно ввода количества дней.

Как видите, в получившейся таблице нет наименований столбцов. Сделано это вполне умышленно. Во-первых, так легче не ошибиться при вводе количества параметров (это потребуется в дальнейшем), а во-вторых - не так уж сильно они и нужны. Все здесь знакомо, кроме двух столбцов, голубого и зеленого. Слева направо: Номер прохода, Прибыль, Прибыль в день, Всего сделок, Сделок в день, Прибыльность, Матожидание, Просадка $, Просадка %.

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

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

3.3. Запись параметров в файл.

Необходимо запустить на исполнение макрос "Write", в появившемся диалоговом окне ввести путь, куда будет сохранен файл с параметрами (.... terminal\tester\files\)

Рис.5 Диалоговое окно сохранения файла с параметрами.

В окне "Имя фала" уже будет предопределенное имя "test", не меняйте его без крайней необходимости, но если поменяете, то это же необходимо сделать и в функциях, которые добавлены в ваш эксперт.

После выполнения этой операции в указанном каталоге появится (или перезапишется, если уже был) файл "test.csv".

Внимание, это важно. После создания файла не изменяйте в таблице положение строк, в противном случае результаты тестирования потеряют свою привязку к параметрам, по которым это тестирование производилось.

3.4. Проведение тестирования.

Настройки эксперта:



Рис.6-8 Настройки эксперта для проведения группового теста.

Наверное, пояснения, если и требуются, то минимальные: Ограничений быть не должно, Генетический алгоритм отключен, переменная Counter от 1 до N, где N - количество строк, оставшихся в таблице, Включена оптимизация только по этому параметру.

И еще одна настройка:

Рис.9 Настройка вкладки "Результаты оптимизации"

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

После окончания тестирования, а это может занять довольно продолжительное время, особенно на первом "прогоне", когда таблица еще большая, можем перейти к следующему пункту.

3.5. Работа с результатами теста.

Прежде всего, необходимо подготовить нашу таблицу в Excel к вводу новых данных, для этого необходимо выполнить макрос "Optim_2", после этого в левой части таблицы появятся 7 пустых столбцов. Полученные результаты необходимо отсортировать по возрастанию номера прохода:

Рис. 10 Сортировка результатов теста.

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

После этого последовательно выполняем макросы "Optim_3", "Optim_4". Если все сделано без ошибок, то таблица должна приобрести следующую структуру:


Рис.11 Структура таблицы после сохранения и обработки результатов оптимизации и тестирования.

Про столбцы L-T мы уже говорили, столбцы D-K аналогичны М-T, только данные в них относятся к тестовому участку.
А вот прежде чем говорить о первых трех столбцах, видимо, стоит объяснить, зачем вводились такие критерии как "Прибыль в день" и "Сделок в день".

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

Итак, столбцы: А = N/E (отношение профитов в день), B = P/G (отношение сделок в день), С =S/J ( отношение просадок).

Как видите, сейчас в этих столбцах единички - идеальный вариант, который может быть только в одном случае - когда тестовый участок истории совпадает с участком оптимизации. Это не недосмотр, а сделано специально, чтобы показать один из способов проверки правильности подготовки эксперта. Аналогично можно будет проверить правильность формирования set-файлов.

Таким образом, все готово для анализа. Вся информация есть. Все в руках трейдера, а кому еще, как не ему, знать всю подноготную работы своего эксперта, и в соответствии с этим установить необходимые допуски в разбросе результатов, по которым и произвести отбраковку параметров.

Идем дальше. Таблица еще больше сократилась, но еще недостаточно. Нам ничто не мешает провести еще один тест.
Удаляем столбцы A-K и возвращаемся к пункту 3.

После 3-4 тестов у нас останется табличка, состоящая из 3-5-8 строчек. Остановимся на этом и пойдем дальше.

3.6. Формирование set-файлов.

Возможно кто-то скажет, что в этом нет никакой необходимости, и 5-8 наборов параметров можно обработать вручную. Не возражаю - обрабатывайте. Я же предпочитаю, чтобы рутинную работу за меня делала машина. Для этого всего лишь нужно еще раз выполнить макрос "Write" и еще раз, уже последний, запустить тестер стратегий в режиме "Оптимизация" со следующими настройками эксперта:

Рис.12 Настройки эксперта для формирования set-файлов.

Настройки почти полностью совпадают с режимом тестирования, отличаются значением одной переменной да конечным значением счетчика.

После окончания процесса оптимизации в каталоге tester\files будут созданы файлы настройки эксперта. Последняя цифра в имени - номер строки в нашей таблице.

Рис.13 Вид сформированных файлов настроек.

С ними можно работать как с обычными файлами настройки эксперта.

Собственно, на этом тема статьи исчерпана.


Заключение

Изложенный материал не претендует на открытия в области, условно названной: "Теория оптимизации".... Это чисто практическое руководство, не более того, но и не менее... Наверное, это понятно, но тем не менее, считаю нужным отметить это.
Все, что здесь представлено, - это всего лишь инструмент, назначение которого - максимально облегчить труд трейдера. Никто и никогда не даст 100% гарантии того, что за правым краем графика кривая баланса будет такой же "симпатичной", как и на видимом участке.

И еще одно. Не пугайтесь обилия слов и картинок. На самом деле все достаточно просто и, один-два раза проведя такую оптимизацию, вы научитесь это делать автоматически.

Есть идея и мысль, что у кого-нибудь возникнет идея и мысль о наиболее оптимальных окнах оптимизации и тестирования.... вдруг :)

Удачи и профитов.

P.S. Никогда не думал, что понадобится так много слов для того, чтобы описать пару десятков манипуляций "мышкой". :)

Прикрепленные файлы |
Analise.rar (2.07 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (22)
[Удален] | 31 мая 2010 в 13:19

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

Но кратко скажу о своем методе (всё в Экселе):

- применяю формулу: "Прибыль" * "Всего сделок" * "Прибыльность" * "Матожидание" / "Просадка $" / "Просадка %" (символы: * и / - соответственно умножить и разделить)

- лучшими считаются варианты с максимальным значением этого выражения

- в отдельную таблицу делается выборка 10 лучших вариантов (по убыванию)

- можно установить минимальное число сделок за исследуемый период (желтая клетка на листе "Результат")

Работа с таблицей:

- как и предлагает автор, копируем результаты оптимизации в лист "Данные" (предварительной подготовки компьютера делать не надо)

- и смотрим на лист "Результат"


Прикреплен файл для Excel 7

[Удален] | 20 сент. 2010 в 15:33
Извиняюсь, может быть и туплю, но где-же макрос "write" найти? В прикреплённом файле его нет.
[Удален] | 20 дек. 2010 в 18:03

Спасибо за статью, вопрос такой:

3.1. Оптимизация - например мы берем период с 2010 01 01 по 2010 06 01
а параметр 3.4. Проведение тестирования - за тот же период делать или уже на не знакомом? И параметры оптимизации только Counter или все которые тестировал?

[Удален] | 20 дек. 2010 в 18:11

внутри макросов есть такой

Nextconnected:
Извиняюсь, может быть и туплю, но где-же макрос "write" найти? В прикреплённом файле его нет.
amavladi
amavladi | 24 авг. 2014 в 22:56
спасибо за статью.Сэкономил массу времени.
Как написать индикатор в MQL5 Как написать индикатор в MQL5
Что представляет собою индикатор? Это набор вычисленных значений, которые мы хотим отобразить на экране монитора удобным для нас образом. Наборы значений представляются в программах в виде массивов. Таким образом, создание индикатора - это написание алгоритма, который обрабатывает одни массивы (массивы цен) и записывает результаты обработки в другие массивы (значения индикаторов). На примере создания индикатора True Strength Index в статье рассказывается, как писать индикаторы на MQL5
Проверка некоторых мифов: "Как торгуется азиатская сессия, так весь день и пойдет торговля" Проверка некоторых мифов: "Как торгуется азиатская сессия, так весь день и пойдет торговля"
Предлагается проверить некоторые распространенные утверждения - в данном случае проверяется утверждение о том, что "как торгуется азиатская сессия, так и идут торги весь день".
Передача данных между индикаторами - простое решение наболевшей проблемы Передача данных между индикаторами - простое решение наболевшей проблемы
Мы хотим создать среду, которая предоставляла бы возможность обращения к показаниям индикаторов, присоединенных к тому или иному графику терминала, и обладала бы следующими свойствами: отсутствие копирования данных; минимальное вмешательство в код уже имеющихся инструментов при необходимости их «подключения»; реализация преимущественно средствами MQL (естественно, механизм DLL нам все же потребуется, однако, как мы увидим, его использование будет ограничиваться не более чем десятком строк на С++). В статье объясняется, как можно довольно просто создать в терминале MetaTrader программную среду, обеспечивающую средства для доступа к буферам индикаторов из других MQL-программ.
Использование библиотеки FANN2MQL в MetaTrader Использование библиотеки FANN2MQL в MetaTrader
Цель статьи - показать, как использовать библиотеку FANN2MQL для программирования нейронных сетей в MetaTrader на простом примере: обучение и распознавание простейших паттернов.