K-Linien-Regressionsstrategie mit gleitendem Durchschnitt


Erstellungsdatum: 2023-09-14 17:50:14 zuletzt geändert: 2023-09-14 17:50:14
Kopie: 1 Klicks: 805
1
konzentrieren Sie sich auf
1617
Anhänger

Strategieprinzip

Die Strategie integriert mehrere technische Indikatoren und Strategien, die hauptsächlich dazu dienen, die Ein- und Ausstiegspunkte für den Index zu bestimmen.

Hauptgeschäftslogik:

  1. Berechnung eines Moving Average K-Lines, einschließlich des Moving Averages für den Eröffnungspreis, den Schlusspreis, den Höchstpreis und den niedrigsten Preis

  2. Berechnung der Bewegung der K-Linien mit einem beweglichen Durchschnitt und der linearen Regression der Bewegung

  3. Berechnung der linearen Regression der Moving Average K-Linie selbst

  4. Berechnung von Supertrends zur Bestimmung der Gesamttrendrichtung

  5. Beurteilen Sie den Einstiegspunkt, wenn die Regression von negativ nach rechts oder stark zurückgeht

  6. Wenn die Dynamik von positiv nach negativ oder zurückschwächer wird, wird als Ausstiegspunkt beurteilt

Die Strategie verwendet mehrere technische Indikatoren, um die langfristigen und kurzfristigen Bewegungen und die Rhythmen des Marktes zu beurteilen, um den Zeitpunkt des Handels des Index zu bestimmen.

Strategische Vorteile

  • Der Moving Average K-Line spiegelt die mittelfristige Entwicklung der Märkte wider

  • Regressionsanalyse und Trendwende

  • Supertrends helfen bei der Bestimmung der Gesamtrichtung

  • Mehrindikator-Kombinationen verbessern die Genauigkeit der Beurteilung

Strategisches Risiko

  • Parameteroptimierung ist komplizierter

  • Mehrindikator-Kombinationen sind schwer auszugleichen

  • Wenige Signale, geringe Handelsfrequenz

Zusammenfassen

Die Strategie ist darauf ausgerichtet, die lang- und kurzfristigen Rhythmen des Marktes zu erforschen, um die besten Zeiten für den Indexhandel zu ermitteln. Die Parameteranpassung und Modelloptimierung sind jedoch noch nicht abgeschlossen.

