Stratégie de régression K-line à moyenne mobile


Date de création: 2023-09-14 17:50:14 Dernière modification: 2023-09-14 17:50:14
Copier: 1 Nombre de clics: 805
1
Suivre
1617
Abonnés

Principe de stratégie

La stratégie intègre plusieurs indicateurs techniques et stratégies, principalement utilisés pour déterminer les moments d’entrée et de sortie de l’indice.

Les principales logiques de négociation:

  1. Calculer la moyenne mobile de la ligne K, comprenant les moyennes mobiles des prix d’ouverture, de clôture, du plus haut et du plus bas

  2. Calculer le mouvement de la moyenne mobile K et la régression linéaire du mouvement

  3. Calculer la régression linéaire de la moyenne mobile K elle-même

  4. Calculer les super tendances pour déterminer la direction de la tendance générale

  5. Lorsque la régression de la dynamique est de négatif à rectifié, ou une régression forte, jugée comme le point d’entrée

  6. Lorsque la dynamique passe de positive à négative, ou de retour à faible, jugez le point de sortie

La stratégie utilise un ensemble d’indicateurs techniques pour juger de la dynamique et du rythme des marchés à court et à long terme afin de déterminer le moment de la négociation de l’indice.

Avantages stratégiques

  • La ligne K de la moyenne mobile reflète les tendances à moyen et long terme du marché

  • Analyse de régression pour juger de la reprise

  • Les super tendances aident à déterminer l’orientation générale

  • Une combinaison d’indicateurs multiples améliore la précision des jugements

Risque stratégique

  • L’optimisation des paramètres est plus complexe

  • Les combinaisons de multiples indicateurs sont difficiles à équilibrer

  • Rares signaux, fréquence de négociation basse

Résumer

La stratégie vise à exploiter les rythmes à court et à long terme du marché afin de déterminer le meilleur moment pour échanger des indices. Cependant, l’ajustement de ses paramètres et l’optimisation de ses modèles restent à perfectionner.

Code source de la stratégie
/*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)