A estratégia detecta principalmente a ruptura da caixa formada pelos pontos altos e baixos da linha K para julgar a direção e a força do mercado. Quando há uma ruptura de caixa ascendente, a estratégia definirá uma posição longa em torno do ponto de ruptura. Quando há uma ruptura de caixa descendente, a estratégia definirá uma posição curta em torno do ponto de ruptura. Uma vez gerado um sinal de negociação, a estratégia colocará ordens para abrir posições e definir stop loss e take profit para controlar riscos.
A estratégia define um período de negociação e procura apenas oportunidades de negociação durante esse período.
Após cada forma de linha K, a estratégia avalia se há uma diferença significativa entre os preços mais altos e mais baixos das duas linhas K anteriores.
2.1 Se o preço mais baixo da 2a linha K for superior ao preço mais alto da 1a linha K, ocorre uma ruptura de caixa ascendente.
2.2 Se o preço mais alto da 2a linha K for inferior ao preço mais baixo da 1a linha K, ocorre uma ruptura de caixa descendente.
Após a confirmação do sinal de ruptura da caixa, a estratégia define um ponto de entrada longo ou curto em torno do preço mais alto ou mais baixo da linha K atual.
Uma vez aberta a posição, a estratégia define o lucro baseado no dobro do intervalo de ruptura para capturar a aceleração da tendência.
A estratégia também define o stop loss no preço mais baixo ou mais alto da 2a linha K para reduzir o risco de perda.
A estratégia apresenta as seguintes vantagens:
A lógica é simples e fácil de implementar.
Usar breakouts de caixa de linha K para julgar a direção e a força do mercado tem alta precisão.
A configuração de take profit capta oportunidades da aceleração da tendência.
Há uma lógica de stop loss clara para controlar a perda única.
A ideia de estratégia é flexível e pode ser personalizada de acordo com o estilo pessoal.
No entanto, há alguns riscos na estratégia:
Os sinais de fuga podem ser falsos, as perdas não podem ser completamente evitadas.
O stop loss perto do ponto de entrada pode ser facilmente desencadeado por mercados agressivos.
Não pode julgar a estrutura da tendência e as paradas podem ser frequentemente desencadeadas em mercados de intervalo.
Não considera o impacto de diferentes produtos e períodos de tempo.
Para otimizar ainda mais a estratégia, podemos melhorar os seguintes aspectos:
Estabelecer parâmetros de stop loss e take profit adaptativos para diferentes produtos e períodos de tempo.
Adicionar indicadores técnicos para o julgamento da tendência para evitar ficar preso em mercados de gama.
Definir oportunidades adicionais subsequentes para rastrear corridas de tendência.
Combinar indicadores de volume para avaliar a autenticidade dos sinais de fuga e filtragem.
Adicionar algoritmos de aprendizagem de máquina para ajudar a determinar a direção da tendência.
A estratégia é projetada com base no princípio de breakout simples para capturar corridas aceleradas após breakouts para retornos excessivos.
/*backtest start: 2024-01-07 00:00:00 end: 2024-01-14 00:00:00 period: 3m basePeriod: 1m 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/ // © Dvitash //@version=5 strategy("Casper SMC Silver Bullet", shorttitle = "Casper SB", overlay=true, calc_on_order_fills = true) startTime = input(defval = "1000", title = "Start Time") endTime = input(defval = "1600", title = "End Time") contractAmt = input.int(defval = 2, title = "Contract Amount") fvgCol = input.color(defval = color.rgb(63, 61, 179, 41), title = "FVG Color") borderCol = input.color(defval = color.rgb(35, 33, 172, 41), title = "FVG Border Color") fvgExtendLength = input.int(defval = 0, minval = 0, title = "FVG Extend Length") allowedTime = not na(time(timeframe.period, startTime + "-" + endTime +":23456", "America/New_York")) newDay = bool(ta.change(time('D'))) h = hour(time('1'), "America/New_York") var bool fvgDrawn = na var float entryPrice = na var float stopPrice = na var float tpPrice = na if newDay fvgDrawn := false // a_allBoxes = box.all // if array.size(a_allBoxes) > 0 // for i = 0 to array.size(a_allBoxes) - 1 // box.delete(array.get(a_allBoxes, i)) if allowedTime and barstate.isconfirmed and h <= 16 //Long FVG if high[2] < low and not fvgDrawn // box.new(bar_index[2], low, bar_index + fvgExtendLength, high[2], bgcolor = fvgCol, border_color = borderCol) stopPrice := low[2] entryPrice := low tpPrice := entryPrice + (math.abs(low[2] - entryPrice) * 2) // log.info("SL: " + str.tostring(stopPrice) + " Entry: " + str.tostring(entryPrice) + " TP: " + str.tostring(tpPrice)) strategy.entry("long", strategy.long, contractAmt, limit = entryPrice, comment = "Long Entry") fvgDrawn := true if low[2] > high and not fvgDrawn // box.new(bar_index[2], high, bar_index + fvgExtendLength, low[2], bgcolor = fvgCol, border_color = borderCol) stopPrice := high[2] entryPrice := high tpPrice := entryPrice - (math.abs(high[2] - entryPrice) * 2) // log.info("SL: " + str.tostring(stopPrice) + " Entry: " + str.tostring(entryPrice) + " TP: " + str.tostring(tpPrice)) strategy.entry("short", strategy.short, contractAmt, limit = entryPrice, comment = "Short Entry") fvgDrawn := true if h >= 16 strategy.close_all() strategy.cancel_all() strategy.exit("long exit", from_entry = "long", qty = contractAmt, limit = tpPrice, stop = stopPrice, comment = "Long Exit") strategy.exit("short exit", from_entry = "short", qty = contractAmt, limit = tpPrice, stop = stopPrice, comment = "Short Exit")