Momentumrotation über Zeiträume hinweg

Schriftsteller:ChaoZhang, Datum: 2023-11-17 17:32:11
Tags:

img

Übersicht

Die Strategie nutzt eine Kombination von gleitenden Durchschnittslinien über einen zeitlichen Rahmen, um Trendwechsel auf dem grossen und mittleren Stundenchart zu erkennen und Trends mit geringem Risiko zu verfolgen. Die Strategie hat die Vorteile einer flexiblen Konfiguration, der Einfachheit und der hohen Kapital-Effizienz und ist für Trader geeignet, die Trends mit mittleren und langen Linien verfolgen.

Das ursprüngliche Verständnis

Die Strategie verwendet drei gleitende Durchschnittslinien von 5, 20 und 40 Tagen, um eine Reihe von Trends in verschiedenen Zeitrahmen zu bestimmen.

Insbesondere wird der 20-tägige Mittelpunkt der 5-tägigen schnellen Linie als ein kurzfristiges Aufstiegssignal betrachtet. Der 40-tägige Mittelpunkt der 40-tägigen langsamen Linie wird als ein mittleres Aufstiegssignal betrachtet.

So wird ein spezifischer Einstieg in Kombination mit einer kleinen Zyklusstärke nach der Richtung des großen Zyklustrends ermittelt. Das heißt, man kann nur bei gleichgerichteten großen Trends und starken kleinen Zyklen treten, um einen umgekehrten falschen Durchbruch effektiv zu filtern und eine hohe Gewinnrate zu erzielen.

Darüber hinaus nutzt die Strategie den ATR-Stoppverlust, um das Risiko einer Einzahlung zu kontrollieren und die Profitabilität weiter zu steigern.

Stärkenanalyse

  • Konfigurationsflexibilität, Benutzer können die Parameter der gleitenden Durchschnittslinie an unterschiedliche Sorten und Handelspräferenzen anpassen

  • Die Implementierung ist einfach und für Neulinge einfach.

  • Die Effizienz der Kapitalnutzung und die Nutzung des Kapital-Leverages

  • Risikokontrolle, Verlustverhütungsmechanismen, um erhebliche Verluste effektiv zu vermeiden

  • Trends mit starker Trendfähigkeit, nach der Festlegung der Richtung des großen Zyklus weiterhin profitabel

  • Höhere Gewinnraten, bessere Signalqualität und weniger falsche Zugwechsel

Risiko und Verbesserung

  • Die große Periodenschätzung hängt von der Verlagerung der Mittellinien ab und besteht ein Risiko für Verzögerungen bei der Fehlentscheidung.

  • Kleinsiklusstärke-Detektion mit nur einem K-Strang, möglicherweise frühzeitig ausgelöst, entsprechend entspannt

  • Festes Stoppvermögen, optimiert für dynamisches Stopp

  • Sie können zusätzliche Filterbedingungen wie Transaktionsvolumenenergie berücksichtigen.

  • Versuche verschiedene Kombinationen von gleitenden Mittelwertparametern, optimiere die Strategie

Zusammenfassung

Die Strategie integriert Multi-Zeitrahmen-Analyse und Stop-Loss-Management und ermöglicht eine geringe Risikobereitschaft bei Trend-Folge-Tarifen. Durch die Anpassung der Parameter kann sie auf verschiedene Sorten angewendet werden, um die Bedürfnisse von Trend-Folgern zu erfüllen. Die Handelsentscheidungen sind stabiler und die Signale sind effizienter als bei herkömmlichen Single-Time-Frame-Systemen.

Übersicht

Diese Strategie verwendet eine Kombination von gleitenden Durchschnitten über Zeitrahmen hinweg, um Trendrotationen auf den stündlichen, täglichen und wöchentlichen Diagrammen zu identifizieren. Sie ermöglicht einen risikoarmen Trend nach dem Handel. Die Strategie ist flexibel, einfach zu implementieren, kapitaleffizient und geeignet für mittel- und langfristige Trendhandler.

Handelslogik

Die Strategie verwendet gleitende Durchschnitte von 5, 20 und 40 Tagen, um die Ausrichtung der Trends in verschiedenen Zeitrahmen zu bestimmen.

Die Überschreitung der 5-tägigen schnellen MA über die 20-tägige mittlere MA zeigt einen Aufwärtstrend auf kurze Sicht. Die Überschreitung der 20-tägigen mittleren MA über die 40-tägige langsame MA signalisiert einen Aufwärtstrend auf mittlere Sicht. Wenn die schnellen, mittleren und langsamen MA positiv ausgerichtet sind (5-tägige > 20-tägige > 40-tägige), ist es ein Bullenzyklus. Wenn sie negativ ausgerichtet sind (5-tägige < 20-tägige < 40-tägige), ist es ein Bärenzyklus.

Durch die Bestimmung der Richtung aus den größeren Zyklen und die Bestätigung der Stärke auf den kleineren Zyklen eröffnet diese Strategie Positionen nur, wenn sich der Haupttrend und die geringere Dynamik ausrichten.

