Заметка

Стратегия "Вход относительно открытия свечей старших таймфреймов"

  4  

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

Предлагаю поэксперементировать с описанной выше торговой идеей. На желание поэкспериментировать навела вот эта заметка http://robostroy.ru/community/article.aspx?id=342 Я взял акцию Сбербанка с часовым таймфремом и протестировал с тратегию со следующими простыми условиями:

Вход в лонг — часовая свеча закрывается выше открытия текущего дня.

Вход в шорт — часовая свеча закрывается ниже открытия текущего дня.

Сигнал по первой дневной свече не отрабатываем — ждем второй.

Выходим по тейк-профиту и стоп-лоссу — 2% и 1% соответственно.

Смотрим на результаты бэктеста описанной стратегии с начала 2008 года. С реинвестированием. Комиссия — 0,06%. Акции Сбербанка, таймфрейм — 1 час.

Интересно, что стратегия замечательно работала до конца 2011 года и с начала 2012-го кривая доходности уверенно идет вниз. По результатам работы стратегии на текущий момент мы иммеем 80% годовых и 50% просадки. Впрочем, просадка размером в 50% была один раз — во время кризиса 2008-го - и короткой по времени: счет достаточно быстро восстановился. Видим так же, что при текущих условиях плохо работают шорты, но если их отключить совсем и торговать только лонг, то прибыльность стратегии серьезно падает. Можно оптимизировать тейк-профит и стоп-лосс и результаты улучшатся, но это не суть: мани-менеджмент в виде 2% тейка и 1% стопа теоретически нас устраивает, неустраивает то, что основное условие на вход (закрытие свечи больше/меньше открытия дня), которое неплохо работало на отрезке 2008-2011 не дает ничего хорошего в 2012-м.

Добавим дополнительное уловие: закрытие свечи должно быть выше открытия месяца. Таким образом, пока месяц в минусе, мы пытаемся шортить в те дни, когда есть нисходящая тенденция, когда месяц в плюсе, мы пытаемся покупать, когда есть восходящая тенденция относительно отрытия дня. Условия такие:

Вход в лонг — часовая свеча закрывается выше открытий текущих дня и месяца.

Вход в шорт — часовая свеча закрывается ниже открытий текущих дня и месяца.

Сигнал по первой дневной свече не отрабатываем — ждем второй.

Выходим по тейк-профиту и стоп-лоссу — 2% и 1% соответственно.

Результаты бэктеста с начала 2008 года. С реинвестированием. Комиссия — 0,06%. Акции Сбербанка, таймфрейм — 1 час.

В результате максимальная просадка уменьшается. Средние просадки по счету становятся скромнее. В 2012-м стратегия ведет себя лучше. Если немного поиграть с параметрами тейк-профита и стоп-лосса и выбрать, скажем, 2,2% и 1,3% для лонгов и 2,2% и 1,1% для шортов, то получаем такую картину.

Показатель риск/доходность и профит-фактор не слишком хорошие, но обратите внимние на то, что максимальноя просадка — 35,97%, случившаяся во время кризиса 2008-го, была короткой по времени (счет быстро восстановился), после этого самые значительные просадки не достигали 20%. Еще радует неплохой процент прибыльных сделок. И тот факт, что при любых значения оптимизируемых параметров (от 0,5 до 1,5 стоп и от 2 до 3,4 тейк) стратегия показывает плюс. Худшее значине по соотношению риск/доходность 1,32 — 66,1% годовых и 49,97% макс. просадка (файл с результатами оптимизации прикладываю).

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

Буду благодарен за комментарии и ценные советы. Код стратегии на С# из Трейдматика также прикладываю.

Прикрепленные файлы

·   Код + результаты оптимизации.rar

Комментарии

Pablo4646 — 23 августа 2012 г.

кода нет в файле

1 +

sergshabal — 23 августа 2012 г.

да кода нет)

0 +

ALendi — 23 августа 2012 г.

Теперь есть

0 +

ALendi — 23 августа 2012 г.

Результаты работы стратегии по годам без реинвестирования - доход/максимальная просадка.
2008 - 26,53/12,85
2009 - 64,7/5,45
2010 - 28,29/10,5
2011 - 40,07/8,68
2012 - 17,05/16,95

0 +

palevas — 24 августа 2012 г.

На тренде стратегия часто выходит из позиции и опять входит на одной свече.

0 +

ALendi — 24 августа 2012 г.

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

0 +

palevas — 24 августа 2012 г.

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

0 +

ALendi — 24 августа 2012 г.

