アダプティブ・スーパートレンド・チャネル・トレーディング・戦略

作者: リン・ハーンチャオチャン, 日付: 2023-09-20 15:17:51
タグ:

概要

この戦略は,二層超トレンドチャネルを構築し,価格がチャネルを突破すると取引信号を生成する.また,適応効果のために価格変動を使用してチャネル幅を調整する.これはトレンドフォロー戦略に属する.

戦略の論理

  1. 価格標準偏差と波動性ATRを計算し,波動性を使ってチャネル幅を調整する.

  2. 内部層がより敏感で 外層がより安定した 双層超トレンドチャネルを構築します

  3. 価格がチャネル内側や外側を突破すると 買い/売るシグナルを生成します

  4. ダブルチャネル構造は 偽の突破を フィルタリングするのに役立ちます

  5. ATR波動性はチャネル幅を調整し,波動性が上昇するとより広く適応効果をもたらす.

利点

  1. スーパートレンドチャネルは 傾向を追跡するのに シンプルで効果的です

  2. ダブルチャネルは 偽信号をフィルタリングし 信号の質を向上させます

  3. 変動に適応した調整により チャンネルは異なる市場環境に適しています

  4. シンプルなパラメータ調整で簡単に実装できます

  5. 視覚化されたチャネルとブレイクアウトは 直感的な取引信号を形成します

リスク

  1. ブレイクシグナルが誤った信号を出し,不必要な損失を起こす可能性があります.

  2. トレンド方向や トレンド逆の取引のリスクを 判定できないのです

  3. 適応調整は過度に敏感で 過剰な調整で

  4. パラメータの最適化が不適切なら オーバーフィッティングになります

  5. トレンドフォロー戦略として レンジ・バインド市場では 苦戦しています

強化

  1. 試験パラメータ 適応効果への影響

  2. 主な傾向を特定するために MA を組み込む.

  3. 偽の突破を防ぐために 突破の確認を最適化します

  4. ストップ・ロスは,トレード毎の損失制限に追加します.

  5. 取引の頻度でチャンネル調整を評価する.

  6. マシン学習を使って パーマータを動的に最適化します

結論

この戦略は,価格トレンドを把握するために適応性のあるダブルスーパートレンドチャネルを使用する.トレンドを追跡する方法はシンプルで直感的です.しかし,リスクには誤ったブレイクアウトと誤ったトレンド方向が含まれます.さらなるパラメータチューニングと補完メカニズムは戦略のパフォーマンスを向上させ,強力なトレンドフォローシステムになります.


/*backtest
start: 2023-08-20 00:00:00
end: 2023-09-19 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("SuperTrend Cloud Strategy", shorttitle="SuperTrend Cloud Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital = 1000)

//Inputs
multi = input(title="Multiplier", type=input.float, step=0.1, defval=3, minval=1)
period = input(title="Period", type=input.integer, step=1, defval=10, minval=1)
SelfAdjust = input(title="Self-Adjusting", type=input.bool, defval = false)


////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
 
// From Date Inputs
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2019, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2020, title = "To Year", minval = 1970)
 
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true
 
////////////////////////////////////////////////////////////////////////////////

dev = stdev(close, period)
stdDev = (dev / close) * 100 + 1
MultDev = SelfAdjust ? multi * stdDev : multi

up_lev1 = hl2 - MultDev * atr(period)
dn_lev1 = hl2 + MultDev * atr(period)
up_lev2 = hl2 - (MultDev * 2 * atr(period))
dn_lev2 = hl2 + (MultDev * 2 * atr(period))

up_trend1 = 0.0
up_trend1 := close[1] > up_trend1[1] ? max(up_lev1, up_trend1[1]) : up_lev1
up_trend2 = 0.0
up_trend2 := close[1] > up_trend2[1] ? max(up_lev2, up_trend2[1]) : up_lev2

down_trend1 = 0.0
down_trend1 := close[1] < down_trend1[1] ? min(dn_lev1, down_trend1[1]) : dn_lev1
down_trend2 = 0.0
down_trend2 := close[1] < down_trend2[1] ? min(dn_lev2, down_trend2[1]) : dn_lev2

trend1 = 0
trend1 := close > down_trend1[1] ? 1: close < up_trend1[1] ? -1 : nz(trend1[1], 1)
trend2 = 0
trend2 := close > down_trend2[1] ? 1: close < up_trend2[1] ? -1 : nz(trend2[1], 1)

st_line1 = trend1 == 1 ? up_trend1 : down_trend1
st_line2 = trend2 == 1 ? up_trend2 : down_trend2

// Plotting
plot1 = plot(st_line1, color = trend1 == 1 ? color.green : color.red , style = plot.style_line, linewidth = 1, title = "SuperTrend 1")
plot2 = plot(st_line2, color = trend2 == 1 ? color.green : color.red , style = plot.style_line, linewidth = 1, title = "SuperTrend 2")
fill(plot1, plot2, color = color.aqua, title = "Cloud")

buy = crossover(close, st_line1) and close > st_line2 or crossover(close, st_line2) and close > st_line1
sell = crossunder(close, st_line1) and close < st_line2 or crossunder(close, st_line2) and close < st_line1

if(buy and time_cond)
    strategy.entry("long", long = true , comment="long")

if (close < st_line1 and time_cond or close < st_line2 and time_cond)
    strategy.close("long")
    
if (not time_cond)
    strategy.close_all()





 


もっと