指数移動平均クロスオーバー B-Xtrender 戦略


作成日: 2024-02-20 14:45:17 最終変更日: 2024-02-20 14:45:17
コピー: 0 クリック数: 1666
1
フォロー
1617
フォロワー

指数移動平均クロスオーバー B-Xtrender 戦略

概要

この戦略は,指数均線交差原理に基づく取引戦略である.これは,RSI指標と均線フィルターを併用して,より完全なトレンド追跡と反転取引システムを形成している.

戦略原則

  1. 指数移動平均の快慢交差を利用して取引信号を形成する.快線パラメータは5日線と20日線のEMA交差,慢線パラメータは20日線と15日線のEMA交差である.
  2. 快線で慢線を横切るときは多行し,快線下で慢線を横切るときは空行する.RSI指標を用いて二次検証を行い,RSIも同方向の交差するときにのみ取引信号の有効性を確認する.
  3. 200日移動平均をフィルターとして加え,価格が平均線を突破したときにのみ取引信号を発信し,そのため,震動の状況下での複数の偽交差を回避する.

戦略的優位性

  1. 双EMA交差はRSI指標と結合し,信号の信頼性を大幅に高め,偽信号率を下げている.
  2. EMAパラメータの配合により,取引信号の感度が考慮され,信号の安定性が確保されます.
  3. 均線フィルターの追加により,震動時の騒音を効果的にフィルターし,不要な取引を回避する.

戦略リスク

  1. EMAは,価格が急激に変化するときに,明らかに遅れている指標である.これは,損失を増加させたり,信号が逃れられるリスクにつながる.
  2. RSIパラメータの不適切な設定は,信号の遅延を引き起こします.
  3. 均線フィルタリングは,変動を回避しますが,トレンドの初期段階では,早期のエントリー機会をフィルタリングすることができます.

戦略最適化の方向性

  1. EMAパラメータを動的に調整し,異なる周期で最適なパラメータの組み合わせを選択する.
  2. RSIとMACDなどの他の指標を組み合わせてみてください.
  3. 均線フィルターパラメータを最適化して,ノイズとアクセス機会のバランスをとる.

要約する

この戦略は,全体として,より完全な指数移動平均取引システムを構築するものである.これは,取引シグナルを取得した基礎で,RSI指標を追加して,多層の検証を行う.これは,間違いなく,信号の質を大幅に向上させ,学習と最適化の価値のある戦略である.もちろん,指標自体の遅滞の特徴のために,遅滞の停止などのリスクを防ぐことに注意すべきである.

ストラテジーソースコード
/*backtest
start: 2023-02-13 00:00:00
end: 2024-02-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © QuantTherapy
//@version=4
strategy("B-Xtrender [Backtest Edition] @QuantTherapy")

i_short_l1  = input(5 , title="[Short] L1")
i_short_l2  = input(20, title="[Short] L2")
i_short_l3  = input(15, title="[Short] L3")

i_long_l1   = input(20, title="[Long] L1")
i_long_l2   = input(15, title="[Long] L2")

i_ma_use    = input(true , title="[MA Filter] Yes/No" )
i_ma_len    = input(200  , title="[MA Filter] length" )
i_ma_type   = input("EMA", title="[MA Filter] type", options = ["SMA", "EMA"])

shortTermXtrender = rsi( ema(close, i_short_l1) - ema(close, i_short_l2), i_short_l3 ) - 50
longTermXtrender  = rsi( ema(close, i_long_l1), i_long_l2 ) - 50

shortXtrenderCol = shortTermXtrender > 0 ? shortTermXtrender > shortTermXtrender[1] ? color.lime : #228B22 : shortTermXtrender > shortTermXtrender[1] ? color.red : #8B0000
plot(shortTermXtrender, color=shortXtrenderCol, style=plot.style_columns, linewidth=1, title="B-Xtrender Osc. - Histogram", transp = 40)

longXtrenderCol   = longTermXtrender> 0 ? longTermXtrender > longTermXtrender[1] ? color.lime : #228B22 : longTermXtrender > longTermXtrender[1] ? color.red : #8B0000
macollongXtrenderCol =  longTermXtrender > longTermXtrender[1] ? color.lime : color.red
plot(longTermXtrender , color=longXtrenderCol, style=plot.style_columns, linewidth=2, title="B-Xtrender Trend - Histogram", transp = 90)

plot(longTermXtrender , color=#000000             , style=plot.style_line, linewidth=5, title="B-Xtrender Trend - Line", transp = 100)
plot(longTermXtrender , color=macollongXtrenderCol, style=plot.style_line, linewidth=3, title="B-Xtrender Trend - Line", transp = 100)

// --- Initialize MA Filter
ma = i_ma_type == "EMA" ? ema(close, i_ma_len) : sma(close, i_ma_len)
maFilterLong = true
maFilterShort = true
if i_ma_use
    maFilterLong  := close > ma ? true : false
    maFilterShort := close < ma ? true : false

long  = shortTermXtrender > 0 and longTermXtrender > 0 and maFilterLong
closeLong = shortTermXtrender < 0 or longTermXtrender < 0 
short = shortTermXtrender < 0 and longTermXtrender < 0 and maFilterShort
closeShort = shortTermXtrender > 0 or longTermXtrender > 0 

plotshape(long[1]==true  and long[2]==false  ? 0 : na , location=location.absolute, style=shape.labelup  , color=color.lime, size=size.small, transp=10)
plotshape(short[1]==true and short[2]==false ? 0 : na, location=location.absolute, style=shape.labeldown, color=color.red , size=size.small, transp=10)
plotshape(closeLong[1]==true and closeLong[2]==false
 or closeShort[1]==true and closeShort[2]==false ? 0 : na, location=location.absolute, style=shape.circle, color=color.orange , size=size.small)

i_perc     = input(defval = 20.0, title = "[TSL-%] Percent"  , minval = 0.1 )
i_src = close // constant for calculation
sl_val = i_src * i_perc / 100

strategy.entry("Long", strategy.long, when = long ) 
strategy.close("Long", when = closeLong)

strategy.entry("Short", strategy.short, when = short) 
strategy.close("Short", when = closeShort)

// Calculate SL
longStopPrice = 0.0, shortStopPrice = 0.0
longStopPrice := if (strategy.position_size > 0)
    stopValue = close - sl_val
    max(stopValue, longStopPrice[1])
else
    0

shortStopPrice := if (strategy.position_size < 0)
    stopValue = close + sl_val
    min(stopValue, shortStopPrice[1])
else
    syminfo.mintick*1000000

// For TSL Visualisation on Chart    
// plot(series=(strategy.position_size > 0) ? longStopPrice : na,
//      color=color.fuchsia, style = plot.style_circles,
//      linewidth=1, title="Long Trail Stop")
     
// plot(series=(strategy.position_size < 0) ? shortStopPrice : na,
//      color=color.fuchsia, style = plot.style_circles,
//      linewidth=1, title="Short Trail Stop")

if (strategy.position_size > 0)
    strategy.exit(id="TSL Long", stop=longStopPrice)

if (strategy.position_size < 0)
    strategy.exit(id="TSL Short", stop=shortStopPrice)