Oszillierende quantitative K-Linien-Handelsstrategie


Erstellungsdatum: 2023-09-26 20:05:55 zuletzt geändert: 2023-09-26 20:05:55
Kopie: 0 Klicks: 724
1
konzentrieren Sie sich auf
1617
Anhänger

Überblick

Die Strategie ist eine indikatorbasierte Dynamikstrategie, bei der Indikatoren von Oszillatoren wie RSI, Stoch und MACD verwendet werden, um Strategie-Handelssignale zu erstellen. Die Hauptidee der Strategie besteht darin, die Richtung des Trends zu identifizieren, wenn die Preise schwanken, und den Eintritt entsprechend der Indikatorsignale durchzuführen. Die Strategie nutzt auch die Verzögerung des Übertrendindikators zum Verlust.

Strategieprinzip

Die Strategie ruft zunächst die benutzerdefinierte Funktion f_getOscilatorValues auf, um die Werte verschiedener Oszillatoren zu erhalten, einschließlich RSI, Stoch, MACD usw. Dann berechnet die f_getSupertrend-Funktion die Werte des übertriebenen Indikators, um den Stop-Loss zu verfolgen.

Nach der Berechnung des Indikators ruft die Strategie die Funktion f_getBuySellStops auf, die den Einstiegs- und den Ausstiegs-Stopp berechnet. Konkret berechnet sie den ATR-Indikator und multipliziert den Einstiegs- und den Ausstiegs-Stopp mit dem ATR multipliziert mit dem Ausstiegs-Stopp-Koeffizienten. Der Stop-Loss und der Ausstiegs-Stopp werden angepasst, wenn ein Trendwechsel eintritt.

Die Strategie beurteilt dann, in welcher Richtung die K-Linien entstehen. Wenn die K-Linien aufwärts sind, werden sie in grün und unten in rot dargestellt. Nach der Darstellung der K-Linien und des Indikators beurteilt die Strategie, ob die Einstiegsvoraussetzungen erfüllt sind.

Nach dem Eintritt wird der Stop-Loss verfolgt, wobei der Stop-Loss auf der Oberfläche oder unter der Oberfläche verfolgt wird, je nachdem, was näher ist. Wenn der Stop-Loss ausgelöst wird, wird die Position ausgeglichen.

Strategische Stärkenanalyse

Diese Strategie hat folgende Vorteile:

  1. Die Verwendung von Oszillatoren als Indikator zur Identifizierung der Richtung von Trends ermöglicht die zeitnahe Erfassung von kurzfristigen Wendechancen auf dem Markt.

  2. Verzögerung der Überschreitung der Stop-Loss-Strategie, die den Ausgang vor dem Ausbau der Verluste verhindert und die Einzelschäden begrenzt.

  3. Die Größe der Position kann dynamisch angepasst werden, je nach Stop-Loss- und Stop-Option-Risiko, die von ATR berechnet werden.

  4. Filterung in Verbindung mit einer hohen periodischen Durchschnittslinie zur Vermeidung von Verschlüssen.

  5. Es ist eine Strategie, die einen Teil der Gewinne aufrechterhält und einen Teil der Gewinne sperrt.

  6. Die Strategie ist einfach und verständlich und für Anfänger geeignet.

Strategische Risikoanalyse

Die Strategie birgt auch einige Risiken:

  1. Die Oszillatoren zeigen ein Verzögerungsproblem, das zu einer Verzögerung des Einstiegssignals und zu einem frühen Ausstieg führen kann. Sie können durch Anpassung der Indikatorparameter optimiert werden oder durch Hinzufügen von Trend-following-Indikatoren unterstützt werden.

  2. Der Stop-Loss-Punkt ist nahe und kann durch einen Durchbruch gestoppt werden. Der Stop-Loss-Bereich kann entsprechend erweitert werden, oder dynamische Stop-Strategien wie der Chandelier Stop können verwendet werden.

  3. Nach einer teilweisen Stop-Off kann die verbleibende Position nachträglich beendet werden. Die teilweise Stop-Off-Rate kann reduziert werden, um Spielraum zu schaffen.

  4. Überprüfungsrisiken. Überprüfungen sollten in verschiedenen Märkten durchgeführt werden, um Überprüfungen zu vermeiden.

  5. Eine hohe periodische Durchschnittslinie kann als Filterbedingung auch fehlschlagen. Trendklassifizierung und andere Methoden sollten zur Beurteilung der grossen Periodenbewegung verwendet werden.

