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.
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.
As vantagens desta estratégia são as seguintes:
A utilização de relações entre os prazos evita ser enganado pelo ruído de um único período de tempo.
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.
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.
O uso de curto prazo extremos para entrada e stop loss pode ajudar a controlar os drawdowns até certo ponto.
Os principais riscos desta estratégia são:
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.
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.
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.
Outras orientações de otimização da estratégia incluem:
Adicionar filtros de tendência para evitar sinais incorretos durante a inversão da tendência.
Otimizar a correspondência dos parâmetros do intervalo de tempo para melhorar a qualidade do sinal.
Utilize o aprendizado de máquina para obter o máximo de lucro/perda.
Adicione filtros suplementares como tendência de um período de tempo maior.
Expandir as variantes da estratégia para formar um conjunto de estratégias.
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) //