A estratégia integra vários indicadores técnicos e estratégias, principalmente para determinar o momento de entrada e saída do índice.
A principal lógica de negociação:
Calcule a média móvel K, incluindo a média móvel de preços de abertura, de fechamento, de preços mais altos e mais baixos.
Calcule a quantidade de movimento da linha K da média móvel e a regressão linear da quantidade de movimento
Calcule a regressão linear da própria linha K da média móvel
Calculando super tendências para determinar a direção geral
Quando a regressão da dinâmica é negativa para a direção correta, ou regressão forte, julgar como ponto de entrada
Quando a dinâmica passa de positiva para negativa, ou regressa para fraca, julga-se o ponto de saída
A estratégia utiliza um conjunto de indicadores técnicos para avaliar a tendência e o ritmo do mercado a longo e curto prazo, a fim de determinar o momento de negociação do índice.
A linha K da média móvel reflete a tendência de médio e longo prazo do mercado
Análise de regressão para julgar uma reversão de tendência
Supertrends ajudam a determinar a direção geral
A combinação de vários indicadores aumenta a precisão do julgamento
Optimização de parâmetros é mais complexa
A combinação de vários indicadores é difícil de equilibrar
Sinais escassos e baixa frequência de transações
A estratégia se dedica a explorar o ritmo de longo e curto prazo do mercado para determinar o melhor momento para negociar índices. No entanto, o ajuste de parâmetros e a otimização do modelo ainda precisam ser aperfeiçoados.
/*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)