Richtung der Strategieoptimierung

Diese Strategie kann in folgenden Bereichen optimiert werden:

  1. Testen Sie Kombinationen von Parametern verschiedener Oszillatoren und wählen Sie eine Kombination aus, die ein besseres Qualitätssignal liefert, wie z. B. die Stoch-Indikatoren für schnelle K-Linien.

  2. Versuchen Sie, einen teilweisen Stopp in einen beweglichen Stopp umzuwandeln, indem Sie den Stopp nach dem ATR oder dem beweglichen Durchschnitt einstellen.

  3. Die Verwendung von maschinellen Lernalgorithmen für die Beurteilung von Großzyklustrends ersetzt die hochzyklusmäßige lineare Filterung und erhöht die Genauigkeit der Beurteilung.

  4. Die Erhöhung der Energieeffizienz und dergleichen dienen als Eintrittsfilterbedingungen, um unnötige Umkehrgeschäfte zu vermeiden.

  5. Integration und Gewichtsoptimierung der Kennzahlen zur Auswahl der für die aktuelle Sorte am besten geeigneten Kennzahlenkombination.

  6. Hinzufügen von Lernmodulen für die Windsteuerung und dynamische Optimierung von Stop-Loss-Positionen, Stopp-Positionen, Positionen usw.

  7. Um die Differenz zwischen Futures und Cash zu nutzen, fügen Sie Handelssignale hinzu, die Dreiecks-Arbitrage oder Futures-Arbitrage enthalten.

Zusammenfassen

Die Strategie als Ganzes ist eine sehr geeignete Strategie für den Lernbeginn des quantitativen Handels, mit klaren Gedanken, die Schlüsselpunkte basieren auf der Kennzahlenanalyse und Risikokontrolle. Die Parameteroptimierung und Risikovermeidung für den realen Markt sind jedoch erforderlich, um einen stabilen Ertrag zu erzielen. Darüber hinaus kann die Strategie durch Trendbeurteilung, Stop-Loss-Optimierung und integriertes Lernen verbessert werden, um die Strategie robuster zu machen.

Strategiequellcode
/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Oscilator candles - strategy", overlay=false, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

oscilatorType = input(title="Oscliator Type", defval="stoch", options=["rsi", "stoch", "cog", "macd", "tsi", "cci", "cmo", "mfi"])
length = input(3)
shortlength = input(3)
longlength = input(9)

