이 전략은 세 가지 주요 지표에 기반합니다. 경향 지표, 켈트너 채널 및 DM 지표입니다.
트렌드 인디케이터는 SMA와 EMA로 구성됩니다. 켈트너 채널은 촛불의 오픈 및 클로즈 가격을 결정하는 데 사용됩니다. DM 인디케이터는 긴 및 짧은 방향을 판단하는 데 사용됩니다.
입력 신호는 다음과 같은 경우 발사됩니다.
이 전략은 두 가지 수익 레벨과 하나의 스톱 로스 레벨을 가지고 있습니다. 트레이링 스톱은 이익을 최적화하기 위해 사용할 수 있습니다.
SMA와 EMA의 교차는 트렌드 방향을 결정하는 데 사용됩니다. EMA (46) 가 SMA (46) 를 교차하면 상승 추세를 나타냅니다.
채널은 세 개의 라인을 가지고 있습니다. 중간에, 상단에 그리고 하단에. 중간에 있는 라인은 81의 길이로 닫는 가격의 SMA입니다. 상부와 하부 밴드는 중간에 있는 진정한 범위의 배수 위에 위치하고 있습니다. 여기 우리는 진정한 범위의 2.5 배를 사용합니다.
켈트너 채널은 지원 및 저항 수준을 보여줍니다. 채널에 대한 가격 움직임이 분석됩니다.
DM 지표는 ADX, +DI 및 -DI를 포함합니다. +DI는 상승 추세 강도를 측정하고 -DI는 하락 추세 강도를 측정합니다. ADX는 추세 강도를 보여줍니다.
여기 ADX (10), DI (19) 가 사용 됩니다. +DI가 벤치마크 (디폴트 27) 를 넘으면 강한 상승 추세를 나타내고 긴 진입에 적합합니다.
이 전략은 트렌드, 채널 및 동력 지표를 결합하여 가격 행동과 긴 / 짧은 방향을 효과적으로 결정합니다. 이점은 다음과 같습니다.
트렌드 식별은 상대적으로 정확해서 역 트렌드 거래를 피합니다.
켈트너 채널은 명확한 지원과 저항 수준을 보여줍니다.
DM 지표는 방향을 확인하기 위해 긴 / 짧은 모멘텀을 측정합니다.
엄격한 입국 규칙은 거짓 탈출을 필터링하는 데 도움이 됩니다.
이윤을 취하고 손실을 멈추는 지점은 이윤을 확보 할 수 있습니다.
또한 고려해야 할 몇 가지 위험이 있습니다.
EMA가 SMA 아래로 넘어가면 트렌드가 역전될 수 있어
채널은 강력한 트렌드에 실패할 수 있습니다. 엄격한 지원/저항이 아닙니다.
DM는 잘못된 신호를 생성할 수 있습니다. 가격 동작을 확인합니다.
가짜 탈출은 진입을 촉발할 수 있지만 빨리 탈락하면 합리적인 스톱 손실을 사용합니다.
이윤을 취하고 손해를 멈추는 것은 변화하는 시장 조건에 적응하기 위해 지속적인 최적화가 필요합니다.
전략을 더 최적화 할 수있는 몇 가지 방법:
매개 변수를 조정하고 다른 트렌드 식별 방법을 테스트합니다.
채널 매개 변수를 최적화해 실제 범위에 더 잘 맞게
다른 DM 매개 변수를 테스트하고 최적의 조합을 찾습니다.
부피와 같은 입력 필터를 더 추가합니다.
더 많은 수익을 얻기 위해 Stop Loss를 추적해보세요.
가장 좋은 매개 변수 집합을 찾기 위해 각기 다른 제품을 개별적으로 테스트합니다.
이 전략은 트렌드, 지원/저항 및 모멘텀을 결정하기 위해 여러 지표를 통합하여 트렌드를 효과적으로 파악하고 위험을 제어 할 수 있습니다. 그러나 위험은 주목해야하며 매개 변수가 시장 변화에 따라 최적화를 필요로합니다. 전반적으로 이것은 강력한 실용성을 가진 전략입니다.
/*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")