Dynamische Unterstützung und Widerstandsstrategie der CCI

Schriftsteller:ChaoZhang, Datum: 2024-01-22 16:37:46
Tags:

img

Übersicht

Diese Strategie verwendet die Drehpunkte des CCI-Indikators zur Berechnung dynamischer Unterstützungs- und Widerstandsniveaus und kombiniert Trendbeurteilung zur Suche nach Kauf- und Verkaufssignalen.

Strategieprinzip

Der CCI-Indikator kann zeigen, ob der Markt zu schwach oder zu stark ist. Die beiden Extreme von 80 und -80 können verwendet werden, um festzustellen, ob der Markt in einen Überkauf- oder Überverkaufszustand eingetreten ist. Diese Strategie nutzt diese Eigenschaft des CCI. Durch die Berechnung der Drehpunkte der linken und rechten 50 Balken werden die oberen und unteren Drehpunkte erhalten. Dann werden Unterstützung und Widerstandslinien dynamisch konstruiert, indem ein Puffer auf der Grundlage der Drehpunkte hinzugefügt oder subtrahiert wird.

Ein Kaufsignal wird erzeugt, wenn der Schluß höher als der offene und niedriger als der obere Unterstützungsstand ist. Ein Verkaufssignal wird erzeugt, wenn der Schluß niedriger als der offene und höher als der niedrigere Widerstandsstand ist. Um Handelssignale gegen die Haupttrendrichtung auszufiltern, kombiniert die Strategie auch EMA und Neigungsindikatoren, um die aktuelle Haupttrendrichtung zu bestimmen.

Der Stop-Loss und der Take-Profit werden dynamisch anhand des ATR-Indikators berechnet, was die Risikokontrolle dieser Strategie vernünftiger macht.

Analyse der Vorteile

  1. Die Kommission ist der Auffassung, dass die in den Erwägungsgründen 7 und 8 genannten Maßnahmen im Sinne des Artikels 107 Absatz 1 AEUV nicht gerechtfertigt sind, da sie nicht im Sinne des Artikels 107 Absatz 1 AEUV gelten.
  2. Die Kombination mit dem Trendbeurteilungsvermögen verhindert einen gegen den Trend gerichteten Handel und reduziert Verluste.
  3. Dynamische Stop-Loss- und Take-Profit-Einstellungen machen die Risikokontrolle sinnvoller.
  4. Anpassungsfähige Parameter wie CCI-Länge, Puffergröße usw. passen sich mehr Marktumgebungen an.

Risikoanalyse

  1. Der CCI-Indikator neigt dazu, falsche Signale zu erzeugen und muss durch das Trendbeurteilungsfilter gefiltert werden.
  2. Umkehrungen sind nicht immer erfolgreich und mit gewisser Wahrscheinlichkeit mit Verlustrisiko verbunden.
  3. Eine unsachgemäße Einstellung der Parameter kann zu einem Überhandel oder zu fehlenden Gelegenheiten führen.

Methoden wie Parameteroptimierung, Anpassung des Stop-Loss-Bereichs usw. können dazu beitragen, Risiken zu reduzieren.

Optimierungsrichtlinien

  1. Optimierung der Puffergröße für Märkte mit unterschiedlicher Volatilität.
  2. Optimierung der ATR-Periodenparameter für eine genauere dynamische Stop-Loss- und Take-Profit-Regelung.
  3. Versuche verschiedene CCI-Parameter-Einstellungen.
  4. Testen Sie die Auswirkungen anderer Typen von Trendbeurteilungsindikatoren.

Schlussfolgerung

Diese Strategie integriert die Lang/Kurz-Screening-Fähigkeit von CCI und die Filterbestätigung aus dem Trendbeurteil, besitzt einen bestimmten praktischen Wert. Der dynamische Stop-Loss und Take-Profit macht das Risiko auch bei der Anwendung der Strategie im tatsächlichen Handel kontrollierbar. Durch Parameteroptimierung und -verbesserungen können bessere Ergebnisse erwartet werden.


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

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © AliSignals


//@version=5
strategy("CCI based support and resistance strategy", overlay=true  )


