Algorithmische Handelsstrategie mit Dual Line Tracking


Erstellungsdatum: 2023-10-30 15:27:34 zuletzt geändert: 2023-10-30 15:27:34
Kopie: 1 Klicks: 718
1
konzentrieren Sie sich auf
1617
Anhänger

Algorithmische Handelsstrategie mit Dual Line Tracking

Überblick

Die Strategie nutzt vor allem das Gleichgewicht-Kreuzprinzip, kombiniert mit dem RSI-Index-Umkehrsignal, und die benutzerdefinierte Binary-Tracking-Algorithmus, um den Gleichgewicht-Kreuz-Tracking-Handel zu realisieren. Die Strategie verfolgt die Gleichgewicht-Kreuzung zweier unterschiedlicher Perioden, wobei ein schneller Durchschnitt den kurzfristigen Trend verfolgt, der andere den langfristigen Trend verfolgt. Wenn der schnelle Durchschnitt den langsamen Durchschnitt aufwärts durchquert, ist ein kurzfristiger Trend aufwärts zu kaufen; wenn der schnelle Durchschnitt den langsamen Durchschnitt aufwärts durchquert, ist der kurzfristige Trend beendet und sollte platziert werden.

Strategieprinzip

  1. Berechnung der VWAP-Mittellinie für zwei verschiedene Parameter, die einen langfristigen und einen kurzfristigen Trend darstellen

    • Langfristige Tendenzen bei der Berechnung der langsam schwebenden Schattenlinie und der Benchmark
    • Kurzfristige Trends bei der Berechnung von Schnellschirmlinien und Benchmarks
  2. Die Mittelwerte der beiden Gruppen von Oberflächenlinien und Referenzlinien werden als langsame und schnelle Durchschnittslinien verwendet

  3. Berechnung der Brin-Band-Indikatoren für die Berechnung und den Durchbruch

    • Die mittlere Linie ist der Mittelwert zwischen der schnellen und der langsamen Durchschnittslinie
    • Brin-Band auf und ab für den Durchbruch
  4. Berechnung des TSV-Wertes für die Energie der Transaktionsmenge

    • TSV größer als 0 bedeutet, dass der Aufwärtstrend größer ist als der Rückgang.
    • TSV ist größer als seine EMA und macht sich stärker
  5. Der RSI ist ein Indikator für Überbuying und Überselling.

    • Wenn der RSI unter 30 liegt, ist das ein Überverkauf.
    • Wenn der RSI über 70 liegt, ist das ein Überkaufbereich, der verkauft werden sollte.
  6. Teilnahmebedingungen:

    • Durchschreiten der langsamen Durchschnittslinie auf der schnellen Durchschnittslinie
    • Ein Brin-Band auf der Strecke zum Schlusspreis
    • TSV größer als 0 und größer als seine EMA
    • RSI unter 30
  7. Bedingungen für die Teilnahme:

    • Durchschreiten der langsamen Durchschnittslinie unter der schnellen Durchschnittslinie
    • RSI über 70

Analyse der Stärken

  1. Mit einer doppelten Linearisierung kann ein langfristiger Trend gleichzeitig erfasst werden.

  2. RSI-Indikator vermeidet Überkauf und Verkauf von Überverkauf

  3. Der TSV-Index stellt sicher, dass genügend Transaktionen die Trends unterstützen.

  4. Die wichtigsten Durchbrüche im Brin-Band

  5. Eine Kombination aus mehreren Kennzahlen, die einen effektiven Filter für falsche Durchbrüche ermöglichen

Risikoanalyse

  1. Einheitliche Systeme sind anfällig für Fehlsignale und benötigen eine zusätzliche Filterung der Indikatoren

  2. Die RSI-Parameter müssen optimiert werden, sonst könnten Sie einen Kauf- oder Verkaufspunkt verpassen

  3. Die TSV-Werte sind ebenfalls sehr parametersensibel und müssen sorgfältig getestet werden.

  4. Ein Durchbruch der Brin-Strecke könnte ein gefälschter Durchbruch sein, der überprüft werden muss

  5. Mehrindikator-Kombination, Parameter-Optimierung ist schwierig, leicht zu optimieren

  6. Unzureichende Trainings- und Testdaten können zu Kurvenübereinstimmungen führen

