
A estratégia é um sistema de negociação inteligente que combina MACD (Moving Average Convergence Spread Index) e LRS (Linear Regression Slope Index). A estratégia otimiza o cálculo do MACD através de uma combinação de vários métodos de média móvel e introduz a análise de regressão linear para aumentar a confiabilidade do sinal de negociação. A estratégia permite ao comerciante a flexibilidade de escolher usar um único indicador ou uma combinação de dois indicadores para gerar sinais de negociação e é equipada com um mecanismo de stop loss para controlar o risco.
O núcleo da estratégia é capturar a tendência do mercado com MACD e indicadores de retorno linear optimizados. A parte MACD usa uma combinação de quatro métodos de média móvel, SMA, EMA, WMA e TEMA, aumentando a sensibilidade à tendência de preço. A parte de retorno linear determina a direção e a intensidade da tendência calculando a inclinação e a localização da linha de retorno.
A estratégia cria um sistema de negociação com flexibilidade e confiabilidade, combinando versões melhoradas de indicadores clássicos e métodos estatísticos. Seu design modular permite que os comerciantes ajustem flexivelmente os parâmetros da estratégia e o mecanismo de confirmação de sinais de acordo com diferentes condições de mercado. Com otimização e melhoria contínuas, a estratégia espera manter um desempenho estável em vários cenários de mercado.
/*backtest
start: 2024-11-10 00:00:00
end: 2024-12-09 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy('SIMPLIFIED MACD & LRS Backtest by NHBProd', overlay=false)
// Function to calculate TEMA (Triple Exponential Moving Average)
tema(src, length) =>
ema1 = ta.ema(src, length)
ema2 = ta.ema(ema1, length)
ema3 = ta.ema(ema2, length)
3 * (ema1 - ema2) + ema3
// MACD Calculation Function
macdfx(src, fast_length, slow_length, signal_length, method) =>
fast_ma = method == 'SMA' ? ta.sma(src, fast_length) :
method == 'EMA' ? ta.ema(src, fast_length) :
method == 'WMA' ? ta.wma(src, fast_length) :
tema(src, fast_length)
slow_ma = method == 'SMA' ? ta.sma(src, slow_length) :
method == 'EMA' ? ta.ema(src, slow_length) :
method == 'WMA' ? ta.wma(src, slow_length) :
tema(src, slow_length)
macd = fast_ma - slow_ma
signal = method == 'SMA' ? ta.sma(macd, signal_length) :
method == 'EMA' ? ta.ema(macd, signal_length) :
method == 'WMA' ? ta.wma(macd, signal_length) :
tema(macd, signal_length)
hist = macd - signal
[macd, signal, hist]
// MACD Inputs
useMACD = input(true, title="Use MACD for Signals")
src = input(close, title="MACD Source")
fastp = input(12, title="MACD Fast Length")
slowp = input(26, title="MACD Slow Length")
signalp = input(9, title="MACD Signal Length")
macdMethod = input.string('EMA', title='MACD Method', options=['EMA', 'SMA', 'WMA', 'TEMA'])
// MACD Calculation
[macd, signal, hist] = macdfx(src, fastp, slowp, signalp, macdMethod)
// Linear Regression Inputs
useLR = input(true, title="Use Linear Regression for Signals")
lrLength = input(24, title="Linear Regression Length")
lrSource = input(close, title="Linear Regression Source")
lrSignalSelector = input.string('Rising Linear', title='Signal Selector', options=['Price Above Linear', 'Rising Linear', 'Both'])
// Linear Regression Calculation
linReg = ta.linreg(lrSource, lrLength, 0)
linRegPrev = ta.linreg(lrSource, lrLength, 1)
slope = linReg - linRegPrev
// Linear Regression Buy Signal
lrBuySignal = lrSignalSelector == 'Price Above Linear' ? (close > linReg) :
lrSignalSelector == 'Rising Linear' ? (slope > 0 and slope > slope[1]) :
lrSignalSelector == 'Both' ? (close > linReg and slope > 0) : false
// MACD Crossover Signals
macdCrossover = ta.crossover(macd, signal)
// Buy Signals based on user choices
macdSignal = useMACD and macdCrossover
lrSignal = useLR and lrBuySignal
// Buy condition: Use AND condition if both are selected, OR condition if only one is selected
buySignal = (useMACD and useLR) ? (macdSignal and lrSignal) : (macdSignal or lrSignal)
// Plot MACD
hline(0, title="Zero Line", color=color.gray)
plot(macd, color=color.blue, title="MACD Line", linewidth=2)
plot(signal, color=color.orange, title="Signal Line", linewidth=2)
plot(hist, color=hist >= 0 ? color.green : color.red, style=plot.style_columns, title="MACD Histogram")
// Plot Linear Regression Line and Slope
plot(slope, color=slope > 0 ? color.purple : color.red, title="Slope", linewidth=2)
plot(linReg,title="lingreg")
// Signal Plot for Visualization
plotshape(buySignal, style=shape.labelup, location=location.bottom, color=color.new(color.green, 0), title="Buy Signal", text="Buy")
// Sell Signals for Exiting Long Positions
macdCrossunder = ta.crossunder(macd, signal) // MACD Crossunder for Sell Signal
lrSellSignal = lrSignalSelector == 'Price Above Linear' ? (close < linReg) :
lrSignalSelector == 'Rising Linear' ? (slope < 0 and slope < slope[1]) :
lrSignalSelector == 'Both' ? (close < linReg and slope < 0) : false
// User Input for Exit Signals: Select indicators to use for exiting trades
useMACDSell = input(true, title="Use MACD for Exit Signals")
useLRSell = input(true, title="Use Linear Regression for Exit Signals")
// Sell condition: Use AND condition if both are selected to trigger a sell at the same time, OR condition if only one is selected
sellSignal = (useMACDSell and useLRSell) ? (macdCrossunder and lrSellSignal) :
(useMACDSell ? macdCrossunder : false) or
(useLRSell ? lrSellSignal : false)
// Plot Sell Signals for Visualization (for exits, not short trades)
plotshape(sellSignal, style=shape.labeldown, location=location.top, color=color.new(color.red, 0), title="Sell Signal", text="Sell")
// Alerts
alertcondition(buySignal, title="Buy Signal", message="Buy signal detected!")
alertcondition(sellSignal, title="Sell Signal", message="Sell signal detected!")
// Take Profit and Stop Loss Inputs
takeProfit = input.float(10.0, title="Take Profit (%)") // Take Profit in percentage
stopLoss = input.float(0.10, title="Stop Loss (%)") // Stop Loss in percentage
// Backtest Date Range
startDate = input(timestamp("2024-01-01 00:00"), title="Start Date")
endDate = input(timestamp("2025-12-12 00:00"), title="End Date")
inBacktestPeriod = true
// Entry Rules (Only Long Entries)
if (buySignal and inBacktestPeriod)
strategy.entry("Buy", strategy.long)
// Exit Rules (Only for Long Positions)
strategy.exit("Exit Buy", from_entry="Buy", limit=close * (1 + takeProfit / 100), stop=close * (1 - stopLoss / 100))
// Exit Long Position Based on Sell Signals
if (sellSignal and inBacktestPeriod)
strategy.close("Buy", comment="Exit Signal")