cci_length = input.int(50, "cci length")
right_pivot = input.int(50, "right pivot")
left_pivot = input.int(50, "left pivot")
buffer = input.float(10.0, "buffer")
trend_matter = input.bool(true, "trend matter?")
showmid = input.bool ( false , "show mid?")
trend_type = input.string("cross","trend type" ,options = ["cross","slope"])
slowma_l = input.int(100, "slow ma length")
fastma_l = input.int(50, "fast ma length")
slope_l = input.int(5,  "slope's length for trend detection")
ksl = input.float(1.1)
ktp = input.float(2.2)
restf = input.timeframe(title="Time Frame of Last Period for Calculating max" , defval="D")



// Calculating Upper and Lower CCI
cci = ta.cci(hlc3,cci_length)

uppercci = 0.0
lowercci = 0.0

uppercci := fixnan(ta.pivothigh(cci, left_pivot, right_pivot)) - buffer
lowercci := fixnan(ta.pivotlow (cci, left_pivot, right_pivot)) + buffer
midccci  = math.avg(uppercci,lowercci)


// Support and Resistance based on CCI
res = uppercci*(0.015*ta.dev(hlc3,cci_length))+ ta.sma(hlc3,cci_length)
sup = lowercci*(0.015*ta.dev(hlc3,cci_length))+ ta.sma(hlc3,cci_length)
mid =  midccci*(0.015*ta.dev(hlc3,cci_length))+ ta.sma(hlc3,cci_length)



// Calculating trend
t_cross  = 0
t_cross := ta.ema(close,fastma_l) > ta.ema(close,slowma_l) ? 1 : ta.ema(close,fastma_l) < ta.ema(close,slowma_l) ? -1 : t_cross[1] 

t_slope  = 0
t_slope := ta.ema(close,slowma_l) > ta.ema(close,slowma_l)[slope_l] ? 1 : ta.ema(close,slowma_l) < ta.ema(close,slowma_l)[slope_l]  ? -1 : t_slope[1] 

t  = 0
t := trend_type == "cross" ? t_cross : trend_type == "slope" ? t_slope : na

colort =  trend_matter == false ? color.rgb(201, 251, 0) : t == 1 ? color.rgb(14, 243, 132) :  t == -1 ? color.rgb(255, 34, 34) : na
bull_t = trend_matter == false or t ==  1
bear_t = trend_matter == false or t == -1

plot(res, color = colort)
plot(sup, color = colort)
plot(showmid == true ? mid : na)


// Long and Short enter condition
buy  = bull_t == 1 and ta.lowest (2) < sup and close > open and close > sup
sell = bear_t == 1 and ta.highest(2) > res and close < open and close < res

plotshape( buy , color=color.rgb(6, 255, 23) , location = location.belowbar, style = shape.triangleup  , size = size.normal)
plotshape( sell, color=color.rgb(234, 4, 4) ,  location = location.abovebar, style = shape.triangledown, size = size.normal)





atr = ta.atr(100)



CLOSE=request.security(syminfo.tickerid, restf, close)
max = 0.0
max := CLOSE == CLOSE[1] ? math.max(max[1], atr) : atr
act_atr = 0.0
act_atr := CLOSE == CLOSE[1] ? act_atr[1] : max[1]

atr1 =  math.max(act_atr, atr) 

dis_sl = atr1 * ksl
dis_tp = atr1 * ktp


var float longsl  = open[1] - dis_sl
var float shortsl = open[1] + dis_sl
var float longtp =   open[1] + dis_tp
var float shorttp =  open[1] - dis_tp


longCondition = buy
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = sell
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)


longsl  := strategy.position_size > 0  ? longsl[1]  : close - dis_sl
shortsl := strategy.position_size < 0 ? shortsl[1] : close + dis_sl
longtp  := strategy.position_size > 0  ? longtp[1]  : close + dis_tp
shorttp := strategy.position_size < 0 ? shorttp[1] : close - dis_tp




if strategy.position_size > 0 
    strategy.exit(id="My Long close Id", from_entry ="My Long Entry Id" , stop=longsl, limit=longtp)
if strategy.position_size < 0 
    strategy.exit(id="My Short close Id", from_entry ="My Short Entry Id" , stop=shortsl, limit=shorttp)



Mehr