
A estratégia usa três indicadores técnicos, a faixa de Bryn, o canal de Kentner e o indicador de adaptação relativamente forte, para determinar a direção da tendência atual, em conjunto com o indicador de SAR da linha de paralelo. Quando os resultados dos três indicadores coincidem, o sinal de negociação é gerado. A estratégia determina principalmente a direção da tendência, entrando em tempo hábil quando a tendência muda, com o objetivo de lucrar.
A estratégia usa uma combinação de três indicadores técnicos para avaliar as tendências atuais:
SQUEEZE MOMENTUM INDICATOR: Calcula os canais de Bryn e Kentner, que se comprimem quando se sobrepõem, sinalizando uma mudança iminente na tendência. O indicador retorna ao estado de compressão e a inclinação da curva de retorno linear.
RSI VOLUME WEIGHTED: calcula o RSI ponderado pelo volume de transação, com a linha média para determinar sobrecompra e sobrevenda. O indicador enfatiza as mudanças no volume de transação.
Paralisação da linha de paralisação ((SAR): determina a relação entre o preço atual e a posição da linha de paralisação SAR, com a SAR a cair acima do preço e a SAR a subir abaixo dele.
A estratégia usa a faixa de Brin para determinar a direção da tendência, o refinamento do canal de Kentner, o RSI para determinar o overbought e o oversold para encontrar oportunidades de reversão, e o SAR para indicar o momento de entrada. A lógica específica é a seguinte:
Calcule a faixa de Bryn, o canal de Kentner, o indicador de squiz. Quando o squiz é comprimido, entra na fase de preparação.
O RSI é calculado com o peso de transação RSI. O RSI está acima da linha média de baixa e abaixo da linha média de alta.
Calcular a linha de paralelo SAR. O SAR é positivo abaixo do preço e negativo acima do preço.
A síntese dos três indicadores acima: quando o esquizofrênico comprime, o RSI está acima da linha média e o SAR gera um sinal de cabeça para baixo no preço; quando o esquizofrênico comprime, o RSI está abaixo da linha média e o SAR gera um sinal de cabeça para cima no preço.
Quando o sinal é gerado, julgue o resultado dos três indicadores de julgamento da linha K anterior, se o julgamento do sinal atual for o oposto, o sinal de entrada é gerado.
Depois de entrar, configure o parâmetro de parada de perda e acompanhe a parada de perda.
A estratégia tem as seguintes vantagens:
Indicadores de múltiplos indicadores de baixa e baixa, julgamento preciso. O indicador de Squizes identifica mudanças de tendência com precisão, o RSI julga o excesso de compra e venda com clareza, o SAR indica o tempo de entrada com precisão.
A lógica do indicador é simples, clara e fácil de entender.
A confirmação de múltiplos indicadores permite a filtragem de falhas.
O mecanismo de bloqueio de perdas foi criado para bloquear os lucros e controlar os riscos.
Os dados de detecção são abundantes e de alta confiabilidade.
A estratégia também apresenta alguns riscos:
A lógica de entrada de multi-cabeças e cabeças vazias é semelhante, podendo emitir sinais de retrocesso ao mesmo tempo, necessitando de filtragem.
Todos os três indicadores são optimizados para parâmetros, podendo ser demasiado ajustados.
O número de transações pode ser muito frequente, portanto, o número de posições deve ser controlado.
A configuração de parada de danos pode ser muito próxima e facilmente quebrada.
A solução é:
Aumentar a determinação da periodicidade dos resultados dos indicadores, evitando oscilações de sinais.
Adotar a análise walk forward para ajustar os parâmetros e evitar o excesso de encaixe.
Configure o tamanho da pirâmide para controlar o número de posições.
Testar diferentes intervalos de perda e otimizar a posição de perda.
A estratégia pode ser otimizada em várias direções:
Parâmetros de otimização de indicadores para melhorar a estabilidade dos parâmetros. Parâmetros de otimização dinâmica podem ser considerados.
Aumentar a lógica de controle de posição, como o tamanho, o tamanho e o valor da posição.
Teste diferentes métodos de perda, como perda por flutuação, perda linear, perda de zero, etc.
Aumentar as funções de gerenciamento de dinheiro, como posições fixas, taxa de utilização de fundos fixos, etc.
A entrada e saída dinâmicas são implementadas em combinação com algoritmos de aprendizagem de máquina.
Aumentar os mecanismos de cobertura, fazer mais cobertura de risco, reduzir o risco sistêmico nos mercados relevantes.
Considerar a inclusão de mais indicadores, a criação de mecanismos de votação e a melhoria da precisão de julgamentos.
A estratégia é uma estratégia de acompanhamento de tendências mais estável. Otimizando os parâmetros e melhorando o mecanismo de controle de risco, pode-se obter melhores indicadores de retorno e efeitos em disco rígido. A estratégia é adequada para variedades com tendências mais evidentes e também pode ser considerada para operar em grandes ciclos de relativa estabilidade, como a linha do sol. No geral, a estratégia tem um forte valor prático.
/*backtest
start: 2023-10-06 00:00:00
end: 2023-11-05 00:00:00
period: 1h
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/
// © XaviZ
//#####©ÉÉÉɶN###############################################
//####*..´´´´´´,,,»ëN########################################
//###ë..´´´´´´,,,,,,''%©#####################################
//###'´´´´´´,,,,,,,'''''?¶###################################
//##o´´´´´´,,,,,,,''''''''*©#################################
//##'´´´´´,,,,,,,'''''''^^^~±################################
//#±´´´´´,,,,,,,''''''''^í/;~*©####æ%;í»~~~~;==I±N###########
//#»´´´´,,,,,,'''''''''^;////;»¶X/í~~/~~~;=~~~~~~~~*¶########
//#'´´´,,,,,,''''''''^^;////;%I^~/~~/~~~=~~~;=?;~~~~;?ë######
//©´´,,,,,,,''''''''^^~/////X~/~~/~~/~~»í~~=~~~~~~~~~~^;É####
//¶´,,,,,,,''''''''^^^;///;%;~/~~;í~~»~í?~?~~~?I/~~~~?*=íÑ###
//N,,,,,,,'''''''^^^^^///;;o/~~;;~~;£=»í»;IX/=~~~~~~^^^^'*æ##
//#í,,,,,''''''''^^^^^;;;;;o~»~~~~íX//~/»~;í?IíI»~~^/*?'''=N#
//#%,,,'''''''''^^^^^^í;;;;£;~~~//»I»/£X/X/»í*&~~~^^^^'^*~'É#
//#©,,''''''''^^^^^^^^~;;;;&/~/////*X;í;o*í»~=*?*===^'''''*£#
//##&''''''''^^^^^^^^^^~;;;;X=í~~~»;;;/~;í»~»±;^^^^^';=''''É#
//##N^''''''^^^^^^^^^^~~~;;;;/£;~~/»~~»~~///o~~^^^^''''?^',æ#
//###Ñ''''^^^^^^^^^^^~~~~~;;;;;í*X*í»;~~IX?~~^^^^/?'''''=,=##
//####X'''^^^^^^^^^^~~~~~~~~;;íííííí~~í*=~~~~Ií^'''=''''^»©##
//#####£^^^^^^^^^^^~~~~~~~~~~~íííííí~~~~~*~^^^;/''''='',,N###
//######æ~^^^^^^^^~~~~~~~~~~~~~~íííí~~~~~^*^^^'=''''?',,§####
//########&^^^^^^~~~~~~~~~~~~~~~~~~~~~~~^^=^^''=''''?,íN#####
//#########N?^^~~~~~~~~~~~~~~~~~~~~~~~~^^^=^''^?''';í@#######
//###########N*~~~~~~~~~~~~~~~~~~~~~~~^^^*'''^='''/É#########
//##############@;~~~~~~~~~~~~~~~~~~~^^~='''~?'';É###########
//#################É=~~~~~~~~~~~~~~^^^*~'''*~?§##############
//#####################N§£I/~~~~~~»*?~»o§æN##################
//@version=4
strategy(title="M-SQUEEZE", overlay = true)
//study(title="M-SQUEEZE", overlay = true)
src = input(close, "SOURCE", type = input.source)
// ███▓▒░░ VARIABLES ░░▒▓███
var bool longCond = na, var bool shortCond = na
var int CondIni_long0 = 0, var int CondIni_short0 = 0
var int CondIni_long = 0, var int CondIni_short = 0
var float last_open_longCondition = na, var float last_open_shortCondition = na
var int last_longCondition0 = na, var int last_shortCondition0 = na
var int last_longCondition = na, var int last_shortCondition = na
var bool long_tp = na, var bool short_tp = na
var int last_long_tp = na, var int last_short_tp = na
var bool Final_Long_tp = na, var bool Final_Short_tp = na
var bool SMI_longCond = na, var bool SMI_shortCond = na
var bool RSI_longCond = na, var bool RSI_shortCond = na
var bool ADX_longCond = na, var bool ADX_shortCond = na
var bool SAR_longCond = na, var bool SAR_shortCond = na
var bool Final_longCondition0 = na, var bool Final_shortCondition0 = na
var bool Final_longCondition = na, var bool Final_shortCondition = na
// ███▓▒░░ SQUEEZE MOMENTUM INDICATOR ░░▒▓███
Act_SMI = input(true, "SQUEEZE MOMENTUM INDICATOR")
BB_length = input(85, title="BOLLINGER BANDS LENGTH", minval = 1)
BB_mult = input(2.1, title="BOLLINGER BANDS MULTI-FACTOR", minval = 0.1, step = 0.1)
KC_length = input(38, title="KELTNER CHANNEL LENGTH", minval = 1)
KC_mult = input(2.0, title="KELTNER CHANNEL MULTI-FACTOR", minval = 0.1, step = 0.1)
SQUEEZE_M(_src,_BB_length,_BB_mult,_KC_length,_KC_mult)=>
// Calculate BB
basis = sma(_src, _BB_length)
dev = _BB_mult * stdev(_src, _BB_length)
upperBB = basis + dev
lowerBB = basis - dev
// Calculate KC
ma = sma(src, _KC_length)
rangema = sma(tr, _KC_length)
upperKC = ma + rangema * _KC_mult
lowerKC = ma - rangema * _KC_mult
// Squeeze
sqzOn = lowerBB > lowerKC and upperBB < upperKC
sqzOff = lowerBB < lowerKC and upperBB > upperKC
nosqz = sqzOn == false and sqzOff == false
// Linear Regression curve
val = linreg(_src - avg(avg(highest(high, _KC_length), lowest(low, _KC_length)), sma(close, _KC_length)), _KC_length, 0)
[nosqz,val]
[NOSQZ,VAL] = SQUEEZE_M(src,BB_length,BB_mult,KC_length,KC_mult)
barcolor(iff(VAL > 0, iff(VAL > nz(VAL[1]), color.lime, color.green), iff(VAL < nz(VAL[1]), color.red, color.maroon)))
// ███▓▒░░ SAR ░░▒▓███
Act_SAR = input(true, "PARABOLIC SAR")
Sst = input (0.73, "SAR STAR", step=0.01, minval = 0.01)
Sinc = input (0.5, "SAR INC", step=0.01, minval = 0.01)
Smax = input (0.06, "SAR MAX", step=0.01, minval = 0.01)
SAR = sar(Sst, Sinc, Smax)
plot(SAR, style = plot.style_cross, title = "SAR")
// ███▓▒░░ RSI VOLUME WEIGHTED ░░▒▓███
Act_RSI = input(true, "RSI VOLUME WEIGHTED")
RSI_len = input(22, "RSI LENGHT", minval = 1)
RSI_obos = input(45,title="RSI CENTER LINE", type=input.integer, minval = 1)
WiMA(_src, _length)=>
var float MA_s=0.0
MA_s:=(_src + nz(MA_s[1] * (_length-1)))/_length
MA_s
RSI_Volume(fv, length)=>
up=iff(fv>fv[1],abs(fv-fv[1])*volume,0)
dn=iff(fv<fv[1],abs(fv-fv[1])*volume,0)
upt=WiMA(up,length)
dnt=WiMA(dn,length)
100*(upt/(upt+dnt))
RSI_V = RSI_Volume(src, RSI_len)
// ███▓▒░░ STRATEGY ░░▒▓███
SMI_longCond := (Act_SMI ? (VAL > 0 and (VAL > nz(VAL[1])) and not NOSQZ) : RSI_longCond)
RSI_longCond := (Act_RSI ? (RSI_V > RSI_obos) : SAR_longCond)
SAR_longCond := (Act_SAR ? (SAR < close) : SMI_longCond)
SMI_shortCond := (Act_SMI ? (VAL < 0 and (VAL < nz(VAL[1])) and not NOSQZ) : RSI_shortCond)
RSI_shortCond := (Act_RSI ? (RSI_V < RSI_obos) : SAR_shortCond)
SAR_shortCond := (Act_SAR ? (SAR > close) : SMI_shortCond)
longCond := SMI_longCond and RSI_longCond and SAR_longCond
shortCond := SMI_shortCond and RSI_shortCond and SAR_shortCond
CondIni_long0 := longCond ? 1 : shortCond ? -1 : CondIni_long0[1]
CondIni_short0 := longCond ? 1 : shortCond ? -1 : CondIni_short0[1]
longCondition0 = (longCond and CondIni_long0[1] == -1)
shortCondition0 = (shortCond and CondIni_short0[1] == 1)
CondIni_long := longCond[1] ? 1 : shortCond[1] ? -1 : CondIni_long[1]
CondIni_short := longCond[1] ? 1 : shortCond[1] ? -1 : CondIni_short[1]
longCondition = (longCond[1] and CondIni_long[1] == -1)
shortCondition = (shortCond[1] and CondIni_short[1] == 1)
// ███▓▒░░ ALERTS & SIGNALS ░░▒▓███
plotshape(longCondition, title = "Long Signal", style = shape.triangleup, location = location.belowbar, color = color.blue, transp = 0, size = size.tiny)
plotshape(shortCondition, title = "Short Signal", style = shape.triangledown, location = location.abovebar, color = #FF0000, transp = 0, size = size.tiny)
//alertcondition(longCondition, title="Long Alert", message = "LONG")
//alertcondition(shortCondition, title="Short Alert", message = "SHORT")
// ███▓▒░░ BACKTESTING ░░▒▓███
testStartYear = input(2018, "BACKTEST START YEAR", minval = 1980, maxval = 2222)
testStartMonth = input(01, "BACKTEST START MONTH", minval = 1, maxval = 12)
testStartDay = input(01, "BACKTEST START DAY", minval = 1, maxval = 31)
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testStopYear = input(2222, "BACKTEST STOP YEAR", minval=1980, maxval = 2222)
testStopMonth = input(12, "BACKTEST STOP MONTH", minval=1, maxval=12)
testStopDay = input(31, "BACKTEST STOP DAY", minval=1, maxval=31)
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)
testPeriod = time >= testPeriodStart and time <= testPeriodStop ? true : false
strategy.entry("Long", strategy.long, when = longCondition0 and testPeriod)
strategy.entry("Short", strategy.short, when = shortCondition0 and testPeriod)