B-Xtrender Exponential Moving Average Crossover-Strategie

Schriftsteller:ChaoZhang, Datum: 2024-02-20 14:45:17
Tags:

img

Übersicht

Dies ist eine Handelsstrategie, die auf dem Crossover-Prinzip des exponentiellen gleitenden Durchschnitts (EMA) basiert.

Strategie Logik

  1. Generation von Handelssignalen durch schnelle und langsame EMA-Crossovers. Die schnelle Linie verwendet 5- und 20-tägige EMA-Crossover, während die langsame Linie 20- und 15-tägige EMA-Crossover verwendet.
  2. Gehen Sie lang, wenn die schnelle Linie über die langsame Linie kreuzt, und gehen Sie kurz, wenn die schnelle Linie unterhalb kreuzt. Verwenden Sie RSI zur sekundären Bestätigung und nehmen Sie nur Signale auf, wenn RSI auch in die gleiche Richtung kreuzt.
  3. Fügen Sie einen 200-Tage- gleitenden Durchschnittsfilter hinzu, um Signale in unruhigen Perioden zu vermeiden.

Vorteile

  1. Die Bestätigung des RSI erhöht die Signalzuverlässigkeit erheblich und verringert falsche Signale.
  2. Bei der Auswahl der EMA-Parameter sind Empfindlichkeit und Stabilität im Gleichgewicht.
  3. Der MA-Filter beseitigt Lärm, um unnötige Transaktionen zu vermeiden.

Risiken

  1. Die EMA hat Probleme mit starken Kursschwankungen, zunehmenden Verlusten oder fehlenden Signalen.
  2. Schlechte RSI-Einstellungen könnten auch Signalverzögerungen verursachen.
  3. Der MA-Filter kann frühe Trendsignale filtern.

Möglichkeiten zur Verbesserung

  1. Dynamische Optimierung der EMA-Parameter über die Zyklen hinweg.
  2. Experimentieren Sie mit anderen Indikatoren wie MACD, um sie mit dem RSI zu kombinieren.
  3. Feinstimmungs-MA-Filterparameter für eine optimale Geräuschminderung und Gelegenheitserfassung.

Schlussfolgerung

Dies ist eine allgemeine solide Strategie für den Aufbau eines vollständigen EMA-Handelssystems, mit zusätzlicher RSI-Bestätigung zur Steigerung der Signalqualität. Es lohnt sich zu studieren und zu optimieren.


/*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)    

Mehr