Aktienstrategien basierend auf Momentumrotation


Erstellungsdatum: 2023-09-19 22:14:24 zuletzt geändert: 2023-09-19 22:14:24
Kopie: 0 Klicks: 729
1
konzentrieren Sie sich auf
1617
Anhänger

Überblick

Diese Strategie verwendet eine dynamische Rotation, um die Markttrends anhand des Stoch RSI-Indikators zu beurteilen und Aktienrotationshandlungen zu realisieren. Wenn der Indikator überkauft ist, wird kurz gehalten, wenn er überkauft ist, wird er überkauft.

Strategieprinzip

  1. Berechnen Sie den Wert des RSI mit einer Länge von 14 Zyklen
  2. Die Stochastic Length ist 14, die Smooth K ist 3 und die Smooth D ist 1
  3. Wenn der Stoch RSI von einer Überverkaufszone in eine Überkaufszone übergeht, wird ein zusätzlicher Einstieg getätigt
  4. Wenn der Stoch RSI von der Überkaufzone in die Überverkaufszone fällt, wird der Shorting eingestellt
  5. Die Einlagerung erfolgt in Form von Schachteln, maximal 5 Einlagerungen
  6. Setzen Sie einen Stop-Loss und verfolgen Sie den Stop-Loss nach jedem Aufschlag
  7. Der Stop-Loss wird ausgelöst
  8. Verwalten Sie Ihre Positionen nach Stop-Loss und Tracking-Stops

Analyse der Stärken

Diese Strategie hat folgende Vorteile:

  1. Auf Basis der Dynamik-Indikator-Betrieb, kann die Wendepunkte der Markttrends zu erfassen, rechtzeitig die Richtung der Position zu korrigieren.
  2. Die Verwendung von Kurvenpositionen ermöglicht es, Positionen zu Beginn des Trends einzunehmen und die Positionen nach der Trendbestätigung zu erhöhen, um die Trendgewinne vollständig zu erfassen.
  3. Setzen Sie einen Stop-Loss-Punkt, um das Risiko zu kontrollieren. Setzen Sie einen Initial Stop-Loss-Punkt, um das Risiko zu kontrollieren. Setzen Sie einen Stop-Loss-Punkt, um das Risiko zu kontrollieren.
  4. Der RSI-Parameter-Optimierungsraum ist groß, so dass die Parameter für verschiedene Märkte angepasst werden können, um die beste Kombination zu finden.
  5. Flexible Anpassung von Parametern wie Anzahl der Aufschläge, Tiefe, Stop-Loss-Punkt, starke Anpassungsfähigkeit an den Markt.

Risikoanalyse

Die Strategie birgt auch einige Risiken, die beachtet werden müssen:

  1. Der Stoch RSI ist der einzige Indikator, der falsche Signale für Überraschungen erzeugen kann.
  2. Nur für die stark tendenziellen Sorten, nicht für die Querplatten-Schwankungen.
  3. Übermäßige Anlagerungen können zu einer Vergrößerung der Verluste führen. Die Tiefe der Anlagerung muss kontrolliert werden.
  4. Unvernünftige Stop-Loss-Einstellungen können zu übermäßigen Stop-Losses führen. Die Stop-Loss-Parameter müssen an den Markt angepasst werden.
  5. Es ist wichtig, die Kosten für die Transaktion zu kontrollieren.

Optimierungsrichtung

Die Strategie kann auch in folgenden Richtungen optimiert werden:

  1. Optimierung des RSI-Parameters, um die optimale Längen zu finden.
  2. Optimieren Sie die Stoch-Parameter, um die optimale K, D-Zykluskombination zu finden.
  3. Das ist eine sehr gute Idee, aber es ist nicht die richtige.
  4. Dynamische Anpassung der Anzahl der Anlagen, je nach Markt, Anpassung der Tiefe der Anlage.
  5. Optimierung der Stop-Loss-Logik und Verringerung der Stop-Loss-Rate.
  6. Ein zusätzliches Modul zur Positionsverwaltung, um die Positionen nach den Prinzipien der Geldverwaltung zu steuern.
  7. Das Modul zur Kontrolle der Gebühren, um die übermäßige Häufigkeit der Transaktionen zu kontrollieren.

Zusammenfassen

Die Strategie verwendet insgesamt eine eher erfahrene Dynamik-Rotations-Idee, mit Stoch RSI als Kern-Trading-Indikator, unterstützt durch die Form der Verlagerung und Stop-Loss-Management für die Risikokontrolle, ist eine zuverlässige Trend-Tracking-Strategie. Durch die Optimierung der Parameter und Modul-Erweiterung kann die Stabilität und Adaptivität der Strategie weiter verbessert werden.

