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.
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.
Diese Strategie hat folgende Vorteile:
Die Verwendung von Oszillatoren als Indikator zur Identifizierung der Richtung von Trends ermöglicht die zeitnahe Erfassung von kurzfristigen Wendechancen auf dem Markt.
Verzögerung der Überschreitung der Stop-Loss-Strategie, die den Ausgang vor dem Ausbau der Verluste verhindert und die Einzelschäden begrenzt.
Die Größe der Position kann dynamisch angepasst werden, je nach Stop-Loss- und Stop-Option-Risiko, die von ATR berechnet werden.
Filterung in Verbindung mit einer hohen periodischen Durchschnittslinie zur Vermeidung von Verschlüssen.
Es ist eine Strategie, die einen Teil der Gewinne aufrechterhält und einen Teil der Gewinne sperrt.
Die Strategie ist einfach und verständlich und für Anfänger geeignet.
Die Strategie birgt auch einige Risiken:
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.
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.
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.
Überprüfungsrisiken. Überprüfungen sollten in verschiedenen Märkten durchgeführt werden, um Überprüfungen zu vermeiden.
Eine hohe periodische Durchschnittslinie kann als Filterbedingung auch fehlschlagen. Trendklassifizierung und andere Methoden sollten zur Beurteilung der grossen Periodenbewegung verwendet werden.
Diese Strategie kann in folgenden Bereichen optimiert werden:
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.
Versuchen Sie, einen teilweisen Stopp in einen beweglichen Stopp umzuwandeln, indem Sie den Stopp nach dem ATR oder dem beweglichen Durchschnitt einstellen.
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.
Die Erhöhung der Energieeffizienz und dergleichen dienen als Eintrittsfilterbedingungen, um unnötige Umkehrgeschäfte zu vermeiden.
Integration und Gewichtsoptimierung der Kennzahlen zur Auswahl der für die aktuelle Sorte am besten geeigneten Kennzahlenkombination.
Hinzufügen von Lernmodulen für die Windsteuerung und dynamische Optimierung von Stop-Loss-Positionen, Stopp-Positionen, Positionen usw.
Um die Differenz zwischen Futures und Cash zu nutzen, fügen Sie Handelssignale hinzu, die Dreiecks-Arbitrage oder Futures-Arbitrage enthalten.
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.
/*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)