showSupertrend = input(true)
AtrMAType = input(title="Moving Average Type", defval="rma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
AtrLength = input(30, step=10)
stopMultiplier  = input(4)
targetMultiplier  = input(3)
wicks = input(true)
considerWicksForDelayByStep = input(false)
colorByPreviousClose = input(true)

useHTFPivot = input(false)
resolution = input("12M", type=input.resolution)
HTFMultiplier = input(4, title="Higher Timeframe multiplier (Used when resolution is set to Same as Symbol)", minval=2, step=1)
PivotLength = input(2, step=1)

tradeDirection = input(title="Trade Direction", defval=strategy.direction.long, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Backtest Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "Backtest End Time", type = input.time)
inDateRange = true

f_getOscilatorValues(oscilatorType, length, shortlength, longlength)=>
    oOpen = rsi(open, length)
    oClose = rsi(close, length)
    oHigh = rsi(high, length)
    oLow = rsi(low, length)
    if(oscilatorType == "tsi")
        oOpen := tsi(open, shortlength, longlength)
        oClose := tsi(close, shortlength, longlength)
        oHigh := tsi(high, shortlength, longlength)
        oLow := tsi(low, shortlength, longlength)
    if(oscilatorType == "stoch")
        oOpen := stoch(open, longlength, shortlength, length)
        oClose := stoch(close, longlength, shortlength, length)
        oHigh := stoch(high, longlength, shortlength, length)
        oLow := stoch(low, longlength, shortlength, length)
    if(oscilatorType == "cci")
        oOpen := cci(open, length)
        oClose := cci(close, length)
        oHigh := cci(high, length)
        oLow := cci(low, length)
    if(oscilatorType == "cog")
        oOpen := cog(open, length)
        oClose := cog(close, length)
        oHigh := cog(high, length)
        oLow := cog(low, length)
    if(oscilatorType == "cmo")
        oOpen := cmo(open, length)
        oClose := cmo(close, length)
        oHigh := cmo(high, length)
        oLow := cmo(low, length)
    if(oscilatorType == "mfi")
        oOpen := mfi(open, length)
        oClose := mfi(close, length)
        oHigh := mfi(high, length)
        oLow := mfi(low, length)
    if(oscilatorType == "macd")
        [macdLineOpen, signalLineOpen, histLineOpen] = macd(open, shortlength, longlength, length)
        [macdLineClose, signalLineClose, histLineClose] = macd(close, shortlength, longlength, length)
        [macdLineHigh, signalLineHigh, histLineHigh] = macd(high, shortlength, longlength, length)
        [macdLineLow, signalLineLow, histLineLow] = macd(low, shortlength, longlength, length)
        oOpen := macdLineOpen
        oClose := macdLineClose
        oHigh := macdLineHigh
        oLow := macdLineLow
    [oOpen, oClose, oHigh, oLow]

f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

f_getSupertrend(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, stopMultiplier, wicks)=>
    truerange = max(oHigh, oClose[1]) - min(oLow, oClose[1])
    
    averagetruerange = f_getMovingAverage(truerange, AtrMAType, AtrLength)
    atr = averagetruerange * stopMultiplier

    longStop = oClose - atr
    longStopPrev = nz(longStop[1], longStop)
    longStop := (wicks ? oLow[1] : oClose[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop
    
    shortStop = oClose + atr
    shortStopPrev = nz(shortStop[1], shortStop)
    shortStop := (wicks ? oHigh[1] : oClose[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
    
    dir = 1
    dir := nz(dir[1], dir)
    dir := dir == -1 and (wicks ? oHigh : oClose) > shortStopPrev ? 1 : dir == 1 and (wicks ? oLow : oClose) < longStopPrev ? -1 : dir
    
    trailingStop = dir == 1? longStop : shortStop
    
    [dir, trailingStop]


f_getBuySellStops(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, considerWicks, considerWicksForDelayByStep, stopMultiplier, targetMultiplier)=>
    barState = 0
    source = oClose
    
    truerange = max(oHigh, oClose[1]) - min(oLow, oClose[1])
    
    atr = f_getMovingAverage(truerange, AtrMAType, AtrLength)

    buyStop = source - atr * stopMultiplier
    sellStop = source + atr * stopMultiplier
    buyStopDerived = buyStop
    sellStopDerived = sellStop
    highTarget = considerWicks ? oHigh : source
    lowTarget = considerWicks ? oLow : source
    
    highTargetDelayByStep = considerWicksForDelayByStep ? oHigh : source
    lowTargetDelayByStep = considerWicksForDelayByStep ? oLow : source
    
    barState := highTarget > sellStopDerived[1] ? 1 : lowTarget < buyStopDerived[1] ? -1 : nz(barState[1],0)
    
    buyMultiplier = (barState == 1)? stopMultiplier : targetMultiplier
    sellMultiplier = (barState == -1)? stopMultiplier : targetMultiplier
    buyStop := source - atr * buyMultiplier
    sellStop := source + atr * sellMultiplier
    buyStop := barState == 1? max(buyStop, buyStop[1]) : barState == -1? min(buyStop, buyStop[1]) : buyStop
    sellStop := barState == 1? max(sellStop, sellStop[1]) : barState == -1? min(sellStop, sellStop[1]) : sellStop
    
    buyStopDerived := buyStop
    sellStopDerived := sellStop
    
    buyStopDerived := highTargetDelayByStep < sellStopDerived[1] and lowTargetDelayByStep > buyStopDerived[1] ? buyStopDerived[1] : buyStopDerived
    sellStopDerived := highTargetDelayByStep < sellStopDerived[1] and lowTargetDelayByStep > buyStopDerived[1] ? sellStopDerived[1] : sellStopDerived

    [buyStopDerived, sellStopDerived, barState]


f_secureSecurity(_symbol, _res, _src) => security(_symbol, _res, _src[1], lookahead = barmerge.lookahead_on, gaps=barmerge.gaps_off)

f_multiple_resolution(HTFMultiplier) => 
    target_Res_In_Min = timeframe.multiplier * HTFMultiplier * (
      timeframe.isseconds   ? 1. / 60. :
      timeframe.isminutes   ? 1. :
      timeframe.isdaily     ? 1440. :
      timeframe.isweekly    ? 7. * 24. * 60. :
      timeframe.ismonthly   ? 30.417 * 24. * 60. : na)

    target_Res_In_Min     <= 0.0417       ? "1S"  :
      target_Res_In_Min   <= 0.167        ? "5S"  :
      target_Res_In_Min   <= 0.376        ? "15S" :
      target_Res_In_Min   <= 0.751        ? "30S" :
      target_Res_In_Min   <= 1440         ? tostring(round(target_Res_In_Min)) :
      tostring(round(min(target_Res_In_Min / 1440, 365))) + "D"
    
f_getPivotHighLow(oOpen, oClose, oHigh, oLow, HTFMultiplier, resolution, PivotLength)=>
    derivedResolution = resolution == ""? f_multiple_resolution(HTFMultiplier) : resolution
    HTFHigh = f_secureSecurity(syminfo.tickerid, derivedResolution, oHigh)
    HTFLow = f_secureSecurity(syminfo.tickerid, derivedResolution, oLow)
    CLOSEprev = f_secureSecurity(syminfo.tickerid, derivedResolution, oClose)
    pivothi = pivothigh(HTFHigh, PivotLength, PivotLength)
    pivotlo = pivotlow(HTFLow, PivotLength, PivotLength)
    pivothi := na(pivothi)? nz(pivothi[1]) : pivothi
    pivotlo := na(pivotlo)? nz(pivotlo[1]) : pivotlo
    [pivothi, pivotlo]
    
[oOpen, oClose, oHigh, oLow] = f_getOscilatorValues(oscilatorType, length, shortlength, longlength)
[dir, trailingStop] = f_getSupertrend(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, stopMultiplier, wicks)

candleColor = colorByPreviousClose ?
                 (oClose[1] < oClose ? color.green : oClose[1] > oClose ? color.red : color.silver) : 
                 (oOpen < oClose ? color.green : oOpen > oClose ? color.red : color.silver)
plotcandle(oOpen, oHigh, oLow, oClose, 'Oscilator Candles', color = candleColor)

[buyStopDerived, sellStopDerived, barState] = f_getBuySellStops(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, wicks, considerWicksForDelayByStep, stopMultiplier, targetMultiplier)

trailingStopDerived = barState == 1? buyStopDerived : sellStopDerived

plot(showSupertrend?trailingStopDerived:na, title="TrailingStop", style=plot.style_linebr, linewidth=1, color= barState == 1 ? color.green : color.red)

[pivotHigh, pivotLow] = f_getPivotHighLow(open, close, high, low, HTFMultiplier, resolution, PivotLength)

buyCondition = (barState == 1) and (close > pivotHigh or not useHTFPivot)
exitBuyConditin = (barState == -1)
sellCondition = (barState == -1) and (close < pivotLow or not useHTFPivot)
exitSellCondition = (barState == 1)

// strategy.risk.allow_entry_in(tradeDirection)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca")
strategy.entry("Sell", strategy.short, when=sellCondition and inDateRange, oca_name="oca")
strategy.close("Buy", when = exitBuyConditin)
strategy.close( "Sell", when = exitSellCondition)