Descoberta da oscilação - Estratégia de mudança da estrutura do mercado

Autora:ChaoZhang, Data: 2023-12-05 15:17:01
Tags:

img

A estratégia de mudança de estrutura de mercado (ICT_MSS) é uma estratégia de tendência que identifica mudanças na estrutura de mercado usando as relações entre diferentes prazos.

Estratégia lógica

A lógica central desta estratégia é usar padrões de engulfamento de curto prazo para baixo e para cima como sinais para mudanças de estrutura de mercado de longo prazo. Especificamente, a estratégia monitora simultaneamente um período de tempo mais longo (por exemplo, barras de 60m) e um período de tempo mais curto (por exemplo, barras de 15m). Quando uma barra vermelha engulfante para baixo aparece no período de tempo mais curto, enquanto a barra de período de tempo mais longo é verde, é determinado que ocorreu uma estrutura de mercado e uma posição de mudança longa é tomada. Quando uma barra verde engulfante para cima aparece no período de tempo mais curto, enquanto a barra de período de tempo mais longo é vermelha, é determinado que ocorreu uma mudança de estrutura de mercado e uma posição curta é tomada.

Após entrar em uma posição direcional, a estratégia utiliza o curto prazo alto/baixo para definir um stop loss, a fim de controlar o risco.

Análise das vantagens

As vantagens desta estratégia são as seguintes:

  1. A utilização de relações entre os prazos evita ser enganado pelo ruído de um único período de tempo.

  2. Determina automaticamente a nova direcção da tendência, as mudanças na estrutura do mercado desencadeiam automaticamente entradas longas/cortas sem necessidade de julgamento manual.

  3. Controle eficaz do risco: o curto prazo de alta/baixa utilizada para o controlo do risco ajuda a limitar as perdas de transações individuais.

  4. O uso de curto prazo extremos para entrada e stop loss pode ajudar a controlar os drawdowns até certo ponto.

Análise de riscos

Os principais riscos desta estratégia são:

  1. Risco de avaliação incorreta da estrutura do mercado. Os sinais podem falhar quando o ruído de curto prazo é elevado. Os parâmetros de prazo devem ser ajustados.

  2. Risco de reversão de tendência. A estratégia luta para controlar a redução durante reversões em forma de V. O algoritmo de stop loss precisa ser ajustado.

  3. Risco de desajuste de parâmetros: combinação incorreta de prazo longo/curto leva a má qualidade do sinal e requer testes de otimização.

Orientações de otimização

Outras orientações de otimização da estratégia incluem:

  1. Adicionar filtros de tendência para evitar sinais incorretos durante a inversão da tendência.

  2. Otimizar a correspondência dos parâmetros do intervalo de tempo para melhorar a qualidade do sinal.

  3. Utilize o aprendizado de máquina para obter o máximo de lucro/perda.

  4. Adicione filtros suplementares como tendência de um período de tempo maior.

  5. Expandir as variantes da estratégia para formar um conjunto de estratégias.

Conclusão

A estratégia ICT_MSS é uma estratégia global confiável de tendência. Determina automaticamente uma nova direção de tendência com base em mudanças na estrutura do mercado e também tem um bom controle de risco embutido. Os próximos passos são melhorias adicionais em torno da melhoria da qualidade do sinal, otimização de saídas e prevenção de reversões para torná-lo uma estratégia de nível comercial.


