Трехкратный супертенд Ichimoku Cloud Количественная стратегия торговли

Автор:Чао Чжан, Дата: 2023-12-27 15:22:40
Тэги:

img

Резюме

Эта стратегия является количественной торговой стратегией, которая сочетает в себе тройной индикатор супертенденции, индикатор облака Ичимоку, индикатор среднего истинного диапазона (ATR) и экспоненциальную скользящую среднюю (EMA).

Принцип стратегии

Основная логика этой стратегии основана на тройном индикаторе супертенденции. Индикатор супертенденции определяет направление тренда путем сравнения цены со средним истинным диапазоном в течение определенного периода. Когда цена выше верхней полосы, это бычий сигнал, а когда цена ниже нижней полосы, это медвежий сигнал. Эта стратегия использует три индикатора супертенденции с различными параметрами. Торговые сигналы генерируются, когда все три дают сигналы покупки или продажи одновременно.

Кроме того, толщина облака Ичимоку помогает определить силу текущего тренда, чтобы отфильтровать некоторые ложные сигналы.

В частности, идти длинным, когда цена выше верхней полосы всех трех индикаторов супертенденции, и идти коротким, когда ниже нижней полосы всех трех.

Преимущества

  1. Три индикатора супертенденции с различными настройками могут эффективно фильтровать рыночный шум и более точно определять направление тренда.

  2. Облако Ичимоку определяет силу тренда, чтобы избежать ложных прорывов.

  3. EMA помогает подтверждать направление среднесрочного и долгосрочного тренда, проверяет сигналы от супертенденции, повышая надежность.

  4. Объединение нескольких индикаторов делает сигналы более надежными, поскольку они могут проверять друг друга при определении тенденции рынка.

Риски

  1. Несмотря на то, что облако Ичимоку добавлено, все еще существует риск попадания в недействительную зону, если толщина облака проникнет.

  2. Когда волатильность высока, стоп-лосс, установленный ATR, может быть напрямую активирован, тем самым увеличивая уровень потерь.

  3. Недействительные сигналы могут часто возникать, если параметры супертенденции установлены ненадлежащим образом.

Улучшение

  1. Дополнительные показатели, такие как индекс волатильности, полосы Боллинджера, могут быть добавлены для фильтрации сигналов и повышения надежности.

  2. Улучшить расчет ATR для динамической корректировки диапазона остановки потери при больших колебаниях для снижения скорости потери.

  3. Добавьте модель машинного обучения, обученную на исторических данных для оценки торговых сигналов вместо ручного настройки параметров.

Заключение

Эта стратегия сочетает в себе четыре части, включая тройной супертенд, облако Ичимоку, ATR и EMA. Сигналы проверяются по всем индикаторам при определении тенденции рынка. Облако Ичимоку и ATR контролируют риск остановки потерь. EMA подтверждает среднесрочный и долгосрочный тренд. Сигналы от этой стратегии относительно надежны для среднесрочного и долгосрочного держания. Стоп-лосс можно дополнительно оптимизировать и добавить больше вспомогательных индикаторов для получения лучшей эффективности стратегии.


