Strategi Regresi K-line Purata Bergerak


Tarikh penciptaan: 2023-09-14 17:50:14 Akhirnya diubah suai: 2023-09-14 17:50:14
Salin: 1 Bilangan klik: 805
1
fokus pada
1617
Pengikut

Prinsip Strategi

Strategi ini mengintegrasikan pelbagai petunjuk dan strategi teknikal yang digunakan untuk menentukan masa masuk dan titik keluar indeks.

Logik perdagangan utama:

  1. Hitung garis K purata bergerak, termasuk purata bergerak harga pembukaan, harga penutupan, harga tertinggi, dan harga terendah

  2. Mengira momentum pada garis K purata bergerak, dan regresi linear pada momentum

  3. Hitung kemerosotan linear pada purata bergerak K

  4. Mengira trend super untuk menentukan arah trend keseluruhan

  5. Apabila momentum kembali dari negatif ke arah yang betul, atau kembali dengan kuat, dinilai sebagai masa masuk

  6. Apabila momentum bertukar dari positif ke negatif, atau kembali ke lemah, dinilai sebagai titik keluar

Strategi ini menggunakan pelbagai petunjuk teknikal untuk menilai pergerakan dan kadar jangka pendek dan jangka panjang pasaran untuk menentukan masa perdagangan indeks.

Kelebihan Strategik

  • Garis purata bergerak K mencerminkan pergerakan jangka panjang pasaran

  • Analisis regresi untuk menilai perubahan trend

  • Trend super membantu menentukan arah keseluruhan

  • Kombinasi pelbagai indikator meningkatkan ketepatan penilaian

Risiko Strategik

  • Pengoptimuman parameter lebih rumit

  • Portfolio pelbagai indikator sukar diimbangi

  • Sinyal jarang, frekuensi perdagangan rendah

ringkaskan

Strategi ini bertujuan untuk menggali jangka masa panjang dan jangka pendek pasaran untuk menentukan masa terbaik untuk perdagangan indeks. Namun, penyesuaian parameter dan pengoptimuman model masih belum sempurna.

Kod sumber strategi
/*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)