
Esta estratégia baseia-se em um indicador de canal dinâmico para projetar sinais de negociação, gerando sinais de compra e venda de acordo com o aumento e queda do canal de ruptura do preço. A estratégia faz apenas negociações múltiplas e, se houver um sinal de venda, a posição é reduzida a uma posição vazia.
Esta estratégia usa a média SMA e a amplitude de oscilação real do ATR para construir um canal de força. O canal de força é composto por dois eixos:
A trajetória = SMA + ATR * coeficiente Subtração = SMA - ATR * coeficiente
Quando o preço sobe, gera um sinal de compra; quando o preço desce, gera um sinal de venda.
Uma vez que só se faz mais, se aparecer um sinal de venda, cancele a ordem de abertura anterior e leve a posição para o estado de vazio.
A lógica da estratégia é a seguinte:
A estratégia tem as seguintes vantagens:
A estratégia também apresenta alguns riscos:
Resposta:
A estratégia pode ser melhorada em alguns aspectos:
Esta estratégia baseia-se em indicadores de canal de força, capturando facilmente e efetivamente as tendências do mercado. A lógica da estratégia é clara e fácil de entender, gerando sinais de negociação por meio de uma ruptura de canal de preço. Embora apenas ser multi-cabeça e sem mecanismo de saída seja insuficiente, pode ser melhorada por meio de otimização de parâmetros, adição de módulos de cabeçalho, adição de stop loss, etc.
/*backtest
start: 2023-11-24 00:00:00
end: 2023-12-24 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Keltner Channel Strategy", overlay=true)
source = close
useTrueRange = input(true)
length = input(20, minval=1)
mult = input(1.0)
ma = sma(source, length)
range = useTrueRange ? tr : high - low
rangema = sma(range, length)
upper = ma + rangema * mult
lower = ma - rangema * mult
crossUpper = crossover(source, upper)
crossLower = crossunder(source, lower)
bprice = 0.0
bprice := crossUpper ? high+syminfo.mintick : nz(bprice[1])
sprice = 0.0
sprice := crossLower ? low -syminfo.mintick : nz(sprice[1])
crossBcond = false
crossBcond := crossUpper ? true
: na(crossBcond[1]) ? false : crossBcond[1]
crossScond = false
crossScond := crossLower ? true
: na(crossScond[1]) ? false : crossScond[1]
cancelBcond = crossBcond and (source < ma or high >= bprice )
cancelScond = crossScond and (source > ma or low <= sprice )
if (cancelBcond)
strategy.cancel("KltChLE")
if (crossUpper)
strategy.entry("KltChLE", strategy.long, stop=bprice, comment="KltChLE")
if (cancelScond)
strategy.cancel("KltChSE")
if (crossLower)
strategy.entry("KltChSE", strategy.short, stop=sprice, comment="KltChSE")
//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)