A estratégia baseia-se no princípio de ruptura da faixa de Brin, onde a operação de reversão é realizada quando o preço é completamente rompido para cima ou para baixo. Capta o movimento de equilíbrio de retorno após a flutuação anormal e é aplicável a comerciantes ativos em busca de lucros eficientes.
A estratégia usa a faixa de Brin para definir a amplitude de flutuação do mercado atual. Quando os preços formam uma coluna de sol ou coluna de lua completa e quebram completamente a faixa de Brin para cima ou para baixo, o mercado está em um estado de alta flutuação e os preços retornarão para a direção equilibrada.
Especificamente, a estratégia calcula os preços de fechamento de 20 linhas K no meio, no topo e no fundo do binário. Quando o preço está abaixo do baixo e o preço de fechamento está abaixo do preço de abertura, é gerado um sinal de quebra. Quando o preço está acima do topo e o preço de fechamento está acima do preço de abertura, é gerado um sinal de quebra.
As principais vantagens desta estratégia são:
O uso da faixa de Brin para avaliar a volatilidade do mercado e identificar situações anormais.
O ponto de ruptura serve como um ponto de parada para controlar o risco de forma eficaz.
O retorno à órbita estabelece um alvo razoável para evitar uma queda excessiva.
Filtração completa de K-line de falsa ruptura, melhorando a qualidade do sinal.
Definição de parâmetros simples, fácil de implementar e otimizar.
A lógica é clara, o código é simples e elegante.
A estratégia também apresenta os seguintes riscos:
Parâmetros errados na faixa de Bryn podem causar falhas.
A ruptura pode ser o começo de uma nova tendência, com o risco de uma saída prematura.
A meta de órbita intermédia pode ser conservadora demais para gerar lucros sustentáveis.
A maior brecha não pode ser totalmente preenchida e há risco de deslizamento.
A tendência de choque pode levar a transações desnecessárias e frequentes.
A estratégia pode ser melhorada em alguns dos seguintes pontos:
Avaliar a força da tendência, ajustar os parâmetros ou a frequência de negociação.
Combinado com outros indicadores para determinar a melhor hora de entrada.
Ajustar o stop loss de acordo com a volatilidade.
Otimizar a definição de metas iniciais para obter lucros mais rápidos.
A rede de reinserção e otimizar o lucro.
Avaliar a credibilidade de uma brecha e evitar transações erradas.
A estratégia baseia-se no princípio da ruptura da faixa de Brin e é adequada para os comerciantes ativos que buscam lucros a curto prazo. A vantagem é que o controle de risco é claro, a desvantagem é que a saída antecipada e o espaço de lucro são limitados.
/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 3h
basePeriod: 15m
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/
// © Bishnu103
//@version=4
strategy(title="Full Candle Outside BB [v1.0][Bishnu103]",shorttitle="OUTSIDE BB",overlay=true,calc_on_every_tick=true,backtest_fill_limits_assumption=2)
// ***********************************************************************************************************************
// input variables
buy_session = input(title="Buy Session", type=input.session, defval="0915-1430")
exit_inraday = input(title="Exit Intraday?", type=input.bool, defval=true)
entry_distance = input(title="Entry distance from alert", minval=1, maxval=10, defval=3)
show_bb_switch = input(title="Show BB", type=input.bool, defval=true)
//
bbLength = input(title="BB Length", minval=1, defval=20)
bbStdDev = input(title="BB StdDev", minval=1, defval=2)
// ***********************************************************************************************************************
// global variables
long_entry = false
short_entry = false
long_exit = false
short_exit = false
// variable values available across candles
var entry_price = 0.0
var sl_price = 0.0
var exit_price = 0.0
var candle_count = 0
// ***********************************************************************************************************************
// function to return bollinger band values based on candle poition passed
getBB(pos) => [mBB, uBB, lBB] = bb(close[pos], bbLength, bbStdDev)
// function returns true if current time is within intraday byuing session set in input
BarInSession(sess) => time(timeframe.period, sess) != 0
// ***********************************************************************************************************************
// strategy
//
// get current bb value
[mBB_0,uBB_0,lBB_0] = getBB(0)
// check if full candle outside upper BB
outside_uBB = low > uBB_0 and close <= open
outside_lBB = high < lBB_0 and close >= open
// ***********************************************************************************************************************
// entry conditions
long_entry := outside_lBB
short_entry := outside_uBB
// keep candle count since the alert generated so that order can be cancelled after N number of candle calling it out as invalid alert
candle_count := candle_count + 1
if long_entry or short_entry
candle_count := 0
// ***********************************************************************************************************************
// risk management
//
// decide entry and sl price
if long_entry
entry_price := high
if short_entry
entry_price := low
if long_entry
sl_price := low
if short_entry
sl_price := high
// first exit is when price hits middle BB, gets updated for each candle based on it's middle BB value
exit_price := mBB_0
// ***********************************************************************************************************************
// position sizing
price = if close[0] > 25000
25000
else
price = close[0]
qty = 25000/price
// ***********************************************************************************************************************
// entry
//if long_entry and strategy.position_size == 0
// strategy.entry("BUY", strategy.long, qty, stop=entry_price, comment="BUY @ "+ tostring(entry_price))
if long_entry and strategy.position_size == 0
strategy.order("BUY", strategy.long, qty, stop=entry_price, comment="BUY @ "+ tostring(entry_price))
//if short_entry and strategy.position_size == 0
// strategy.entry("SELL", strategy.short, qty, stop=entry_price, comment="SELL @ "+ tostring(entry_price))
if short_entry and strategy.position_size == 0
strategy.order("SELL", strategy.short, qty, stop=entry_price, comment="SELL @ "+ tostring(entry_price))
// cancel an order if N number of candles are completed after alert candle
strategy.cancel_all(candle_count > entry_distance)
// if current time is outside byuing session then do not enter intraday trade
strategy.cancel_all(timeframe.isintraday and not BarInSession(buy_session))
// ***********************************************************************************************************************
// exit
if strategy.position_size > 0
strategy.cancel("EXIT at MBB", true)
strategy.cancel("EXIT at SL", true)
strategy.order("EXIT at MBB", strategy.short, abs(strategy.position_size), limit=exit_price, comment="EXIT TG @ "+ tostring(exit_price))
strategy.order("EXIT at SL", strategy.short, abs(strategy.position_size), stop=sl_price, comment="EXIT SL @ "+ tostring(sl_price))
if strategy.position_size < 0
strategy.cancel("EXIT at MBB", true)
strategy.cancel("EXIT at SL", true)
strategy.order("EXIT at MBB", strategy.long, abs(strategy.position_size), limit=exit_price, comment="EXIT TG @ "+ tostring(exit_price))
strategy.order("EXIT at SL", strategy.long, abs(strategy.position_size), stop=sl_price, comment="EXIT SL @ "+ tostring(sl_price))
// if intraday trade, close the trade at open of 15:15 candle //!!!!!!!!!!!!!!!!!!!!! TO BE CORRECTED !!!!!!!!!!!!!!!!!!!!!!!
if timeframe.isintraday and exit_inraday and hour == 15 and minute == 00
strategy.close("BUY", when=strategy.position_size > 0, qty=strategy.position_size, comment="EXIT @ "+ tostring(close))
strategy.close("SELL", when=strategy.position_size < 0, qty=strategy.position_size, comment="EXIT @ "+ tostring(close))
// ***********************************************************************************************************************
// plots
//
// plot BB
[mBBp,uBBp,lBBp] = getBB(0)
p_mBB = plot(show_bb_switch ? mBBp : na, color=color.teal)
p_uBB = plot(show_bb_switch ? uBBp : na, color=color.teal)
p_lBB = plot(show_bb_switch ? lBBp : na, color=color.teal)
fill(p_uBB,p_lBB,color=color.teal,transp=95)