Die Strategie nutzt auch ATR-Trailing Stops, um Einzelhandelsrisiken zu kontrollieren und die Rentabilität weiter zu verbessern.

Vorteile

  • Flexible Konfigurationen für verschiedene Instrumente und Handelsstile

  • Einfache Implementierung auch für Anfänger

  • Hohe Kapitaleffizienz zur Maximierung der Hebelwirkung

  • Wirksame Risikokontrolle zur Vermeidung erheblicher Verluste

  • Starke Entwicklung nach nachhaltiger Gewinnfähigkeit

  • Hohe Gewinnrate durch starke Signale und weniger Whipsaws

Risiken und Verbesserungen

  • MA-Kreuzungen können verzögern und zu einer späten Trenddetektion führen

  • Eine einzelne Kerzenstärke könnte einen vorzeitigen Einstieg auslösen, entspannenden Zustand.

  • Festgelegte ATR-Stoppverluste, Optimierung auf dynamische Stopps

  • Überlegen Sie, zusätzliche Filter wie Volumen hinzuzufügen

  • Erforschen Sie verschiedene MA-Parameter zur Optimierung

Schlussfolgerung

Diese Strategie integriert mehrere Zeitrahmenanalyse und Risikomanagement für einen risikoarmen Trend nach dem Handel. Durch die Anpassung der Parameter kann sie an verschiedene Instrumente angepasst werden, um den Trendhandlern zu entsprechen. Im Vergleich zu einzelnen Zeitrahmensystemen trifft sie robustere Handelsentscheidungen und erzeugt höhere Effizienzsignale. Abschließend hat diese Strategie eine gute Marktanpassungsfähigkeit und ein gutes Entwicklungspotenzial.


