適応型スーパートレンドチャネルに基づく取引戦略


作成日: 2023-09-20 15:17:51 最終変更日: 2023-09-20 15:17:51
コピー: 1 クリック数: 810
1
フォロー
1617
フォロワー

概要

この戦略は,2層の超トレンドチャネルを構築し,価格突破チャネルと組み合わせて取引信号を生成する.価格の変動率を利用してチャネル幅を調整し,自己適応効果を実現する.トレンド追跡型の戦略である.

戦略原則

  1. 価格の標準差と波動率ATRを計算し,波動率に応じて超トレンドチャネルの幅を調整する.

  2. 双層超トレンドチャネルを構築し,内層チャネルはより敏感で,外層チャネルはより安定する.

  3. 価格が内層または外層の超トレンドチャネルを突破すると,買ったり売ったりするシグナルが生じます.

  4. 偽突破をフィルタリングする2層の通路構造を使用しています.

  5. 波動率ATRは,波動が大きくなると通路の幅が増加し,自己適応効果を実現するために通路の幅を調整するために使用される.

優位分析

  1. 超トレンドチャネルは使いやすいので,トレンドをよく追跡できます.

  2. 双層の通路構造は信号の質を向上させ,偽突破をフィルターする.

  3. 波動率は,通路の幅を自律的に調整し,通路を異なる市場環境に適したものにします.

  4. 実行しやすく,パラメータの調整も簡単です.

  5. 経路と突破を視覚化して,直感的な取引信号を形成する.

リスク分析

  1. 突破信号は誤判で不必要な損失を招く可能性があります.

  2. 逆転の危険性があるため,トレンドの方向を判断できない.

  3. 適応の調整は過度に敏感で,過度の調整になるかもしれない.

  4. パラメータ最適化が不適切である場合,過度に最適化される可能性があります.

  5. 傾向を追跡する戦略として,ダッドルは,市場において利益の不足や損失を招く.

最適化の方向

  1. 異なるパラメータが通路の自己適応効果に与える影響をテストする.

  2. 平均線などの指標を組み合わせて大きなトレンドの方向を判断してみてください.

  3. 突破確認メカニズムを最適化し,偽突破を回避する.

  4. ストップ・ロース戦略を導入し,単発損失を抑制する.

  5. チャネルパラメータの調整が取引頻度に与える影響を評価する.

  6. 機械学習アルゴリズムで動的に最適化できるパラメータ.

要約する

この戦略は,2層の自己適応超トレンドチャネルを用いて価格トレンドを捕捉する。優点はシンプルで直感的で,トレンドを効果的に追跡できる。しかし,いくつかの突破的な誤判とトレンド判断の誤りのリスクもある。パラメータ最適化と配套メカニズムの補充によって,戦略の効果をさらに改善し,安定した高効率のトレンド追跡システムにすることができる。

ストラテジーソースコード
/*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()