資源の読み込みに... 荷物...

範囲フィルター ブレイク 短期取引戦略

作者: リン・ハーンチャオチャン開催日:2023年9月21日 21:17:40
タグ:

概要

この短期取引戦略は,価格変動範囲に基づいて購入・販売信号を生成する. 期間中の価格変動範囲を計算し,それを取引信号のフィルターとして使用する. 価格が範囲を突破すると信号が起動する.

戦略の論理

主要な指標は価格変動範囲である.具体的段階は以下の通りである.

  1. 過去N期間の高低範囲を計算する.

  2. 範囲フィルターを導き出すために移動平均を使用して振幅を平らにする

  3. 価格がレンジフィルターを超えると購入信号が生成されます.

  4. 価格がレンジフィルターを下回るときに販売信号が生成されます.

この方法で,価格帯のブレイクがトレンド方向を決定し,よりクリーンな信号のためのノイズをフィルタリングするために使用されます.

利点

  • 価格帯は簡単に判断できます
  • スムーズな範囲は 効果的 に 騒音 を フィルター する
  • ブレイクシグナルが短期的なトレンドを捉える
  • 短期取引に適したより高い取引頻度
  • 調整可能なパラメータを最適化しやすい

リスク

  • 射程外れは 鞭打ちに易しい
  • 範囲を計算するのに十分な歴史的データが必要です
  • 悪いパラメータは過敏性や鈍さを引き起こす
  • 効果的ストップなし 大幅な引き上げ
  • 高周波による手数料によるパフォーマンスの影響

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

  • リラックス範囲フィルターの揮発率係数
  • 理想設定のためのパラメータ最適化
  • ストップ・ロストまたはトライリング・ストップを実行する
  • 取引頻度を減らし,手数料を下げる
  • 製品特異パラメータ試験

改善の方向性

戦略は以下によって改善できます.

  1. 異なる範囲計算期間をテストする

  2. 範囲フィルターの揮発率係数を最適化する

  3. MACD のような確認指標を追加する

  4. 移動または後退停止を使用する

  5. 各製品に特化した調整パラメータ

  6. ポジションサイズシステムの最適化

概要

この戦略は,短期的なトレンドを効果的に捉えるため,短期間信号を生成するために価格の範囲を突破することを利用する.しかし,ウィップソーなどのリスクは存在する.効率性を維持しながらリスクを制御するために,パラメータ最適化,ストップ損失,フィルターなどを追加することで改善が可能である.製品の特徴によるパラメータの精細調整も不可欠である.継続的な最適化は強度につながる.


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

//@version=3
strategy(title="Range Filter Buy and Sell 5min [Strategy]", overlay=true, commission_type=strategy.commission.percent, commission_value=0.025, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, slippage=0)

// === INPUT BACKTEST RANGE ===
useDate = input(true,     title='---------------- Use Date ----------------', type=bool)
FromMonth = input(defval = 7, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 25, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
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 = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true  // create function "within window of time"
// === INPUT BACKTEST RANGE ===


sources = input(defval=close, title="Source")
isHA = input(false, "Use HA Candles", bool)
src = isHA ? security(heikenashi(tickerid), period, sources) : sources
// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters

per = input(defval=50, minval=1, title="Sampling Period")

// Range Multiplier

mult = input(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range

smoothrng(x, t, m)=>
    wper      = (t*2) - 1
    avrng     = ema(abs(x - x[1]), t)
    smoothrng = ema(avrng, wper)*m
    smoothrng
smrng = smoothrng(src, per, mult)

// Range Filter

rngfilt(x, r)=>
    rngfilt  = x
    rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
    rngfilt
filt = rngfilt(src, smrng)

// Filter Direction

upward   = 0.0
upward  := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands

hband = filt + smrng
lband = filt - smrng

// Colors

filtcolor = upward > 0 ? lime : downward > 0 ? red : orange
barcolor  = (src > filt) and (src > src[1]) and (upward > 0) ? lime : (src > filt) and (src < src[1]) and (upward > 0) ? green : 
   (src < filt) and (src < src[1]) and (downward > 0) ? red : (src < filt) and (src > src[1]) and (downward > 0) ? maroon : orange

filtplot = plot(filt, color=filtcolor, linewidth=3, title="Range Filter")

// Target

hbandplot = plot(hband, color=aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=fuchsia, transp=100, title="Low Target")

// Fills

fill(hbandplot, filtplot, color=aqua, title="High Target Range")
fill(lbandplot, filtplot, color=fuchsia, title="Low Target Range")

// Bar Color

//barcolor(barcolor)

// Break Outs 

longCond = na
shortCond = na
longCond := ((src > filt) and (src > src[1]) and (upward > 0)) or ((src > filt) and (src < src[1]) and (upward > 0)) 
shortCond := ((src < filt) and (src < src[1]) and (downward > 0)) or ((src < filt) and (src > src[1]) and (downward > 0))

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Alerts

plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = white, style=shape.labelup, size = size.normal, location=location.belowbar, color = green, transp = 0)
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = red, transp = 0)

//strategy.entry("Long", strategy.long, stop = hband, when = window() , comment="Long")
//strategy.entry("Short", strategy.short, stop = lband, when = window() , comment="Short")

strategy.entry("Long", strategy.long, when = longCondition and window() , comment="Long")
strategy.entry("Short", strategy.short, when = shortCondition and window() , comment="Short")



// === Stop LOSS ===
useStopLoss = input(false, title='----- Use Stop Loss / Take profit -----', type=bool)
sl_inp = input(100, title='Stop Loss %', type=float, step=0.25)/100
tp_inp = input(1.5, title='Take Profit %', type=float, step=0.25)/100
stop_level = strategy.position_avg_price * (1 - sl_inp)
take_level = strategy.position_avg_price * (1 + tp_inp)
stop_level_short = strategy.position_avg_price * (1 + sl_inp)
take_level_short = strategy.position_avg_price * (1 - tp_inp)
// === Stop LOSS ===

if useStopLoss
    strategy.exit("Stop Loss/Profit Long","Long", stop=stop_level, limit=take_level)
    strategy.exit("Stop Loss/Profit Short","Short", stop=stop_level_short, limit=take_level_short)


もっと