Quantitative Handelsstrategie auf der Grundlage mehrerer Indikatoren

Schriftsteller:ChaoZhang, Datum: 2023-10-25 18:06:44
Tags:

img

Übersicht

Diese Strategie kombiniert mehrere technische Indikatoren, um lange und kurze Handelsentscheidungen zu treffen.

Strategie Logik

Die Strategie verwendet hauptsächlich Bollinger Bands, um die Preisvolatilität zu beurteilen. Verengende Bands repräsentieren eine abnehmende Volatilität, die zu einem Ausbruch führen kann. Der RSI wird verwendet, um überkaufte und überverkaufte Bedingungen zu identifizieren. Der RSI über 70 ist überkauft, während unter 30 überverkauft ist. Wenn sich die Bands verengen und der RSI seinen Grenzen nähert, wird Reverse Trading in Betracht gezogen.

Darüber hinaus wird ADX verwendet, um die Trendstärke zu bewerten. Hoher ADX stellt einen starken Trend dar, der den Trendhandel begünstigt. Niedriger ADX stellt keinen klaren Trend dar, wenn man die mittlere Umkehrung berücksichtigt. Schließlich definieren gleitende Durchschnitte die langfristige Trendrichtung. Aufwärtstrend begünstigt lang, während Abwärtstrend kurz begünstigt.

Speziell, wenn Bands drücken, RSI nähert sich seinen Grenzen, und Preisbrüche unter dem unteren Band, ein Sprung wird erwartet, gehen lang. Wenn Bands drücken, RSI nähert sich seinen Grenzen, und Preisbrüche über dem oberen Band, ein Rückgang wird erwartet, gehen kurz. Auch mit hohem ADX, Longs im Aufwärtstrend hinzufügen. Mit niedrigem ADX, Shorts im Abwärtstrend hinzufügen. Kombination von Indikatoren verbessert die Robustheit des Systems.

Analyse der Vorteile

Die Multi-Indikator-Strategie hat folgende Vorteile:

  1. Die Kombination von Indikatoren verbessert die Genauigkeit und Robustheit. Ein einzelner Indikator ist anfällig für falsche Signale, während mehrere Indikatoren Signale überprüfen und schlechte Trades vermeiden.

  2. Der Trendhandel zielt auf große Bewegungen ab. Der Rangehandel zielt auf kleine Gewinne ab.

  3. Longs und Shorts verringern die Richtungsrisiken und vermeiden extreme Bewegungen.

  4. Stop-Loss und Take-Profit verriegeln Gewinne und begrenzen Verluste, wenn Geschäfte schief gehen.

  5. Parameteroptimierung verbessert die Strategie kontinuierlich, indem sie sich an sich ändernde Märkte anpasst.

Risikoanalyse

Die Strategie birgt auch einige Risiken:

  1. Mehr Indikatoren erhöhen die Komplexität. Falsche Einstellungen können die Leistung beeinträchtigen. Umfangreiche Tests und Optimierungen sind erforderlich.

  2. Eine übermäßige Abhängigkeit von technischen Faktoren, während die Grundlagen ignoriert werden, kann zu ungenauen Signalen führen.

  3. Die Märkte haben sich möglicherweise bereits bewegt, wenn Signale auftauchen, was ein Risiko darstellt.

  4. Der Handel in zwei Richtungen erhöht die Häufigkeit, erhöht die Kosten und den Druck.

  5. Es bestehen Risiken für die Anpassung an die Kurve. Die Robustheit sollte auf verschiedenen Märkten getestet werden.

Die Risiken können durch strenge Stop-Loss-Verfahren, eine umsichtige Positionsgröße, angemessene Hebelwirkung usw. verwaltet werden. Insgesamt hat die Strategie einen starken praktischen Wert.

Möglichkeiten zur Verbesserung

