超トレンドに基づく長期取引戦略

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

概要

この戦略は,スーパートレンド指標を使用してロング機会を特定する.ロングエントリーのための動的なサポートレベルを決定するために,ATRと倍数を使用する.ロングトレードに焦点を当てています.

戦略の論理

  1. 上部と下部帯はATR期間,倍数に基づいて計算されます.上部帯を割ると上昇傾向を示し,下部帯を割ると下位傾向を示します.

  2. 現在のトレンドは,上昇傾向の1と下落傾向の-1で追跡される. 上部帯を超える価格がトレンドをダウンからアップに切り替えて,購入信号を生成する. 下部帯を超える価格がアップからダウンに切り替えて,販売信号を生成する.

  3. 移動平均値はトレンドフィルターとして追加されます. 上部帯を突破するときに価格がMA以上であればのみ購入します. 下部帯を突破するときに価格がMA以下であればのみ販売します. これにより偽のブレイクアウトを避けることができます.

  4. ビジュアルヘルパーは,傾向やシグナルなどを強調し,意思決定を支援します.

利点分析

この戦略の利点は

  1. スーパートレンドは 価格変動を動的に追跡し 傾向の変化を タイムリーに反映します

  2. ATRストップロスは 市場の変動に基づいてストップを調整し 利益を固定します

  3. MAフィルターは,様々な市場での騒音から誤った信号を排除します.

  4. ビジュアルデザインは戦略の仕組みと市場情勢を直感的に提示します

  5. 取引傾向の逆転だけが 長期保有に適している

リスク分析

主なリスクは以下のとおりです.

  1. スーパートレンドはパラメータに敏感で,頻度の調整が過剰な取引につながる可能性があります.

  2. 市場が不安定な場合 ストップは頻繁に起こります

  3. 取引コストは考慮されません 小規模な口座は大きな影響を受けます

  4. ストップ・ロスのないことは,引き上げリスクが高いことを意味します.

  5. トレンドフィルターは 機会を逃すかもしれません

リスクは以下によって軽減できます.

  1. ATRパラメータを低帯域調整周波数に最適化

  2. 高周波の小さな振動による停止を避けるため,同等のバーフィルターを追加します.

  3. ストップ・ロスを実行し 利益を守ります

  4. 移動平均期を調整してバランスフィルタ効果を調整する

  5. 資金管理を最適化して 取引コストを削減する

オプティマイゼーションの方向性

戦略は以下の側面で強化できる:

  1. 価格源をテストします 価格源は 価格源は 価格源は

  2. 他のダイナミックストップ・ロスト・インジケーターを試してください チェンデリア・エグジットなどです

  3. 資本利用を最適化するために ポジションサイズを追加します

  4. 記入を精査するために変動指標を組み込む.

  5. ストップ・ロスを実行し リスクをコントロールするために 利益を取ります

  6. 異なる市場のためのパラメータを調整します.

  7. パラメータ最適化のための機械学習を探求します

  8. フィルターの精度を向上させるために他の指標を組み合わせます.

結論

この戦略は,トレンドを決定するために動的ストップを持つスーパートレンドを使用し,長いエントリを識別するためにMAフィルターを追加する.視覚設計は操作を簡素化する.最適化されたパラメータと追加された機能により,堅牢な長期的な取引戦略になることができます.


/*backtest
start: 2020-09-13 00:00:00
end: 2023-09-19 00:00:00
period: 3d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("SuperTrend Long Strategy", overlay=true, initial_capital=50000, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=50000)

Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR = input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true)

atr2 = sma(tr, Periods)
atr = changeATR ? atr(Periods) : atr2

up = src - (Multiplier * atr)
up1 = nz(up[1], up)
up := close[1] > up1 ? max(up, up1) : up

dn = src + (Multiplier * atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? 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

// Moving Average as Trend Filter
periodes_ma = input(title="Moving Average Period", type=input.integer, defval=20)
src_ma = input(title="Moving Average Source", type=input.source, defval=close)
ma = sma(src_ma, periodes_ma)

upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1 and close > ma
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0))
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(color.green, 0))

dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1 and close < ma
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0))
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 0))

mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.new(color.green, 70) : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.new(color.red, 70) : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highlighter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highlighter", color=shortFillColor)

FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 999)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(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)
    strategy.entry("BUY", strategy.long, when = window())

shortCondition = sellSignal
if (shortCondition)
    strategy.close("BUY")
    strategy.entry("SELL", strategy.short, when = window())

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


もっと