Este artigo descreve em detalhes uma estratégia de negociação quantitativa baseada em indicadores de tendência e julgamentos de múltiplos períodos de tempo. A estratégia utiliza indicadores de tendência em diferentes períodos para melhorar a qualidade do sinal de negociação.
Princípios estratégicos
O núcleo da estratégia inclui:
O indicador de tendência ultrapassada é calculado no ciclo atual para determinar a direção da tendência dos preços;
Calcular indicadores de tendências excessivas em quadros de tempo elevados (como a linha do sol) para avaliar as grandes tendências;
A combinação da consistência da direção dos indicadores de ultra-tendência em dois quadros temporais, formando um sinal de negociação;
Paragem de perda razoável de acordo com a configuração do sinal;
A partir daí, o jogo será dividido em partes, com uma certa proporção de jogadores, para bloquear o lucro.
Quando o indicador de tendência ultrapassa o ciclo de alta e baixa, quando a direção do indicador é consistente, é considerado uma grande tendência, formando um sinal de compra e venda de acordo com a relação do indicador. E configure um stop-loss para gerenciar o risco de ganhos de cada transação.
A vantagem estratégica
A principal vantagem desta estratégia é que, com a utilização de múltiplos quadros de tempo, é possível filtrar alguns sinais falsos, aumentando a fiabilidade do sinal.
Além disso, a configuração razoável de stop loss também permite que o risco seja controlado em cada transação, evitando grandes perdas.
Por fim, a estratégia de bloqueio de lucro, através de partidas em grupos, é uma das principais características da estratégia.
C. Riscos potenciais
Mas também devemos estar atentos aos seguintes riscos:
Em primeiro lugar, o próprio indicador de tendências ultrapassadas tem problemas de atraso, podendo perder os melhores pontos de entrada.
Em segundo lugar, o risco de que os estímulos sejam demasiado radicais para serem aplicados requer uma abordagem racional.
Por fim, os custos de deslizamento de uma partida em série também devem ser considerados.
Quatro conteúdos, resumo
Este artigo detalha uma estratégia de quantificação baseada em indicadores de tendência ultrapassada e julgamentos de múltiplos períodos de tempo. Ela usa combinações de ciclos altos e baixos para melhorar a qualidade do sinal e gerencia o risco usando stop-loss and batch exits. Em geral, a estratégia usa indicadores de forma racional e obtém bons resultados com otimização de parâmetros.
/*backtest
start: 2023-09-06 00:00:00
end: 2023-09-13 00:00:00
period: 10m
basePeriod: 1m
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/
// © ranga_trading
//@version=5
// strategy(title='SuperTrend Multi Time Frame Long and Short Trading Strategy with Take Profit, Stop Loss and in build alerts V01', shorttitle='SuperTrend Multi Time Frame Long and Short Trading Strategy with Take Profit, Stop Loss and in build alerts V01 ', overlay=true, default_qty_value=60, initial_capital=2000, default_qty_type=strategy.percent_of_equity, pyramiding=0, process_orders_on_close=true)
tf1 = input.timeframe('D', title='Timeframe 1')
tf2 = input.timeframe('W', title='Timeframe 2')
length = input(title='ATR Period', defval=22)
mult = input.float(title='ATR Multiplier', step=0.1, defval=3.0)
showLabels = input(title='Show Buy/Sell Labels ?', defval=true)
useClose = input(title='Use Close Price for Extremums ?', defval=true)
highlightState = input(title='Highlight State ?', defval=true)
atr = mult * ta.atr(length)
longStop = (useClose ? ta.highest(close, length) : ta.highest(length)) - atr
longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? math.max(longStop, longStopPrev) : longStop
shortStop = (useClose ? ta.lowest(close, length) : ta.lowest(length)) + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop
var int dir = 1
dir := close > shortStopPrev ? 1 : close < longStopPrev ? -1 : dir
var color longColor = color.green
var color shortColor = color.red
longStopPlot = plot(dir == 1 ? longStop : na, title='Long Stop', style=plot.style_linebr, linewidth=2, color=color.new(longColor, 0))
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title='Long Stop Start', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(longColor, 0))
shortStopPlot = plot(dir == 1 ? na : shortStop, title='Short Stop', style=plot.style_linebr, linewidth=2, color=color.new(shortColor, 0))
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title='Short Stop Start', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(shortColor, 0))
midPricePlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0, display=display.none, editable=false)
longFillColor = highlightState ? dir == 1 ? longColor : na : na
shortFillColor = highlightState ? dir == -1 ? shortColor : na : na
fill(midPricePlot, longStopPlot, title='Long State Filling', color=longFillColor, transp=90)
fill(midPricePlot, shortStopPlot, title='Short State Filling', color=shortFillColor, transp=90)
// CE Function
ce() =>
atr2 = mult * ta.atr(length)
longStop2 = (useClose ? ta.highest(close, length) : ta.highest(length)) - atr2
longStop2Prev = nz(longStop2[1], longStop2)
longStop2 := close[1] > longStop2Prev ? math.max(longStop2, longStop2Prev) : longStop2
shortStop2 = (useClose ? ta.lowest(close, length) : ta.lowest(length)) + atr2
shortStop2Prev = nz(shortStop2[1], shortStop2)
shortStop2 := close[1] < shortStop2Prev ? math.min(shortStop2, shortStop2Prev) : shortStop2
var int dir2 = 1
dir2 := close > shortStop2Prev ? 1 : close < longStop2Prev ? -1 : dir2
ce = dir2 == 1 ? longStop2 : shortStop2
[dir2, ce]
[side, ce_plot] = ce()
ce1_plot = request.security(syminfo.tickerid, tf1, ce_plot[1], barmerge.gaps_off, barmerge.lookahead_on)
ce2_plot = request.security(syminfo.tickerid, tf2, ce_plot[1], barmerge.gaps_off, barmerge.lookahead_on)
ce1 = request.security(syminfo.tickerid, tf1, side[1], barmerge.gaps_off, barmerge.lookahead_on)
ce2 = request.security(syminfo.tickerid, tf2, side[1], barmerge.gaps_off, barmerge.lookahead_on)
long = buySignal and ce1 > 0 and ce2 > 0
short = sellSignal and ce1 < 0 and ce2 < 0
tradeType = input.string('BOTH', title='What trades should be taken : ', options=['LONG', 'SHORT', 'BOTH'])
// Position Management Tools
pos = 0.0
if tradeType == 'BOTH'
pos := long ? 1 : short ? -1 : pos[1]
pos
if tradeType == 'LONG'
pos := long ? 1 : pos[1]
pos
if tradeType == 'SHORT'
pos := short ? -1 : pos[1]
pos
longCond = long and (pos[1] != 1 or na(pos[1]))
shortCond = short and (pos[1] != -1 or na(pos[1]))
plot(ce1_plot, title='Timeframe 1 CE', color=ce1 > 0 ? #008000 : #800000, linewidth=2)
plot(ce2_plot, title='Timeframe 2 CE', color=ce2 > 0 ? color.green : color.red, linewidth=2)
// EXIT FUNCTIONS //
i_sl = input.float(5.0, title='Stop Loss %', minval=0, group='Trades')
sl = i_sl > 0 ? i_sl / 100 : 99999
long_entry = ta.valuewhen(longCond, close, 0)
short_entry = ta.valuewhen(shortCond, close, 0)
// Simple Stop Loss + 2 Take Profits
sl_long = strategy.position_avg_price * (1 - sl)
sl_short = strategy.position_avg_price * (1 + sl)
// Position Adjustment
long_sl = low < sl_long and pos[1] == 1
short_sl = high > sl_short and pos[1] == -1
if long_sl or short_sl
pos := 0
pos
long_exit = sellSignal and pos[1] == 1
short_exit = buySignal and pos[1] == -1
if long_exit or short_exit
pos := 0
pos
tp1percent = input.int(5, title='TP1 %', group='Trades') / 100.0
tp2percent = input.int(10, title='TP2 %', group='Trades') / 100.0
tp3percent = input.int(15, title='TP3 %', group='Trades') / 100.0
tp1amt = input.int(10, title='TP1 Amount %', group='Trades')
tp2amt = input.int(15, title='TP2 Amount %', group='Trades')
tp3amt = input.int(20, title='TP3 Amount %', group='Trades')
// Strategy Backtest Limiting Algorithm
i_startTime = input(defval=timestamp('01 Jun 2021 13:30 +0000'), title='Backtesting Start Time')
i_endTime = input(defval=timestamp('30 Sep 2099 19:30 +0000'), title='Backtesting End Time')
timeCond = true
KeepLastPosition = input(false)
// Make sure we are within the bar range, Set up entries and exit conditions
strategy.entry('long', strategy.long, when=longCond == true and tradeType != 'SHORT' and timeCond)
strategy.entry('short', strategy.short, when=shortCond == true and tradeType != 'LONG' and timeCond)
var float Qty1 = na
var float Qty2 = na
var float Qty3 = na
var float Qty4 = na
if strategy.position_size == 0
equity_q = (50000 + strategy.netprofit) / close
Qty1 := equity_q * tp1amt / 100.0
Qty2 := equity_q * tp2amt / 100.0
Qty3 := equity_q * tp3amt / 100.0
Qty4 := equity_q - Qty1 - Qty2 - Qty3
Qty4
strategy.exit('Exit1', qty=Qty1, stop=sl_long, limit=strategy.position_avg_price * (1 + tp1percent), when=strategy.position_size > 0)
strategy.exit('Exit2', qty=Qty2, stop=sl_long, limit=strategy.position_avg_price * (1 + tp2percent), when=strategy.position_size > 0)
strategy.exit('Exit3', qty=Qty3, stop=sl_long, limit=strategy.position_avg_price * (1 + tp3percent), when=strategy.position_size > 0)
strategy.exit('Exit4', qty=Qty4, stop=sl_long, when=strategy.position_size > 0 and KeepLastPosition == false)
strategy.close('long', when=long_exit, comment='CE Exit')
strategy.exit('Exit1', qty=Qty1, stop=sl_short, limit=strategy.position_avg_price * (1 - tp1percent), when=strategy.position_size < 0)
strategy.exit('Exit2', qty=Qty2, stop=sl_short, limit=strategy.position_avg_price * (1 - tp2percent), when=strategy.position_size < 0)
strategy.exit('Exit3', qty=Qty3, stop=sl_short, limit=strategy.position_avg_price * (1 - tp3percent), when=strategy.position_size < 0)
strategy.exit('Exit4', qty=Qty4, stop=sl_short, when=strategy.position_size < 0 and KeepLastPosition == false)
strategy.close('short', when=short_exit, comment='CE Exit')
plot(strategy.position_size > 0 ? strategy.position_avg_price * (1 + tp1percent) : na, color=color.new(color.green, 0), style=plot.style_linebr)
plot(strategy.position_size > 0 ? strategy.position_avg_price * (1 + tp2percent) : na, color=color.new(color.green, 0), style=plot.style_linebr)
plot(strategy.position_size > 0 ? strategy.position_avg_price * (1 + tp3percent) : na, color=color.new(color.green, 0), style=plot.style_linebr)
plot(strategy.position_size > 0 ? sl_long : na, color=color.new(color.red, 0), style=plot.style_linebr)
plot(strategy.position_size > 0 ? strategy.position_avg_price : na, color=color.new(color.gray, 0), style=plot.style_linebr)
plot(strategy.position_size < 0 ? strategy.position_avg_price * (1 - tp1percent) : na, color=color.new(color.green, 0), style=plot.style_linebr)
plot(strategy.position_size < 0 ? strategy.position_avg_price * (1 - tp2percent) : na, color=color.new(color.green, 0), style=plot.style_linebr)
plot(strategy.position_size < 0 ? strategy.position_avg_price * (1 - tp3percent) : na, color=color.new(color.green, 0), style=plot.style_linebr)
plot(strategy.position_size < 0 ? sl_short : na, color=color.new(color.red, 0), style=plot.style_linebr)
plot(strategy.position_size < 0 ? strategy.position_avg_price : na, color=color.new(color.gray, 0), style=plot.style_linebr)