Strategiequellcode
/*backtest
start: 2023-09-11 00:00:00
end: 2023-09-13 13:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This script was created for educational purposes only.
// © mcristianrios

// FEEL FREE TO DROP A COMMENT AND A LIKE IF YOU USE IT OR IT SERVES YOU WELL

//@version=4
//strategy(title="Pyramiding Strategy To Study [mcristianrios]", commission_type=strategy.commission.cash_per_contract, commission_value=0.0002, overlay=true, default_qty_value=1000, initial_capital=100, calc_on_order_fills=false, currency="USD", overlay=true, pyramiding=5)
// study(title="Pyramiding Strategy To Study [mcristianrios]", overlay=true)

int pyramiding            = input(1,  'Pyramiding', minval=1, maxval=5)
int slPips                = input(80, 'SL Pips')
int ttPips                = input(60, 'Trail Trig')
int trailOffset           = input(60, 'Trail Offset')

// === PYRAMIDING DECLARATION === {
var int   longPyramiding  = 0
var int   shortPyramiding = 0

// To save init of operation price
var float close1          = na
var float close2          = na
var float close3          = na
var float close4          = na
var float close5          = na

// How far did the Trailing Stop Get?
var float far1            = na
var float far2            = na
var float far3            = na
var float far4            = na
var float far5            = na
// }

// === STOCHASTIC RSI === {
smoothK                   = input(3, minval=1)
smoothD                   = input(1, minval=1)
lengthRSI                 = input(14, minval=1)
lengthStoch               = input(14, minval=1)
src                       = input(close, title="RSI Source")

rsi1                      = rsi(src, lengthRSI)
k                         = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d                         = sma(k, smoothD)
// }

// === SOME CONDITION TO TAKE A POSITION === {
goLong  = k[1] < 80 and k >= 80 and longPyramiding  < pyramiding
goShort = k[1] > 20 and k <= 20 and shortPyramiding < pyramiding
// }

// === PYRAMIDING SIMULATION === {
var string lastOperation = ''
if (goLong  and lastOperation != 'LONG') or (goShort and lastOperation != 'SHORT')
    // RESET
    longPyramiding           := 0
    shortPyramiding          := 0
    far1                     := na
    far2                     := na
    far3                     := na
    far4                     := na
    far5                     := na
    close1                   := na
    close2                   := na
    close3                   := na
    close4                   := na
    close5                   := na

// === SUM ONE INTO 'LONG' OR 'SHORT' PYRAMIDING AND REMEMBER LAST OPERATION TYPE === {
isCallOrShort = if goLong and longPyramiding < pyramiding
    lastOperation := 'LONG'
    longPyramiding := longPyramiding + 1

    true
else
    isShort = if goShort and shortPyramiding < pyramiding
        lastOperation := 'SHORT'
        shortPyramiding := shortPyramiding + 1

        true
    else
        false

    isShort
// }

// === SAVE CURRENT PRICE === {
if isCallOrShort
    if na(close1)
        close1 := close
    else
        if na(close2)
            close2 := close
        else
            if na(close3)
                close3 := close
            else
                if na(close4)
                    close4 := close
                else
                    if na(close5)
                        close5 := close
// }

if longPyramiding > 0
    // If Trail Stop was not triggered and distance is achieved saved it
    if na(far1) and high > close1 + syminfo.mintick * 10 * ttPips
        far1 := high
    if na(far2) and high > close2 + syminfo.mintick * 10 * ttPips
        far2 := high
    if na(far3) and high > close3 + syminfo.mintick * 10 * ttPips
        far3 := high
    if na(far4) and high > close4 + syminfo.mintick * 10 * ttPips
        far4 := high
    if na(far5) and high > close5 + syminfo.mintick * 10 * ttPips
        far5 := high
    
    // Update how far our position went
    if not na(far1) and high > far1
        far1 := high
    if not na(far2) and high > far2
        far2 := high
    if not na(far3) and high > far3
        far3 := high
    if not na(far4) and high > far4
        far4 := high
    if not na(far5) and high > far5
        far5 := high
        
    /// === SL not na(trailing stop) ? Use Trailing Stop : Use Default Stop Loss === {
    if not na(close1) and (not na(far1) ? low <= far1 - syminfo.mintick * 10 * trailOffset : low <= close1 - syminfo.mintick * 10 * slPips)
        longPyramiding := longPyramiding - 1
        close1         := na
        far1           := na
    if not na(close2) and (not na(far2) ? low <= far2 - syminfo.mintick * 10 * trailOffset : low <= close2 - syminfo.mintick * 10 * slPips)
        longPyramiding := longPyramiding - 1
        close2         := na
        far2           := na
    if not na(close3) and (not na(far3) ? low <= far3 - syminfo.mintick * 10 * trailOffset : low <= close3 - syminfo.mintick * 10 * slPips)
        longPyramiding := longPyramiding - 1
        close3         := na
        far3           := na
    if not na(close4) and (not na(far4) ? low <= far4 - syminfo.mintick * 10 * trailOffset : low <= close4 - syminfo.mintick * 10 * slPips)
        longPyramiding := longPyramiding - 1
        close4         := na
        far4           := na
    if not na(close5) and (not na(far5) ? low <= far5 - syminfo.mintick * 10 * trailOffset : low <= close5 - syminfo.mintick * 10 * slPips)
        longPyramiding := longPyramiding - 1
        close5         := na
        far5           := na
    // }

// Log when long pyramiding changed
if longPyramiding[1] != longPyramiding[2]
    label.new(bar_index, high, tostring(longPyramiding[1]), xloc.bar_index, yloc.price, size = size.normal, color=color.blue, textcolor=color.white)

if shortPyramiding > 0
    // If Trail Stop was not triggered and distance is achieved saved it
    if na(far1) and low < close1 - syminfo.mintick * 10 * ttPips
        far1 := low
    if na(far2) and low < close2 - syminfo.mintick * 10 * ttPips
        far2 := low
    if na(far3) and low < close3 - syminfo.mintick * 10 * ttPips
        far3 := low
    if na(far4) and low < close4 - syminfo.mintick * 10 * ttPips
        far4 := low
    if na(far5) and low < close5 - syminfo.mintick * 10 * ttPips
        far5 := low
    
    // Update how far our position went
    if not na(far1) and low < far1
        far1 := low
    if not na(far2) and low < far2
        far2 := low
    if not na(far3) and low < far3
        far3 := low
    if not na(far4) and low < far4
        far4 := low
    if not na(far5) and low < far5
        far5 := low
        
    /// === SL not na(trailing stop) ? Use Trailing Stop : Use Default Stop Loss === {
    if not na(close1) and (not na(far1) ? high >= far1 + syminfo.mintick * 10 * trailOffset : high >= close1 + syminfo.mintick * 10 * slPips)
        shortPyramiding := shortPyramiding - 1
        close1          := na
        far1            := na
    if not na(close2) and (not na(far2) ? high >= far2 + syminfo.mintick * 10 * trailOffset : high >= close2 + syminfo.mintick * 10 * slPips)
        shortPyramiding := shortPyramiding - 1
        close2          := na
        far2            := na
    if not na(close3) and (not na(far3) ? high >= far3 + syminfo.mintick * 10 * trailOffset : high >= close3 + syminfo.mintick * 10 * slPips)
        shortPyramiding := shortPyramiding - 1
        close3          := na
        far3            := na
    if not na(close4) and (not na(far4) ? high >= far4 + syminfo.mintick * 10 * trailOffset : high >= close4 + syminfo.mintick * 10 * slPips)
        shortPyramiding := shortPyramiding - 1
        close4          := na
        far4            := na
    if not na(close5) and (not na(far5) ? high >= far5 + syminfo.mintick * 10 * trailOffset : high >= close5 + syminfo.mintick * 10 * slPips)
        shortPyramiding := shortPyramiding - 1
        close5          := na
        far5            := na
    // }

// Log when long pyramiding changed
if shortPyramiding[1] != shortPyramiding[2]
    label.new(bar_index, high + syminfo.mintick * 10 * 22, tostring(shortPyramiding[1]), xloc.bar_index, yloc.price, size = size.normal, color=color.red, textcolor=color.white)
// }

// === COMMENT IF STUDY === {
strategy.entry("Long",  strategy.long,  when = goLong  and longPyramiding  <= pyramiding)
strategy.entry("Short", strategy.short, when = goShort and shortPyramiding <= pyramiding)

strategy.exit("Exit Long",  "Long",  loss=slPips * 10, trail_points=ttPips * 10, trail_offset=trailOffset * 10)
strategy.exit("Exit Short", "Short", loss=slPips * 10, trail_points=ttPips * 10, trail_offset=trailOffset * 10)
// }

// === UNCOMMENT IF STUDY === {
// plot(ttPips,      title='TrailTrig',   color=na, display=display.none)
// plot(trailOffset, title='TrailOffset', color=na, display=display.none)
// plot(slPips,      title='LossPips',    color=na, display=display.none)

// string longTradeId     = 'tradeid=long{{ticker}}_PYRAMIDING_[MCRISTIANRIOS]'
// string shortTradeId    = 'tradeid=short{{ticker}}_PYRAMIDING_[MCRISTIANRIOS]'
// string basicTrade      = 'tradesymbol={{ticker}} sl={{plot("LossPips")}} trailtrig={{plot("TrailTrig")}} traildist={{plot("TrailOffset")}}'

// alertcondition(goLong  and longPyramiding  <= pyramiding, title='Long',   message='long '  + basicTrade + ' ' + longTradeId)
// alertcondition(goShort and shortPyramiding <= pyramiding, title='Short',  message='short ' + basicTrade + ' ' + shortTradeId)

// alertcondition(goLong  and longPyramiding  <= pyramiding, title='XShort', message='closepart part=1 ' + shortTradeId)
// alertcondition(goShort and shortPyramiding <= pyramiding, title='XLong',  message='closepart part=1 ' + longTradeId)
// }

// Background color for backtest
bgcolor(goLong[1] ? color.lime : goShort[1] ? color.red : na, transp=70)