Начало истории Черепахбыло положено
в 1983 году, оно во многом легендарно. Но большинство источников склоняются к
тому, что своим появлением Черепахи обязаны спору, который возник между Ричардом
Деннисом и Вильямом Экхардом. Спор заключался в принципиальной возможности
обучения профессии трейдера любого человека. Деннис полагал, что успешным
трейдером может стать каждый. Для этого достаточно обладать некоторым набором
торговых методов и дисциплинированно следовать им. Напротив, Экхард считал, что
для достижения успеха в биржевой торговле требуется дар, некое шестое чувство.
Для разрешения
спора была создана группа из 14 добровольцев, специально отобранных из
нескольких тысяч желающих. Эта группа впоследствии получила название
"Черепахи", а их методы торговли "стратегия Черепах". Легендарность Черепах
заключается в том, что все 14 участников добились значительных успехов в деле
спекуляций. Насколько это правда, судить не будем, но интерес к стратегии
Черепах возник немалый. Так в чем же заключалась методика Черепах?
Достоверно о
стратегии Черепах ничего не известно. Существует лишь два момента, в которых
едино множество источников.
Первый заключается в
том, что интересом Черепах являлись затяжные тренды, формировавшие доходную
часть стратегии. Поэтому рыночный флэт приводил к серии убытков, но изюминка
стратегии как раз и заключалась в том, что серия мелких убытков перекрывалась
одной-двумя прибыльными сделками.
Второй опорой Черепах было
управление капиталом. Суть его заключалась в изменении объема торговой позиции,
исходя из текущей рыночной волатильности в совокупности с размером собственного
капитала. То есть сначала высчитывался размер рискового капитала для одной
сделки, а затем под него подбирался объем позиции, основанный на средней
волатильности рынка за последнее время.
Все остальные, более
конкретные, представления о стратегии Черепах, скорее всего, являются домыслами.
Но даже эти домыслы представляют практический интерес, так как пытаются описать
гениальную простоту стратегии Черепах. А она действительно была простой. Ведь,
если верить легенде, обучение торговле заняло всего лишь две недели!
Сразу договоримся
о некоторых упрощениях или даже искажениях стратегии Черепах. Достоверно
известно, что Черепахи предпочитали фьючерсные рынки. Мы же опробуем методику
Черепах на валютных парах. За основу стратегии возьмем наиболее популярную
версию, которая гласит, что открытие сделки происходило при пробитии ценой
двадцатидневного максимума или минимума. Закрытие сделки производилось при
пробитии десятидневного максимума/минимума. Для иллюстрации такой стратегии
подойдет известный индикатор PChannel, отображающий
минимум и максимум цены за определенный период в виде канала (см. рис.1).
Рис. 1 - Заключение сделок по стратегии Черепах.
Голубыми линиями
отмечен канал, построенный по двадцатидневным максимумам/минимумам. Канал,
отмеченный зелеными линиями, построен по десятидневным экстремумам. Открытие
длинных сделок показано синими стрелками "вверх", закрытие - синими значками Х.
Аналогично, открытие коротких позиций обозначено красными стрелками "вниз", а
закрытие - красными значками Х.
Рис. 1 отражает
наиболее идеальную ситуацию, когда из четырех сделок три оказались прибыльными.
На самом деле в соотношении прибыльных и убыточных сделок стратегии Черепах
преобладают именно убыточные сделки. Кажущимся недостатком стратегии является
запоздалый выход из прибыльной сделки. Но именно такой подход позволяет
следовать за трендом до его окончания, чтобы быть уверенным в том, что выход не
стал преждевременным.
Это была
техническая сторона стратегии. Вторая сторона заключается в правильном управлении
капиталом. Для вычисления объема позиции, Черепахи использовали некое
N, рассчитывающееся по формуле:
N = (10 * PDN + TR)/20,
(1)
где: PDN - предыдущее значение
N; TR - текущее значение дневной волатильности.
Цикличность
расчета N приводит к тому, что в зависимости от выбора
начальной точки отсчета мы будем получать различные значения
N. Поэтому данную идею сразу отбросим как приводящую к разным
результатам, зависящим от продолжительности ведения торгов. В качестве
альтернативного расчета N, который не зависит от
предыдущих его значений, возьмем разницу в пунктах от цены открытия сделки до
уровня ее стопа, выраженное в пунктах:
N = | OpenPrice - StopLoss|
/ Point, (2)
где Point - значение одного пункта в единицахинструмента (валютной пары, опциона, фьючерса, акции)
Чтобы не получать отрицательных N, примем
абсолютное значение разницы между ценой открытия и уровнем стопа.
Дальнейшие
расчеты приводят к вычислению объема позиции. Каждая позиция у Черепах
составлялась из частей, которая называлась "Юнит" ("Unit"):
Unit = (1% of Account)/(N * Dollars per
Point) (3)
То есть берется 1% имеющегося капитала и делится на количество денег,
которое может быть потеряно за одну сделку. Такой подход сводит к нулю
вероятность полной потери капитала, так как для этого требуется получение серии
из 100 убыточных сделок подряд. С другой стороны, рассчитывать на
сверхприбыльную торговлю тоже не приходится. Видимо, по этой причине группа
трейдеров Ричарда Денниса и Вильяма Экхарда была названа Черепахами - к своей
цели они шли медленно, но уверенно.
Формализация торговых правил и наличие формул расчета объема торговых позиций
позволяют оформить стратегию Черепах в виде эксперта Turtles.
Так как мы всегда располагаем уровнями открытия и закрытия позиции, то
логичным было бы все входы осуществлять при помощи отложенных ордеров. Это
позволит
свести к минимуму накладные расходы по открытию сделки с рынка.
Сначала мы всегда оформляли сигнальную часть системы, но в данном случае
непосредственно сигнал не требуется, так как уровни открытия позиции существуют
всегда. Нужно лишь рассчитать их. Поэтому вместо функции расчета сигнала
создадим функцию расчета уровней:
Для каждого из типов ордеров выделен свой блок операций.
Установка ордера Buy Stop производится в первом блоке.
Для этого необходимо выполнение трех условий: не должна присутствовать позиция
Buy, не должен присутствовать ордер
Buy Stop и текущая цена должна находиться ниже уровня
HighOpen. Наличие позиции Buy или ордера
Buy Stop можно узнать по значению переменных
BuyTicket и BSTicket,
которые содержат номера тикетов позиции и ордера соответственно. Отрицательное
значение переменной свидетельствует об отсутствии позиции или ордера. Определение
номеров тикетов происходит в другой функции, FindOrders,
которая будет рассмотрена ниже.
Ценой открытия ордера Buy Stop является уровень
HighOpen, к которому прибавлен спрэд (длинные позиции
открываются по Ask), и один
тик (в качестве пробития уровня). Уровень стопа устанавливается на один тик ниже
LowClose. Очередной модификацией стратегии Черепах
является установка уровня профита ордера, который вычисляется как уровень
возможных потерь, умноженный на коэффициент Mul. Mul -
это внешний параметр эксперта, который может быть изменен пользователем без
вмешательства в код программы.
Аналогичным образом происходит установка ордера Sell Stop.
Сначала проверяется выполнение трех условий: отсутствие позиции
Sell (SellTicket < 0), отсутствие ордера
Sell Stop (SSTicket < 0) и нахождение текущей цены
выше LowOpen. Цена открытия ордера ставится на один
пункт ниже уровня LowClose, а уровень стоп-приказа -
выше на пункт и на спрэд, чем HighClose. Уровень
фиксации прибыли рассчитывается кратным потенциальному уровню потерь.
Далее рассмотрим, как формируются значения BuyTicket,
SellTicket, SSTicket и BSTicket:
//+-------------------------------------------------------------------------------------+
//| Нахождение всех своих ордеров, установка стопа, профита или закрытие позиции. |
//+-------------------------------------------------------------------------------------+
bool FindOrders()
{
BuyTicket = -1; SellTicket = -1;
BSTicket = -1; SSTicket = -1;
// - 1 - ============================ Выбираем свои ордера и позиции ====================
for (int i = OrdersTotal()-1; i >= ; i--)
if (OrderSelect(i, SELECT_BY_POS))
if (OrderSymbol() == Symbol() && MathFloor(OrderMagicNumber()/10) == MagicNumber)
// - 1 - ================================ Окончание блока ===============================
{
double SL = ;
// - 2 - ================= Принятие решения о модификации или удалении ==================
switch (OrderType())
{
case OP_BUY:
BuyTicket = OrderTicket();
if (LowClose - Tick - OrderStopLoss() >= Tick)
if (Bid - LowClose + Tick > StopLevel)
SL = NP(LowClose - Tick);
break;
case OP_SELL:
SellTicket = OrderTicket();
if (OrderStopLoss() - HighClose - Spread - Tick >= Tick)
if (HighClose + Spread + Tick - Ask > StopLevel)
SL = NP(HighClose + Spread + Tick);
break;
case OP_BUYSTOP:
BSTicket = OrderTicket();
if (MathAbs(OrderOpenPrice() - HighOpen - Spread - Tick) >= Tick ||
MathAbs(OrderStopLoss() - LowClose + Tick) >= Tick)
if (OrderOpenPrice() - Ask > FreezeLevel)
if (WaitForTradeContext())
if (!OrderDelete(OrderTicket()))
return(False);
else
BSTicket = -1;
break;
case OP_SELLSTOP:
SSTicket = OrderTicket();
if (MathAbs(OrderOpenPrice() - LowOpen + Tick) >= Tick ||
MathAbs(OrderStopLoss() - HighOpen - Spread - Tick) >= Tick)
if (Bid - OrderOpenPrice() > FreezeLevel)
if (WaitForTradeContext())
if (!OrderDelete(OrderTicket()))
return(False);
else
SSTicket = -1;
break;
}
// - 2 - ================================ Окончание блока ===============================
// - 3 - ============================= Модификация позиции ==============================
if (SL != )
if (WaitForTradeContext())
if (!OrderModify(OrderTicket(), , SL, OrderTakeProfit(), ))
return(False);
// - 3 - ================================ Окончание блока ===============================
}
return(True);
}
Функцию FindOrders можно назвать рабочей лошадкой
эксперта, так как она совершает всю вспомогательную работу стратегии -
передвигает уровни стопов позиций и удаляет не сработавшие ордера.
Первый
блок находит принадлежащую эксперту позицию или ордер посредством обычного
перебора всех существующих ордеров и позиций.
Второй
блок - мозг функции. Именно здесь заполняются переменные
BuyTicket, SellTicket, BSTicket и SSTicket, в
зависимости от типа найденного ордера или позиции. Если речь идет о позиции (Buy
или Sell), то производится
проверка правильного расположения уровня стоп-приказа. Для этого текущее
положение стоп-приказа сравнивается со значением
HighClose или LowClose, в
зависимости от типа позиции. Если уровень стоп-приказа нужно изменить, то
переменная SL принимает новое значение стопа.
В случае
если найден ордер (Buy Stop или
Sell Stop), проверяется два его параметра -
цена открытия и уровень стопа. Неправильное значение хотя бы одного параметра
приводит к удалению ордера. Удаление необходимо, так как невозможно изменить
объем отложенного ордера, который в стратегии Черепах тесно связан с ценой открытия
и уровнем возможного убытка.
Третий блок
производит модификацию уровня стопа позиции, если значение SL
не равно нулю.
Успешное
проведение всех операций в функции FindOrders приводит
к возврату значения True. В случае какой-нибудь ошибки
результат будет противоположный - False.
Блок расчета объема ордера был включен в состав функции
OpenOrderCorrect, которая является неотъемлемой частью
каждого разрабатываемого нами эксперта. Поэтому, в целях экономии места, полный
код функции приводиться не будет. Рассмотрим лишь его измененную часть:
Одной из фатальных ошибок в программировании является попытка деления на ноль.
Чтобы избежать появления такой ошибки, которая приводит к краху программы, перед
каждой операцией деления следует проверять значение знаменателя на равенство
нулю. В знаменателе у нас находится произведение риска и значения пункта в
валюте депозита. Поэтому именно эти выражения необходимо сравнить с нулем.
Соответствующее условие проверки венчает блок расчета объема сделки.
При выполнении условия производится серия арифметических действий,
соответствующая формуле расчета юнита (3). В противном случае функция
OpenOrderCorrect завершается досрочно с кодом ошибки
5.
Последняя составная часть эксперта - функция start,
претерпевшая минимальные изменения:
//+-------------------------------------------------------------------------------------+
//| Функция START эксперта |
//+-------------------------------------------------------------------------------------+
int start()
{
// - 1 - == Разрешено ли советнику работать? ===========================================
if (!Activate || FatalError) // Отключается работа советника, если функция
return(); // init завершилась с ошибкой или имела место фатальная ошибка
// - 1 - == Окончание блока ============================================================
// - 2 - == Сбор информации об условиях торговли ========================================
Spread = ND(MarketInfo(Symbol(), MODE_SPREAD)*Point); // текущий спрэд
StopLevel = ND(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point); // текущий уровень стопов
FreezeLevel = ND(MarketInfo(Symbol(), MODE_FREEZELEVEL)*Point); // уровень заморозки
// - 2 - === Окончание блока ============================================================
// - 3 - ================ Расчет уровней открытия длинных и коротких позиций ============
if (LastSignal < Time[])
{
GetLevels();
LastSignal = Time[];
}
// - 3 - ================================ Окончание блока ==============================
// - 4 - ================ Оптимизация работы эксперта и поиск своих ордеров =============
if (LastBar == Time[])
return();
if (!FindOrders()) return();
// - 4 - ================================ Окончание блока ==============================
// - 5 - ============================ Установка отложенных ордеров ======================
if (!OpenOrders()) return();
// - 5 - ========================== Окончание блока =====================================
LastBar = Time[];
return();
}
Для достижения наибольшего быстродействия эксперта после успешного выполнения
всехфункций в течение одной свечи, происходит
остановка выполнения программы до формирования новой свечи. Это может сказаться
на правильности работы стратегии в случае пробития одного из уровней дважды в
течение одной свечи. Имеется в виду последовательное пробитие двух уровней с
возвратом к первоначальному уровню. В таком случае не будет вторично установлен
один из ордеров. Работоспособность эксперта в этот момент нарушена не будет.
Перейдем к наиболее интересному этапу - тестированию эксперта. Здесь мы вновь
вмешаемся в стратегию Черепах, приняв в качестве рабочего таймфрейма Н4. Переход
с дневного таймфрейма на более мелкий связан с необходимостью увеличения
количества сделок, так как на график D1 за один год
приходилось порядка 30 сделок. Также, исходя из несоответствия характера рынков
фьючерсов, акций и т. д. по отношению к валютному рынку, будем изменять
количество свечей, использующееся для расчета уровней открытия и закрытия
позиций. В эксперте Turtles это можно делать без
вмешательства в код программы при помощи параметров
PeriodOpen и PeriodClose.
Управление риском, приходящегося на одну сделку, производится благодаря
параметру MaxDepoRisk. В предстоящих тестах это
значение будет немного завышено - 3%. Значение Mul,
отвечающее за соотношение уровня прибыли и риска, везде будет равно 1.
Тестирование проводим в
историческом диапазоне 01.01.2009 -
27.02.2010 на таймфрейме Н4. Для каждой валютной
пары подобрано свое значение PeriodOpen и
PeriodClose (см. рис. 2 - 5).
Рис. 2. - График кривой баланса,
получаемый при тестировании советника на валютной паре
EURUSD.
EURUSD.
Значение PeriodOpen взято равным 10,
а PeriodClose 14. Большее значение
PeriodClose, в сравнении с
PeriodOpen, приводит к одновременному существованию двух
разнонаправленных позиций. Поэтому такой режим работы эксперта возможен только в
тех дилинговых центрах, в которых доступно локирование. Вид кривой баланса можно
назвать стабильным, но к конечному успеху это не привело. Чистая прибыль 597
долларов, а максимальная просадка 2674 доллара. Исходя из общего депозита 10 000
долларов (то есть 26.74%), назвать просадку катастрофической нельзя, но и
переводить торговлю на реальные рельсы тоже не имеет смысла.
Рис.
3.
- График кривой баланса, получаемый при тестировании
советника на валютной паре
USDCHF.
Примерно в таком же ключе отработала валютная пара
USDCHF. Значительным отличием от предыдущего результата
является количество сделок, возросшее почти в два раза. Рост количества сделок
связан с малым значением периода открытия PeriodOpen,
равного 3. А вот период закрытия остался примерно на том же уровне
PeriodClose = 15. В том же диапазоне осталось и
значение максимальной просадки - 2899 долларов, но возросла чистая прибыль -
1009 долларов.Вывод напрашивается сходный с выводом
по евро - нет смысла использовать, когда риск превышает прибыль.
Рис.
4.
- График кривой баланса, получаемый при тестировании
советника на валютной паре
GBPUSD.
Валютная пара GBPUSD (PeriodOpen
= 3, PeriodClose = 7) радует кривой баланса. Отсутствие значительных
спадов говорит о стабильности. К тому же, максимальная просадка вновь находится
в знакомых пределах - 2763 доллара (27.63%). А вот чистая прибыль показана
значительная - 8773 доллара, что дает фактор восстановления 3.17. Такие
показатели можно рассматривать более серьезно, задумываясь о реальном
применении, но, не забывая о разумном уровне риска.
Рис. 5.
- График кривой баланса, получаемый при тестировании советника на валютной паре
USDJPY.
Наиболее прогрессивной из всех оказалась валютная параUSDJPY
при значениях PeriodOpen = 3 и
PeriodClose =
3. Близкая к прямой кривая баланса характеризует результаты с наилучшей
стороны. Чистая прибыль 33173 доллара в сравнении с максимальной просадкой
6852
доллара выглядит очень привлекательно. Да, уровень просадки высокий. Но следует
помнить, что он, в первую очередь, связан с возросшим объемом сделок, которые
были ориентированы на возросший капитал, а не на начальные 10 000. Поэтому в
данном случае стоит смотреть на значение относительной просадки - 22.77%. То
есть, вновь приходим к похожему значению просадки. Не забудем и то, что фактор
восстановления в данном случае оказался высоким - 4.84. Да и прирост капитала в
три раза за год свидетельствует только в пользу реального применения стратегии.
Доработка стратегии для
использования в AutoGraf 4.0
Код эксперта
Turtles для работы стратегии в
среде AutoGraf 4.0 преобразуется подобно всем
предыдущим рассматриваемым нами экспертам. Все входные параметры эксперта определяем
как внешние переменные
AutoGraf AT_1 - AT_4. Параметр AT_1
эквивалентен параметру PeriodOpen (количество свечей,
используемых для расчета уровня открытия сделки), AT_2 -
PeriodClose (количество свечей, используемых для расчета уровня закрытия
сделки), AT_3 - Mul (множитель
для расчета цели), AT_4 - MaxDepoRisk (уровень
потерь в одной сделке, выраженный в процентах от эквити).
Для запуска советника из-под
AutoGraf 4.0совершите такие
шаги:
Для работы
советника в ключе приведенных результатов
тестирования(на примере
USDJPY) выставьтезначения
AT_1 = 3, AT_2 = 3, AT_3 = 3, AT_4 - 1 (полное повторение
результатов при этом не гарантируется).
Выб
ерите стратегию №3. Для этого передвиньте вверх значок
So и среди названий стратегий найдитезначок
S3, который также потяните вверх.
Запустит
е функцию автоматической торговли, передвинув
значок AT в верхнее положение.
Использование полученного
советника рекомендуется только в полуавтоматическом режиме под присмотром
трейдера и после всестороннего изучения слабых и сильных сторон стратегии.
Комментарии
Отправить комментарий