На выходных поработаю с выходами. Напишу тут, что получилось

0 +

Николай Камынин — 24 августа 2012 г.

Добрый день,
Хочу обратить Ваше внимание на следующие факты.
1) Любые сигналы внутри свечи имеют неопределенность момента появления.
Поэтому, если в тесте появляются внутри свечи два сигнала - тайк-профит и торговый сигнал, то Вы не можете знать какой из них в реальности появился бы раньше.
Попытки улучшить стратегию на тесте с такими сигналами приводит к искажению истории.
2) Если торговый сигнал появляется внутри свечи и Вы исполняете сделку тоже внутри или на закрытие, то такая система заглядывает в будущее и реально работать будет плохо, хотя на истории может показывать очень хорошие результаты.

0 +

Николай Камынин — 24 августа 2012 г.

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

0 +

palevas — 24 августа 2012 г.

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

0 +

Николай Камынин — 24 августа 2012 г.

Добрый вечер, palevas
Я раньше высказывал некоторые вопросы(сомнения ) по публикуемым на сайте данным тестирования в TradeMatic.
Посмотрел на результаты и возник очередной вопрос:
В последней таблице капитал - 1 млн
максимальная просадка 4.3 млн.
Каким образом 4.3 млн составили от 1 млн 35.97%
для лонгов просадка 2.8 млн составляет 53.25%
От какого уровня считается просадка.
Можете объяснить?
Интересно, разработчики где-нибудь объяснили как они считают эти параметры или Вы сами догадываетесь, чтобы это значило.

0 +

Николай Камынин — 24 августа 2012 г.

хочу заметить, что данный алгоритм - это алгоритм работы на пробой значимого уровня поддержки(сопротивления)
кроме уровня открытия текущего дня(месяца,квартала,года) можно с таким же успехом использовать и максимум, минимум и закрытие соответствующего периода (использую в своем роботе) Более того можно использовать CHLD не только текущего но и предыдущих(тоже использую)
Результаты работы робота можно увидеть на моем сайте.
для 2012 года на сегодня это 342%. Максимальная просадка с 2007 года не превышает 10%.

0 +

palevas — 24 августа 2012 г.

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

0 +

Николай Камынин — 25 августа 2012 г.

ALendi,
1)Относительно просадки в данном алгоритме.
В ы пишите то просадка в 35% была в 2008 году, а из таблицы следует то она была в 2012 году.
вообще-то в 2012 году такую просадку очень сложно получить.
palevas,
2)Close High Low Open (в сокращении опечатка следует читать CHLO)

0 +

Николай Камынин — 25 августа 2012 г.

вернее сказать в таблице две даты для максимальной просадки 2012 и 2008
В 2008 -просадка 35% а в 2012 - 4 млн. если к начальному капиталу то это 400% если к конечному то это 20%. Очевидно что в 2008 году 35% это меньше чем 4 млн в 2012.
TradeMatic- крутая программа

0 +

serg108 — 26 августа 2012 г.

Попытался воспроизвести по описанию стратегию в Amibroker, результаты плачевные, хотя может что-то не правильно понял.

0 +

serg108 — 26 августа 2012 г.

Если оставить только стоп-лосс, а тейк-профит убрать то результаты вырастают в разы, но в основном только из-за 2009 года.

0 +

orekton — 26 августа 2012 г.

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

0 +

ALendi — 29 августа 2012 г.

Всем привет! В плане доработки алгоритма я нисколько не продвинулся. Так что к самому материалу добавить пока ничего не могу. По поводу комментариев.

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

serg108, в Ами по закрытию свечи работаете. "Если оставить только стоп-лосс, а тейк-профит убрать то результаты вырастают в разы, но в основном только из-за 2009 года." Как в это случае закрываете позиции, речь о результатах в Ами?

0 +

serg108 — 31 августа 2012 г.

Что касается закрытии позиции - sell=short, buy=cover, т.е по сути в зависимости от того что наступает раньше - тейк-профит или сигнал на переворот. Да, разговор был о попытке повторения стратегии на Ami.

0 +

ALendi — 31 августа 2012 г.

serg108, в описанной стратегии позиции закрываются только по тейку и стопу. в случае открытой позиции (длинной или короткой), сигналы не отрабатываются.

0 +

serg108 — 31 августа 2012 г.

Ясно. По описанию стратегии такого уточнения нет, поэтому и тестировал в обычном варианте.

