
Esta estratégia é construída através de uma média móvel bidirecional para construir um sinal de alto espaço, para realizar o rastreamento de perdas. A ideia central é usar a média móvel para determinar a direção da tendência, fazer mais espaço na direção da tendência e usar o ATR para calcular o ponto de parada para realizar o rastreamento de perdas.
Esta estratégia usa o hl2 como preço de origem e calcula o ATR de um determinado período como a amplitude de parada. O ATR é multiplicado por um determinado múltiplo para calcular o algarismo e o algarismo.
Após a abertura da posição, de acordo com a mudança em tempo real do ATR, ajuste o ponto de parada, para realizar o rastreamento de parada. Concretamente, quando fazemos mais, o caminho inferior aumenta de acordo com o mais recente baixo, para realizar o rastreamento de parada; Quando fazemos vazio, o caminho superior diminui de acordo com o mais recente alto, para realizar o rastreamento de parada.
Desta forma, a estratégia aproveita ao máximo a função de medias móveis para determinar a direção da tendência e adiciona um mecanismo de rastreamento de stop loss baseado no ATR, garantindo a correção da direção da negociação e controlando o risco de negociação.
A maior vantagem desta estratégia reside no controle do risco. A estratégia de média móvel tradicional considera apenas o julgamento da direção, e é fácil quebrar a posição. A estratégia, juntamente com o stop loss de rastreamento do cálculo do ATR, pode ajustar o stop loss de acordo com a amplitude de flutuação do mercado, controlando efetivamente o risco de negociação.
Além disso, esta estratégia combina negociação bidirecional multi-marchas. Em comparação com a estratégia unilateral, é possível ajustar a direção da posição em tempo hábil em caso de reversão de tendência, evitando ficar preso na mesma direção e aumentando o lucro da estratégia.
O principal risco desta estratégia reside na configuração do ATR e do multiplicador. Se o ATR for muito curto ou o multiplicador for muito grande, o stop loss será pequeno demais para controlar o risco de forma eficaz; se o ATR for muito longo ou o multiplicador for pequeno, o stop loss será muito relaxado e será difícil de lucrar. Além disso, o risco de uma falsa ruptura também pode ocorrer quando o preço quebra a média móvel e aciona um sinal de construção de posição.
Pode-se equilibrar a perda de receita de parada através da otimização de parâmetros de ciclo e multiplicador; em combinação com outros indicadores de filtragem de brechas falsas, melhorar a qualidade do sinal e reduzir o risco.
A estratégia pode ser melhorada em alguns aspectos:
Otimizar o ciclo da média móvel para encontrar a melhor combinação de parâmetros
Adicionar filtros para outros indicadores, como MACD, KDJ, etc., para melhorar a qualidade do sinal
Aumentar as estratégias de gestão de posições, tais como ações fixas, Martingale, etc., para aumentar a receita estratégica
É possível estudar as diferenças de parâmetros entre as diferentes variedades e otimizar os parâmetros
Otimizar o treinamento de parâmetros com métodos de aprendizagem de máquina, como algoritmos genéticos
Esta estratégia considera completamente o julgamento de tendências e o controle de riscos, com foco na redução de retrocessos ao mesmo tempo em que busca ganhos. Através de métodos como otimização de parâmetros e combinações, os ganhos da estratégia podem ser aumentados ainda mais.
/*backtest
start: 2022-11-09 00:00:00
end: 2023-11-15 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/
// © KivancOzbilgic
//@version=4
strategy("Trenbolone Strategy", overlay = true)
Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear = input(defval = 2018, title = "From Year", minval = 999)
ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear = input(defval = 9999, title = "To Year", minval = 999)
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() => time >= start and time <= finish ? true : false
longCondition = buySignal
if (longCondition)
strategy.entry("BUY", strategy.long, when = window())
shortCondition = sellSignal
if (shortCondition)
strategy.entry("SELL", strategy.short, when = window())
buy1 = barssince(buySignal)
sell1 = barssince(sellSignal)
color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na
barcolor(barcoloring ? color1 : na)