Эта стратегия основана на трех основных показателях: индикатор тенденции, канал Келтнера и индикатор DM.
Индикатор тренда состоит из SMA и EMA. Канал Келтнера используется для определения цены открытия и закрытия свечей. Индикатор DM предназначен для оценки направления длинного и короткого.
Сигнал входа запускается, когда:
Стратегия имеет два уровня получения прибыли и один уровень остановки потери.
Для определения направления тренда используются перекрестки SMA и EMA. Пересечение EMA (46) через SMA (46) указывает на тенденцию к росту.
Канал имеет три линии: среднюю, верхнюю и нижнюю. Средняя линия представляет собой SMA с длиной 81. Верхние и нижние полосы расположены на кратном истинном диапазоне выше и ниже средней линии. Здесь мы используем 2,5 раза истинного диапазона.
Канал Келтнера показывает уровни поддержки и сопротивления. Проанализированы движения цены по отношению к каналу.
Индикатор DM содержит ADX, +DI и -DI. +DI измеряет силу восходящего тренда, а -DI - силу нисходящего тренда. ADX показывает силу тренда.
При этом используются ADX (10), DI (19), а когда +DI пересекает отметку над эталоном (по умолчанию 27), это сигнализирует о сильном восходящем тренде и хорошем для длинного входа.
Эта стратегия сочетает в себе индикаторы тренда, канала и импульса для эффективного определения ценовых действий и длинного/короткого направления.
Определение тренда является относительно точным, чтобы избежать контратендных сделок.
Канал Келтнера показывает четкие уровни поддержки и сопротивления.
Индикатор DM измеряет длинный/короткий импульс для обеспечения направления.
Строгие правила входа помогают фильтровать ложные побеги.
Точки получения прибыли и остановки потери позволяют получать прибыль.
Также следует учитывать некоторые риски:
Тенденция может измениться, когда EMA пересекается ниже SMA, поэтому выходите своевременно.
Канал может потерпеть неудачу при сильных тенденциях, а не при строгой поддержке/сопротивлении.
DM может генерировать ложные сигналы, проверять движение цены.
Фальшивый прорыв может привести к вхождению, но быстрое отступление, используйте разумную стоп-лосс.
Приобретение прибыли и стоп-лосс требуют постоянной оптимизации для адаптации к изменяющимся рыночным условиям.
Некоторые способы дальнейшей оптимизации стратегии:
Настройка параметров и тестирование различных методов определения тренда.
Оптимизируйте параметры канала, чтобы лучше соответствовать истинному диапазону.
Испытайте различные параметры ДМ и найдите оптимальную комбинацию.
Добавьте больше фильтров, например, громкость.
Попробуйте остановить потерю, чтобы получить больше прибыли.
Испытать отдельно для различных продуктов, чтобы найти лучшие наборы параметров.
Стратегия включает в себя несколько индикаторов для определения тренда, поддержки/сопротивления и импульса, что позволяет эффективно улавливать тенденции и контролировать риски.
/*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")