| / | Статьи |
Cтатьи
Тестер
Автоматическая оптимизация торгового робота в процессе реальной торговли
Авторизуйтесь или зарегистрируйтесь , чтобы добавить новую статью
|
Автоматическая оптимизация торгового робота в процессе реальной торговли [ en ]ВведениеЕсть предположение, что эксперт с подогнанными под историю параметрами будет первое время, пусть и достаточно недолгое, прибыльно торговать. Косвенные свидетельства в пользу этого предположения появились после наблюдений за чемпионатом по автотрейдингу в разделе Automated Trading Championship 2006 текущего сайта. В начале работы чемпионата прибыльных советников было значительно больше, а по прошествии небольшого промежутка времени многие из них отсеялись. Отсюда и появилось предположение о том, что большинство из отсеявшихся советников были просто подогнаны под историю. Идея проверить это предположение на практике родилась на форуме в разделе Идеальная механическая торговая система. Основной принцип идеи заключается в том, чтобы один раз в сутки в указанное время автоматически запускалась оптимизация советника и полученные после оптимизации значения анализировались и записывались в переменные советника. Для реализации этой идеи решено было взять готовый советник MACD Sample из клиентского терминала MetaTrader 4 и вставить в него свою функцию автоматической оптимизации. Через некоторое время код автооптимизатора был готов и выложен на форуме в разделе автооптимизатор. По прошествии еще некоторого времени в ветке автооптимизатор появились и первые подтверждения идеи. В дальнейшем, после внесения некоторых изменений для более удобного использования, автооптимизатор был переделан в mqh-библиотеку.
|
![]() Как не попасть в ловушки оптимизации?
В статье описываются методы, позволяющие лучше понимать результаты оптимизации тестера. Также приведено несколько советов, помогающих избежать "вредной оптимизации". |
![]() Визуализация тестирования. Графики состояния счета.
Погрузитесь в процесс тестирования с графиками, отображающими состояние счета - теперь вся необходимая информация всегда на виду! |
| Предыдущая | Следующая |
Очень достойный инструмент, давно его использую, но реальную прибыль начал получать недавно, а потому спешу сказать СПАСИБО.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ extern int SetWeek = 0; //Установка дня недели (0-Воскресенье,1,2,3,4,5,6) extern int SetHour = 0; //Час старта оптимизации extern int SetMinute = 1; //Минута старта оптимизации int TestDay = 10; //Количество дней для оптимизации int TimeOut = 10; //Время ожидания окончания оптимизации в минутах string NameMTS = "AI"; //Имя советника string NameFileSet = "AI.set"; //Имя Set файла с установками string PuthTester = "D:\Program Files\Forex Best Trade Station_1"; //Путь к тестеру //--- Последовательность фильтрации int Gross_Profit = 1; //Сортировка по Максимальной прибыли int Profit_Factor = 2; //Сортировка по Максимальной прибыльности int Expected_Payoff= 3; //Сортировка по Максимальному матожиданию //--имена переменных для оптимизации string Per1 = "x1"; string Per2 = "x2"; string Per3 = "x4"; string Per4 = "sl"; bool StartTest=false; datetime TimeStart; //--- Подключение библиотеки автооптимизатора #include <auto_optimization_204.mqh> //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~в функцию start()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!IsTesting() && !IsOptimization()){ //При тестировании и оптимизации не запускать if(TimeDayOfWeek(TimeLocal())==SetWeek){ //сравнение дня недели с текущим if(TimeHour(TimeLocal())==SetHour){ //Сравнение текущего часа с установленным для запуска if(!StartTest){ //Защита от повторного запуска if(TimeMinute(TimeLocal())>SetMinute-1){ //Сравнение диапазона минут с установленной для запуска минутой if(TimeMinute(TimeLocal())<SetMinute+1){ //диапазон нужен в случае если по каким-то причинам долго нет нового тика TimeStart =TimeLocal(); StartTest =true; //Флаг запуска тестера Tester(TestDay,NameMTS,NameFileSet,PuthTester,TimeOut,Gross_Profit,Profit_Factor,Expected_Payoff,Per1,Per2,Per3,Per4); }}}}} x1 =GlobalVariableGet(Per1); x2 =GlobalVariableGet(Per2); x4 =GlobalVariableGet(Per3); sl =GlobalVariableGet(Per4); } if(StartTest){ //Если флаг запуска тестера установлен if(TimeLocal()-TimeStart > TimeOut*60){ //Если с момента запуска прошло больше установленного времени ожидания тестирования StartTest = false; //Обнулим флаг }} //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Сортировка по Максимальной прибыли int Gross_Profit = 1; // Сортировка по Максимальной прибыльности int Profit_Factor = 2; // Сортировка по Максимальному матожиданию int Expected_Payoff = 3;Возможно фильр по минимальным убыткам и не потребуется.
Попытаюсь ответить на ваши вопросы -
>Если говорить о советнике с которым я работаю и автооптимизация
которого меня интересует, то оптимизируя он
>выбирает очень плохой результат из тех что есть. В чем может
быть ошибка?
Возможно лучшие (по вашему мнению) значения отфильтровываются
double MinTr = TestDay-2; //Ограничение на минимальное количество сделок в день double MaxTr = (60/Period()*TestDay)+2;//Ограничение на максимальное количество сделок в день
фильтром количества сделок в день, вы можете задать значения
которые практически не будут влиять на результат, например:
double MinTr = 0; //Ограничение на минимальное количество сделок в день double MaxTr = 1000; //Ограничение на максимальное количество сделок в день
>оптимизация идет, файл с отчетом оптимизатора создается,
и создаются файлы сортированные, но в них в строке GrossProfit - всегда
0, а размер >профита отображается в строке TotalTrades. Н иже приведу
копию сторк из файла. И на экран результаты теста выдаются а
вот в советник не заносятся.
>привожу данные из файла .csv
>GrossProfit TotalTrades ProfitFactor ExpectedPayoff FastEMA SlowEMA SignalSMA
>0 8 1000.00000000 0.00000000 17 27 13 0
>0 10 1000.00000000 0.00000000 17 27 12 0
>...да... Метатрейдер 203 билд
Судя по файлу промежуточного отчета, есть ошибки оптимизации,
например неверно выбраны переменные для оптимизации.
Проверить это можно посмотрев результаты работы оптимизатора
в файле "FileReport_EURUSD_2007.04.28.htm" который создается тестером.
Ну вот, появилось немного свободного времени, можно и поработать
на благо трейдеров :-)
И так, вот код который нужно вставить в AI:
//+------------------------------------------------------------------+ //| ArtificialIntelligence.mq4 | //| Copyright © 2006, Yury V. Reshetov | //| http://reshetov.xnet.uz/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Yury V. Reshetov ICQ:282715499 http://reshetov.xnet.uz/" #property link "http://reshetov.xnet.uz/" //---- input parameters extern int x1 = 135; extern int x2 = 127; extern int x3 = 16; extern int x4 = 93; // StopLoss level extern double sl = 85; extern int MagicNumber = 888; static int prevtime = 0; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ extern int SetHour = 0; //Час старта оптимизации extern int SetMinute = 1; //Минута старта оптимизации int TestDay = 10; //Количество дней для оптимизации int TimeOut = 10; //Время ожидания окончания оптимизации в минутах string NameMTS = "AI"; //Имя советника string NameFileSet = "AI.set"; //Имя Set файла с установками string PuthTester = "D:\Program Files\Forex Best Trade Station_1"; //Путь к тестеру //--- Последовательность фильтрации int Gross_Profit = 1; //Сортировка по Максимальной прибыли int Profit_Factor = 2; //Сортировка по Максимальной прибыльности int Expected_Payoff= 3; //Сортировка по Максимальному матожиданию //--имена переменных для оптимизации string Per1 = "x1"; string Per2 = "x2"; string Per3 = "x4"; string Per4 = "sl"; bool StartTest=false; datetime TimeStart; //--- Подключение библиотеки автооптимизатора #include <auto_optimization_204.mqh> //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include <b-Lots.mqh> //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init(){ // Tester(TestDay,NameMTS,NameFileSet,PuthTester,TimeOut,Gross_Profit,Profit_Factor,Expected_Payoff,Per1,Per2,Per3,Per4); return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!IsTesting() && !IsOptimization()){ //При тестировании и оптимизации не запускать if(TimeHour(TimeLocal())==SetHour){ //Сравнение текущего часа с установленным для запуска if(!StartTest){ //Защита от повторного запуска if(TimeMinute(TimeLocal())>SetMinute-1){ //Сравнение диапазона минут с установленной для запуска минутой if(TimeMinute(TimeLocal())<SetMinute+1){ //диапазон нужен в случае если по каким-то причинам долго нет нового тика TimeStart =TimeLocal(); StartTest =true; //Флаг запуска тестера Tester(TestDay,NameMTS,NameFileSet,PuthTester,TimeOut,Gross_Profit,Profit_Factor,Expected_Payoff,Per1,Per2,Per3,Per4); }}}} x1 =GlobalVariableGet(Per1); x2 =GlobalVariableGet(Per2); x4 =GlobalVariableGet(Per3); sl =GlobalVariableGet(Per4); } if(StartTest){ //Если флаг запуска тестера установлен if(TimeLocal()-TimeStart > TimeOut*60){ //Если с момента запуска прошло больше установленного времени ожидания тестирования StartTest = false; //Обнулим флаг }} //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Соответственно необходимо внести изменения которые будут действительны
для вашего компьютера
1) изменить путь к папке с терминал-тестером
"D:\Program Files\Forex Best Trade Station_1"
вам нужно указать тот который у вас на компьютере
2) Подготовить set файл с параметрами настроек (как описано в статье)
AI. set
Теперь что касательно переменных для оптимизации
"x1"; "x2"; "x4"; "sl";
так как в автооптимизатором можно оптимизировать только 4 переменных,
а изменения в эту версию вносить не планируется, я выбрал переменные
которые на мой взгляд наиболее сильно влияют на результаты
(вы можете изменить их по своему усмотрению)
Очень достойный инструмент, давно его использую, но реальную прибыль начал получать недавно, а потому спешу сказать СПАСИБО.
Здравствуйте всем!
На прошлой неделе занялся оптимизацией AI и мне дали ссылку на
эту ветку. Смотрю СDR, Paha занимаются тем-же. Я прогнал на 12 инструментах
с 2го по 19 апреля на всех ТФ. Оптимизировал х1, х2, х3, х4, tp, sl. Лучшие
результаты на 5м и 1h. Сегодня с начала сесси поставил их соответственно
на два разных демо-счета. Если еще и с автооптимизацией на h1
запустить один счет было бы здорово. XEON, если можно мне бы то-же
сразу встроить в AI автооптимизатор. И еще, первые ордера выставляются
0,01 лота, как я изменил в самом b-lots, а следующие по 0,1 лоту. Хотя
в настройках по выбору лота выставлено вот так extern int LotsWayChoice
= 0; // Способ выбора рабочего лота: // 0-фиксированный. Хотелось
бы чтобы сразу под небольшой реал тестировалось. И тип исполнения
ордеров в моем ДЦ Execution by Market у меня есть переделанный AI, но если не трудно сразу-бы сделать
под это исполнение. Какие заинтересуют отчеты, результаты буду
выкладывать. С уважением. Дмитрий
Здравствуйте всем!
На прошлой неделе занялся оптимизацией AI и мне дали ссылку на
эту ветку. Смотрю СDR, Paha занимаются тем-же. Я прогнал на 12 инструментах
с 2го по 19 апреля на всех ТФ. Оптимизировал х1, х2, х3, х4, tp, sl. Лучшие
результаты на 5м и 1h. С 23.04 с начала сесси поставил их соответственно
на два разных демо-счета. Если еще и с автооптимизацией на м5
запустить один счет было бы здорово. XEON, если можно, мне бы то-же
сразу встроить в AI автооптимизатор. И подправить AI нужно на
тип исполнения ордеров Execution by Market (в моем ДЦ такое). А еще первые
ордера выставляются 0,01 лота, как я изменил в самом b-lots, а следующие
по 0,1 лоту. Хотя в настройках по выбору лота выставлено вот так
extern int LotsWayChoice = 0; // Способ выбора рабочего лота: // 0-фиксированный.
(хотелось бы чтобы по 0,01 лоту, чтобы сразу настраивать под небольшой
реал). Естественно какие нужно отчеты буду давать. Могу просто
ивест-пароль от этих счетов дать.
С уважением. Дмитрий