トレンドトラッキング トレリングストップ戦略は,トレンド判断指標とトレリングストップメカニズムを組み合わせた定量的な取引戦略である.この戦略は,現在のトレンド方向を決定するためにスーパートレンド指標を使用し,トレンドトラッキングとリスク管理を達成するためにリアルタイムで価格変化を追跡するためにトレリングストップラインを使用する.
この戦略は,まずスーパートレンド指標を計算し,現在のトレンドが上下なのか判断する.スーパートレンド指標は,ATR指標とピボットポイントを組み込み,トレンド方向をより正確に決定する.スーパートレンド指標が上昇傾向を判断した場合,購入信号が生成される.下落傾向を判断した場合,販売信号が生成される.
買い信号が生成されると,ストラテジーはロングポジションを開く.同時に,リアルタイムでトレーリングストップラインを計算する.このストップラインの計算方法は,ピボットポイントマイナスATR指標値である.現在の閉じる価格がこのストップラインよりも高い限り,ストップラインはリアルタイムで上昇し,合理的なストップ損失ポジションを維持する.価格がストップラインを突破した場合,ポジションはストップ損失で閉鎖される.
この戦略には,不適切な取引信号をフィルターするためにADXおよびRSIインジケーターも組み込まれています.ADXが設定された
この戦略の最大の利点は,トレンド方向をうまく把握し,トレンドトラッキングを達成できるということです.スーパートレンド指標は,単純な移動平均値よりも正確で,ターニングポイントを迅速に決定することができます.同時に,トレーリングストップメカニズムは,利益ロックを最大化し,リスクを効果的に制御するためにストップレベルを自動的に調整できます.
さらに,ADXおよびRSI指標は,過濾戦略に追加され,市場の変動が高い時期のエラーを回避する.ADX指標は十分な傾向を確保し,RSI指標は過買いと過売のシナリオを回避し,収益性を向上させる.
この戦略の最大のリスクは,トレンド判断が間違って,スーパートレンドインジケーターが間違ったシグナルを発信することである.スーパートレンドインジケーターは単純な移動平均値よりも優れているが,複雑な市場状況で判断が間違われるのは避けられない.この時点で,損失を制御するためにストップロスのメカニズムに依存することが必要です.
また,戦略パラメータの設定が不適切である場合もリスクが生じる可能性があります.例えば,ATRパラメータが大きすぎると,過剰に攻撃的なストップ損失ライン調整につながる可能性があります.ADXおよびRSIパラメータの設定が不適切である場合も,取引機会を逃したり,間違った取引の確率を増やす可能性があります.これは最適なパラメータを見つけるために広範な歴史的バックテストを必要とします.
この戦略は,次の側面においてさらに最適化することができる.
DMIやKDJなどの他の傾向判断指標をスーパートレンド指標と組み合わせて試し,判断の正確性を向上させる"多因子"判断システムを形成する.
機械学習ベースの適応パラメータ最適化モジュールを増やして,ATRパラメータ,ADXパラメータ,RSIパラメータなど,固定値ではなくリアルタイム市場に応じて調整できます.
シグナルフィルタリングのためのRSIインジケーターを代替するセンチメントインジケーターを導入する.RSIインジケーターは複雑な市場条件ではうまく機能しないが,社会センチメントインジケーターは市場の熱意をよりよく判断することができる.
ストップラインと現在の価格の間の距離に応じて,ポジションサイズを動的に調整します.ストップラインから遠ければ遠ければ遠ければ,ポジションサイズを適切に増加させ,利益の可能性を向上させることができます.
トレンドトラッキング・トレイルストップ戦略は,トレンド分析,トレイルストップ,マルチファクターフィルタリングなどの方法を包括的に採用している.トレンドを把握しながら,リスクを厳格に制御し,より成熟した定量戦略である.この戦略をより複雑な市場環境に適応するために最適化するための大きな可能性は依然としてある.
/*backtest start: 2023-01-16 00:00:00 end: 2024-01-16 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Bendre ADX Sup Trend", overlay = true) /////////////////////////// // SuperTrend + Pivot Point ////////////////////////// src = input(close, title="EMA Source") PPprd = input(defval = 2, title="Pivot Point Period") AtrFactor=input(defval = 2, title = "ATR Factor") AtrPd=input(defval = 18, title = "ATR Period") StartDate = input(timestamp("1 Dec 2022"), title="Start Date") EndDate = input(timestamp("12 Jan 2023"), title="End Date") var float ph = na var float pl = na ph := ta.pivothigh(PPprd, PPprd) pl :=ta.pivotlow(PPprd, PPprd) float center = na center := center[1] // float lastpp = ph ? ph : pl ? pl : 0.0 float lastpp = na(ph) ? na(pl) ? na : pl : ph if lastpp > 0 if na(center) center := lastpp else center := (center * 2 + lastpp) / 3 Up = center - (AtrFactor * ta.atr(AtrPd)) Dn = center + (AtrFactor * ta.atr(AtrPd)) var float TUp = na var float TDown = na Trend = 0 TUp := close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up TDown := close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1) Trailingsl = Trend == 1 ? TUp : TDown // Lines linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na plot(Trailingsl, color = linecolor , linewidth = 2, title = "PP SuperTrend") bsignalSSPP = close > Trailingsl ssignalSSPP = close < Trailingsl /////// // ADX ////// lenADX = 14 th = 14 TrueRange = math.max(math.max(high-low, math.abs(high-nz(close[1]))), math.abs(low-nz(close[1]))) DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? math.max(high-nz(high[1]), 0): 0 DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? math.max(nz(low[1])-low, 0): 0 SmoothedTrueRange = 0.0 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange SmoothedDirectionalMovementPlus = 0.0 SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus SmoothedDirectionalMovementMinus = 0.0 SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 DX = math.abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100 ADX = ta.sma(DX, lenADX) ////// // MA ///// lenMA = 21 srcMA = input(close, title="Source") // offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500) offsetMA = input(0, title="Offset") outMA = ta.sma(srcMA, lenMA) // // RSI // length = input( 14 ) overSold = input( 30 ) overBought = input( 65 ) price = close vrsi = ta.rsi(price, length) // Buy - Sell Entries buy = bsignalSSPP and outMA < close and ADX > th sell = ssignalSSPP if (buy and vrsi > overBought) // .order // Tuned version strategy.entry("Buy", strategy.long) // strategy.close("Sell", "close Sell") if (sell) and (strategy.position_size > 0) // strategy.entry("Sell", strategy.short) strategy.close("Buy", "Close Buy") // if(sell and vrsi < overSold ) // strategy.entry("Sell", strategy.short) // if(buy) and (strategy.position_size > 0) // strategy.close("Sell", "close Sell")