Заметка

Трендовая торговая система на основе индикатора MACD

  2  

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

Торговая система использует индикатор MACD как основной для входа. Однако, как показала практика использования этого индикатора, он частенько грешит с точностью входов, выдавая, порой, совершенно нелепые сигналы. Так для него в порядке вещей выдать сигнал на покупку при явно нисходящем тренде. Конечно, подобное обстоятельство – вопрос используемых параметров, но, если мы хотим иметь достаточно “чувствительный” MACD, то данные ситуации лучше избегать. Для этого был установлен простейший фильтр – покупка (рассуждаем от покупок) будет исполняться тогда, когда цена преодолеет уровень High того бара, на котором линия MACD пересекла сигнальную линию. При этом наклон медленной EMA (которая используется для расчета линии MACD) должен быть положительным.

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

Правила входа:

- Если линия MACD пересекает сигнальную линию МАСD, то взводим флаг готовности к входу – истина. Цену входа устанавливаем на уровне цены High бара, на котором произошло пересечение MACD.

 - Если взведен флаг готовности ко входу и при этом цена достигла уровня High, а также наклон скользящей средней положительный (это проверяется через индикатор ROC, а в качестве скользящей средней взята одна из EMA (медленная) индикатора MACD), то входим в позицию. Последнее условие помогло избежать большого количества сделок, которые совершали покупки на падающем рынке.

 Правила Выхода:

- Если текущая цена закрытия выше цены входа в позицию, выставляем стоп-приказ на закрытие по текущей цене с отступом 50% среднего диапазона

- Если текущая цена закрытия ниже цены входа  выставляем стоп-приказ на продажу по цене закрытие с отступом 25% среднедневного диапазона.

Данная техника использовалась в классическом варианте робота Fractal_Reverse. Здесь она также работает приемлемо и среди других вариантов выхода, которые пробовались, проявила себя лучше всех. Вообще стоит сказать, что она является достаточно универсальной, поскольку использовалась и в других стратегиях. При этом для отступа ATR можно использовать не цену закрытия, а, например, цену Low предыдущего бара. Как вариант, можно посмотреть отступ не от предыдущих баров, а от минимального за период. Сами параметры 0,5 и 0,25 можно сделать оптимизируемыми.

Параметры стратегии (оптимизируемые):

Работает на 15минутном масштабе. Также может работать и в масштабе 1 час.

Интервал тестирования: 1/07/2009 по 1/10/2011

Работаем 1 контрактом, начальный капитал 200000

Работают лонги и шорты. Но шорты реализованы как отдельная стратегия.

Параметр индикатора MACD – один параметр, остальные берутся по соотношениям: x2, x9/13

Параметр ATR

Два дополнительных (как показали эксперименты – мало влияющие на результаты) параметры – период для ROC и коэффициент K для определения долей ATR при вычислении уровней выхода.

Работают лонги и шорты. Но шорты реализованы как отдельная стратегия.

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

Ниже результаты работы.


рис 1. Кривая капитала
рис 1. Кривая капитала

All Trades

Long Trades

Short Trades

Buy & Hold

Starting Capital

200 000,00р.

200 000,00р.

200 000,00р.

200 000,00р.

Ending Capital

386 083,30р.

386 083,30р.

200 000,00р.

346 310,00р.

Net Profit

186 083,30р.

186 083,30р.

0,00р.

146 310,00р.

Net Profit %

93,04%

93,04%

0,00%

73,16%

Annualized Gain %

35,54%

35,54%

0,00%

28,90%

Exposure

30,96%

30,96%

0,00%

96,38%

Total Commission

-54 030,00р.

-54 030,00р.

0,00р.

-60,00р.

Return on Cash

0,00р.

0,00р.

0,00р.

0,00р.

Margin Interest Paid

0,00р.

0,00р.

0,00р.

0,00р.

Dividends Received

0,00р.

0,00р.

0,00р.

0,00р.

Number of Trades

901

901

0

1

Average Profit

206,53р.

206,53р.

0,00р.

146 310,00р.

Average Profit %

0,15%

0,15%

0,00%

77,70%

Average Bars Held

20,74

20,74

0

29 176,00

Winning Trades

301

301

0

1

Win Rate

33,41%

33,41%

0,00%

100,00%

Gross Profit

606 941,67р.

606 941,67р.

0,00р.

146 310,00р.

Average Profit

2 016,42р.

2 016,42р.

0,00р.

146 310,00р.

Average Profit %

1,39%

1,39%

0,00%

77,70%

Average Bars Held

41,45

41,45

0

29 176,00

Max Consecutive Winners

6

6

0

1

Losing Trades

600

600

0

0

Loss Rate

66,59%

66,59%

0,00%

0,00%

Gross Loss

-420 858,37р.

-420 858,37р.

0,00р.

0,00р.

Average Loss

-701,43р.

-701,43р.

0,00р.

0,00р.

Average Loss %

-0,47%

-0,47%

0,00%

0,00%

Average Bars Held

10,36

10,36

0

0

Max Consecutive Losses

11

11

0

0

Maximum Drawdown

-21 088,66р.

-21 088,66р.

0,00р.

-129 880,00р.

Maximum Drawdown Date

11.08.2011

11.08.2011

01.07.2009

11.08.2011

Maximum Drawdown %

-5,80%

-5,80%

0,00%

-30,26%

Maximum Drawdown % Date

15.02.2010

15.02.2010

13.10.2011

11.08.2011

Wealth-Lab Score

108,12

108,12

0

20,91

Sharpe Ratio

3,53

3,53

0

1,12

Profit Factor

1,44

1,44

0

бесконечность

Recovery Factor

8,82

8,82

0

1,13

Payoff Ratio

2,97

