Estratégia de reversão do ímpeto do mercado

Autora:ChaoZhang, Data: 2024-02-29 15:10:11
Tags:

img

Resumo

Esta estratégia combina o indicador Supertrend e Fisher Transform para procurar oportunidades curtas quando o mercado reverte. Pode ajustar os parâmetros do Supertrend e Fisher Transform para diferentes criptomoedas, ações e mercados. Quando um sinal de venda aparece, ele mostra o tamanho da posição, os níveis de stop loss e take profit. Você também pode alterar o valor do risco.

Estratégia lógica

A estratégia primeiro calcula a Transformação de Fisher com um período de 10. Quando a linha de Fisher quebra 2,5 a partir de baixo, um sinal de venda é gerado. Ao mesmo tempo, calcula a faixa média verdadeira (ATR) de 10 períodos como o canal para a Supertrend. Quando o preço cruza abaixo do trilho superior, um sinal de venda é gerado.

Especificamente, quando o fechamento atual está abaixo do trilho superior anterior e o fechamento anterior está acima do trilho inferior do canal Supertrend, ele determina que o mercado se invertiu e gera um sinal de venda.

Assim, a estratégia requer tanto a identificação de inversão de Supertrend e Fisher Transform para gerar o sinal de venda final.

Vantagens

A estratégia combina o canal Supertrend e a Fisher Transform, que podem capturar com mais precisão os pontos de reversão do mercado.

Além disso, a estratégia fornece flexibilidade para ajustar os parâmetros de Supertrend e Fisher. Os usuários podem selecionar as melhores combinações de parâmetros para diferentes mercados e produtos para se adequar ao mercado propositadamente.

A estratégia também fornece gerenciamento do valor do risco. Os usuários podem ajustar convenientemente o capital de risco para cada ordem para atender às suas próprias necessidades de gerenciamento de risco. Ao mesmo tempo, ele calcula automaticamente os níveis de stop loss e take profit para alcançar uma boa relação risco-recompensa.

Riscos

A estratégia depende principalmente do canal Supertrend para determinar a estrutura do mercado. Quando a tendência dura por um período prolongado, a Supertrend pode falhar. Neste caso, o período ou o multiplicador ATR do canal deve ser aumentado adequadamente.

Além disso, a Fisher Transform tende a gerar sinais falsos ou sinais prematuros facilmente.

Além disso, a taxa de ganho geral das estratégias de reversão pode ser limitada. Deve combinar-se com indicadores de tendência para evitar a abertura de posições em zonas de gama ou participar depois que a tendência se torna mais clara. As médias móveis podem ser adicionadas como filtro para melhorar a estabilidade.

Orientações para a melhoria

A estratégia pode ser reforçada pelos seguintes aspectos:

  1. Otimizar o período ATR e o multiplicador ATR da Supertrend para a melhor combinação de parâmetros com base em diferentes produtos e condições de mercado.

  2. Otimizar o período de Fisher para suavizar a curva e evitar sinais falsos.

  3. Adicionar médias móveis ou bandas de Bollinger como indicador auxiliar para evitar a abertura de posições em mercados variáveis.

  4. Combinar a transformação de Fisher em diferentes prazos para obter um julgamento de reversão mais estável.

  5. Adicionar módulos de gestão de posições, como o rácio de alavancagem, o dimensionamento das posições, regras adicionais, etc., para controlar os riscos.

  6. Incorporar métodos de aprendizagem de máquina para obter otimização automática de parâmetros e ajuste de estratégia.

Conclusão

A estratégia integra a Supertrend e a Fisher Transform com flexibilidade para se adaptar a diferentes produtos por ajuste de parâmetros, em comparação com as estratégias de indicador único.


/*backtest
start: 2024-02-21 00:00:00
end: 2024-02-27 03:00:00
period: 2m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Supertrend and Fisher_SHORT", overlay=true)

//This block is for  Fisher Transformation Calculation.
len = input.int(10, minval=1, title="Length") // Length is optional. 10 is good but is up to you.
high_ = ta.highest(hl2, len)
low_ = ta.lowest(hl2, len)
round_(val) => val > .99 ? .999 : val < -.99 ? -.999 : val
value = 0.0
value := round_(.66 * ((hl2 - low_) / (high_ - low_) - .5) + .67 * nz(value[1]))
fish1 = 0.0
fish1 := .5 * math.log((1 + value) / (1 - value)) + .5 * nz(fish1[1])
fish2 = fish1[1]

// Sell condition for Fisher transformation.
sell_signal = (fish1 > 2.5) and (fish2 > fish1)
durum = 0 //just for the situation.

if (sell_signal)
    durum := -1 // now it changes from 0 to -1.

// Supertrend indicator inputs and calculations (same as in the indicator)
Periods = input(title='ATR Period', defval=10) // period is 10, but you can change it
src = input(hl2, title='Source')
Multiplier = input.float(title='ATR Multiplier', step=0.1, defval=2) //atr multiplier is important. it is 2 for this strategy but you can find another for best performance 
RiskAmount = input.float(title='Risk Amount ($)', defval=10.0, minval=0.0, step=1.0) // ıf you use risk-reward method, risk is 10$ for each position. you can also change it
changeATR = input(title='Change ATR Calculation Method ?', defval=true)

atr2 = ta.sma(ta.tr, Periods)
atr = changeATR ? ta.atr(Periods) : atr2
up = src - Multiplier * atr
up1 = nz(up[1], up)
up := close[1] > up1 ? math.max(up, up1) : up
dn = src + Multiplier * atr
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? math.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

// Calculate position size based on risk amount
riskPerContract = atr * Multiplier
contracts = RiskAmount / (riskPerContract * syminfo.mintick)

//short signal condition
sellSignal = trend == -1 and trend[1] == 1 and durum == -1

plotshape(sellSignal, title='Sell Signal', location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small) //shows the signal.

// variables
var float entryPrice = na
var float stopLoss = na
var float takeProfit = na
var float atr1 = na
var float takeProfit2 = na
var float takeProfit3 = na

//it calculates the stop level and reward profit levels using atr.
if (sellSignal)
    entryPrice := close
    atr1 := atr
    stopLoss := entryPrice + atr1 * Multiplier
    contracts := entryPrice / (stopLoss - entryPrice) * RiskAmount / entryPrice
    takeProfit := entryPrice - atr1 * Multiplier
    takeProfit2 := entryPrice - 2 * atr1 * Multiplier
    takeProfit3 := entryPrice - 3 * atr1 * Multiplier

if (sellSignal)
    strategy.entry("Sell", strategy.short, qty=1)

// 
if (close >= stopLoss)
    strategy.close("Sell", comment="Stop Loss Hit")
else if (close <= takeProfit)
    strategy.close("Sell", comment="Take Profit Hit")

// draw the stop, entry and profit levels
plot(stopLoss, title="Stop Loss", color=color.red, linewidth=1, style=plot.style_linebr)
plot(entryPrice, title="Entry Price", color=color.orange, linewidth=1, style=plot.style_linebr)
plot(takeProfit, title="Take Profit", color=color.green, linewidth=1, style=plot.style_linebr)
plot(takeProfit2, title="Take Profit 2", color=color.blue, linewidth=1, style=plot.style_linebr)
plot(takeProfit3, title="Take Profit 3", color=color.purple, linewidth=1, style=plot.style_linebr)


Mais.