Estratégia de reversão quantitativa baseada em IFM e MA

Autora:ChaoZhang, Data: 2023-12-27 14:42:16
Tags:

img

Resumo

Esta estratégia utiliza o indicador de IFM para identificar zonas de sobrecompra e sobrevenda combinadas com o MA para filtrar a direção de reversão de preços.

Estratégia lógica

A estratégia utiliza o indicador de IFM para avaliar as condições de sobrecompra e sobrevenda no mercado. Quando a IFM cai abaixo de 20 na zona de sobrevenda, ele sinaliza que o ativo está subvalorizado e um fundo está se formando, implicando um sinal longo. Quando a IFM sobe acima de 80 na área de sobrecompra, sugere que o ativo está sobrevalorizado e provavelmente corrigirá em breve, desencadeando um sinal curto.

Para evitar falsas inversões, a estratégia também utiliza o indicador MA para determinar a direcção da tendência.

A lógica específica de negociação é a seguinte:

  1. Quando a IFM ultrapassa os 20 para a zona de sobrevenda e o fechamento se situa acima da linha MA, é gerado um sinal de compra.

  2. Quando a IFM ultrapassa os 80 para a zona de sobrecompra e o fechamento ultrapassa a linha MA, desencadeia-se um sinal de venda.

Com a confirmação do duplo indicador, a estratégia pode identificar eficazmente oportunidades de reversão com sinais de entrada fiáveis.

Vantagens

  1. A confirmação por dois indicadores evita falhas e garante uma elevada fiabilidade do sinal.

  2. A utilização de reversões de sobrecompra/supervenda é uma técnica de negociação clássica e comprovada.

  3. A incorporação de filtros de tendência torna os sinais mais precisos e confiáveis.

  4. Aplicável em vários mercados com uma forte adaptabilidade.

Riscos

  1. O mercado pode ter uma tendência persistente para cima ou para baixo, levando a um stop loss.

  2. Precisa de ter cuidado com os riscos sistemáticos em condições de mercado extremas que causam pontos de reversão perdidos.

  3. A alta frequência de negociação pode conduzir a um aumento dos custos de transacção.

Atenuantes:

  1. Permitir um stop loss mais amplo para dar mais espaço à estratégia.

  2. Aumentar o tamanho das posições com cautela, observando gráficos de prazos mais longos para sinais de risco sistémico.

  3. Otimizar parâmetros para evitar trocas desnecessárias.

Oportunidades de melhoria

  1. Otimizar os parâmetros de MA para corresponderem às características do instrumento de negociação.

  2. Ajustar os níveis de sobrecompra/supervenda com base na variação do sentimento do mercado.

  3. Incorporar regras de dimensionamento de posições para lucros mais controlados.

Conclusão

Esta estratégia integra técnicas de análise clássicas com métodos quantísticos modernos. Aplicando rigorosamente confirmações de indicadores duplos, demonstra uma robusta adaptabilidade em vários instrumentos, tornando-se uma estratégia genérica recomendada a curto prazo.


/*backtest
start: 2023-12-19 00:00:00
end: 2023-12-26 00:00:00
period: 1m
basePeriod: 1m
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/
// © vikris

//@version=4
strategy("[VJ]Thor for MFI", overlay=true, calc_on_every_tick = false,pyramiding=0)

// ********** Strategy inputs - Start **********

// Used for intraday handling
// Session value should be from market start to the time you want to square-off 
// your intraday strategy
// Important: The end time should be at least 2 minutes before the intraday
// square-off time set by your broker
var i_marketSession = input(title="Market session", type=input.session, 
     defval="0915-1455", confirm=true)

// Make inputs that set the take profit % (optional)
longProfitPerc = input(title="Long Take Profit (%)",
     type=input.float, minval=0.0, step=0.1, defval=1) * 0.01

shortProfitPerc = input(title="Short Take Profit (%)",
     type=input.float, minval=0.0, step=0.1, defval=1) * 0.01
     
// Set stop loss level with input options (optional)
longLossPerc = input(title="Long Stop Loss (%)",
     type=input.float, minval=0.0, step=0.1, defval=0.5) * 0.01

shortLossPerc = input(title="Short Stop Loss (%)",
     type=input.float, minval=0.0, step=0.1, defval=0.5) * 0.01    

i_MFI = input(3, title="MFI Length")
OB=input(100, title="Overbought Level")
OS=input(0, title="Oversold Level")
barsizeThreshold=input(.5, step=.05, minval=.1, maxval=1, title="Bar Body Size, 1=No Wicks")
i_MAFilter = input(true, title="Use MA Trend Filter")
i_MALen = input(80, title="MA Length")
// ********** Strategy inputs - End **********


// ********** Supporting functions - Start **********

// A function to check whether the bar or period is in intraday session
barInSession(sess) => time(timeframe.period, sess) != 0
// Figure out take profit price
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)

// Determine stop loss price
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)


// ********** Supporting functions - End **********


// ********** Strategy - Start **********
// See if intraday session is active
bool intradaySession = true

// Trade only if intraday session is active

//=================Strategy logic goes in here===========================
 

MFI=mfi(close,i_MFI)
barsize=high-low
barbodysize=close>open?(open-close)*-1:(open-close)
shortwicksbar=barbodysize>barsize*barsizeThreshold
SMA=sma(close, i_MALen)
MAFilter=close > SMA



BUY = MFI[1] == OB and close > open and shortwicksbar and (i_MAFilter ? MAFilter : true)

SELL = MFI[1] == OS and close < open and shortwicksbar and (i_MAFilter ? not MAFilter : true) 

//Final Long/Short Condition
longCondition = BUY
shortCondition = SELL
 
//Long Strategy - buy condition and exits with Take profit and SL
if (longCondition and intradaySession)
    stop_level = longStopPrice
    profit_level = longExitPrice
    strategy.entry("Buy", strategy.long)
    strategy.exit("TP/SL", "Buy", stop=stop_level, limit=profit_level)


//Short Strategy - sell condition and exits with Take profit and SL
if (shortCondition and intradaySession)
    stop_level = shortStopPrice
    profit_level = shortExitPrice
    strategy.entry("Sell", strategy.short)
    strategy.exit("TP/SL", "Sell", stop=stop_level, limit=profit_level)
 
 
// Square-off position (when session is over and position is open)
squareOff = (not intradaySession) and (strategy.position_size != 0)
strategy.close_all(when = squareOff, comment = "Square-off")

// ********** Strategy - End **********

Mais.