2,97

0

0

таб 1. Характеристика работы стратегии

2
рис 2. Доходность по месяцам

Period Starting

Return

Return %

Max DD %

Exposure %

Entries

Exits

01.07.2009

9 998,51р.

5

-3,95

27,46

35

34

03.08.2009

19 317,29р.

9,2

-2,61

26,7

32

32

01.09.2009

9 750,07р.

4,25

-2,33

30,94

35

35

01.10.2009

18 213,03р.

7,62

-4,15

30,83

36

37

02.11.2009

12 491,92р.

4,86

-3,75

33,03

33

32

01.12.2009

8 702,03р.

3,23

-3,48

30,32

37

37

11.01.2010

5 837,70р.

2,1

-3,55

30,17

28

28

01.02.2010

-3 103,85р.

-1,09

-4,37

33,38

32

33

01.03.2010

9 034,99р.

3,21

-2,67

33,23

37

36

01.04.2010

3 317,43р.

1,14

-2,42

34,02

36

36

04.05.2010

295,46р.

0,1

-5,04

26,7

31

31

01.06.2010

-377,37р.

-0,13

-3,18

28,58

36

37

01.07.2010

12 318,84р.

4,2

-1,73

33,4

34

33

02.08.2010

-2 179,52р.

-0,71

-2,84

25,3

39

40

01.09.2010

4 284,79р.

1,41

-1,1

28,54

41

40

01.10.2010

9 976,47р.

3,24

-1,78

32,98

34

34

01.11.2010

2 418,64р.

0,76

-1,77

28,74

33

33

01.12.2010

7 297,29р.

2,28

-1,82

34,38

40

40

11.01.2011

8 120,65р.

2,48

-1,61

34,06

29

29

01.02.2011

11 800,14р.

3,51

-2,93

35,82

34

34

01.03.2011

13 557,74р.

3,9

-1,17

34,61

35

35

01.04.2011

10 539,18р.

2,92

-2,77

34,14

40

40

03.05.2011

9 868,54р.

2,66

-2,33

30,28

30

30

01.06.2011

-1 715,37р.

-0,45

-2,56

30,75

36

36

01.07.2011

10 612,26р.

2,79

-1,4

30,68

32

32

01.08.2011

-4 293,56р.

-1,1

-5,35

25,01

36

36

таб 2. Результаты работы по месяцам\

Стратегия торговалась в режиме реальных торгов с июля 2011 года. Представленные результаты — только для лонгов. Средняя прибыль составила 13% (среднегодовая) при просадке порядка 13%. Как видим, результаты прилично отличаются от полученных при бэктестинге. Но, кроме "чудодейственных" свойств оптимизации, это также объясняется следующим: все, что было заработано стратегией — пришлось на период трендовости, в боковике стратегия рушится. Ну и, конечно, на падающем рынке, лонгам зарабатывать сложновато.

Комментарии

ALendi — 20 марта 2012 г.

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

0 +

Flyanimal — 24 марта 2012 г.

ALendi, добрый день!
Система работает в лонг, потому как в шорт работает плохо (результаты теста были плохими). То, что система повторяет график, в этом ничего удивительного. Рынок растет - она следует за ним, падает- пытается минимизировать просадку, но сразу не реагирует, в силу особенностей используемых индикаторов и параметров стратегии. Насчет улучшения.. Система средненькая, но результаты могут быть улучшены управлением капитала. Думаю, здесь есть над чем работать.

0 +

fedosey1 — 1 июня 2015 г.

всем привет. я только начал разбираться и решил реализовать ваш алгоритм. я его конечно не много упростил, но у меня получилась какая-то сумашедшая доходность. что я делаю не так? тестировал на сбербанке 15 минут осень-зима 2014
вот код
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 _period;


public MyScript()
{
parameter0 = CreateParameter("Период короткой средней (LE)", 12, 9, 15, 1);
parameter1 = CreateParameter("Период длинной средней (LE)", 26, 22, 40, 1);
parameter2 = CreateParameter("Период сигнальной средней (LE)", 9, 5, 14, 1);
_period = CreateParameter("Период для угла наклона",2,1,5,1);

}

public override void Execute()
{
// Вывод индикаторов на график
ChartPane pane0 = CreatePane(75, true);
PlotSeries(pane0, MACDExt.Series(Close, parameter0.ValueInt, parameter1.ValueInt), Color.Maroon, LineStyle.Solid, 1);
PlotSeries(pane0, EMA.Series(MACDExt.Series(Close, parameter0.ValueInt, parameter1.ValueInt), parameter2.ValueInt), Color.Black, LineStyle.Solid, 0);




// Инициализация
bool ReadyToLong = false;
double price =0;;//цена входа
int period = _period.ValueInt;

MACDExt macdext = MACDExt.Series(Close, parameter0.ValueInt, parameter1.ValueInt);
EMA emasig = EMA.Series(macdext, parameter2.ValueInt);


// Основной цикл
for (int bar = 26; bar < Symbol.Count; bar++)
{
if (MarketPosition == 1)
{
if(LastPosition != null && (Close[bar] > LastPosition.EntryPrice))
{

SellAtClose(bar,LastPosition);
}

}
else if (MarketPosition == -1)
{
}

if (MarketPosition == 0)

{
if(CrossOver(bar,macdext,emasig)){
ReadyToLong = true;
price = High[bar];
}
if((ReadyToLong &&(Close[bar]>High[bar-1]))&& EMA.Value(bar,Close,parameter1.ValueInt)>EMA.Value(bar-periodnazad,Close,parameter1.ValueInt))
{
BuyAtLimit(bar,price);

}
}

if (MarketPosition == 0)
{
}
}
}
}
}

0 +

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

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

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