
モメンタム・ブレークアウト・トレーディング・ストラテジー (Momentum Breakout Trading Strategy) は,価格が重要なサポート・レジスタンス・ポイントを突破したときに,トレードシグナルを生成するトレンド追跡戦略である.このストラテジーは,ドンチアン・チャネル指数ダイナミクスを使って,重要なサポート・レジスタンス・ポイントを決定し,移動平均指数と組み合わせて,誤った取引を防ぐために,さらにシグナルをフィルターします.
この戦略の核心指標はDonchian Channelである。Donchian Channelは最高価格,最低価格,中線価格で構成されている。チャネル上軌道と下軌道線は,それぞれ一定の周期における最高価格と最低価格を接続している。価格がチャネル上軌道を破るときに買取シグナルを生成し,価格がチャネル下軌道を破るときに売出シグナルを生成する。これは市場の動力の変化を反映している。
移動平均は,価格のトレンド方向を判断するために使用される. 価格が移動平均の上にある場合にのみ,通路上線を突破する買取信号が採用され,これにより,整合区域への買取が回避されます.
具体的には,この戦略の入場条件は,価格がドンチアンチャネルを突破し,閉店価格は移動平均より高い.出場条件は,価格がドンチアンチャネルを突破し,下落している.
ストップ・ロスは,ドンキアン・チャネルの下線を追跡する.これは,ストップ・ロスがトレンドの経過とともに上向きに移動することを保証する.
この戦略は,トレンドの方向と強さを判断する2つの指標を組み合わせて,突破シグナルを効果的に識別し,誤った取引を避けることができます.同時に,ストップダストは合理的で,戦略がトレンドを十分に追跡できるようにします.
この戦略の利点は以下の通りです.
Donchian Channel指標は,トレンドの重要な転換点を識別するために,重要なサポートと抵抗の位置を動的に決定することができます.
移動平均指標はフィルターとして使用され,平衡区域への買い入れを避け,無効取引を減らす.
ドンチアンチャネル下線を追跡することで,トレンドを最大限に追いつくことができます.
戦略パラメータの設定は合理的な柔軟性があり,異なる市場環境に対応して調整・最適化が可能である.
この戦略には以下のリスクがあります.
突破失敗のリスク. 価格突破チャネルが軌道上にあると,迅速にリコールされ,効果的に倉庫を建設することができない.
トレンド反転リスク. 市場が止損点より前に反転し,止損出場を引き起こす可能性がある.
パラメータ最適化のリスク.不適切なパラメータ設定は,取引の頻度や信号不足を引き起こす可能性があります.
これらのリスクに対して,移動平均周期を調整し,取引量フィルターを増やすなどによって最適化することができ,生成された信号がより信頼性が高いことを保証できます.また,短期的な調整のリスクに対応するために適切なLooseのいくつかのストップロスの設定をする必要があります.
この戦略は,以下の点でさらに最適化できます.
突破口の強さを確認するために,交差量指標のフィルタリング信号を使用します.
移動平均の周期パラメータを最適化して,異なる品種の特性に適合させる.
ストップ・メカニズムの調整により,ストップ・距離は市場変動に適応する.
また,再入場メカニズムが追加され,出場を停止した後でトレンドのチャンスを再獲得できます.
多品種再測,パラメータの健壮性をチェックする.異なる品種特性に応じて微調整する.
動力突破取引戦略は,トレンドの方向と強さを判断する複数の指標を統合し,一般的なトレンドシステムの盲目ポジションの問題を解決する.この戦略のパラメータは,異なる状況環境と取引品種に最適化調整を行う柔軟な設定であり,一般的な実戦的な突破システムである.
/*backtest
start: 2022-12-12 00:00:00
end: 2023-12-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// Revision: 1
// Author: @millerrh
// Strategy:
// Entry: Buy when Donchian Channel breaks out
// Exit: Trail a stop with the lower Donchian Channel band
// Conditions/Variables:
// 1. Can add a filter to only take setups that are above a user-defined moving average (helps avoid trading counter trend)
// 2. Manually configure which dates to back test
// 3. User-Configurable DC Channel length
// === CALL STRATEGY/STUDY, PROGRAMATICALLY ENTER STRATEGY PARAMETERS HERE SO YOU DON'T HAVE TO CHANGE THEM EVERY TIME YOU RUN A TEST ===
// (STRATEGY ONLY) - Comment out srategy() when in a study()
strategy("Donchian Breakout", overlay=true, initial_capital=10000, currency='USD',
default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
// (STUDY ONLY) - Comment out study() when in a strategy()
//study("Donchian Breakout", overlay=true)
// === BACKTEST RANGE ===
From_Year = input(defval = 2019, title = "From Year")
From_Month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
From_Day = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
To_Year = input(defval = 9999, title = "To Year")
To_Month = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
To_Day = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
Start = timestamp(From_Year, From_Month, From_Day, 00, 00) // backtest start window
Finish = timestamp(To_Year, To_Month, To_Day, 23, 59) // backtest finish window
// == INPUTS ==
trigInput = input(title = "Execute Trades On...", defval = "Wick", options=["Wick","Close"]) // Useful for comparing standing stop orders vs. waiting for candle closes prior to action
stopTrail = input(title = "Trail Stops On...", defval = "ATR", options = ["ATR","Bottom of DC Channel","Midline of DC Channel","Tightest of ATR/Bot DC Channel"])
dcPeriod = input(title="DC period", type=input.integer, defval=20)
// === PLOT THE DONCHIAN CHANNEL ===
// Logic
dcUpper = highest(high, dcPeriod)
dcLower = lowest(low, dcPeriod)
dcMid = avg(dcUpper, dcLower)
// Plotting
dcUplot = plot(dcUpper, color=color.blue, linewidth=1, title="Upper Channel Line")
dcLplot = plot(dcLower, color=color.blue, linewidth=1, title="Lower Channel Line")
dcMidPlot = plot(dcMid, color=color.gray, linewidth=1, title="Mid-Line Average")
fill(dcUplot, dcLplot, color=color.gray, transp=90)
// == FILTERING ==
// Inputs
useMaFilter = input(title = "Use MA for Filtering?", type = input.bool, defval = true)
maType = input(defval="SMA", options=["EMA", "SMA"], title = "MA Type For Filtering")
maLength = input(defval = 100, title = "MA Period for Filtering", minval = 1)
// Declare function to be able to swap out EMA/SMA
ma(maType, src, length) =>
maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = ma(maType, close, maLength)
plot(maFilter, title = "Trend Filter MA", color = color.green, linewidth = 3, style = plot.style_line, transp = 50)
// Check to see if the useMaFilter check box is checked, this then inputs this conditional "maFilterCheck" variable into the strategy entry
maFilterCheck = if useMaFilter == true
maFilter
else
0
// == ENTRY AND EXIT CRITERIA ==
// Trigger stop based on candle close or High/Low (i.e. Wick) - If doing daily timeframe, can do candle close. Intraday should use wick.
trigResistance = trigInput == "Close" ? close : trigInput == "Wick" ? high : na
trigSupport = trigInput == "Close" ? close : trigInput == "Wick" ? low : na
buySignal = trigResistance >= dcUpper[1] // The [1] looks at the previous bar's value as it didn't seem to be triggering correctly without it (likely) DC moves with each bar
sellSignal = trigSupport <= dcLower[1]
buy = buySignal and dcUpper[1] > maFilterCheck // All these conditions need to be met to buy
// (STRATEGY ONLY) Comment out for Study
// This string of code enters and exits at the close
if (trigInput == "Close")
strategy.entry("Long", strategy.long, when = buy)
strategy.close("Long", when = sellSignal)
// This string of code enters and exits at the wick (i.e. with pre-set stops)
if (trigInput == "Wick")
strategy.entry("Long", strategy.long, stop = dcUpper[1], when = time > Start and time < Finish and dcUpper[1] > maFilterCheck)
strategy.exit("Exit Long", from_entry = "Long", stop = dcLower[1])