Стратегия Keltner Channel, основанная на тенденциях

Автор:Чао Чжан, Дата: 2023-11-03 16:59:39
Тэги:

img

Обзор

Эта стратегия основана на трех основных показателях: индикатор тенденции, канал Келтнера и индикатор DM.

Индикатор тренда состоит из SMA и EMA. Канал Келтнера используется для определения цены открытия и закрытия свечей. Индикатор DM предназначен для оценки направления длинного и короткого.

Сигнал входа запускается, когда:

  1. ЕМА пересекает SMA, подтверждая рост
  2. Свеча открывается над верхней полосой и закрывается внутри канала
  3. Показатель DM выше показателя

Стратегия имеет два уровня получения прибыли и один уровень остановки потери.

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

Определение тенденции

Для определения направления тренда используются перекрестки SMA и EMA. Пересечение EMA (46) через SMA (46) указывает на тенденцию к росту.

Канал Келтнера

Канал имеет три линии: среднюю, верхнюю и нижнюю. Средняя линия представляет собой SMA с длиной 81. Верхние и нижние полосы расположены на кратном истинном диапазоне выше и ниже средней линии. Здесь мы используем 2,5 раза истинного диапазона.

Канал Келтнера показывает уровни поддержки и сопротивления. Проанализированы движения цены по отношению к каналу.

Показатель DM

Индикатор DM содержит ADX, +DI и -DI. +DI измеряет силу восходящего тренда, а -DI - силу нисходящего тренда. ADX показывает силу тренда.

При этом используются ADX (10), DI (19), а когда +DI пересекает отметку над эталоном (по умолчанию 27), это сигнализирует о сильном восходящем тренде и хорошем для длинного входа.

Анализ преимуществ

Эта стратегия сочетает в себе индикаторы тренда, канала и импульса для эффективного определения ценовых действий и длинного/короткого направления.

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

  2. Канал Келтнера показывает четкие уровни поддержки и сопротивления.

  3. Индикатор DM измеряет длинный/короткий импульс для обеспечения направления.

  4. Строгие правила входа помогают фильтровать ложные побеги.

  5. Точки получения прибыли и остановки потери позволяют получать прибыль.

Анализ рисков

Также следует учитывать некоторые риски:

  1. Тенденция может измениться, когда EMA пересекается ниже SMA, поэтому выходите своевременно.

  2. Канал может потерпеть неудачу при сильных тенденциях, а не при строгой поддержке/сопротивлении.

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

  4. Фальшивый прорыв может привести к вхождению, но быстрое отступление, используйте разумную стоп-лосс.

  5. Приобретение прибыли и стоп-лосс требуют постоянной оптимизации для адаптации к изменяющимся рыночным условиям.

Руководство по оптимизации

Некоторые способы дальнейшей оптимизации стратегии:

  1. Настройка параметров и тестирование различных методов определения тренда.

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

  3. Испытайте различные параметры ДМ и найдите оптимальную комбинацию.

  4. Добавьте больше фильтров, например, громкость.

  5. Попробуйте остановить потерю, чтобы получить больше прибыли.

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

Заключение

Стратегия включает в себя несколько индикаторов для определения тренда, поддержки/сопротивления и импульса, что позволяет эффективно улавливать тенденции и контролировать риски.


/*backtest
start: 2022-10-27 00:00:00
end: 2023-11-02 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Original Idea by: Wunderbit Trading

//@version=4
strategy("Keltner Channel ETH/USDT 1H", overlay=true, initial_capital=1000,pyramiding = 0, currency="USD", default_qty_type=strategy.percent_of_equity, default_qty_value=100,  commission_type=strategy.commission.percent,commission_value=0.07)


/// TREND
ribbon_period = input(46, "Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)

// p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
// p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
// fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)

//Upward Trend
UT=leadLine2 < leadLine1
DT=leadLine2>leadLine1

///////////////////////////////////////INDICATORS

// KELTNER //
source       = close
useTrueRange = input(true)
length       = input(81, step=1, minval=1)
mult         = input(2.5, step=0.1)

// Calculate Keltner Channel
ma      = sma(source, length)
range   = useTrueRange ? tr : high - low
rangema = sma(range, length)
upper = ma + rangema * mult
lower = ma - rangema * mult

plot(ma, title="Middle", color=color.orange)
p1=plot(upper, title="Upper", color=color.orange)
p2=plot(lower, title="Lower", color=color.orange)
fill(p1,p2)


// DMI INDICATOR //
adxlen = 10 // input(10, title="ADX Smoothing")
dilen = input(19, title="DI Length")
keyLevel = 23// input(23, title="key level for ADX")
dirmov(len) =>
	up = change(high)
	down = -change(low)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange)
	minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange)
	[plus, minus]

adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
	[adx, plus, minus]

[sig, up, down] = adx(dilen, adxlen)

benchmark=input(title="DMI Benchmark", defval=27, minval=1,step=1)

// plot(sig, color=color.red, title="ADX")
// plot(up, style=plot.style_histogram, color=color.green, title="+DI")
// plot(down, style=plot.style_histogram, color=color.red, title="-DI")
// plot(keyLevel, color=color.white, title="Key Level")

///////////////////////////////////////////////////////////


////////////////////////////////////////////////////Component Code Start

testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(9999, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriod() => true
///// Component Code Stop //////////////////////////////////////////

//////////////// STRATEGY EXECUTION //////////////////////////

//LONG SET UP
// Take Profit / Stop Loss
long_tp1_inp = input(4.5, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(15, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(20, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(100, title="Long Take Profit 2 Qty", step=1)

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)

long_sl_inp = input(4, title='Long Stop Loss %', step=0.1)/100
long_stop_level = strategy.position_avg_price * (1 - long_sl_inp)


// STRATEGY CONDITION
// LONG
entry_long = ((open > lower and open < upper) and close > upper) and up > down and up > benchmark //  and volume[0] > volume[1]
entry_price_long=valuewhen(entry_long,close,0)
SL_long = entry_price_long * (1 - long_sl_inp)
exit_long = (close < lower) or low < SL_long


// STRATEGY EXECUTION
if testPeriod()

    // LONG
    if UT
        strategy.entry(id="Long", long=true, when=entry_long, comment = "INSERT ENTER LONG COMMAND")
    strategy.exit("TP1","Long", qty_percent=long_tp1_qty, limit=long_take_level_1) // PLACE TAKE PROFIT IN WBT BOT SETTINGS 
    strategy.exit("TP2","Long", qty_percent=long_tp2_qty, limit=long_take_level_2) // PLACE TAKE PROFIT IN WBT BOT SETTINGS
    strategy.close(id="Long", when=exit_long, comment= "INSERT EXIT LONG COMMAND")


//PLOT FIXED SLTP LINE
// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")

Больше