В процессе загрузки ресурсов... загрузка...

Стратегия отслеживания тренда на канале импульса равновесия

Автор:Чао Чжан, Дата: 2023-12-12 18:07:31
Тэги:

img

Обзор

Эта стратегия определяет формирование трендов путем расчета каналов и индикаторов импульса для достижения торговли отслеживанием тренда.

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

Стратегия в основном использует следующие два показателя для оценки:

  1. Индикатор импульса (DMI): оценивает длинную и короткую тенденции на рынке и генерирует торговые сигналы, когда индекс превышает установленный порог.

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

Конкретная логика торговли такова: когда индикатор импульса +DI больше установленного порога (по умолчанию 32), определяется, что сформировалась бычья тенденция. В это время, если цена проходит через верхнюю рельсу канала равновесия, генерируется сигнал покупки; после этого используется канал равновесия. Средняя рельса используется в качестве линии остановки потери для отслеживания остановки потери и достижения защиты прибыли.

Эта стратегия сочетает в себе преимущества двух индикаторов, использует индикаторы импульса для определения направления тренда и использует каналы равновесия для определения времени входа и зоны остановки потерь.

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

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

  2. Использование равновесного канала для определения конкретного диапазона торговли может эффективно блокировать зону прибыли.

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

  4. Стратегия относительно проста и ясна, легко понять и реализовать, и подходит для начинающих количественной торговли, чтобы узнать.

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

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

  1. Стратегия подходит только для трендовых рынков и не подходит для консолидации и колебаний рынков.

  2. Показатель DMI имеет определенное отставание и не может определить подтверждение тренда.

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

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

Оптимизация

  1. Для замены фиксированного процентного стоп-лосса можно протестировать различные методы стоп-лосса, такие как ATR стоп-лосс, движущийся стоп-лосс и т.д.

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

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

  4. Устойчивость параметров может быть проверена путем пошаговой оптимизации и прохождения тестирования.

Резюме

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


/*backtest
start: 2023-11-11 00:00:00
end: 2023-12-11 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Original Idea by: @Wunderbit


//@version=4
strategy("Keltner Channel [LINKUSDT] 1H", overlay=true, initial_capital=3000,pyramiding = 0, currency="USD", default_qty_type=strategy.percent_of_equity, default_qty_value=100,  commission_type=strategy.commission.percent,commission_value=0.1)


/// TREND
trend_cond = input(true, title="Enable Ribbon Filter")
ribbon_period = input(30, "Ribbon 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(80, "KELTNER Period", step=1, minval=1)
mult         = input(3.0,"KELTNER Multiple", step=0.1)

// Calculate Keltner Channel
ma      = ema(source, length)
range   = useTrueRange ? tr : high - low
rangema = ema(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 //

lensig = input(14, title="ADX Smoothing", minval=1, maxval=50)
len = input(14, minval=1, title="DI Length")
up = change(high)
down = -change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
trur = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / trur)
minus = fixnan(100 * rma(minusDM, len) / trur)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), lensig)

trig_level=input(title="+DI Trigger Level", defval=32, minval=1,step=1)
//trig_level_adx=input(title="ADX Trigger Level", defval=30, minval=1,step=1)

//plot(adx, color=#FF006E, title="ADX")
//plot(plus, color=#0094FF, title="+DI")
//plot(minus, color=#FF6A00, title="-DI")
// plot(trig_level, 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(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
    
///// Component Code Stop //////////////////////////////////////////

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

// STRATEGY CONDITION
// LONG

long = ((open > lower and open < upper) and close > upper) and plus > minus and plus > trig_level and volume[0] > volume[1]
entry_long = trend_cond ? long and UT : long
exit_long = (close < ma) //or low < SL_long

//LONG SET UP
// Take Profit / Stop Loss

entry_price_long=valuewhen(entry_long,close,0)
//SL_long = entry_price_long * (1 - long_sl_inp)

long_tp1_inp = input(8, title='Long Take Profit 1 Target %', step=0.1)/100
long_tp1_qty = input(20, title="Long Take Profit 1 Qty %", step=1)

long_tp2_inp = input(16, title='Long Take Profit 2 Target %', step=0.1)/100
long_tp2_qty = input(30, 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 EXECUTION
if testPeriod()

    // LONG
    
    strategy.entry(id="Long", long=true, when=entry_long, comment = "INSERT ENTRY 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")

Больше