Esta estratégia combina vários indicadores e estratégias técnicas, principalmente para determinar os pontos de entrada e saída do índice.
A lógica chave é:
Calcular as velas médias móveis, incluindo abertas, fechadas, altas e baixas
Calcular o momento das velas MA e a regressão linear do momento
Calcular a regressão linear das próprias velas MA
Use o SuperTrend para determinar a direção geral
Quando a regressão de momento passa de negativo para positivo, ou fortemente positivo, sinaliza entrada
Quando o momento passa de positivo para negativo, ou enfraquece, ele sinaliza saída.
A estratégia sintetiza vários indicadores para avaliar os movimentos de curto e longo prazo do mercado e o ritmo para determinar o calendário das negociações de índices.
As velas MA reflectem tendências de médio a longo prazo
Análise de regressão identifica mudanças de tendência
SuperTrend ajuda na direcção geral
Indicadores múltiplos melhoram a precisão
Optimização de parâmetros complexos
Dificuldade de equilibrar múltiplos indicadores
Sinais pouco frequentes significam menor frequência de negociação
Esta estratégia visa descobrir os sinais de tempo do mercado através da análise de padrões de curto e longo prazo.
/*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)