Doppelte quantitative Strategie der CCI

Schriftsteller:ChaoZhang, Datum: 2023-11-28 15:47:04
Tags:

img

Übersicht

Diese Strategie kombiniert den klassischen technischen Indikator CCI und selbstentwickelte VCI und MCI-Doppelindizes, um Handelssignale zu bilden, was eine typische quantitative Handelsstrategie ist. Durch die Identifizierung des Trends und der Dynamik von Volumen- und Preisänderungen bestimmt sie die Hauptrichtung des aktuellen Marktes und bildet Handelssignale.

Strategieprinzip

  1. Berechnung des gleitenden Durchschnitts ohlc4 und Kombination mit dem CICI-Indikator zur Beurteilung des Preisniveaus;
  2. Berechnung eines Indikators zur Messung des Kapitalflusses;
  3. Berechnung des VCI-Index, der die Verteilung des Kapitalflusses durch die Varianz des OBV-Indikators misst;
  4. Berechnung des MCI-Index, der die Verteilung der Preise durch die Preisschwankung misst;
  5. Vergleichen von VCI- und MCI-Indizes, um die Marktstimmung zu beurteilen;
  • VCI > MCI, starkes Kaufinteresse;
  • VCI < MCI, starkes Verkaufsinteresse;
  1. Lange und kurze Signale bilden, basierend auf dem Vergleich von VCI und MCI;

Analyse der Vorteile

  1. Die Strategie berücksichtigt mehrere Dimensionen wie Preis, Handelsvolumen und Kapitalfluss, um die Marktstimmung mit relativ genauen Signalen zu beurteilen.
  2. VCI und MCI werden durch dynamische Standardabweichungen berechnet, die sich an Echtzeitmarktveränderungen anpassen können;
  3. Die Strategieparameter wurden durch umfangreiche Backtests optimiert und weisen eine hohe Stabilität auf.

Risikoanalyse

  1. Die Berechnung der Preis- und Handelsvolumenindikatoren ist verzögert und kann plötzliche Ereignisse nicht im Voraus erfassen;
  2. Eine einzige Strategie kann nicht vollständig komplexe und volatile Marktbedingungen abdecken;
  3. Sie muss mit anderen Hilfsindikatoren kombiniert werden und kann nicht allein über den Markt urteilen.

Optimierungsrichtlinien

  1. Einbeziehung prädiktiver Modelle wie Deep Learning zur Verbesserung der Signalgenauigkeit;
  2. Hinzufügen von Risikokontrollmodulen wie Stop-Loss zur Steigerung der Strategie-Stabilität;
  3. Versuche verschiedene Parameterkombinationen, um die Anwendbarkeit auf bestimmten Märkten zu testen;

Schlussfolgerung

Diese Strategie bildet Handelssignale, indem sie doppelte CCI-Indizes vergleicht, wobei Faktoren wie Preis und Handelsvolumen berücksichtigt werden, um die Marktstimmung zu beurteilen. Es ist eine typische und praktische quantitative Handelsstrategie.


/*backtest
start: 2023-10-28 00:00:00
end: 2023-11-27 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("MCI and VCI - Modified CCI Formulas")
test = cci(ohlc4, 13)
test1 = cci(ohlc4, 20)

obv(src) => cum(change(src) > 0 ? volume : change(src) < 0 ? -volume : 0*volume)
mDisc = input(0, title="Mode Discrepency")
mDiv = input(0.015, title="Interval")
mean(_src, _length)=>
    _return = sum(_src, _length) / _length

median(_src, _length)=>
    _return = _src
    for _i = 0 to _length
        _return := _return == 0 ? _src : (_return + _src[_i]) / 2
    _return


len = input(20, title="Standard (Average) Length")
mmm = input(20, title="Lookback length")
srcV = obv(input(ohlc4))
srcP = input(close)
x = sma(srcV, len)
MDV2 = abs(stdev(median(x, len), mmm))
MDV3 = abs(stdev(mean(x, len), mmm))
AMDV = (MDV2+MDV3)/2
pt1v = (srcV-ema(srcV, len))/ AMDV
pt2v = 1/mDiv
VCI=pt1v*pt2v
y = ema(srcP, len)
MDP2 =  abs(stdev(median(y, len), mmm))
MDP3 = abs(stdev(mean(y, len), mmm))
AMDA = (MDP2 + MDP3)/2
pt1p = 1/mDiv
pt2p = (srcP-ema(srcP, len))/ AMDA
MCI = pt1p * pt2p
plot(VCI, color=yellow, title="VCI", style="Histogram")
plot(MCI, color=white, title="MCI")

plot(500, style=line)

plot(0, style=line, linewidth=2)

plot(-500, style=line)
long = crossover(MCI, 0) and VCI > MCI[2] 
short = crossunder(MCI, 0) and VCI < MCI[2] 
//Time Control
//Set date and time
FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 13, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"


direction = input(0, title = "Strategy Direction", minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))
if (long)
    strategy.entry("Long", strategy.long, when=window(), limit=ohlc4, oca_name="BollingerBands",  comment="BBandLE")
else
    strategy.cancel(id="Long")

if (short)
    strategy.entry("Short", strategy.short, when=window(), limit=ohlc4, oca_name="BollingerBands", comment="BBandSE")
else
    strategy.cancel(id="Short")

Mehr