Strategiequellcode
/*backtest
start: 2023-09-06 00:00:00
end: 2023-09-13 00:00:00
period: 15m
basePeriod: 5m
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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("MACandles-LinearRegression-Strategy", shorttitle="MALinReg - Strategy",
                     overlay=false, initial_capital = 100000, 
                     default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, 
                     commission_value = 0.01)
resolution = ""
MAType = input(title="Moving Average Type (MA Candles)", defval="hma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
LoopbackBars = input(60, title="Length (MA Candles)", step=10)

MMAType = input(title="Moving Average Type (Momentum)", defval="ema", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
MLength = input(20, title="MA Length (Momentum)", step=10)

lb = input(40  , title="Look Back Period Percentile High/Low", step=10, minval=10, maxval=100)
ph = input(.85, title="Highest Percentile - 0.90=90%, 0.95=95%, 0.99=99%")
pl = input(1.01, title="Lowest Percentile - 1.10=90%, 1.05=95%, 1.01=99%")
mult = input(3.0    , minval=1, maxval=5, title="Bollinger Band Standard Devaition Up")

aggressiveLong = input(true)
longTrades = input(true)
useVixFix = input(false)
i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "End Time", type = input.time)
inDateRange = true


f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

f_getMACandles(resolution, MAType, LoopbackBars)=>
    oOpen = f_getMovingAverage(open, MAType, LoopbackBars)
    oClose = f_getMovingAverage(close, MAType, LoopbackBars)
    oHigh = f_getMovingAverage(high, MAType, LoopbackBars)
    oLow = f_getMovingAverage(low, MAType, LoopbackBars)
    [oOpen, oClose, oHigh, oLow]

f_getVixFixLinReg(oClose, oLow, MLength)=>
    wvf = ((highest(oClose, MLength)-oLow)/(highest(oClose, MLength)))*100
    
    sDev = mult * stdev(wvf, MLength)
    midLine = sma(wvf, MLength)
    lowerBand = midLine - sDev
    upperBand = midLine + sDev
    
    rangeHigh = (highest(wvf, lb)) * ph
    rangeLow = (lowest(wvf, lb)) * pl
    
    
    col = wvf >= upperBand or wvf >= rangeHigh ? color.lime : color.gray
    
    val = linreg(wvf, MLength, 0)
    absVal = abs(val)
    linRegColor = val>val[1]? (val > 0 ? color.green : color.orange): (val > 0 ? color.lime : color.red)
    
    vixFixState = (col == color.lime) ? 1: 0
    vixFixState := strategy.position_size == 0? max(vixFixState, nz(vixFixState[1],0)) : vixFixState
    [val, absVal, wvf, col, linRegColor, vixFixState]
    
f_getMACandlesLinReg(oClose, MMAType, MLength, mult, lb, ph, pl)=>
    ma = f_getMovingAverage(oClose, MMAType, MLength)
    
    maDiff = oClose  -  ma
    val = linreg(maDiff, MLength,0)
    absVal = abs(val)
    linRegColor = iff( val > 0,
                 iff( val > nz(val[1]), color.green, color.lime),
                 iff( val < nz(val[1]), color.red, color.orange))
    
    
    sDev = mult * stdev(maDiff, MLength)
    midLine = sma(maDiff, MLength)
    lowerBand = midLine - sDev
    upperBand = midLine + sDev
    
    rangeHigh = (highest(maDiff, lb)) * ph
    rangeLow = (lowest(maDiff, lb)) * pl
    
    col = maDiff >= upperBand or maDiff >= rangeHigh ? color.lime : maDiff <= lowerBand or maDiff <= rangeLow ? color.orange : color.silver
    absMaDiff = abs(maDiff)
    [val, absVal, maDiff, absMaDiff, col, linRegColor]

f_getSupertrend(resolution, oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, AtrMult, wicks)=>
    truerange = max(oHigh, oClose[1]) - min(oLow, oClose[1])
    
    averagetruerange = f_getMovingAverage(truerange, AtrMAType, AtrLength)
    atr = averagetruerange * AtrMult

    longWicks = wicks
    shortWicks = wicks
    longStop = oClose - atr
    longStopPrev = nz(longStop[1], longStop)
    longStop := (longWicks ? oLow[1] : oClose[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop
    
    shortStop = oClose + atr
    shortStopPrev = nz(shortStop[1], shortStop)
    shortStop := (shortWicks ? oHigh[1] : oClose[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
    
    dir = 1
    dir := nz(dir[1], dir)
    dir := dir == -1 and (longWicks ? oHigh : oClose) > shortStopPrev ? 1 : dir == 1 and (shortWicks[1]? oLow : oClose) < longStopPrev ? -1 : dir
    
    [dir, longStop, shortStop]

f_getMACandlesAndSupertrend(MAType, LoopbackBars, AtrMult, wicks)=>
    oOpen = f_getMovingAverage(open, MAType, LoopbackBars)
    oClose = f_getMovingAverage(close, MAType, LoopbackBars)
    oHigh = f_getMovingAverage(high, MAType, LoopbackBars)
    oLow = f_getMovingAverage(low, MAType, LoopbackBars)
    [dir, longStop, shortStop] = f_getSupertrend(resolution, oOpen, oClose, oHigh, oLow, MAType, LoopbackBars, AtrMult, wicks)
    dir

[oOpen, oClose, oHigh, oLow] = f_getMACandles(resolution, MAType, LoopbackBars)
dir = f_getMACandlesAndSupertrend("sma", 200, 1, false)
colorByPreviousClose = false
candleColor = colorByPreviousClose ?
                 (oClose[1] < oClose ? color.green : oClose[1] > oClose ? color.red : color.silver) : 
                 (oOpen < oClose ? color.green : oOpen > oClose ? color.red : color.silver)


[vval, vabsVal, wvf, vcol, vlinRegColor, vixFixState] = f_getVixFixLinReg(oClose, oLow, MLength)
[val, absVal, maDiff, absMaDiff, col, linRegColor] = f_getMACandlesLinReg(oClose, MMAType, MLength, mult, lb, ph, pl)


plot(useVixFix?na:absMaDiff, title="Momentum", style=plot.style_histogram, linewidth = 4, color=col)
plot(useVixFix?wvf:na, title="VIX Fix", style=plot.style_histogram, linewidth = 4, color=vcol)
plot(useVixFix?na:-absVal, title="Linear Regression (Momentum)", style=plot.style_histogram, linewidth=4, color=linRegColor)
plot(useVixFix?-vabsVal:na, title="Linear Regression (VIX Fix)", style=plot.style_histogram, linewidth=4, color=vlinRegColor)

exitColor = longTrades? color.orange : color.silver
exitPreviousColor = longTrades? color.silver : color.lime
longCondition = (useVixFix? (vixFixState == 1 and vlinRegColor == color.lime) :
                     ((linRegColor == color.orange and linRegColor[1] == color.red) or (linRegColor == color.green and linRegColor[1] != color.green and aggressiveLong)))  and inDateRange and dir>0
exitLongCondition = (col == exitColor and col[1] == exitColor and col[2] == exitPreviousColor and (linRegColor != color.green or not aggressiveLong))

strategy.entry("Long", strategy.long, when=longCondition, oca_name="oca_buy")
strategy.close("Long", when=exitLongCondition)