Strategie der Kombination von Doppel gleitendem Durchschnitt und Williams-Indikator

Schriftsteller:ChaoZhang, Datum: 2024-02-01 15:04:51
Tags:

img

Übersicht

Diese Strategie kombiniert zwei verschiedene Strategien. Die erste Strategie erzeugt Signale basierend auf dem doppelten gleitenden Durchschnitts-Crossover der Aktienkurse. Die zweite Strategie basiert auf dem Awesome Oscillator aus den Williams-Indikatoren. Das Endsignal nimmt die Schnittstelle der beiden Strategiesignale, um das endgültige Handelssignal zu bilden.

Strategie Logik

Die erste Strategie erzeugt ein Kaufsignal, wenn der Closing von gestern höher ist als der Closing des Vortages und der schnelle 9-Tage-Stochastische Oszillator niedriger als die langsame 3-Tage-Stochastische Oszillator-D-Linie. Sie erzeugt ein Verkaufssignal, wenn der Closing von gestern niedriger ist als der Closing des Vortages und der schnelle Stochastische Oszillator höher ist als die langsame Stochastische Oszillator-D-Linie.

Die zweite Strategie berechnet die Differenz zwischen den 5-Tage- und 34-Tage-Preisschwankungen und berechnet gleitende Durchschnitte dieser Differenz. Wenn der aktuelle Wert über dem vorherigen Zeitraum liegt, ist es ein Kaufsignal. Wenn der aktuelle Wert unter dem vorherigen Zeitraum liegt, ist es ein Verkaufssignal.

Die beiden Strategie-Signale werden kombiniert, indem sie ihre Schnittstelle nehmen. Eine Long-Position wird eingegangen, wenn beide Strategien ein Kaufsignal geben. Eine Short-Position wird eingegangen, wenn beide Strategien ein Verkaufssignal geben.

Analyse der Vorteile

Diese Strategie kombiniert die Vorteile der doppelten gleitenden Durchschnitts-Crossover-Strategie und der Williams-Indikator-Strategie. Die doppelte gleitende Durchschnitts-Crossover-Strategie kann mittelfristige bis langfristige Trends erfassen. Die Williams-Indikator-Strategie kann kurzfristige Handelsmöglichkeiten erfassen. Die Kombination der beiden Strategien ermöglicht sowohl die Gewinnnahme als auch die Verhinderung von falschen Ausbrüchen.

Darüber hinaus ermöglicht die Verwendung mehrerer Eingabeparameter eine Optimierung für verschiedene Bestände und Marktbedingungen, wodurch die Strategie an ein breiteres Spektrum von Marktumgebungen angepasst werden kann.

Risikoanalyse

Das größte Risiko besteht darin, dass die Signale der beiden Strategien möglicherweise nicht konsistent sind. Wenn eine Strategie ein Kaufsignal erzeugt, während die andere ein Verkaufssignal erzeugt, kann die kombinierte Strategie kein aussagekräftiges Signal erzeugen, was möglicherweise Handelsmöglichkeiten verpasst.

Dabei sind die mehrfachen Parameter für die Optimierung schwierig, und unpassende Parameterkombinationen können zu schlechter Strategieleistung führen.

Um Risiken zu reduzieren, kann ausschließlich eines der beiden Strategiesignale verwendet werden, und für verschiedene Marktbedingungen können geeignete Parameterbereiche erforscht werden.

Möglichkeiten zur Verbesserung

Die Strategie kann in mehreren Aspekten verbessert werden:

  1. Bewerten Sie die Signalkonsistenz zwischen den beiden Strategien unter verschiedenen Parameterkombinationen, um die optimalen Parameter für die Signalmatching zu finden.

  2. Testen Sie die Leistung verschiedener Produkte und Zeitrahmen, um den besten Anwendungsbereich zu finden.

  3. Es sollte in Erwägung gezogen werden, den doppelten gleitenden Durchschnitts-Crossover durch andere technische Indikatoren wie KDJ zu ersetzen, um die Strategiekombination zu diversifizieren.

  4. Einbeziehung von Stop-Loss-Mechanismen zur Risikokontrolle, z. B. Festlegung von maximalen Drawdown-Stops.

Schlussfolgerung

