Esta é uma estratégia de negociação de intervalos diários baseada em técnicas de impulso usando ATR Stops. Foi criada por Kory Hoang da Stably.
A estratégia identifica a direção da tendência utilizando indicadores de ímpeto e define linhas de stop loss baseadas no ATR para implementar a negociação swing de baixa compra-alta venda.
O código define primeiro o intervalo de tempo de backtesting.
Em seguida, na secção dos indicadores, são calculados os seguintes indicadores:
A lógica principal para julgar a tendência é:
Se o fechamento for superior à linha de stop loss ascendente anterior, é considerado uma tendência de alta; se o fechamento for inferior à linha de stop loss ascendente anterior, é considerado uma tendência de baixa.
Quando a tendência mudar, ajuste a posição da linha de stop loss.
Especificamente, numa tendência ascendente, a linha de stop loss é definida no preço mais alto da barra anterior menos o valor ATR; numa tendência descendente, a linha de stop loss é definida no preço mais baixo da barra anterior mais o valor ATR.
Esta é a realização da tendência após o stop loss.
Na secção Regras de negociação, abrir posições longas/cortas quando o preço ultrapassar a linha de stop loss.
As vantagens desta estratégia:
Há também alguns riscos:
Algumas otimizações:
Algumas orientações para otimizar esta estratégia:
Teste diferentes parâmetros ATR para encontrar o ideal.
Optimize o stop loss combinando métricas de volatilidade em cima do ATR. Adicione métricas de volatilidade, relaxe o stop loss adequadamente durante períodos de aumento da volatilidade.
Adicione um filtro de tendência para evitar negociações durante o mercado agitado.
Adicionar um mecanismo de dimensionamento de posições. Ajustar o tamanho da posição com base na taxa de utilização da conta, tempos consecutivos de stop loss, etc.
Adicionar o controlo do risco de gap overnight.
Como uma estratégia básica de negociação diária, a lógica geral é clara.
Ainda grande espaço para otimização, pode melhorar a partir de aspectos como julgamento de tendência, método de stop loss, dimensionamento de posição, etc. para tornar a estratégia mais prática.
/*backtest start: 2023-01-29 00:00:00 end: 2024-02-04 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("BTC Swinger", overlay=true, commission_value = 0.25, default_qty_type=strategy.percent_of_equity, default_qty_value = 100) ///////////////////////////////////////////////////////////// //START - SET DATE RANGE // === BACKTEST RANGE === FromMonth = input(defval = 1, title = "From Month", minval = 1) FromDay = input(defval = 1, title = "From Day", minval = 1) FromYear = input(defval = 2010, title = "From Year") ToMonth = input(defval = 12, title = "To Month", minval = 1) ToDay = input(defval = 31, title = "To Day", minval = 1) ToYear = input(defval = 2020, title = "To Year") startDate = time > timestamp(FromYear, FromMonth, FromDay, 1, 1) endDate = time < timestamp(ToYear, ToMonth, ToDay, 23, 59) withinTimeRange = true ///////////////////////////////////////////////////////////// //END - SET DATE RANGE ///////////////////////////////////////////////////////////// //START - INDICATORS length = input(3) mult = input(1, minval = 0.01) atr_ = atr(length) max1 = max(nz(max_[1]), close) min1 = min(nz(min_[1]), close) is_uptrend_prev = nz(is_uptrend[1], true) stop = is_uptrend_prev ? max1 - mult * atr_ : min1 + mult * atr_ vstop_prev = nz(vstop[1]) vstop1 = is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop) is_uptrend = close - vstop1 >= 0 is_trend_changed = is_uptrend != is_uptrend_prev max_ = is_trend_changed ? close : max1 min_ = is_trend_changed ? close : min1 vstop = is_trend_changed ? is_uptrend ? max_ - mult * atr_ : min_ + mult * atr_ : vstop1 plot(vstop, color = is_uptrend ? yellow : red, style=circles, linewidth=2) ///////////////////////////////////////////////////////////// //END - INDICATORS ///////////////////////////////////////////////////////////// //START - TRADING RULES direction = input(defval=1, title = "Strategy Direction", minval=-1, maxval=1) strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long)) condition1 = close > vstop and withinTimeRange condition2 = close < vstop and withinTimeRange strategy.entry("BUY", strategy.long, when = condition1) strategy.entry("SELL", strategy.short, when = condition2) ///////////////////////////////////////////////////////////// //END - TRADING RULES