Optimierungsrichtung

  1. Tests mit mehr Periodenparametern, um die beste Kombination zu finden

  2. Versuchen Sie andere Indikatoren wie MACD, KD Alternative oder RSI kombiniert

  3. Die Parameteroptimierung nutzt Walk Forward Analysis

  4. Erhöhung der Stop-Loss-Strategie zur Kontrolle von Einzelschäden

  5. Erwägen Sie die Einbeziehung von Machine-Learning-Modellen zur Unterstützung der Signalentscheidung

  6. Anpassung der Parameter an verschiedene Märkte, ohne sich zu sehr auf eine einzelne Parameterkombination zu verlassen

Zusammenfassen

Die Strategie erfasst die langfristigen kurzfristigen Trends über die Doppel-Gleichlinien-Systeme und filtert die Signale mit mehreren Indikatoren wie RSI, TSV und Brin-Band. Die Strategie hat den Vorteil, dass sie nach und nach die langfristigen Aufwärtswellen erfasst. Es besteht jedoch ein gewisses Risiko für Falschsignale. Die Parameter müssen weiter optimiert und die Stop-Loss-Kontrollen eingesetzt werden, um das Risiko zu verringern.

Strategiequellcode
/*backtest
start: 2022-10-23 00:00:00
end: 2023-10-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=4

// Credits

// "Vwap with period" code which used in this strategy to calculate the leadLine was written by "neolao" active on https://tr.tradingview.com/u/neolao/
// "TSV" code which used in this strategy was written by "liw0" active on https://www.tradingview.com/u/liw0. The code is corrected by "vitelot" December 2018.
// "Vidya" code which used in this strategy was written by "everget" active on https://tr.tradingview.com/u/everget/

strategy("HYE Combo Market [Strategy] (Vwap Mean Reversion + Trend Hunter)", overlay = true, initial_capital = 1000, default_qty_value = 100, default_qty_type = strategy.percent_of_equity, commission_value = 0.025)
  
//Strategy inputs

source = input(title = "Source", defval = close, group = "Mean Reversion Strategy Inputs")
smallcumulativePeriod = input(title = "Small VWAP", defval = 8, group = "Mean Reversion Strategy Inputs")
bigcumulativePeriod = input(title = "Big VWAP", defval = 10, group = "Mean Reversion Strategy Inputs")
meancumulativePeriod = input(title = "Mean VWAP", defval = 50, group = "Mean Reversion Strategy Inputs")
percentBelowToBuy = input(title = "Percent below to buy %", defval = 2, group = "Mean Reversion Strategy Inputs")
rsiPeriod = input(title = "Rsi Period", defval = 2, group = "Mean Reversion Strategy Inputs")
rsiEmaPeriod = input(title = "Rsi Ema Period", defval = 5, group = "Mean Reversion Strategy Inputs") 
rsiLevelforBuy = input(title = "Maximum Rsi Level for Buy", defval = 30, group = "Mean Reversion Strategy Inputs")
slowtenkansenPeriod = input(9, minval=1, title="Slow Tenkan Sen VWAP Line Length", group = "Trend Hunter Strategy Inputs")
slowkijunsenPeriod = input(13, minval=1, title="Slow Kijun Sen VWAP Line Length", group = "Trend Hunter Strategy Inputs")
fasttenkansenPeriod = input(3, minval=1, title="Fast Tenkan Sen VWAP Line Length", group = "Trend Hunter Strategy Inputs")
fastkijunsenPeriod = input(7, minval=1, title="Fast Kijun Sen VWAP Line Length", group = "Trend Hunter Strategy Inputs")
BBlength = input(20, minval=1, title= "Bollinger Band Length", group = "Trend Hunter Strategy Inputs")
BBmult = input(2.0, minval=0.001, maxval=50, title="Bollinger Band StdDev", group = "Trend Hunter Strategy Inputs")
tsvlength  = input(20, minval=1, title="TSV Length", group = "Trend Hunter Strategy Inputs")
tsvemaperiod = input(7, minval=1, title="TSV Ema Length", group = "Trend Hunter Strategy Inputs")
length = input(title="Vidya Length", type=input.integer, defval=20, group = "Trend Hunter Strategy Inputs") 
src = input(title="Vidya Source", type=input.source, defval= hl2 , group = "Trend Hunter Strategy Inputs")

// Vidya Calculation 

getCMO(src, length) =>
    mom = change(src)
    upSum = sum(max(mom, 0), length)
    downSum = sum(-min(mom, 0), length)
    out = (upSum - downSum) / (upSum + downSum)
    out

cmo = abs(getCMO(src, length))

alpha = 2 / (length + 1)

vidya = 0.0
vidya := src * alpha * cmo + nz(vidya[1]) * (1 - alpha * cmo)

// Make input options that configure backtest date range 

startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31, group = "Strategy Date Range")
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12, group = "Strategy Date Range")
startYear = input(title="Start Year", type=input.integer,
     defval=2000, minval=1800, maxval=2100, group = "Strategy Date Range")

endDate = input(title="End Date", type=input.integer, 
     defval=31, minval=1, maxval=31, group = "Strategy Date Range")
endMonth = input(title="End Month", type=input.integer,
     defval=12, minval=1, maxval=12, group = "Strategy Date Range") 
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100, group = "Strategy Date Range")
     
inDateRange = true
// Mean Reversion Strategy Calculation 

typicalPriceS = (high + low + close) / 3
typicalPriceVolumeS = typicalPriceS * volume
cumulativeTypicalPriceVolumeS = sum(typicalPriceVolumeS, smallcumulativePeriod)
cumulativeVolumeS = sum(volume, smallcumulativePeriod)
smallvwapValue = cumulativeTypicalPriceVolumeS / cumulativeVolumeS

typicalPriceB = (high + low + close) / 3
typicalPriceVolumeB = typicalPriceB * volume
cumulativeTypicalPriceVolumeB = sum(typicalPriceVolumeB, bigcumulativePeriod)
cumulativeVolumeB = sum(volume, bigcumulativePeriod)
bigvwapValue = cumulativeTypicalPriceVolumeB / cumulativeVolumeB 

typicalPriceM = (high + low + close) / 3
typicalPriceVolumeM = typicalPriceM * volume
cumulativeTypicalPriceVolumeM = sum(typicalPriceVolumeM, meancumulativePeriod)
cumulativeVolumeM = sum(volume, meancumulativePeriod)
meanvwapValue = cumulativeTypicalPriceVolumeM / cumulativeVolumeM

rsiValue = rsi(source, rsiPeriod)
rsiEMA   = ema(rsiValue, rsiEmaPeriod)
buyMA = ((100 - percentBelowToBuy) / 100) * bigvwapValue[0]

inTrade = strategy.position_size > 0
notInTrade = strategy.position_size <= 0

if(crossunder(smallvwapValue, buyMA) and rsiEMA < rsiLevelforBuy and close < meanvwapValue and inDateRange and notInTrade)
    strategy.entry("BUY-M", strategy.long)

if(close > meanvwapValue or not inDateRange)
    strategy.close("BUY-M")
    
// Trend Hunter Strategy Calculation

// Slow Tenkan Sen Calculation

typicalPriceTS = (high + low + close) / 3
typicalPriceVolumeTS = typicalPriceTS * volume
cumulativeTypicalPriceVolumeTS = sum(typicalPriceVolumeTS, slowtenkansenPeriod)
cumulativeVolumeTS = sum(volume, slowtenkansenPeriod)
slowtenkansenvwapValue = cumulativeTypicalPriceVolumeTS / cumulativeVolumeTS

// Slow Kijun Sen Calculation

typicalPriceKS = (high + low + close) / 3
typicalPriceVolumeKS = typicalPriceKS * volume
cumulativeTypicalPriceVolumeKS = sum(typicalPriceVolumeKS, slowkijunsenPeriod)
cumulativeVolumeKS = sum(volume, slowkijunsenPeriod)
slowkijunsenvwapValue = cumulativeTypicalPriceVolumeKS / cumulativeVolumeKS

// Fast Tenkan Sen Calculation

typicalPriceTF = (high + low + close) / 3
typicalPriceVolumeTF = typicalPriceTF * volume
cumulativeTypicalPriceVolumeTF = sum(typicalPriceVolumeTF, fasttenkansenPeriod)
cumulativeVolumeTF = sum(volume, fasttenkansenPeriod)
fasttenkansenvwapValue = cumulativeTypicalPriceVolumeTF / cumulativeVolumeTF

// Fast Kijun Sen Calculation

typicalPriceKF = (high + low + close) / 3
typicalPriceVolumeKF = typicalPriceKS * volume
cumulativeTypicalPriceVolumeKF = sum(typicalPriceVolumeKF, fastkijunsenPeriod)
cumulativeVolumeKF = sum(volume, fastkijunsenPeriod)
fastkijunsenvwapValue = cumulativeTypicalPriceVolumeKF / cumulativeVolumeKF

// Slow LeadLine Calculation
 
lowesttenkansen_s = lowest(slowtenkansenvwapValue, slowtenkansenPeriod)
highesttenkansen_s = highest(slowtenkansenvwapValue, slowtenkansenPeriod)

lowestkijunsen_s = lowest(slowkijunsenvwapValue, slowkijunsenPeriod)
highestkijunsen_s = highest(slowkijunsenvwapValue, slowkijunsenPeriod)

slowtenkansen = avg(lowesttenkansen_s, highesttenkansen_s)
slowkijunsen = avg(lowestkijunsen_s, highestkijunsen_s)
slowleadLine = avg(slowtenkansen, slowkijunsen)

// Fast LeadLine Calculation 
 
lowesttenkansen_f = lowest(fasttenkansenvwapValue, fasttenkansenPeriod)
highesttenkansen_f = highest(fasttenkansenvwapValue, fasttenkansenPeriod)

lowestkijunsen_f = lowest(fastkijunsenvwapValue, fastkijunsenPeriod)
highestkijunsen_f = highest(fastkijunsenvwapValue, fastkijunsenPeriod) 

fasttenkansen = avg(lowesttenkansen_f, highesttenkansen_f)
fastkijunsen = avg(lowestkijunsen_f, highestkijunsen_f)
fastleadLine = avg(fasttenkansen, fastkijunsen)

// BBleadLine Calculation
 
BBleadLine = avg(fastleadLine, slowleadLine)

// Bollinger Band Calculation
 
basis = sma(BBleadLine, BBlength)
dev = BBmult * stdev(BBleadLine, BBlength)
upper = basis + dev  
lower = basis - dev 

// TSV Calculation

tsv = sum(close>close[1]?volume*(close-close[1]):close<close[1]?volume*(close-close[1]):0,tsvlength)
tsvema = ema(tsv, tsvemaperiod)

// Rules for Entry & Exit  

if(fastleadLine > fastleadLine[1] and slowleadLine > slowleadLine[1] and tsv > 0 and tsv > tsvema and close > upper and close > vidya and inDateRange and notInTrade)
    strategy.entry("BUY-T", strategy.long)
 
if((fastleadLine < fastleadLine[1] and slowleadLine < slowleadLine[1]) or not inDateRange)
    strategy.close("BUY-T")

// Plots 

plot(meanvwapValue, title="MEAN VWAP", linewidth=2, color=color.yellow)

//plot(vidya, title="VIDYA", linewidth=2, color=color.green)

//colorsettingS = input(title="Solid Color Slow Leadline", defval=false, type=input.bool)
//plot(slowleadLine, title = "Slow LeadLine", color = colorsettingS ? color.aqua : slowleadLine > slowleadLine[1] ? color.green : color.red, linewidth=3)

//colorsettingF = input(title="Solid Color Fast Leadline", defval=false, type=input.bool)
//plot(fastleadLine, title = "Fast LeadLine", color = colorsettingF ? color.orange : fastleadLine > fastleadLine[1] ? color.green : color.red, linewidth=3)

//p1 = plot(upper, "Upper BB", color=#2962FF)
//p2 = plot(lower, "Lower BB", color=#2962FF)
//fill(p1, p2, title = "Background", color=color.blue)

//plot(smallvwapValue, color=#13C425, linewidth=2)
//plot(bigvwapValue, color=#CA1435, linewidth=2)