スーパーATR トレンド フォローする戦略

作者: リン・ハーンチャオチャン,日付: 2024-02-19 11:41:20
タグ:

img

概要

スーパーATRトレンドフォロー戦略は,ATR指標に基づくトレンドフォロー戦略である.市場変動を測定するためにATR指標を使用し,トレンドを追跡するために複数のATRに基づいてストップロスを設定する.

戦略の論理

この戦略は,まず,過去N日間の価格変動の移動平均であるATR指標を計算し,市場リスクと変動を表します.この戦略は,ATR計算方法,通常のATRまたはSMAを変更することができます.

その後,上位および下位帯は,ATR値を因数で掛け算した値に基づいて計算されます.close - Multiplier * ATR上部帯の場合close + Multiplier * ATRこれはATRベースのトレンドチャネルを形成します

価格がチャネルの上下帯を突破するかどうかを判断します.価格が上下帯を突破した場合,ダウントレンドに入ると判断されます.価格が下下帯を突破した場合,上下トレンドに入ると判断されます.トレンドブレイクがあるとき,対応する買い売りを行います.

さらに,戦略では,指定された日付時間帯での取引のみの時間枠を設定しています.

利点分析

この指標チャネルベースのトレンドフォロー戦略には以下の利点があります.

  1. ストップ・ロスの位置を自動的に調整するATRインジケーターを使用することで,リスクを効果的に制御できます.
  2. ATRは価格変動を考慮し,より合理的なストップロスを考慮します
  3. チャネルブレイクによって入力精度を高める
  4. ATR 計算方法の調整を可能にします.より柔軟です.
  5. 重要なイベントの際に戦略の失敗を回避する取引窓を設定する

一般的にこれはリスクを効果的に制御し,良い収益を得ることができる シンプルで実用的な戦略に従う傾向です

リスク分析

この戦略にはいくつかのリスクもあります:

  1. 市場が急激に変化し,ATRは間に合わずに反応し,ストップロスは緩すぎます.
  2. 感情が異なる場合,価格がチャネル内で変動し,取引リスクが増加します
  3. 固定倍数はすべての製品に合わない場合があり,それに応じて調整する必要があります.
  4. set 窓は取引機会を制限し,正しく設定されていない場合,良い取引を逃す可能性があります

これらのリスクを制御するには,次の措置を講じることができます.

  1. 他の指標を組み合わせて市場状況を決定し,ATRだけに頼るのを避ける
  2. 取引リスクを導入する無効なブレイクアウトを避けるためにフィルターを追加する
  3. 異なる製品の歴史的な特徴に応じて適切な倍数を選択します
  4. 適切な設定を保証するために設定ウィンドウパラメータを最適化およびテスト

最適化

この戦略をさらに最適化できる余地があります.

  1. マシン学習アルゴリズムを導入し, 増倍数を動的に最適化する
  2. チャンネル範囲を最適化するために感情指標などを組み込む
  3. 無効なブレイクを避けるためにボリュームまたは波動性確認を追加する
  4. バックテストのための高度な時間ベースの戦略フレームワークを使用

これらの最適化は,戦略の安定性と収益性をさらに向上させることができます.

結論

この戦略は,一般的には非常に実践的なトレンドフォロー戦略である.ATR指標を使用して適応チャネルを構築し,チャネルブレイクアウトによってエントリを決定する.この戦略はリスクを制御するためにシンプルで有効であり,中長期トレンドを追跡するのに適しています.また,戦略をより堅牢にするためにさらなるリスク制御と最適化提案も提案しました.


/*backtest
start: 2023-02-12 00:00:00
end: 2024-02-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('B厂长 @超级趋势精简优化版', overlay=true)
Periods = input(title='ATR周期', defval=10)
src = input(hl2, title='价格数据源')
Multiplier = input.float(title='ATR 乘数', step=0.1, defval=3.0)
changeATR = input(title='更改ATR计算方法', defval=true,tooltip = '默认为art否则sma(ta.tr,ATR周期)')
showsignals = input(title='显示买入/卖出信号', defval=false)
atr2 = ta.sma(ta.tr, Periods)
atr = changeATR ? ta.atr(Periods) : atr2
up = src - Multiplier * atr
up1 = nz(up[1], up)
up := close[1] > up1 ? math.max(up, up1) : up
dn = src + Multiplier * atr
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? math.min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
upPlot = plot(trend == 1 ? up : na, title='上涨趋势', style=plot.style_linebr, linewidth=2, color=color.new(color.green, 0))
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal and showsignals ? up : na, title='买点', text='买点', location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(color.green, 0), textcolor=color.new(color.white, 0))
dnPlot = plot(trend == 1 ? na : dn, title='下跌趋势', style=plot.style_linebr, linewidth=2, color=color.new(color.red, 0))
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal and showsignals ? dn : na, title='卖点', text='卖点', location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 0), textcolor=color.new(color.white, 0))
FromMonth = input.int(defval=9, title='From Month', minval=1, maxval=12)
FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31)
FromYear = input.int(defval=2018, title='From Year', minval=999)
ToMonth = input.int(defval=1, title='To Month', minval=1, maxval=12)
ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31)
ToYear = input.int(defval=9999, title='To Year', minval=999)
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() =>
    time >= start and time <= finish ? true : false
longCondition = buySignal
if longCondition and window()
    strategy.entry('BUY', strategy.long, comment = '做多')
shortCondition = sellSignal
if shortCondition and window()
    strategy.entry('SAL', strategy.short, comment = '做空')

buy1 = ta.barssince(buySignal)
sell1 = ta.barssince(sellSignal)
color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na



もっと