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.
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:
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.
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.
A confirmação por dois indicadores evita falhas e garante uma elevada fiabilidade do sinal.
A utilização de reversões de sobrecompra/supervenda é uma técnica de negociação clássica e comprovada.
A incorporação de filtros de tendência torna os sinais mais precisos e confiáveis.
Aplicável em vários mercados com uma forte adaptabilidade.
O mercado pode ter uma tendência persistente para cima ou para baixo, levando a um stop loss.
Precisa de ter cuidado com os riscos sistemáticos em condições de mercado extremas que causam pontos de reversão perdidos.
A alta frequência de negociação pode conduzir a um aumento dos custos de transacção.
Atenuantes:
Permitir um stop loss mais amplo para dar mais espaço à estratégia.
Aumentar o tamanho das posições com cautela, observando gráficos de prazos mais longos para sinais de risco sistémico.
Otimizar parâmetros para evitar trocas desnecessárias.
Otimizar os parâmetros de MA para corresponderem às características do instrumento de negociação.
Ajustar os níveis de sobrecompra/supervenda com base na variação do sentimento do mercado.
Incorporar regras de dimensionamento de posições para lucros mais controlados.
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 **********