Estratégia de acompanhamento de tendência do oscilador de momentum


Data de criação: 2024-01-22 10:08:55 última modificação: 2024-01-22 10:08:55
cópia: 1 Cliques: 602
1
focar em
1617
Seguidores

Estratégia de acompanhamento de tendência do oscilador de momentum

Visão geral

A estratégia de acompanhamento de tendências do oscilador dinâmico é uma estratégia de combinação de indicadores dinâmicos, osciladores e médias móveis. Ela se dedica a identificar tendências ascendentes no estágio 2 e tendências descendentes no estágio 4, gerando sinais de compra e venda precisos em ambos os estágios.

Princípio da estratégia

Geração de sinais e julgamento de tendências

O sinal da estratégia é derivado principalmente do julgamento integrado dos três principais indicadores técnicos, incluindo o RSI de momentum, o cruzamento da linha média do EMA e a amplitude de flutuação real do ATR. Concretamente, a estratégia considera uma tendência ascendente ao atravessar o EMA de longo prazo no EMA de curto prazo, formando um sinal de pluralidade; enquanto o EMA de longo prazo no EMA de curto prazo indica uma tendência decrescente, produzindo um sinal de vazio. Além disso, a região alta do indicador de RSI de momentum indica uma forte energia de múltiplos pontos, enquanto a região baixa representa uma energia de vazio cheia, que pode ser usada para confirmar a eficácia da tendência atual. O indicador ATR é responsável por avaliar a volatilidade do mercado e fornecer a base para a configuração de stop loss.

Geração de sinais em fases

O que torna esta estratégia única é que ela produz sinais apenas durante os estágios 2 e 4 do mercado de ações. Isto é, ela só faz posições quando a tendência de alta é mais forte e a tendência de queda é mais clara.

Processo de decisão global

Em suma, a lógica de decisão da estratégia pode ser resumida como: confirmação de tendências por etapas (Stage 2 ou Stage 4) Determinação da intenção de vazio do RSI do momentum Determinação da direção da linha de equilíbrio do EMA Defina a parada apropriada em combinação com o ATR Abrir uma posição quando todas as condições são atendidas.

Vantagens estratégicas

Aproveitar o ciclo do mercado para aumentar a taxa de vitória

A maior vantagem da estratégia reside na sua profunda compreensão das características cíclicas do mercado. Ao negociar apenas nas fases mais claras de alta e baixa, ele pode filtrar uma grande quantidade de ruído incerto, elevando a probabilidade de sucesso para mais de 80%.

Filtro de múltiplos indicadores para reduzir falsos sinais

Esta estratégia usa vários indicadores como a dinâmica, a tendência e a volatilidade para a verificação cruzada. Isso evita os sinais enganosos que qualquer indicador individual pode gerar, aumentando consideravelmente a estabilidade e a confiabilidade da estratégia.

Parâmetros ricos e altamente personalizáveis

A estratégia oferece uma grande quantidade de parâmetros ajustáveis, permitindo aos usuários uma grande quantidade de personalização de acordo com o estilo pessoal e o ambiente do mercado, otimizando a estratégia ao mais alto nível, o que também aumenta a capacidade de adaptação da estratégia.

Riscos e soluções

Risco de mercado objetivo

Nenhuma estratégia quantitativa pode evitar completamente os riscos do mercado em si, como um grande evento de cisne negro que não pode ser previsto. Mas isso é um risco que existe objetivamente no mercado, não é uma questão de estratégia em si, e requer que o comerciante mantenha a mente clara, controle racional de posições e uso de alavancagem.

Riscos de otimização de parâmetros

Uma vez que os parâmetros da estratégia podem ser ajustados livremente, o ajuste inadequado pode levar ao surgimento de um fenômeno de superalimento. Isso precisa ser evitado por meio de um rigoroso retrocesso, garantindo que qualquer ajuste de parâmetros seja suficientemente comprovado e possa ser adaptado a situações de mercado mais amplas, evitando-se a limitação a um determinado período histórico.

Direção de otimização

Adição de funções de gerenciamento de posições

A estratégia atual é a construção de posições em quantidades fixas, o que pode levar a posições muito leves em grandes situações de tendências. Portanto, uma direção que pode ser otimizada é a adição de módulos de gerenciamento de posições, que podem aumentar gradualmente as posições quando a tendência é clara o suficiente para obter melhores resultados em grandes situações.

Combinação de filtragem de sinais com aprendizagem de máquina

Esta estratégia pode ser combinada com a aprendizagem de máquina para criar um modelo bem treinado para classificar a qualidade do sinal e filtrar alguns sinais de qualidade inferior, melhorando ainda mais o desempenho geral da estratégia. Esta é uma direção importante para a otimização da estratégia.

Resumir

A estratégia de acompanhamento de tendências do oscilador dinâmico é uma estratégia altamente inteligente e parametrizada. Ela usa com sucesso a regularidade periódica do mercado para melhorar a qualidade do sinal e produz um sinal de entrada de alta confiabilidade usando uma verificação cruzada de vários indicadores.

