
A estratégia usa Stochastic RSI e indicadores de taxa de variação de preços para identificar a direção da tendência para entrar em ações em aberto e gerenciar o risco usando o método de stop loss de deslizamento de coordenadas.
Em primeiro lugar, a estratégia usa um indicador RSI de comprimento 5 e um indicador estocástico de comprimento 7 para calcular o RSI estocástico. Quando o valor de K do RSI estocástico é superior ao valor de D, é um sinal de otimização, quando o valor de K é inferior ao valor de D, é um sinal de baixa.
Em segundo lugar, a estratégia calcula a taxa de variação do preço com o indicador EMA ROC. Quando o EMA ROC é superior a metade da depreciação ou inferior a metade negativa da depreciação, o preço é considerado em movimento ativo.
Em seguida, em combinação com o sinal de pluralidade do RSI estocástico e o indicador de taxa de variação de preços, é possível identificar a direção da tendência. Faça mais quando o RSI estocástico é positivo e o preço está ativamente movendo; Faça um curto quando o RSI estocástico é negativo e o preço está ativamente movendo.
Finalmente, a estratégia gerencia o risco usando o método de parada de deslizamento de coordenadas. Após a abertura da posição, continue a atualizar o preço mais alto ou mais baixo, com uma distância proporcional do preço mais alto ou mais baixo como ponto de parada.
A estratégia tem as seguintes vantagens:
Usando o indicador Stochastic RSI, pode-se identificar com eficiência tendências e situações de sobrecompra e sobrevenda.
Os indicadores de volatilidade dos preços podem filtrar os mercados de correção de turbulência e evitar falsos sinais.
O método de parada de deslizamento de coordenadas permite o bloqueio máximo de lucro e, ao mesmo tempo, controla o risco.
Os parâmetros de estratégia têm muito espaço para otimização e podem ser ajustados para diferentes variedades.
A estratégia é simples, clara e fácil de entender.
A estratégia também apresenta alguns riscos:
O RSI estocástico pode produzir falsos sinais e precisa ser confirmado em combinação com outros fatores.
A perda de deslizamento de coordenadas pode ser muito radical, sendo atingida por gaps durante a noite.
A reversão em curto prazo pode desencadear um stop loss.
Os parâmetros da estratégia precisam ser otimizados para diferentes variedades, caso contrário, podem não ser eficazes.
Os custos de transação afetam a rentabilidade da estratégia e a frequência de transação razoável deve ser considerada.
A estratégia também pode ser melhorada nos seguintes aspectos:
Optimizar os parâmetros do RSI estocástico, reduzindo a taxa de falso sinal. Pode testar diferentes parâmetros de K e D.
Optimizar os parâmetros do indicador de variação de preço para melhorar a eficácia da filtragem. Pode testar diferentes períodos de janela e os limiares de variação.
Combinando indicadores de tendência para evitar a inversão de paradas. Indicadores como adicionar médias móveis.
Optimizar a taxa de perda, reduzir o risco de ser coberto. Você pode testar diferentes níveis de perda.
Adicionar gerenciamento de posições para controlar o risco individual. Por exemplo, fixar o valor de stop loss ou ajustar posições de forma dinâmica de acordo com o saldo da conta.
Teste de diferentes variedades de parâmetros para melhorar a adaptabilidade. Preferencialmente verificado em vários mercados em vários períodos de tempo.
O conceito geral da estratégia é claro e simples. Usando o Stochastic RSI para identificar a direção da tendência, e em conjunto com os sinais de filtragem do índice de variação de preço, pode efetivamente capturar oportunidades de tendência de linha média e longa. O método de parada de deslizamento de coordenadas pode bloquear o lucro e controlar o risco.
/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Sto2", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)
/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
///////////// Stochastic calc /////////////
smoothK = input(1, minval=1)
smoothD = input(7, minval=1)
lengthRSI = input(5, minval=1)
lengthStoch = input(7, minval=1)
src = input(close, title="RSI Source")
up = sma(max(change(src), 0), lengthRSI)
down = sma(-min(change(src), 0), lengthRSI)
rsi1 = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)
///////////// Rate Of Change /////////////
source = close, roclength = input(14, minval=1), pcntChange = input(2, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))
/////////////// STRATEGY ///////////////
long = k > d and isMoving()
short = k < d and isMoving()
last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(9.0, title='Take Profit %') / 100
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL
slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na
// Strategy
if testPeriod()
strategy.entry("Long Entry", strategy.long, when=long)
strategy.entry("Short Entry", strategy.short, when=short)
strategy.exit("Long Ex", "Long Entry", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
strategy.exit("Short Ex", "Short Entry", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
///////////// Plotting /////////////
bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80)
p1 = plot(k, color=color.gray, linewidth=0)
p2 = plot(d, color=color.gray, linewidth=0)
h0 = hline(100)
h1 = hline(50)
h3 = hline(0)
fill(p1, p2, color = k > d ? color.lime : color.red, transp=70)