/*backtest
start: 2022-11-28 00:00:00
end: 2023-12-04 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/
// © jl01794

//@version=5
strategy(title="ICT_MSS[PROTOTYPE]", overlay=true, initial_capital=10000, currency="USD", margin_long=15, margin_short=15, max_lines_count=500)


// INPUTS
Time_Frame  = input.timeframe("60", title="Focused Time Frame")
FTF_LTF = input.timeframe("15", title="Focused Time Frame(LTF)")
//

// SECURITY DATA [FOR ONE TIMEFRAME REFERENCE]

FTF_Close = request.security(syminfo.tickerid, Time_Frame, close)
FTF_Open = request.security(syminfo.tickerid, Time_Frame, open)
FTFLTF_High = request.security(syminfo.tickerid, FTF_LTF, ta.highest(2)) 
FTFLTF_Low = request.security(syminfo.tickerid, FTF_LTF, ta.lowest(2)) 
FTFLTF_Close = request.security(syminfo.tickerid, FTF_LTF, close)
FTFLTF_Open = request.security(syminfo.tickerid, FTF_LTF, open)

// TIME BASED CLOSE AND OPEN
_close = FTF_Close
_open = FTF_Open
_LTFclose = FTFLTF_Close
_LTFopen = FTFLTF_Open

// CANDLE STATE
greenCandle = close > open
redCandle = close < open
LTFgreenCandle = FTFLTF_Close > FTFLTF_Open
LTFredCandle = FTFLTF_Close < FTFLTF_Open

// ENGULFING TIMEFRAME REFERENCE
FTF_greenCandle = request.security(syminfo.tickerid, Time_Frame, greenCandle)
FTF_redCandle = request.security(syminfo.tickerid, Time_Frame, redCandle)
FTFLTF_greenCandle = request.security(syminfo.tickerid, FTF_LTF, LTFgreenCandle)
FTFLTF_redCandle = request.security(syminfo.tickerid, FTF_LTF, LTFredCandle)

//--------------------------------------------------------------------------------------------------------------

//ENGULFING_FTF_LTF
B_EnP_mss = FTFLTF_redCandle[1] and        // 1E PIVOT BUY
     FTFLTF_greenCandle
//


B_EnPs_mss = FTFLTF_greenCandle[1] and        // 1E PIVOT SELL
     FTFLTF_redCandle
//  

//--------------------------------------------------------------------------------------------------------------

display_LTF = timeframe.isintraday and timeframe.multiplier <= 15

//--------------------------------------------------------------------------------------------------------------

// STORED DATAS
var float EH_MSS1 = na
var float EL_MSS1 = na
var bool can_draw = false
var line l1_mss = na
var line l1s_mss = na

//--------------------------------------------------------------------------------------------------------------

// MSS BUY
if (B_EnPs_mss) and (display_LTF)                                                 
    EH_MSS1 := FTFLTF_High 
    can_draw := true                                                            
    l1_mss := line.new(bar_index, EH_MSS1, bar_index -3, EH_MSS1, color=color.purple)     
else
    if (can_draw)
        if (FTFLTF_High > EH_MSS1)                                                    
            can_draw := false                                                  
        else
            line.set_x2(l1_mss, bar_index) 
//

// MSS SELL
if (B_EnP_mss) and (display_LTF)                                                 
    EL_MSS1 := FTFLTF_Low 
    can_draw := true                                                            
    l1s_mss := line.new(bar_index, EL_MSS1, bar_index -3, EL_MSS1, color=color.purple)     
else
    if (can_draw)
        if (FTFLTF_Low < EL_MSS1)                                                    
            can_draw := false                                                  
        else
            line.set_x2(l1s_mss, bar_index) 
          

//--------------------------------------------------------------------------------------------------------------

// ORDER

// BUY
longCondition_mssB = B_EnPs_mss and FTFLTF_High and close and high[1]
openOr = FTFLTF_High 

//SELL
shortCondition_mssS = B_EnP_mss and FTFLTF_Low and close and low[1]
openOrs = FTFLTF_Low 


if (longCondition_mssB) 
    strategy.entry("Buy", strategy.long, 1, stop = openOr, when = longCondition_mssB)
//

if (shortCondition_mssS) 
    strategy.entry("Sell", strategy.short, 1, stop = openOrs, when = shortCondition_mssS)
//

// EXIT 
long_tp = open < FTFLTF_Close[1]
short_tp = open > FTFLTF_Close[1]

//if (long_tp)
    //strategy.close("Buy", qty_percent = 100, when = long_tp)
//

//if (short_tp)
    //strategy.close("Sell", qty_percent = 100, when = short_tp)
//

Mais.