トレンドフォロートレーリングストップ戦略


作成日: 2024-01-17 11:19:06 最終変更日: 2024-01-17 11:19:06
コピー: 0 クリック数: 616
1
フォロー
1617
フォロワー

トレンドフォロートレーリングストップ戦略

概要

トレンド追跡移動ストップ戦略は,トレンド判断指標と移動ストップメカニズムを組み合わせた定量取引戦略である.この戦略は,スーパートレンド指標を使用して,現在のトレンドの方向を判断し,移動ストップラインを使用して価格変化をリアルタイムで追跡し,トレンド追跡とリスク管理を実現する.

戦略原則

この戦略は,まず超トレンド指標を計算し,現在の上昇傾向または下降傾向にあるかどうかを判断する.超トレンド指標はATR指標と中心点を組み合わせて,トレンドの方向をより正確に判断することができます.超トレンド指標が上昇傾向であると判断されれば,買取シグナルを生成し,下降傾向であると判断されれば,売出シグナルを生成する.

買い信号が生じると,この戦略は多額のポジションを開きます.同時に,それはリアルタイムで移動するストップラインを計算します.このストップラインの計算方法は,ATR指標の値を引いた中心点です.現在の閉店価格がストップラインより高い限り,ストップラインはリアルタイムで移動し,常に合理的なストップポジションに留まります.価格がストップラインを下回れば,平仓ストップ損失です.

この戦略はADX指標とRSI指標を組み合わせて,不適切な取引信号をフィルターします.ADXが設定された値より大きく,RSIが合理的なレベルにある場合にのみ,スーパートレンド指標の信号を受け入れてポジションを開きます.

優位分析

この戦略の最大の利点は,トレンドの方向を把握し,トレンドを追跡できるという点にある.超トレンド指標は,単純な移動平均よりも正確で,転換点を迅速に判断できる.同時に,移動止損機構は,止損位置を自動的に調整し,利潤を最大限に確保し,リスクを効果的に制御することができる.

また,この戦略はADXとRSIの指数に波動を加えることで,市場の波動が大きい時期に誤った取引を防ぐことができます.ADXの指数は,十分な傾向性を保証し,RSIの指数は,過剰買い過剰販売の現象を避けるため,利益の確率を向上させます.

リスク分析

この戦略の最大のリスクは,トレンドを誤判し,超トレンド指標が誤信号を発する確率である.超トレンド指標は,シンプルな移動平均よりも優れているにもかかわらず,複雑な状況でも誤判は避けられない.この場合,損失を制御するために止損メカニズムに頼る必要がある.

さらに,戦略パラメータの設定が不適切であることも一定のリスクをもたらす.例えば,ATRパラメータの過大会議は,止損ラインの調整を過度に激化させる.ADXとRSIのパラメータの設定が不適切であることも,取引機会を逃すか,間違った取引の確率を増やす可能性があります.これは,多くの歴史の回顧を通して最適なパラメータを見つける必要があります.

最適化の方向

この戦略は,以下の点でさらに最適化できます.

  1. DMI,KDJなどの他のトレンド判断指標を,超トレンド指標と組み合わせて,多因子判断システムを形成してみると,判断精度が向上する可能性がある.

  2. 機械学習に基づく自己適応パラメータ最適化モジュールを追加し,ATRパラメータ,ADXパラメータ,RSIパラメータなどのパラメータは,単純に固定値ではなく,リアルタイム市場に応じて調整できます.

  3. 感情指標などの代替RSI指標を導入し,フィルター信号. RSI指標は複雑な状況の判断は理想的ではなく,社会的感情指標などの市場熱度をよりよく判断できます.

  4. ポジション管理モジュールを追加し,ストップラインが現在の価格から近い距離に応じて,ポジションのサイズを動的に調整します.ストップラインから遠ければ遠ければ,ポジションを適切に拡大して,利益の余地を増やすことができます.

要約する

トレンド追跡移動ストップ戦略は,トレンド分析,移動ストップ,多因子フィルタリングなどの方法を総合的に適用し,トレンドを捉えながらもリスクを厳格に制御する,より成熟した量化戦略である.この戦略の最適化スペースは大きく,より複雑な市場環境に適応するように改善する研究に値する.

ストラテジーソースコード
/*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")