この戦略は,トレンドトラッキング取引を達成するためにチャネルとモメンタム指標を計算することによってトレンド形成を特定する.特に,モメンタム指標と均衡チャネル指標を組み合わせ,バランスチャネルを使用しながら長期的トレンドに介入するために両方を活用する.
戦略は主に以下の2つの指標を判断するために使用しています.
モメント インディケーター (DMI): 市場の長期・短期トレンドを判断し,インデックスが設定された
均衡チャネル (ケルトナーチャネル): トレンドエリアを決定する.価格が上部レールを破ると,購入する時間であり,価格が中部レールの下に落ちると,ポジションを閉じる信号です.
特定の取引論理は, +DIモメントインジケーターが設定された
この戦略は,2つの指標の利点を組み合わせ,トレンド方向を決定するためにモメント指標を使用し,エントリータイムとストップ損失エリアを決定するために均衡チャネルを使用する.ダブルインジケーターの組み合わせにより,戦略はトレンドを発見する早期に効率的に入力し,チャネルインジケーターを使用して利益とストップをロックすることができます.
この戦略は,市場動向の初期段階を決定するためにモメンタム指標を使用し,単純な移動平均値などの遅延指標よりも効率的です.
特定の取引範囲を決定するために均衡チャネルを使用することで 利益ゾーンを効果的にロックできます
指標パラメータと取引規則は厳格で合理的で,バックテストデータはうまく機能し,実際の戦闘効果を検証します.
戦略は比較的シンプルで明瞭で,理解し実行しやすいもので,定量取引の初心者にも適しています.
戦略のリスクは制御可能で,単一の損失を効果的に制御するために,中間線を持つダイナミックストップ損失を採用します.
この戦略は,トレンド市場のみに適しており,統合および変動する市場には適していません.QtCoreチャネルが増加し,ミドルレールストップ損失があまりにも緩い場合は,損失を制御することはできません.
DMI インディケーターは一定の遅延があり,トレンドの確認を決定することはできません.トレンドに早期に介入することで損失を引き起こす可能性があります.
固定パーセントストップ損失方法にはリスクがあります.急激な変動の後,トレンドに再介入できず,それ以降のトレンドを見逃します.
バックテストデータは十分だが,実際の取引におけるパラメータの安定性を検証するには,長期間の実行が必要である.
ATRのストップ損失,移動ストップ損失など,固定パーセントのストップ損失を代替するために,異なるストップ損失方法が試験可能である.
傾向の確認後にエントリーを確保するために,ボリューム増幅などの二次確認指標を追加することができる.
最適なパラメータの組み合わせを見つけるために,異なるパラメータの組み合わせをテストすることができます.
パラメータの強さは段階的な最適化とウォークフォワードテストによって確認できます.
この戦略は,ダブルインジケーター判断を用いてトレンド市場の効率的な捕獲を達成する.この戦略は,明確な論理と良いバックテストパフォーマンスで比較的シンプルで直感的です.量的な取引のためのエントリー戦略の1つとして機能することができます.しかし,実際の取引データの十分な検証とパラメータ最適化は,実際の取引損失を減らすためにまだ必要です.これは将来の研究の焦点になります.
/*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")