/*backtest
start: 2022-12-20 00:00:00
end: 2023-12-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="HyperTrend", shorttitle="HyperTrend", overlay=true )

// 
float percent_of_portfo = input.int(2, title = "percent of portfo per order", minval = 0, maxval = 100) / 100

// ichimoku Cloud
conversionPeriods = input.int(9, minval=1, title="Conversion Line Length", group = "ichimoku")
basePeriods = input.int(26, minval=1, title="Base Line Length", group = "ichimoku")
laggingSpan2Periods = input.int(52, minval=1, title="Leading Span B Length", group = "ichimoku")
displacement = input.int(26, minval=1, title="Lagging Span", group = "ichimoku")
donchian(len) => math.avg(ta.lowest(len), ta.highest(len))
conversionLine = donchian(conversionPeriods)
baseLine = donchian(basePeriods)
leadLine1 = math.avg(conversionLine, baseLine)
leadLine2 = donchian(laggingSpan2Periods)
p1 = plot(leadLine1, offset = displacement - 1, color=#A5D6A7,
	 title="Leading Span A", display = display.none)
p2 = plot(leadLine2, offset = displacement - 1, color=#ef9a9a,
	 title="Leading Span B", display = display.none)
plot(leadLine1 > leadLine2 ? leadLine1 : leadLine2, offset = displacement - 1, title = "Kumo Cloud Upper Line", display = display.none) 
plot(leadLine1 < leadLine2 ? leadLine1 : leadLine2, offset = displacement - 1, title = "Kumo Cloud Lower Line", display = display.none) 
fill(p1, p2, color = leadLine1 > leadLine2 ? color.rgb(67, 160, 72, 59) : color.rgb(244, 67, 54, 70))


// three supertrend

//1
atrPeriod1 = input(10, "ATR Length1", group="SuperTrend")
factor1 = input.float(1.0, "Factor1", step = 0.01, group="SuperTrend")

[supertrend1, direction1] = ta.supertrend(factor1, atrPeriod1)
supertrend1 := barstate.isfirst ? na : supertrend1

bodyMiddle1 = plot(barstate.isfirst ? na : (open + close) / 2, display = display.none)
upTrend1 =    plot(direction1 < 0 ? supertrend1 : na, "Up Trend",   color = color.green, style = plot.style_linebr)
downTrend1 =  plot(direction1 < 0 ? na : supertrend1, "Down Trend", color = color.red,   style = plot.style_linebr)


//2
atrPeriod2 = input(11, "ATR Length2", group="SuperTrend")
factor2 = input.float(2.0, "Factor2", step = 0.01, group="SuperTrend")

[supertrend2, direction2] = ta.supertrend(factor2, atrPeriod2)
supertrend2 := barstate.isfirst ? na : supertrend2

bodyMiddle2 = plot(barstate.isfirst ? na : (open + close) / 2, display = display.none)
upTrend2 =    plot(direction2 < 0 ? supertrend2 : na, "Up Trend",   color = color.green, style = plot.style_linebr)
downTrend2 =  plot(direction2 < 0 ? na : supertrend2, "Down Trend", color = color.red,   style = plot.style_linebr)


//3
atrPeriod3 = input(12, "ATR Length2", group="SuperTrend")
factor3 = input.float(3.0, "Factor2", step = 0.01, group="SuperTrend")

[supertrend3, direction3] = ta.supertrend(factor3, atrPeriod3)
supertrend3 := barstate.isfirst ? na : supertrend3

bodyMiddle3 = plot(barstate.isfirst ? na : (open + close) / 2, display = display.none)
upTrend3 =    plot(direction3 < 0 ? supertrend3 : na, "Up Trend",   color = color.green, style = plot.style_linebr)
downTrend3 =  plot(direction3 < 0 ? na : supertrend3, "Down Trend", color = color.red,   style = plot.style_linebr)


// ATR
lengthATR = input.int(title="Length (ATR)", defval=14, minval=1, group="ATR")
smoothingATR = input.string(title="Smoothing (ATR)", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"], group="ATR")
ma_function(sourceATR, lengthATR) =>
	switch smoothingATR
		"RMA" => ta.rma(sourceATR, lengthATR)
		"SMA" => ta.sma(sourceATR, lengthATR)
		"EMA" => ta.ema(sourceATR, lengthATR)
		=> ta.wma(sourceATR, lengthATR)
ATR = ma_function(ta.tr(true), lengthATR)
plot(ATR, title = "ATR", color=color.new(#B71C1C, 0), display = display.none)

// EMA
lenEMA = input.int(200, minval=1, title="Length of EMA", group="EMA")
srcEMA = input(close, title="Source of EMA", group="EMA")
offset = input.int(title="Offset (EMA)", defval=0, minval=-500, maxval=500, group="EMA")
outEMA = ta.ema(srcEMA, lenEMA)
plot(outEMA, title="EMA", color=color.blue, offset=offset, display = display.none)

ma(sourceEMA, lengthEMA, type) =>
    switch type
        "SMA" => ta.sma(sourceEMA, lengthEMA)
        "EMA" => ta.ema(sourceEMA, lengthEMA)
        "SMMA (RMA)" => ta.rma(sourceEMA, lengthEMA)
        "WMA" => ta.wma(sourceEMA, lengthEMA)
        "VWMA" => ta.vwma(sourceEMA, lengthEMA)

typeMA = input.string(title = "Method (EMA)", defval = "SMA", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="EMA")
smoothingLengthEMA = input.int(title = "Smoothing Length (EMA)", defval = 5, minval = 1, maxval = 100, group="EMA")

smoothingLine = ma(outEMA, smoothingLengthEMA, typeMA)
plot(smoothingLine, title="Smoothing Line", color=#f37f20, offset=offset, display=display.none)


//logic



if (open + ATR > supertrend1) and (open + ATR > supertrend2) and (open + ATR > supertrend3) 
	strategy.entry("L", strategy.long)
else if (open < supertrend1 + ATR) and (open < supertrend2 + ATR) and (open < supertrend3 + ATR) 
	strategy.entry("S", strategy.short)
else
	strategy.close_all("C")

Больше