На данный момент максимальная прибыль и минимальная просадка по данной стратегии у меня получилась без использования тейк-профит (только стоп-лосс и переворот), с использованием переноса в безубыток через N процентов прибыли, с тогровлей только по основному тренду (ema 100-200), ну и с ограничением торговли по максимальному дневному ATR. Хотя это можно обозвать как подгонку, но для меня эти фильтры имеют логическое обоснование поэтому я их обычно применяю.

0 +

ALendi — 31 августа 2012 г.

Получилось что-то приличное?

0 +

serg108 — 31 августа 2012 г.

Не уверен.

Если в изначальном варианте с 1 оптимизируемым параметром (stop loss) получалось:
Net Profit - 260%
MaxSysDD - 26%
Сделок - 291
Основная прибыль это 2009 год.

В модифицированном варианте получилось

Net Profit - 234%
MaxSysDD - 9%
Сделок - 228

Основная прибыль это 2008,2009 год.

Сразу скажу, что ухудшаю результаты используя проскальзывание, запрет на шорты при падении больше чем на 3%, даты отсечек и т.п. Да и в кризис, по-моему, шорты вообще запрещали, поэтому результаты будут не объективные.

Может где-то ошибки есть в моем коде, поэтому не факт что считаю верно.

0 +

smb1975 — 29 ноября 2012 г.

Подскажите , в С# не силен , что добавить в код для тестирования. Условия ,выходим по тейк-профиту и стоп-лоссу , но по стоп-лоссу идет переворот позиции. С защитой от пилы n - кол-во раз.

0 +

orekton — 29 ноября 2012 г.

smb1975, в какой программе работаете?

0 +

smb1975 — 29 ноября 2012 г.

orekton, Трейдматик

0 +

orekton — 29 ноября 2012 г.

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using TradeMatic;
using TradeMatic.Indicators;

namespace ScriptNamespace
{
class MyScript : Script
{
private StrategyParameter parameter0;
private StrategyParameter parameter1;
private StrategyParameter parameter2;
private StrategyParameter parameter3;

public MyScript()
{
parameter0 = CreateParameter("Период SMA (LE)", 9, 0, 1000, 1);
parameter1 = CreateParameter("Процент (LX)", 1, 0, 100, 1);
parameter2 = CreateParameter("Процент (LX)", 1, 0, 100, 1);
parameter3 = CreateParameter("Процент (LX)", 1, 0, 100, 1);
}

public override void Execute()
{
// Вывод индикаторов на график
PlotSeries(PricePane, SMA.Series(Close, parameter0.ValueInt), Color.Red, LineStyle.Solid, 1);

// Инициализация

// Основной цикл
int A = 0;
for (int bar = 9; bar < Symbol.Count; bar++)
{
if (MarketPosition == 1)
{
// Выход из длинной позиции
if (LastPosition.NetProfitAsOfBarPercent(bar) < -parameter1.Value)
{
SellAtClose(bar, LastPosition, "");
if (A {
ShortAtClose(bar, "");
A++;
}
}
else if (LastPosition.NetProfitAsOfBarPercent(bar) > parameter2.Value)
{
SellAtClose(bar, LastPosition, "");
}
}


else if (MarketPosition == -1)
{


// Выход из длинной позиции
if (LastPosition.NetProfitAsOfBarPercent(bar) < -parameter1.Value)
{
CoverAtClose(bar, LastPosition, "");
if (A {
BuyAtClose(bar, "");
A++;
}

}
else if (LastPosition.NetProfitAsOfBarPercent(bar) > parameter2.Value)
{
CoverAtClose(bar, LastPosition, "");
}

}

if (MarketPosition == 0)
{
// Вход в длинную позицию
if ((Close[bar] > SMA.Value(bar, Close, parameter0.ValueInt)))
{
BuyAtClose(bar, "");
A=0;
}
else if ((Close[bar] < SMA.Value(bar, Close, parameter0.ValueInt)))
{
ShortAtClose(bar, "");
A=0;
}
}


}
}
}
}

1 +

orekton — 29 ноября 2012 г.

smb1975, вот вариант кода. если выходим по стопу - переворачиваемся, но не больше parameter3.Value раз подряд.

0 +

smb1975 — 29 ноября 2012 г.

orekton, Спасибо , но при компиляции программа ругается на if (A {

0 +

orekton — 30 ноября 2012 г.

Почему-то неправильно скопировалсь. Этот участок должен быть записан так

if (A {
ShortAtClose(bar, "");
A++;
}

0 +

Написать комментарий

Чтобы написать комментарий, необходимо авторизоваться.

Написать администратору