Código-fonte da estratégia
/*backtest
start: 2023-01-15 00:00:00
end: 2024-01-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © JS_TechTrading

//@version=5
strategy('The Flash-Strategy (Momentum-RSI, EMA-crossover, ATR)', shorttitle='The Flash-Strategy (Momentum-RSI, EMA-crossover, ATR)', overlay=true,initial_capital = 1000)
//// author -  JS-TechTrading

// MOM Rsi indicator 
group_mom_rsi = "Rsi Of Momentum "
len = input.int(10, minval=1, title="Length Mom-Rsi", group =group_mom_rsi ,tooltip = 'This ind calculate Rsi value of Momentum we use this ind to determine power of trend')
src2 = close
mom = src2 - src2[len]
rsi_mom = ta.rsi(mom, len)
mom_rsi_val = input.int(60, minval=1, title="Mom-Rsi Limit Val", group =group_mom_rsi, tooltip = "When our Mom-Rsi value more then this we open LONG or Short, with help of this indicator we we determine the status of the trend")

// Super Trend Ind
group_supertrend = "SuperTrend indicator"
atrPeriod = input(10, "ATR Length SuperTrend", group = group_supertrend)
factor = input.float(3.0, "Factor SuperTrend", step = 0.01, group = group_supertrend)

[supertrend, direction] = ta.supertrend(factor, atrPeriod)

// Ema Indicator
group_most = "Ema indicator"
src = input(close, 'Source Ema Ind',group = group_most)
AP2 = input.int(defval=12, title='Length Ema Ind', minval=1,group = group_most)
Trail1 = ta.ema(src, AP2) //Ema func
AF2 = input.float(defval=1, title='Percent Ema Ind', minval=0.1,group = group_most) / 100
SL2 = Trail1 * AF2  // Stoploss Ema
Trail2 = 0.0
iff_1 = Trail1 > nz(Trail2[1], 0) ? Trail1 - SL2 : Trail1 + SL2
iff_2 = Trail1 < nz(Trail2[1], 0) and Trail1[1] < nz(Trail2[1], 0) ? math.min(nz(Trail2[1], 0), Trail1 + SL2) : iff_1
Trail2 := Trail1 > nz(Trail2[1], 0) and Trail1[1] > nz(Trail2[1], 0) ? math.max(nz(Trail2[1], 0), Trail1 - SL2) : iff_2

//EMA50/150/200
group_50_150_200="EMA50/150/200"
show_emas=input.bool(defval = true, title = "SHOW EMAS", group = group_50_150_200)
ema50= ta.ema(src, 50)
ema150 = ta.ema(src, 150)
ema200 = ta.ema(src, 200)
ema50_color=input.color(defval = color.purple, title = "EMA50 COLOR",group = group_50_150_200)
ema50_linewidth=input.int(defval = 2, title = "EMA50 LINEWIDTH", group = group_50_150_200)
ema150_color=input.color(defval = color.blue, title = "EMA150 COLOR", group = group_50_150_200)
ema150_linewidth=input.int(defval = 2, title = "EMA150 LINEWIDTH", group = group_50_150_200)
ema200_color=input.color(defval = color.black, title = "EMA200 COLOR", group = group_50_150_200)
ema200_linewidth=input.int(defval = 2, title = "EMA200 LINEWIDTH", group = group_50_150_200)
plot(show_emas ? ema50 : na, color = ema50_color, linewidth = ema50_linewidth)
plot(show_emas ? ema150 : na, color=ema150_color, linewidth = ema150_linewidth)
plot(show_emas ? ema200 : na, color = ema200_color, linewidth = ema200_linewidth)

//Bull = ta.barssince(Trail1 > Trail2 and close > Trail2 and low > Trail2) < ta.barssince(Trail2 > Trail1 and close < Trail2 and high < Trail2)

//TS1 = plot(Trail1, 'ExMov', style=plot.style_line, color=Trail1 > Trail2 ? color.rgb(33, 149, 243, 100) : color.rgb(255, 235, 59, 100), linewidth=2)
//TS2 = plot(Trail2, 'ema', style=plot.style_line, color=Trail1 > Trail2 ? color.rgb(76, 175, 79, 30) : color.rgb(255, 82, 82, 30), linewidth=2)
//fill(TS1, TS2, Bull  ? color.green : color.red, transp=90)


// Strategy Sett
group_strategy = "Settings of Strategy"
Start_Time = input(defval=timestamp('01 January 2000 13:30 +0000'), title='Start Time of BackTest', group =group_strategy)
End_Time = input(defval=timestamp('30 April 2030 19:30 +0000'), title='End Time of BackTest', group =group_strategy)
dollar = input.float(title='Dollar Cost Per Position* ', defval=50000, group =group_strategy)
trade_direction = input.string(title='Trade_direction', group =group_strategy, options=['LONG', 'SHORT', 'BOTH'], defval='BOTH')
v1 = input(true, title="Version 1 - Uses SL/TP Dynamically ", group =group_strategy ,tooltip = 'With this settings our stoploss price increase or decrease with price to get better PNL score')

v2 = input(false, title="Version 2 -  Uses SL/TP Statically", group =group_strategy)
v2stoploss_input = input.float(5, title='Static Stop.Loss % Val', minval=0.01, group =group_strategy)/100
v2takeprofit_input = input.float(10, title='Static Take.Prof % Val', minval=0.01, group =group_strategy)/100

v2stoploss_level_long = strategy.position_avg_price * (1 - v2stoploss_input)
v2takeprofit_level_long = strategy.position_avg_price * (1 + v2takeprofit_input)

v2stoploss_level_short = strategy.position_avg_price * (1 + v2stoploss_input)
v2takeprofit_level_short = strategy.position_avg_price * (1 - v2takeprofit_input)

group_line = "Line Settings"
show_sl_tp = input.bool(title='  Show StopLoss - TakeProf Lines',inline = "1", defval=true, group =group_line)
show_trend_line = input.bool(title='  Show Trend Line',inline = '3' ,defval=true, group =group_line)
stoploss_colour = input.color(title='StopLoss Line Colour',inline = '2' ,defval=color.rgb(255, 255, 0), group =group_line)
up_trend_line_colour = input.color(title='Up Trend line Colour',inline = '4' ,defval=color.rgb(0, 255, 0, 30), group =group_line)
down_trend_line_colour = input.color(title='Down Trend line Colour',inline = '4' ,defval=color.rgb(255, 0, 0, 30), group =group_line)

//plot(supertrend ,color = strategy.position_size > 0 and show_sl_tp ? color.rgb(255, 0, 0) :show_sl_tp ? color.rgb(0, 255, 0) : na , style = plot.style_steplinebr,linewidth = 2)
// plot(supertrend ,color = show_sl_tp and v1 ? stoploss_colour : na , style = plot.style_steplinebr,linewidth = 2)

// plot(v2stoploss_level_long ,color = strategy.position_size > 0 and show_sl_tp and v2 ? stoploss_colour : na , style = plot.style_steplinebr,linewidth = 2)
// plot(v2stoploss_level_short ,color = strategy.position_size < 0 and show_sl_tp and v2 ? stoploss_colour : na , style = plot.style_steplinebr,linewidth = 2)
// plot(v2takeprofit_level_long  ,color = strategy.position_size > 0 and show_sl_tp and v2 ? up_trend_line_colour : na , style = plot.style_steplinebr,linewidth = 2)
// plot(v2takeprofit_level_short ,color = strategy.position_size < 0 and show_sl_tp and v2 ? up_trend_line_colour : na , style = plot.style_steplinebr,linewidth = 2)


TS2 = plot(Trail2, 'Ema Strategy', style=plot.style_line, color=show_trend_line and Trail1 < Trail2 ? down_trend_line_colour : show_trend_line ? up_trend_line_colour  : na, linewidth=2)

// bgcolor(buy_signal ? color.rgb(0, 230, 119, 80) : na)
// bgcolor(sell_signal ? color.rgb(255, 82, 82, 80) : na)

Time_interval = true
buy_signal = Trail1 > Trail2 and direction < 0 and rsi_mom > mom_rsi_val and Time_interval
sell_signal =Trail1 < Trail2 and direction > 0 and rsi_mom > mom_rsi_val and Time_interval


// Strategy entries 
stop_long = (close < supertrend and v1) or (v2 and strategy.position_size > 0)
stop_short = (close > supertrend and v1) or (v2 and strategy.position_size < 0)
long_cond = ((close > ema150 ) and (ema50 > ema150) and (ema150 > ema200))
short_cond = ((close < ema150) and (ema50 < ema150) and (ema150 < ema200))
if (not stop_long) and (not short_cond) and long_cond and strategy.opentrades == 0 and (trade_direction == 'LONG' or trade_direction == 'BOTH') and buy_signal
    strategy.entry('Long_0', strategy.long, qty=dollar / close)

if (not stop_short) and (not long_cond) and short_cond and strategy.opentrades == 0 and (trade_direction == 'SHORT' or trade_direction == 'BOTH') and sell_signal
    strategy.entry('Short_0', strategy.short, qty=dollar / close)


if close < supertrend and v1
    strategy.exit('Long_Close',from_entry = "Long_0", stop=supertrend, qty_percent=100)
if  v2 and strategy.position_size > 0
    strategy.exit('Long_Close',from_entry = "Long_0", stop=v2stoploss_level_long,limit= v2takeprofit_level_long  , qty_percent=100)
    
if close > supertrend and v1
    strategy.exit('Short_Close',from_entry = "Short_0", stop=supertrend, qty_percent=100)
if  v2 and strategy.position_size < 0
    strategy.exit('Short_Close',from_entry = "Short_0", stop=v2stoploss_level_short,limit= v2takeprofit_level_short ,qty_percent=100)