Einige Möglichkeiten zur Optimierung der Strategie:

  1. Verschiedene Parametermengen testen, um mit schrittweisen, zufälligen oder genetischen Algorithmen optimale Werte zu finden.

  2. Fügen Sie mehr Indikatoren wie KDJ, Williams hinzu, um ein robustes Indikatorensemble zu bauen.

  3. Optimierung von Positionsgrößenmodellen zur dynamischen Risikomanagement.

  4. Einbeziehung von Modellen des maschinellen Lernens zur Vorhersage von Preistrends und -bewegungen.

  5. Tests für verschiedene Produkte, Zeitrahmen und Märkte zur Verbesserung der Anpassungsfähigkeit.

  6. Verfeinern Sie die Ein- und Ausstiegszeit, um Trends frühzeitig zu erfassen und vor Umkehrungen zu verlassen.

  7. Verwenden Sie Profittaking, Trailing Stops, um Gewinne zu erzielen und Verluste zu begrenzen.

  8. Zusätzliche grundlegende Faktoren und Marktstrukturanalysen sollen die technischen Signale filtern.

Zusammenfassung

Diese Strategie automatisiert den Handel, indem sie mehrere Indikatoren interpretiert. Sie profitiert von Indikator-Cross-Validierung, Dual-Direction-Trading, Stop-Loss/Take-Profit usw. Überfitting und falsche Signale erfordern Vorsicht. Kontinuierliche Optimierung und Tests können es in ein robustes, praktisches System verwandeln, das die Zukunft der Quant-Trading-Strategien darstellt.


/*backtest
start: 2023-09-24 00:00:00
end: 2023-10-24 00:00:00
period: 2h
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/
// © The_Bigger_Bull
//@version=5
strategy("Best TradingView Strategy", overlay=true, margin_long=0, margin_short=0)
//Bollinger Bands
source1 = close
length1 = input.int(15, minval=1)
mult1 = input.float(2.0, minval=0.001, maxval=50)
basis1 = ta.sma(source1, length1)
dev1 = mult1 * ta.stdev(source1, length1)
upper1 = basis1 + dev1
lower1 = basis1 - dev1
//buyEntry = ta.crossover(source1, lower1)
//sellEntry = ta.crossunder(source1, upper1)

//RSI
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "Bollinger Bands" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

rsiLengthInput = input.int(14, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(14, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")

up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
rsiMA = ma(rsi, maLengthInput, maTypeInput)
isBB = maTypeInput == "Bollinger Bands"

//plot(rsi, "RSI", color=#7E57C2)
//plot(rsiMA, "RSI-based MA", color=color.yellow)
rsiUpperBand = hline(70, "RSI Upper Band", color=#787B86)
hline(50, "RSI Middle Band", color=color.new(#787B86, 50))
rsiLowerBand = hline(30, "RSI Lower Band", color=#787B86)
fill(rsiUpperBand, rsiLowerBand, color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")
bbUpperBand = plot(isBB ? rsiMA + ta.stdev(rsi, maLengthInput) * bbMultInput : na, title = "Upper Bollinger Band", color=color.green)
bbLowerBand = plot(isBB ? rsiMA - ta.stdev(rsi, maLengthInput) * bbMultInput : na, title = "Lower Bollinger Band", color=color.green)
fill(bbUpperBand, bbLowerBand, color= isBB ? color.new(color.green, 90) : na, title="Bollinger Bands Background Fill")

//ADX

adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
dirmov(len) =>
	up1 = ta.change(high)
	down1 = -ta.change(low)
	plusDM = na(up1) ? na : (up1 > down1 and up1 > 0 ? up1 : 0)
	minusDM = na(down1) ? na : (down1 > up1 and down1 > 0 ? down1 : 0)
	truerange = ta.rma(ta.tr, len)
	plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
	minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)




out = ta.sma(close, 14)

sma1=ta.sma(close,55)

ema200=ta.ema(close,200)



longCondition = (out>sma1) and ta.crossover(source1, lower1)

if (longCondition )
    strategy.entry("long", strategy.long)
    
shortCondition = (out<sma1) and ta.crossunder(source1, lower1)

if (shortCondition )
    strategy.entry("short", strategy.short)
    
    
stopl=strategy.position_avg_price-50
tptgt=strategy.position_avg_price+100
stopshort=strategy.position_avg_price+50
tptgtshort=strategy.position_avg_price-100

strategy.exit("longclose","long",trail_offset=5,trail_points=45,when=ta.crossover(sma1,out))
strategy.exit("shortclose","short",trail_offset=5,trail_points=45,when=ta.crossover(out,sma1))

    
//if strategy.position_avg_price<0
    
    
plot(sma1 , color=color.blue)
plot(out, color=color.green)
//plot(ema200,color=color.red)


    
    


Mehr