| / | Статьи |
Cтатьи
Тестер
Как преодолеть ограничения тестера стратегий при тестировании хеджевых советников
Авторизуйтесь или зарегистрируйтесь , чтобы добавить новую статью
|
Как преодолеть ограничения тестера стратегий при тестировании хеджевых советников [ en ]ВведениеВ данной статье приводятся идеи по тестированию хеджевых экспертов в тестере стратегий. Как Вы знаете, в тестере стратегий имеются ограничения, не позволяющие открывать ордера по другим символам (нет портфельного тестирования). Если есть необходимость протестировать собственный хеджевый эксперт, придется тестировать его на реальном счете. Значит ли это что наши возможности ограничены? Естественно, хеджевым трейдерам необходимо тестировать собственные эксперты перед тем, как использовать их на реальном счете. В данной статье приводятся идеи по созданию виртуального эмулятора тестера стратегий. Надеюсь, это поможет нам преодолеть ограничения в тестере стратегий MetaTrader 4 и окажется полезным при дальнейшем использовании. Концепция виртуального тестераИдея создания виртуального тестера возникла у меня при работе с функцией "Файлы" в mq4. Мне в голову пришла идея об использовании важных данных из файла для создания виртуальной торговой системы. Может ли это быть ответом на вопрос о тестировании собственного хеджевого советника? Давайте попробуем. Мой виртуальный тестер не требует никакого дополнительного программного обеспечения. Достаточно параметров mq4. Концепция этого виртуального тестера заключается в том, чтобы данные параметры открытия или закрытия хеджевых ордеров указывали на сбор необходимых данных. Таких как цена открытия, время открытия, цена закрытия, время закрытия и другие важные данные. После того как необходимые данные собраны, они будут использованы для сравнения со значениями последних тиков любых приемлемых типов, например цена открытия и последний Bid или цена открытия и последний известный Ask. Эти значения приведут нас к способу вычисления прибыли, который будет указывать на сбор новой группы данных после выполнения условия закрытия хеджа. Эти группы данных будут экспортированы в файл для дальнейшего
использования. После окончания тестирования, когда все данные
будут собраны в файл, мы сможем увидеть, как выполнен хеджевый
эксперт. Использовав данные из файла в качестве индикатора
для выстраивания кривой, я думаю, мы сможем завершить виртуальное
тестирование нашего хеджевого эксперта. Я полагаю, используя данную концепцию, мы можем получить результаты тестирования, схожие с результатами реального тестера стратегий. Кстати, это только идея по созданию тестера хеджевых советников. Я не могу гарантировать, что он будет в точности таким же, как реальный тестер. Но, надеюсь, он окажется полезным при дальнейшем использовании. Итак, начнем. Простое значение хеджевой торговлиПрежде чем начать, давайте немного поговорим о хеджевой торговле (информация из моего блога, ник pipsmaker, расположен здесь ). Самый простой способ рассказать о хеджинге - это одновременно
открыть две противоположные позиции по двум валютным парам.
Это позволяет уменьшить риск: если одна пара идет вверх, то ожидается,
что вторая пойдет вниз. Однако нет повода для беспокойства -
так как у нас одновременно открыты ордеры на покупку и продажу,
то даже если один ордер убыточный, второй обязательно прибыльный.
Поэтому мы называем это стратегией с низким уровнем риска. Вообще
в мире Форекс существует множество видов противоположных стилей
торговли.
В хеджевой торговле есть несколько неоспоримых фактов:
Кстати, Вы никогда не задумывались, как трейдеры, использующие хеджевые стратегии, получают прибыль при подобном стиле торговли? Не переживайте, две пары всегда будут частично перекрываться, корреляция по природе своей не является постоянной, одна из двух пар всегда будет запаздывать - одна начинает движение, вторая следует за ней. Как в истории про кролика и черепаху: кролик приляжет отдохнуть, а черепаха обгонит его и выиграет. Поэтому трейдеры, использующие хеджевые стратегии, нередко получают хорошую прибыль от подобных стратегий. Сейчас многие трейдеры используют хеджевые стратегии для получения прибыли на рынках Форекс. Открываем хедж, ждем, закрываем, когда покажется неплохая прибыль. Вот и все. Концепция хеджированияПеред тем, как начать писать код виртуального тестера, попробуем понять концепцию хеджа, поставив эксперимент. Не поняв концепции хеджа, мы не узнаем, какие данные необходимо экспортировать, записывать и высчитывать. Эти данные покажут нам, какие типы ордеров надо открывать виртуально. В эксперименте будем использовать следующие правила хеджирования:
Согласно этим правилам, для виртуальных ордеров нужны данные о ежедневных ценах открытия (для обеих пар), которые будут использоваться как цены открытия ордеров. Для вычисления внутри-дневной прибыли цены каждого часа, тиковые цены, должны записываться в качестве данных для цен закрытия ордеров (ask для продажи и bid для покупки). Также необходимо записывать время тиков (чтобы удостовериться, что тиковые цены взяты для одних и тех же временных значений). И согласно концепции ежедневного открытия хеджа, я разделю все необходимые данные в два типа файлов: ежедневные данные открытия и тиковые значения обеих пар. Оба типа данных будут экспортироваться в виде текстовых фалов с разными именами, например, GBPJPYD1.csv и GBPJPYTick.csv. И так как мы хотели, чтобы тиковые данные виртуального тестера были максимально схожими с реальными данными, необходимо пройти следующие два шага:
Оба шага также должны быть пройдены для пары EURJPY. Но я думаю мы можем объединить их в один советник. Этот советник должен экспортировать оба типа данных в два отдельных файла. После того как данный советник завершит процесс записи данных, другой эксперт воспользуется данными о GBPJPY и EURJPY из всех экспортированных файлов для создания виртуального тестирования.
Три шага преодоления ограничений тестераСогласно вышеизложенной идее, можно сделать вывод, что преодолеть ограничения тестера можно в три шага:
Начнем с первого шага.
Шаг 1: Экспортируем ценовые данныеЗдесь представлен советник, экспортирующий ежедневные цены открытия соответствующего инструмента в файл "GBPJPYD1.csv" для GBPJPY и в файл "EURJPYD1.csv" для EURJPY, между тем он также будет экспортировать тиковые цены в файл "symbolT. csv" (по аналогии с D1 файлами). Работа эксперта раскрыта в комментариях. Обратите внимание: все файлы, созданные данным экспертом, будут экспортироваться в директорию "MetaTrader 4/tester/files". //+------------------------------------------------------------------+ //| symbol-D1.mq4 | //| A Sexy Trader | //| http://pipsmaker.wordpress.com/ | //+------------------------------------------------------------------+ #property copyright "A Sexy Trader" #property link "http://pipsmaker.wordpress.com/" #include <stdlib.mqh> extern string StartDate = "2007.03.17" //установите начальную дату для получения одинаковых данных о времени ,StopDate = "2007.06.28"; //установите ограничение времени тестирования, чтобы избежать //запись излишних данных extern bool For_OP_SELL = true;/*Указывает на тип собираемых данных ->если For_OP_SELL = true ежедневный Open записывается в качестве цены открытия ордера ->если For_OP_SELL = false , означает для OP_BUY, записывается ежедневный Open+SPREAD. */ string name,tname; //+------------------------------------------------------------------+ //| функция инициализации эксперта | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| функция деинициализации эксперта | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //-------------------------------------------------------------------+ //| Некоторые важные параметры данного эксперта | //-------------------------------------------------------------------+ int day // переменная для обозначения, что сегодня данные Open записаны ,ho // идентификатор файла, записывающего цены открытия ,ht // идентификатор файла, записывающего тиковые цены ,x=1 /* порядок файла D1, увеличивающийся каждый раз, если D1 равен 4086 знакам и создается новый файл записи*/ ,xt=1 // так же, как и для x, но для тиковых данных ,bartime // переменная для обозначения, что данные Open для данного бара записаны ; double ot // время последнего открытия ,op // цена последнего открытия ,lt // время последнего тика ,ltk // цена последнего тика ; string OStr // строка для сбора дневных данных открытия ,TStr // строка для сбора тиковых значений ; //+------------------------------------------------------------------+ //| функция запуска эксперта | //+------------------------------------------------------------------+ int start() { /*-------------------Собирать данные только в определенные периоды времени.--------------------*/ if(TimeToStr(TimeCurrent(),TIME_DATE)>=StartDate && TimeToStr(TimeCurrent(),TIME_DATE)<=StopDate) { name=Symbol()+x+"D1.csv"; // установить имя файла с ежедневными ценами открытия tname=Symbol()+xt+"T.csv" // имя файла с тиковыим ценами ; //---- if(day!=TimeDay(Time[0])) // наступил новый день { ot=Time[0]; // берем время нового бара if(For_OP_SELL)op=Open[0]; // берем цену открытия нового ордера для SELL символа else op=Open[0]+MarketInfo(Symbol(),MODE_SPREAD)*Point; // иначе собираем данные для BUY символа OStr=OStr+TimeToStr(Time[0],TIME_DATE)+",";//запись новых данных времени, отделяем знаком "," OStr=OStr+DoubleToStr(op,Digits)+","; //новая цена открытия //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ экспортируем в файла ho=FileOpen(name ,FILE_CSV|FILE_WRITE); // открываем файл для записи дневного open if(ho>0) // если Symbol()+x+"D1.csv" существует { FileWrite(ho,OStr); // записываем собранные данные FileClose(ho); // закрываем файл каждый раз после завершения процесса if(StringLen(OStr)==4086){x++;OStr="";} /* если данные содержат 4086 знаков, устанавливаем новый x*/ } /* для создания нового файла, готовим новую строку для нового файла */ Print(TimeToStr(Time[0],TIME_DATE)); // распечатываем собранное время int thex=FileOpen(Symbol()+"x.csv",FILE_CSV|FILE_WRITE); // создаем файл "сколько x?" для файла D1 для дальнейшего исп-я if(thex>0) // если файл существует { string xs=DoubleToStr(x,0); // преобразуем x в строку FileWrite(thex,xs); // записываем значение x FileClose(thex); // закрываем файл (после каждого окончания) } day=TimeDay(Time[0]); // помечаем сегодня как собранное } //--------------------------------ДЛЯ ТИКОВЫХ ЗНАЧЕНИЙ /*Мы решили собирать тиковые данные ежечасно*/ if(bartime!=Time[0]) // открылся новый часовой бар // сделать его более гибким, если вы решили // собирать данные на другом таймфрейме { lt=TimeCurrent(); // получаем тиковое время if(!For_OP_SELL) ltk=Bid; // тиковые цены для ордеров на продажу else ltk=Ask; // в случае ордера на покупку TStr=TStr+TimeToStr(lt,TIME_DATE|TIME_MINUTES)+","; // вставляем данные в собранную строку TStr=TStr+DoubleToStr(ltk,Digits)+","; // //~~~~~~~~ // экспортируем данные ht=FileOpen(tname,FILE_CSV|FILE_WRITE); // открываем файл для записи тиковых значений if(ht>0) // если файл Symbol+xt+"T.csv" существует { FileWrite(ht,TStr); // записываем собранные тики и время FileClose(ht); // закончили. if(StringLen(TStr)==4080){xt++;TStr="";}// готовим новый файл, если в этом 4086 знаков } int thext=FileOpen(Symbol()+"xt.csv",FILE_CSV|FILE_WRITE); // записываем значение xt .. как D1 файл if(thext>0) // если файл существует { string xts=DoubleToStr(xt,0); // преобразуем в строку FileWrite(thext,xts); // записываем xt FileClose(thext); // готово } bartime=Time[0]; // отмечаем что цена Open текущего часового бара записана } } else if(TimeToStr(TimeCurrent(),TIME_DATE)>StopDate) // если вне указанного периода Print("Done."); // оповестить, когда все готово. //---- return(0); } //+------------------------------------------------------------------+ Шаг 2 : Организация виртуальной торговлиЭтот шаг самый интересный - создание хеджевого эксперта, который будет тестироваться тестером стратегий. Далее представлен скрипт. И не забывайте читать комментарии. Так же, как и в первом советнике, результаты будут экспортироваться в директорию "MetaTrader 4/tester/files". //| VirtualHedge.mq4 | Шаг 3: Отображение результатовПосле исполнения виртуальных ордеров и записи результатов хеджирования, используем полученные данные для отображения хеджевой концепции. Я решила экспортировать все полученные данные в качестве индикатора для построения кривой в отдельном окне, как и во многих других индикаторах (например, CCI, RSI или ATR и др.). Все файлы из второго советника необходимо скопировать в директорию "MetaTrader 4/experts/files". Для построения кривой нам нужен следующий индикатор: //+------------------------------------------------------------------+ Как это использоватьПеред тем как Вы скачаете копию моего кода, давайте подведем небольшие итоги в виде краткой инструкции по использованию. Чтобы наши ожидания воплотились в жизнь, необходимо пройти пять простых шагов:
А вот кривая, полученная в результате моих экспериментальных правил.
Выглядит ужасно. Не так ли? Надеюсь, у Вас получится лучше. ЗаключениеЯ рада, что мы смогли пройти эти шаги тестирования хеджевых советников. Ограничения в тестере больше не являются проблемой трейдеров, использующих хеджевые стратегии. Но, кстати, концепция хеджа в данной статье является только примером, она приведена для сокращения процесса тестирования. Чтобы виртуальный тестер работал с Вашей хеджевой стратегией, Вам необходимо перечислить все необходимые данные, такие как: ежедневные цены открытия и закрытия, максимальные и минимальные цены и другие. Если Вы торгуете с корреляцией, Вам нужно экспортировать все значения корреляции для каждого определенного времени. Этот перечень подскажет Вам, какие данные должны быть записаны, какие - выссчитаны, а какие - выведены в качестве результата. Чтобы сократить время подготовки данных, я рекомендую разделить тестирование на небольшие периоды - это лучше. чем производить все это за один раз. Например, если Вам необходимо протестировать советник за 1 год, лучше разделить его на 4 части по 3 месяца. Надеюсь, Ваша кривая выглядит гораздо лучше, нежели моя. Также надеюсь, что данная статья поможет трейдерам, использующим хеджевые стратегии, хотя бы частично; или же сподвигнет Вас на получение превосходных результатов хеджирования. Далее приводится двухминутный ролик моего виртуального тестирования (с 19 марта 2007 по 19 апреля 2007)
Перевод с английского языка выполнен MetaQuotes Software Corp. Текст оригинала: http://articles.mql4.com/445
Прикрепленные файлы:
Предупреждение:
все права на данные материалы
принадлежат MetaQuotes Software Corp. Полная или частичная перепечатка запрещена.
Это полезная статья. Предлагаю немного более прозрачный код для использования тестера со многими валютами. Идея та же - заменить MarketInfo(..) соответствующим файлом, т.к. тестер не может взять инфо из других пар. 1. Сначала создаём небольшой советник который записывает эти файлы: extern string mini = ""; Мы можем заменить/добавить параметры в FileWrite(ho, TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS), Bid, Ask); на любые другие из MarketInfo 2. В советнике, который должен работать со многими парами добавляем в начале код: //+---------------- работа с файлами bid/ask ----------------------------------+ void getBidAsk() { Список пар может быть любым. Надо поменять pairCnt и размеры соответствующих массивов (см. комментарии) 3. В конце init добавляем код: if (!test) return; //файлы нужны только в режиме тестера 4. Для работы с парами добавляем в start вызов getRates() Значения bid/ask (или чего-то другого в зависимости от FileWrite(ho, ...) в writeBidAsk советнике и процедуры getNextBidAsk()) помещены в rates для соответствующих пар 5. Запускаем советник writeBidAsk для всех используемых пар. 6. Тестируем целевой советник. Если есть вопросы - echashnik@comcast.net
23.05.2009 23:17 echashnik
Skycat писал(а): эту идею я реализовал немного по другому. Я собираюсь торговать на одной валюте, но меня сильно интересует, как поведет себя мой советник на других валютах, убедиться в его устойчивости так сказать. Вот я и слепил девять пар друг за другом, получилось 35 лет истории. Теперь после оптимизации на евре он проходит такой вот тест на выносливость. Как Вы это сделали ? Можете обьяснить?
12.05.2008 16:45 azfaraon
to Neutron:
Странное какое-то у тебя выражение: EUR/JPY-k*GBP/JPY = k1*EUR/GBP+constanta1 Чисто математически должно быть так: EURJPY / GPBJPY = EURGBP. Это если говорить о конкретной котировке. Если же рассматривать движение пар, то получаем: k1*EURJPY / (k2*GBPJPY) = k1/k2 * EURGBP. Логично? Отсюда простой вывод: если EURGBP движется прямолинейно (k1/k2=const), то EURJPY и GBPJPY будут двигаться синхронно, с коэффициентом пропорциональности = k1/k2. Если же EURGBP выписывает кренделя, то никакой синхронности не будет. В этом то и состоит всё коварство форекса, в отличие от других рынков. Валютные пары увязаны между собой математически, поэтому торговля по одной из них неизбежно влияет на движение других. Если же где-то и образуется расхождение, то арбитражёры быстро устраняют это
17.01.2008 19:37 Meat
Если проанализировать хеджирование коррелированных инструментов с точки зрения математики, то получается, что открытие разнонаправленных позиций по двум положительно коррелированным инструментам и ононаправленным - по отрицательно коррелированным, равносильно торговле синтетического инструмента вида (в данном случае): EUR/JPY-k*GBP/JPY, где k - некоторая константа призванная "выровнять" волатильность исходных пар. Возможно, новый синтетический инструмент обладает рядом свойств, эксплуатация которых позволяет получать прибыль... На верхней картинке показаны два временных ряда (ВР): GBP/JPY и k*EUR/JPY+constanta. Действительно, можно отметить хорошую положительную коррелированность рядов.
Теперь построим синтетический ряд вида EUR/JPY-k*GBP/JPY см. нижний рис. синий цвет. Ничего не напоминает? Для сравнения, на этот график наложен инструмент k1*EUR/GBP+constanta1 (красный цвет). Неожиданный результат! Неправда ли? На самом деле, этот результат получается и строго математически если пренебречть в выкладках малыми вторго порядка, т.е. с точностью до этих малых, выполняется равенство: EUR/JPY-k*GBP/JPY = k1*EUR/GBP+constanta1. Выходит, что хеджирование по описанной в данной статье методике, равносильно торговле на инструменте EUR/GBP но с "двойным" спредом! Получаются те же яйца (вид c другой стороны). Или я что-то упускаю? Конечно, данная методика позволяет синтезировать различные экзотические инструменты которых нет в природе (или в данном ДЦ) и работать с ними. Но, увеличенная комиссия за каждую транзакцию сведёт на НЕТ весь потенциальный арбитраж синтетического инструмента. Вобще, наличие арбитража в том или ином инструменте это скорее редкое исключение, чем правило, а уж попытка его увеличения путём сложения двух ВР скорее приведёт к потере всякой арбитражности.
26.09.2007 20:19 Neutron
эту идею я реализовал немного по другому. Я собираюсь торговать
на одной валюте, но меня сильно интересует, как поведет себя
мой советник на других валютах, убедиться в его устойчивости
так сказать. Вот я и слепил девять пар друг за другом, получилось
35 лет истории. Теперь после оптимизации на евре он проходит такой вот тест
на выносливость.
25.09.2007 23:09 Skycat
5 комментариев
|