Esta estratégia usa o MACD para determinar a direção da tendência, combinado com o cruzamento de EMA e SMA como confirmação. O sinal de entrada é quando o histograma do MACD cruza acima da linha do sinal e a tendência é alta. O stop loss é definido no nível de preço abaixo da parada de trail ATR flutuante. A estratégia também sai parcialmente para tirar lucro, sai mais em um aumento maior do preço e mantém alguma posição com parada de trail até que o stop loss seja atingido.
Quando a EMA mais rápida cruza acima da EMA mais lenta, isso indica que a tendência de curto prazo é melhor do que a tendência de longo prazo, sinalizando uma compra. Enquanto isso, uma passagem mais rápida da SMA acima da SMA mais lenta também sugere um impulso de alta mais forte no curto prazo.
O ATR é usado para calcular o nível de stop loss. O ATR pode medir efetivamente a faixa de flutuação do preço. Quando o preço cai abaixo dessa faixa, o stop loss é acionado. O período ATR pode ser ajustado - um período menor permite uma parada mais precisa, mas mais fácil de parar, enquanto um período maior dá uma parada mais ampla, mas mais robusta. O nível de stop também segue o preço para cima, alcançando o efeito de tendência.
Sair parcialmente de um pequeno aumento de preço para obter lucro. Sair mais em um grande aumento de preço para bloquear o lucro. Mantenha alguma posição com parada de rastreamento até que o stop loss seja atingido. Isso ajuda a bloquear o lucro, enquanto ainda é capaz de manter a posição por algum período.
Risco de sinalização errada do MACD e dos indicadores de tendência.
Risco de que o ATR stop loss seja atingido. Pode aumentar o período ATR ou o multiplicador de stop loss.
Reduza o tamanho da posição e corta a perda no tempo.
Otimizar os parâmetros MACD para melhor julgamento da tendência
Otimizar o período ATR para um melhor nível de stop loss
Otimizar os rácios de saída e o dimensionamento das posições para reduzir o risco de ficar preso
Considere a adição de um índice de volatilidade para melhorar o stop loss
A estratégia combina MACD, EMA/SMA e outros indicadores para determinar a tendência e o tempo de entrada com precisão. O ATR flutuante ajuda a bloquear o lucro enquanto segue a tendência. As saídas são escalonadas para tirar lucro, garantir ganho e manter a posição por tempo.
/*backtest start: 2022-10-30 00:00:00 end: 2023-11-05 00:00:00 period: 1d basePeriod: 1h 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/ // © Deobald //@version=4 strategy("MACD Strategy", overlay=true) // FUNCTIONS Ema(src,p) => ema = 0. sf = 2/(p+1) ema := nz(ema[1] + sf*(src - ema[1]),src) Sma(src,p) => a = cum(src), (a - a[max(p,0)])/max(p,0) Atr(p) => atr = 0. Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1]))) atr := nz(atr[1] + (Tr - atr[1])/p,Tr) /// TREND ribbon_period = input(34, "Period", step=1) leadLine1 = ema(close, ribbon_period) leadLine2 = sma(close, ribbon_period) p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1) p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1) fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c) // MACD fast_length = input(title="Fast Length", type=input.integer, defval=3) slow_length = input(title="Slow Length", type=input.integer, defval=5) src = input(title="Source", type=input.source, defval=close) signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 2) sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false) sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true) // Plot colors col_grow_above = #26A69A col_grow_below = #FFCDD2 col_fall_above = #B2DFDB col_fall_below = #EF5350 col_macd = #0094ff col_signal = #ff6a00 // Calculating fast_ma = sma_source ? Sma(src, fast_length) : Ema(src, fast_length) slow_ma = sma_source ? Sma(src, slow_length) : Ema(src, slow_length) macd = fast_ma - slow_ma signal = sma_signal ? Sma(macd, signal_length) : Ema(macd, signal_length) hist = macd - signal //plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 ) // plot(macd, title="MACD", color=col_macd, transp=0) // plot(signal, title="Signal", color=col_signal, transp=0) // TAKE PROFIT AND STOP LOSS long_tp1_inp = input(1, title='Long Take Profit 1 %', step=0.1)/100 long_tp1_qty = input(10, title="Long Take Profit 1 Qty", step=1) long_tp2_inp = input(5, title='Long Take Profit 2%', step=0.1)/100 long_tp2_qty = input(50, title="Long Take Profit 2 Qty", step=1) long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp) long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp) // Stop Loss multiplier = input(2.2, "SL Mutiplier", minval=1, step=0.1) ATR_period=input(17,"ATR period", minval=1, step=1) // Strategy entry_long=crossover(macd,signal) and leadLine2 < leadLine1 entry_price_long=valuewhen(entry_long,close,0) SL_floating_long = entry_price_long - multiplier*Atr(ATR_period) exit_long= close < SL_floating_long ///// BACKTEST PERIOD /////// testStartYear = input(2018, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0) testStopYear = input(2020, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0) testPeriod() => true if testPeriod() strategy.entry("long", strategy.long, comment="Long", when=entry_long) strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1)//, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick) strategy.exit("TP2", qty_percent=long_tp2_qty, limit=long_take_level_2) //, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick) strategy.close_all("long", when=exit_long, comment="exit long" ) // LONG POSITION plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit") plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit") plot(strategy.position_size > 0 ? SL_floating_long : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")