
スーパートレンド日線逆転戦略 (Super Trend Daily Reversal Strategy) は,スーパートレンドの指標を用いて市場動向を判断し,価格突破と平均実際の波動範囲のストロップを計算し,価格変化率指標を用いてスーパートレンドの信号をフィルターする量化取引戦略である.この戦略は日線およびより高い時間周期に適用され,仮想通貨や株式などの市場に使用できる.
この戦略の核心指標はスーパートレンド指標である.スーパートレンド指標は平均実際の波動範囲に基づいており,市場トレンドの方向をより明確に判断できます.価格がスーパートレンドを突破すると下落信号で,下落信号を突破すると看板信号になります.
この戦略は,価格変動率指数 ((ROC) を使用して超トレンド指数にフィルタリングを行い,無効な信号を回避する.価格変動が大きいときに超トレンド信号に参加する.そうでなければ参加しない.
ストップに関しては,この戦略は2種類のストップを提供する:固定ストップ比率とATRベースの自動縮小ストップ.固定ストップは単純で直接であり,ATRストップは市場の変動に応じてストップ範囲を調整できる.
入場条件は,超トレンドの指標が反転し,価格変化率の指標がフィルターを通過するものである.出場条件は,超トレンドが再び反転するか,またはストップラインを突破するものである.この戦略は,トレンド追跡の原則に従って,各方向に1つのポジションしか許されない.
この戦略の最大の利点は,スーパートレンド指標を用いてトレンド方向の判断の明確さと安定性が高く,通常の移動平均と比較してノイズが少ないことである.さらに,戦略に価格変化率指標を加えることで,一部の偽信号を効果的にフィルターする.
ATRの自律的な止損メカニズムはまた,この戦略をより広範な市場環境に適応させることができる.変動が加剧すると,止損は自動的に緩められ,利益が最大限に閉じ込められる.
テストの結果から,この戦略は牛市で優れていることがわかります.
この戦略の主要なリスクは,トレンドの反転を誤判にすることであり,反転シグナルを逃したり,不要な反転シグナルを生成したりする可能性がある.これは,価格が重要なサポートまたはレジスタンスエリアの近くで繰り返し横軸整理される場合によく起こります.
さらに,ストップ設定が過度に緩やかになる場合も損失の拡大につながる.ATRストップは市場の変動に合わせて調整されるので,市場の突発的な出来事でストップが引き込まれる可能性がある.
上記のリスクに対して,ATR計算周期を適切に短縮するか,ATR停止の倍数係数を調整することができる.また,誤導信号を発信しないように,重要なサポート抵抗領域を決定する追加の指標を追加することもできる.
この戦略は以下の点で最適化できます.
超トレンド指標のパラメータを調整し,ATR周期とATR倍数を最適化し,超トレンドラインをより滑らかにする.
価格変化率指標のパラメータを調整し,周期と変化率の値を最適化し,偽信号を減らす.
固定ストップのストップ幅を最適化するなど,異なるストップメカニズムを試す.
追加判断指標を追加し,重要なサポートレジスタンスを特定し,トレンド反転判断誤りを回避する.
異なる品種のパラメータ設定と効果をテストし,最適なパラメータ組み合わせを探します.
測量回帰を最適化して,最適のパラメータ設定を見つけます.
超トレンド日線逆転戦略は,全体的に比較して安定し,信頼性の高いトレンド追跡戦略である.超トレンド指標と価格変化率指標を組み合わせて,フィルタリングを行い,中長期トレンドの方向を効果的に識別することができる.ATR自律止損機構は,ほとんどの市場環境にも適応できるようにする.パラメータ設定をさらに最適化し,判断指標を増やすことで,この戦略の安定性と収益性を向上させることもできる.
/*backtest
start: 2024-01-22 00:00:00
end: 2024-02-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Super Trend Daily BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)
/////////////// Time Frame ///////////////
_1 = input(false, "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
///////////// Super Trend /////////////
_2 = input(false, "══════ Super Trend ══════")
length = input(title="ATR Period", type=input.integer, defval=3)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=1.3)
atr = mult * atr(length)
longStop = hl2 - atr
longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = hl2 + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and close > shortStopPrev ? 1 : dir == 1 and close < longStopPrev ? -1 : dir
///////////// Rate Of Change /////////////
_3 = input(false, "══════ Rate of Change ══════")
source = close
roclength = input(30, "ROC Length", minval=1)
pcntChange = input(6, "ROC % Change", minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))
/////////////// Strategy ///////////////
long = dir == 1 and dir[1] == -1 and isMoving()
short = dir == -1 and dir[1] == 1 and isMoving()
last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])
/////////////// Dynamic ATR Stop Losses ///////////////
_4 = input(false, "════════ Stop Loss ═══════")
SL_type = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inp = input(6.0, title='Fixed Stop Loss %') / 100
atrLkb = input(20, minval=1, title='ATR Stop Period')
atrMult = input(1.5, step=0.25, title='ATR Stop Multiplier')
atr1 = atr(atrLkb)
longStop1 = 0.0
longStop1 := short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop1[1]
shortStop1 = 0.0
shortStop1 := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop1[1]
slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na
/////////////// Execution ///////////////
if testPeriod()
strategy.entry("L", strategy.long, when=long)
strategy.entry("S", strategy.short, when=short)
strategy.exit("L SL", "L", stop = SL_type == "Fixed" ? long_sl : longStop1, when=since_longEntry > 0)
strategy.exit("S SL", "S", stop = SL_type == "Fixed" ? short_sl : shortStop1, when=since_shortEntry > 0)
/////////////// Plotting ///////////////
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(isMoving() ? dir == 1 ? color.lime : color.red : color.white , transp=80)