A estratégia de parada móvel Joker é uma estratégia de acompanhamento de tendências baseada em médias móveis. Combina as características de parada móvel e parada móvel, com o objetivo de bloquear o máximo de ganhos quando a tendência se move para a direção favorável, mas também para parar o mais cedo possível quando a tendência se torna desfavorável.
A estratégia usa a média móvel rápida e a média móvel lenta para construir filtros de tendência. Quando a média móvel rápida atravessa a média móvel lenta, faça mais; quando a média móvel rápida atravessa a média móvel lenta, faça menos.
A estratégia primeiro calcula o primeiro preço de parada após a abertura da posição com base na porcentagem de parada da configuração. Se a função de parada móvel estiver ativada, o tamanho do passo da parada móvel será calculado com base no preço de mínima variação da variedade de negociação e na porcentagem de parada móvel da configuração.
Quando a direção da posição coincide com a direção do sinal, se não tiver sido ativada a parada móvel, a parada é feita usando o método de submissão de preço limitado; se a parada móvel for ativada, a parada é feita usando o método de rastreamento de parada, ajustando continuamente o preço de parada de acordo com o tamanho do passo.
Utilize as médias móveis para determinar a direção das principais tendências, evitando que o ruído do mercado interfira demais com a estratégia.
Ativando o Stop Stop móvel, você pode ajustar a posição do Stop Stop de acordo com a tendência do mercado, garantindo que a posição do Stop Stop esteja sempre próxima do preço. Isso é mais flexível e eficiente do que definir um preço de Stop Stop fixo.
O stop-loss móvel pode bloquear mais lucros, reduzindo o risco de perda de estratégia. Ele também evita o problema de que a posição do stop-loss é conservadora demais e bloqueia os lucros prematuramente, o que pode ocorrer com apenas a configuração de um stop-loss fixo.
A parada móvel mantém as vantagens da parada de perda definida, podendo ser interrompida o mais cedo possível quando a situação se torna desfavorável.
As médias móveis são propensas a formar sinais errados ou sinais de atraso quando os preços flutuam fortemente. Isso pode levar à perda de posição de reversão da estratégia. Os parâmetros das médias móveis podem ser ajustados de acordo com o caso, ou o Filter pode ser adicionado para otimizar.
A configuração de uma proporção de parada muito grande também aumenta o tempo de manutenção da estratégia e o desvio entre o preço de parada real e o preço teórico. A proporção de parada pode ser reduzida adequadamente para reduzir esse risco.
A proporção de passo do stop móvel é muito pequena, o que pode levar a uma frequência de movimento excessiva, aumentando a taxa de transação e o risco de deslizamento. O passo do stop móvel pode ser ajustado adequadamente para otimizar.
A parada móvel considera apenas o movimento unilateral e não a retração. Isso significa que o preço volta novamente e a parada móvel não é desacelerada. Isso pode levar a que a parada final seja executada em um preço que se desvia do preço teórico.
Pode-se considerar ajustar os parâmetros da média móvel de acordo com a dinâmica da taxa de flutuação do mercado, aumentando o ciclo quando a flutuação aumenta e diminuindo o ciclo quando a flutuação diminui.
Pode-se estudar as características de diferentes variedades e mercados, configurando diferentes proporções de estenose por defeito, reduzindo o risco de estenose por desvio.
Pode-se estudar o mecanismo de suspensão móvel bilateral, movendo a suspensão para cima quando o preço atinge um novo pico e para baixo quando ocorre uma retração, deixando a suspensão mais próxima do preço.
Pode-se considerar a combinação com o indicador de força de tendência, reduzindo a taxa de suspensão quando a tendência é fraca e aumentando a taxa de suspensão quando a tendência é forte.
Pode-se considerar a combinação com um modelo de aprendizagem de máquina para definir dinamicamente a proporção de parada usando o intervalo de preços previsto pelo modelo.
A estratégia de parada móvel do Joker é claramente estruturada, usa a média móvel para determinar a direção da tendência e, em seguida, ajusta dinamicamente a posição da parada para bloquear o lucro. Ela possui os benefícios do stop loss móvel e do stop móvel, que podem acompanhar a tendência de forma eficaz e controlar o risco.
/*backtest
start: 2023-08-23 00:00:00
end: 2023-09-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title='Joker Trailing TP Bot', shorttitle='Joker TTP Bot', overlay=true, pyramiding=0, process_orders_on_close=false, close_entries_rule='ANY', calc_on_every_tick=false, calc_on_order_fills=false, commission_type=strategy.commission.percent, commission_value=0.07, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000, currency=currency.USD) //, max_labels_count=500)
fromDate = input(timestamp('01 Jan 2021 00:00 UTC'), 'From Date')
toDate = input(timestamp('31 Dec 2121 23:59 UTC'), 'To Date')
fastMALen = input.int(23, 'Fast SMA Length')
slowMALen = input.int(50, 'Slow SMA Length')
longTakeProfitPerc = input.float(0.5, 'Long Take Profit %', minval=0.05, step=0.05) * 0.01
shortTakeProfitPerc = input.float(0.5, 'Short Take Profit %', minval=0.05, step=0.05) * 0.01
enableTrailing = input.bool(true, 'Enable Trailing')
trailingTakeProfitPerc = input.float(0.01, 'Trailing Take Profit %', minval=0.01, maxval=100, step=0.01) * 0.01
float fastMA = ta.sma(close, fastMALen)
float slowMA = ta.sma(close, slowMALen)
bool isWithinPeriod = true
bool openLongPosition = isWithinPeriod and ta.crossover(fastMA, slowMA)
bool openShortPosition = isWithinPeriod and ta.crossunder(fastMA, slowMA)
bool longIsActive = openLongPosition or strategy.position_size > 0
bool shortIsActive = openShortPosition or strategy.position_size < 0
float longTakeProfitPrice = na
longTakeProfitPrice := if longIsActive
if openLongPosition and not (strategy.position_size > 0)
close * (1 + longTakeProfitPerc)
else
nz(longTakeProfitPrice[1], close * (1 + longTakeProfitPerc))
else
na
float shortTakeProfitPrice = na
shortTakeProfitPrice := if shortIsActive
if openShortPosition and not (strategy.position_size < 0)
close * (1 - shortTakeProfitPerc)
else
nz(shortTakeProfitPrice[1], close * (1 - shortTakeProfitPrice))
else
na
float longTrailingTakeProfitStepTicks = longTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick
float shortTrailingTakeProfitStepTicks = shortTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick
strategy.entry(id = 'Long Entry', direction = strategy.long, when = openLongPosition, alert_message = 'Long(' + syminfo.ticker + '): Started')
strategy.entry(id = 'Short Entry', direction = strategy.short, when = openShortPosition, alert_message = 'Short(' + syminfo.ticker + '): Started')
strategy.exit(id = 'Long Take Profit', from_entry = 'Long Entry', limit = enableTrailing ? na : longTakeProfitPrice, trail_price = enableTrailing ? longTakeProfitPrice : na, trail_offset = enableTrailing ? longTrailingTakeProfitStepTicks : na, when = longIsActive, alert_message = 'Long(' + syminfo.ticker + '): Take Profit activated')
strategy.exit(id = 'Short Take Profit', from_entry = 'Short Entry', limit = enableTrailing ? na : shortTakeProfitPrice, trail_price = enableTrailing ? shortTakeProfitPrice : na, trail_offset = enableTrailing ? shortTrailingTakeProfitStepTicks : na, when = shortIsActive, alert_message = 'Short(' + syminfo.ticker + '): Take Profit activated')
plot(series = fastMA, title='Fast SMA', color = color.blue, linewidth = 1, style = plot.style_line)
plot(series = slowMA, title='Slow SMA', color = color.orange, linewidth = 1, style = plot.style_line)
plot(series = longTakeProfitPrice, title='Long Take Profit', color = color.green, linewidth = 1, style = plot.style_cross, offset = 1)
plot(series = shortTakeProfitPrice, title='Short Take Profit', color = color.red, linewidth = 1, style = plot.style_cross, offset = 1)
plot(series = strategy.position_avg_price, title='Position', color = color.white, linewidth = 1, style = plot.style_linebr)