/*backtest
start: 2023-10-17 00:00:00
end: 2023-11-16 00:00:00
period: 1h
basePeriod: 15m
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/
// © kgynofomo

//@version=5
strategy(title="[Salavi] | Andy Advance Pro Strategy [BTC|M15]",overlay = true, pyramiding = 1,initial_capital = 10000, default_qty_type = strategy.cash,default_qty_value = 10000)

ema_short = ta.ema(close,5)
ema_middle = ta.ema(close,20)
ema_long = ta.ema(close,40)

cycle_1 = ema_short>ema_middle and ema_middle>ema_long
cycle_2 = ema_middle>ema_short and ema_short>ema_long
cycle_3 = ema_middle>ema_long and ema_long>ema_short
cycle_4 = ema_long>ema_middle and ema_middle>ema_short
cycle_5 = ema_long>ema_short and ema_short>ema_middle
cycle_6 = ema_short>ema_long and ema_long>ema_middle

bull_cycle = cycle_1 or cycle_2 or cycle_3
bear_cycle = cycle_4 or cycle_5 or cycle_6
// label.new("cycle_1")
// bgcolor(color=cycle_1?color.rgb(82, 255, 148, 60):na)
// bgcolor(color=cycle_2?color.rgb(82, 255, 148, 70):na)
// bgcolor(color=cycle_3?color.rgb(82, 255, 148, 80):na)
// bgcolor(color=cycle_4?color.rgb(255, 82, 82, 80):na)
// bgcolor(color=cycle_5?color.rgb(255, 82, 82, 70):na)
// bgcolor(color=cycle_6?color.rgb(255, 82, 82, 60):na)

// Inputs
a = input(2, title='Key Vaule. \'This changes the sensitivity\'')
c = input(7, title='ATR Period')
h = false

xATR = ta.atr(c)
nLoss = a * xATR

src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close, lookahead=barmerge.lookahead_off) : close

xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop[1], 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), src - nLoss) : iff_2

pos = 0
iff_3 = src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

ema = ta.ema(src, 1)
above = ta.crossover(ema, xATRTrailingStop)
below = ta.crossover(xATRTrailingStop, ema)

buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below

barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop




atr = ta.atr(14)
atr_length = input.int(25)
atr_rsi = ta.rsi(atr,atr_length)
atr_valid = atr_rsi>50

long_condition =  buy and bull_cycle and atr_valid
short_condition =  sell and bear_cycle and atr_valid

Exit_long_condition = short_condition
Exit_short_condition = long_condition

if long_condition
    strategy.entry("Andy Buy",strategy.long, limit=close,comment="Andy Buy Here")

if Exit_long_condition
    strategy.close("Andy Buy",comment="Andy Buy Out")
    // strategy.entry("Andy fandan Short",strategy.short, limit=close,comment="Andy 翻單 short Here")
    // strategy.close("Andy fandan Buy",comment="Andy short Out")


if short_condition
    strategy.entry("Andy Short",strategy.short, limit=close,comment="Andy short Here")


// strategy.exit("STR","Long",stop=longstoploss)
if Exit_short_condition
    strategy.close("Andy Short",comment="Andy short Out")
    // strategy.entry("Andy fandan Buy",strategy.long, limit=close,comment="Andy 翻單 Buy Here")
    // strategy.close("Andy fandan Short",comment="Andy Buy Out")




inLongTrade = strategy.position_size > 0
inLongTradecolor = #58D68D
notInTrade = strategy.position_size == 0
inShortTrade = strategy.position_size < 0

// bgcolor(color = inLongTrade?color.rgb(76, 175, 79, 70):inShortTrade?color.rgb(255, 82, 82, 70):na)
plotshape(close!=0,location = location.bottom,color = inLongTrade?color.rgb(76, 175, 79, 70):inShortTrade?color.rgb(255, 82, 82, 70):na)


plotshape(long_condition, title='Buy', text='Andy Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(short_condition, title='Sell', text='Andy Sell', style=shape.labeldown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)


//atr > close *0.01* parameter

// MONTHLY TABLE PERFORMANCE - Developed by @QuantNomad
// *************************************************************************************************************************************************************************************************************************************************************************
show_performance = input.bool(true, 'Show Monthly Performance ?', group='Performance - credits: @QuantNomad')
prec = input(2, 'Return Precision', group='Performance - credits: @QuantNomad')

if show_performance
    new_month = month(time) != month(time[1])
    new_year  = year(time)  != year(time[1])
    
    eq = strategy.equity
    
    bar_pnl = eq / eq[1] - 1
    
    cur_month_pnl = 0.0
    cur_year_pnl  = 0.0
    
    // Current Monthly P&L
    cur_month_pnl := new_month ? 0.0 : 
                     (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 
    
    // Current Yearly P&L
    cur_year_pnl := new_year ? 0.0 : 
                     (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1  
    
    // Arrays to store Yearly and Monthly P&Ls
    var month_pnl  = array.new_float(0)
    var month_time = array.new_int(0)
    
    var year_pnl  = array.new_float(0)
    var year_time = array.new_int(0)
    
    last_computed = false
    
    if (not na(cur_month_pnl[1]) and (new_month or barstate.islastconfirmedhistory))
        if (last_computed[1])
            array.pop(month_pnl)
            array.pop(month_time)
            
        array.push(month_pnl , cur_month_pnl[1])
        array.push(month_time, time[1])
    
    if (not na(cur_year_pnl[1]) and (new_year or barstate.islastconfirmedhistory))
        if (last_computed[1])
            array.pop(year_pnl)
            array.pop(year_time)
            
        array.push(year_pnl , cur_year_pnl[1])
        array.push(year_time, time[1])
    
    last_computed := barstate.islastconfirmedhistory ? true : nz(last_computed[1])
    
    // Monthly P&L Table    
    var monthly_table = table(na)
    
    if (barstate.islastconfirmedhistory)
        monthly_table := table.new(position.bottom_center, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)
    
        table.cell(monthly_table, 0,  0, "",     bgcolor = #cccccc)
        table.cell(monthly_table, 1,  0, "Jan",  bgcolor = #cccccc)
        table.cell(monthly_table, 2,  0, "Feb",  bgcolor = #cccccc)
        table.cell(monthly_table, 3,  0, "Mar",  bgcolor = #cccccc)
        table.cell(monthly_table, 4,  0, "Apr",  bgcolor = #cccccc)
        table.cell(monthly_table, 5,  0, "May",  bgcolor = #cccccc)
        table.cell(monthly_table, 6,  0, "Jun",  bgcolor = #cccccc)
        table.cell(monthly_table, 7,  0, "Jul",  bgcolor = #cccccc)
        table.cell(monthly_table, 8,  0, "Aug",  bgcolor = #cccccc)
        table.cell(monthly_table, 9,  0, "Sep",  bgcolor = #cccccc)
        table.cell(monthly_table, 10, 0, "Oct",  bgcolor = #cccccc)
        table.cell(monthly_table, 11, 0, "Nov",  bgcolor = #cccccc)
        table.cell(monthly_table, 12, 0, "Dec",  bgcolor = #cccccc)
        table.cell(monthly_table, 13, 0, "Year", bgcolor = #999999)
    
    
        for yi = 0 to array.size(year_pnl) - 1
            table.cell(monthly_table, 0,  yi + 1, str.tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
            
            y_color = array.get(year_pnl, yi) > 0 ? color.new(color.teal, transp = 40) : color.new(color.gray, transp = 40)
            table.cell(monthly_table, 13, yi + 1, str.tostring(math.round(array.get(year_pnl, yi) * 100, prec)), bgcolor = y_color, text_color=color.new(color.white, 0))
            
        for mi = 0 to array.size(month_time) - 1
            m_row   = year(array.get(month_time, mi))  - year(array.get(year_time, 0)) + 1
            m_col   = month(array.get(month_time, mi)) 
            m_color = array.get(month_pnl, mi) > 0 ? color.new(color.teal, transp = 40) : color.new(color.gray, transp = 40)
            
            table.cell(monthly_table, m_col, m_row, str.tostring(math.round(array.get(month_pnl, mi) * 100, prec)), bgcolor = m_color, text_color=color.new(color.white, 0))



Mehr