Diese Strategie kombiniert die doppelte gleitende Durchschnitts-Crossover-Strategie und die Williams-Indikator-Strategie, um sowohl Trendverfolgung als auch kurzfristige Signale zu erfassen. Durch Parameteroptimierung kann sie sich an eine Vielzahl von Marktbedingungen anpassen. Allerdings bleiben inkonsistente Signalmatching und komplexe Parameteroptimierung ihre Herausforderungen. Insgesamt bietet sie einen effektiven Ansatz für den quantitativen Handel und ist eine weitere Forschung und Optimierung wert, um Risiken zu reduzieren und die Robustheit zu verbessern.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 20/06/2019
// This is combo strategies for get a cumulative signal. 
//
// First strategy
// This System was created from the Book "How I Tripled My Money In The 
// Futures Market" by Ulf Jensen, Page 183. This is reverse type of strategies.
// The strategy buys at market, if close price is higher than the previous close 
// during 2 days and the meaning of 9-days Stochastic Slow Oscillator is lower than 50. 
// The strategy sells at market, if close price is lower than the previous close price 
// during 2 days and the meaning of 9-days Stochastic Fast Oscillator is higher than 50.
//
// Second strategy
//    This indicator plots the oscillator as a histogram where blue denotes 
//    periods suited for buying and red . for selling. If the current value 
//    of AO (Awesome Oscillator) is above previous, the period is considered 
//    suited for buying and the period is marked blue. If the AO value is not 
//    above previous, the period is considered suited for selling and the 
//    indicator marks it as red.
//  You can make changes in the property for set calculating strategy MA, EMA, WMA
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
Reversal123(Length, KSmoothing, DLength, Level) =>
    vFast = sma(stoch(close, high, low, Length), KSmoothing) 
    vSlow = sma(vFast, DLength)
    pos = 0.0
    pos := iff(close[2] < close[1] and close > close[1] and vFast < vSlow and vFast > Level, 1,
	         iff(close[2] > close[1] and close < close[1] and vFast > vSlow and vFast < Level, -1, nz(pos[1], 0))) 
	pos

BillWilliamsAC(nLengthSlow, nLengthFast,nLengthMA, nLengthEMA, nLengthWMA, bShowWMA, bShowMA, bShowEMA) =>
    pos = 0
    xSMA1_hl2 = sma(hl2, nLengthFast)
    xSMA2_hl2 = sma(hl2, nLengthSlow)
    xSMA1_SMA2 = xSMA1_hl2 - xSMA2_hl2
    xSMA_hl2 = sma(xSMA1_SMA2, nLengthFast)
    nRes =  xSMA1_SMA2 - xSMA_hl2
    xResWMA = wma(nRes, nLengthWMA)
    xResMA = sma(nRes, nLengthMA)
    xResEMA = ema(nRes, nLengthEMA)
    xSignalSeries = iff(bShowWMA, xResWMA,
                     iff(bShowMA, xResMA, 
                      iff(bShowEMA, xResEMA, na)))
    cClr = nRes > nRes[1] ? blue : red
    pos := iff(xSignalSeries[2] < 0 and xSignalSeries[1] > 0, 1,
	         iff(xSignalSeries[2] > 0 and xSignalSeries[1] < 0, -1, nz(pos[1], 0))) 
    pos

strategy(title="Combo Backtest 123 Reversal & Bill Williams. Awesome Oscillator (AC) with Signal Line", shorttitle="Combo", overlay = true)
Length = input(14, minval=1)
KSmoothing = input(1, minval=1)
DLength = input(3, minval=1)
Level = input(50, minval=1)
//-------------------------
nLengthSlow = input(34, minval=1, title="Length Slow")
nLengthFast = input(5, minval=1, title="Length Fast")
nLengthMA = input(15, minval=1, title="MA")
nLengthEMA = input(15, minval=1, title="EMA")
nLengthWMA = input(15, minval=1, title="WMA")
bShowWMA = input(type=bool, defval=true, title="Show and trading WMA")
bShowMA = input(type=bool, defval=false, title="Show and trading MA")
bShowEMA = input(type=bool, defval=false, title="Show and trading EMA")
reverse = input(false, title="Trade reverse")
posReversal123 = Reversal123(Length, KSmoothing, DLength, Level)
posBillWilliamsAC = BillWilliamsAC(nLengthSlow, nLengthFast,nLengthMA, nLengthEMA, nLengthWMA, bShowWMA, bShowMA, bShowEMA)
pos = iff(posReversal123 == 1 and posBillWilliamsAC == 1 , 1,
	   iff(posReversal123 == -1 and posBillWilliamsAC == -1, -1, 0)) 
possig = iff(reverse and pos == 1, -1,
          iff(reverse and pos == -1, 1, pos))	   
if (possig == 1) 
    strategy.entry("Long", strategy.long)
if (possig == -1)
    strategy.entry("Short", strategy.short)	 
if (possig == 0) 
    strategy.close_all()
barcolor(possig == -1 ? red: possig == 1 ? green : blue )

Mehr