Estratégia de negociação de curto prazo baseada no indicador estocástico com stop loss elástico

Autora:ChaoZhang, Data: 28 de setembro de 2023 às 10:45:41
Tags:

Resumo

Esta estratégia usa o indicador do oscilador estocástico para determinar as condições de mercado de sobrecompra e sobrevenda para negociação de curto prazo.

Estratégia lógica

Lógico de entrada

O indicador do oscilador estocástico consiste na linha %K e na linha %D. Quando a linha %K cruza acima da linha %D, um sinal de compra cruzada de ouro é gerado. Quando a linha %K cruza abaixo da linha %D, um sinal de venda cruzada de morte é acionado. Esta estratégia simplesmente segue os cruzados no indicador estocástico para determinar entradas.

Especificamente, quando há uma cruz de ouro no indicador estocástico, se o valor de %K for inferior a 80 (não sobrecomprado), uma posição longa será tomada.

GoLong=crossover(k,d) and k<80
GoShort=crossunder(k,d) and k>20

Parem com a lógica da perda

Esta estratégia utiliza uma abordagem de stop loss elástica, definindo o preço de stop com base em pontos pivô anteriores, como mostrado abaixo:

piv_high = pivothigh(high,1,1)
piv_low = pivotlow(low,1,1)

stoploss_long=valuewhen(piv_low,piv_low,0)
stoploss_short=valuewhen(piv_high,piv_high,0) 

Os pivots representam níveis importantes de suporte e resistência. Se o preço atravessar o nível do pivô, a posição será fechada e o preço do stop loss seguirá elasticamente os pontos de pivô em mudança.

Além disso, o preço de parada também considera os preços mais altos e mais baixos do período em curso para uma otimização adicional:

if GoLong
    stoploss_long := low<pl ? low : pl
if GoShort
    stoploss_short := high>ph ? high : ph

Vantagens

  1. Usando o Stochastic para evitar a perseguição de altos e baixos;

  2. O stop loss elástico segue as mudanças do mercado e otimiza o preço do stop;

  3. A redução de perdas baseada na ruptura do ponto de pivô é mais eficaz;

  4. A otimização do preço de parada usando os preços mais altos e mais baixos atuais torna a parada mais precisa.

Riscos e soluções

  1. Risco de sinais falsos do Stochastic

    • Solução: confirmar sinais com outros indicadores para evitar sinais falsos
  2. Risco de preenchimento de stop loss e aumento da perda

    • Solução: Reduzir a distância de parada, ou usar métodos como Chandelier Exit
  3. Risco de alta frequência de negociação e comissões

    • Solução: flexibilizar as regras de entrada para reduzir o número de operações

Orientações de otimização

  1. Otimizar stop loss, usando métodos como Chandelier Exit, trailing stop, oscilando stop loss etc

  2. Otimizar as regras de entrada com outros indicadores para evitar falsos sinais estocásticos

  3. Otimizar a obtenção de lucros, utilizando a meta de lucro de rastreamento, a meta de lucro oscilante, etc., para aumentar a rentabilidade

  4. Adicionar o tamanho da posição, como quantidade fixa por transação, percentagem de risco fixo, etc., ao controlo do risco por transação

  5. Otimizar parâmetros como K, D períodos, suavização etc com base em diferentes mercados

Resumo

Esta estratégia entra com base no Stochastic overbought/oversold e gerencia o risco com stop loss elástico. Tem a vantagem de evitar a perseguição de impulso, paradas eficazes, mas também tem alguns riscos de sinal falso. Melhorias futuras podem ser feitas em entradas, paradas, saídas, gerenciamento de risco etc.


/*backtest
start: 2023-08-28 00:00:00
end: 2023-09-27 00:00:00
period: 2h
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/
// © Peter_O

//@version=4
//strategy(title="TradingView Alerts to MT4 MT5 example with cancelling pending orders", commission_type=strategy.commission.cash_per_order, commission_value=0.00003, overlay=true, default_qty_value=100000, initial_capital=1000)

// This script was created for educational purposes only.
// It is showing how to create pending orders and cancel them
// Together with syntax to send these events through TradingView alerts system
// All the way to brokers for execution

TakeProfitLevel=input(400)

// **** Entries logic **** {
periodK = 13 //input(13, title="K", minval=1)
periodD = 3 //input(3, title="D", minval=1)
smoothK = 4 //input(4, title="Smooth", minval=1)
k = sma(stoch(close, high, low, periodK), smoothK)
d = sma(k, periodD)
// plot(k, title="%K", color=color.blue)
// plot(d, title="%D", color=color.orange)
// h0 = hline(80)
// h1 = hline(20)
// fill(h0, h1, color=color.purple, transp=75)

GoLong=crossover(k,d) and k<80
GoShort=crossunder(k,d) and k>20
// } End of entries logic

// **** Pivot-points and stop-loss logic **** {
piv_high = pivothigh(high,1,1)
piv_low = pivotlow(low,1,1)
var float stoploss_long=low
var float stoploss_short=high

pl=valuewhen(piv_low,piv_low,0)
ph=valuewhen(piv_high,piv_high,0)

if GoLong 
    stoploss_long := low<pl ? low : pl
if GoShort 
    stoploss_short := high>ph ? high : ph
plot(stoploss_long, color=color.lime, title="stoploss_long")
plot(stoploss_short, color=color.red, title="stoploss_short")
// } End of Pivot-points and stop-loss logic

CancelLong=crossunder(low,stoploss_long) and strategy.position_size[1]<=0 and strategy.position_size<=0
CancelShort=crossover(high,stoploss_short) and strategy.position_size[1]>=0 and strategy.position_size>=0
entry_distance=input(10, title="Entry distance for stop orders")

plotshape(CancelLong ? stoploss_long[1]-10*syminfo.mintick : na, location=location.absolute, style=shape.labelup, color=color.gray, textcolor=color.white, text="cancel\nlong", size=size.tiny)
plotshape(CancelShort ? stoploss_short[1]+10*syminfo.mintick : na, location=location.absolute, style=shape.labeldown, color=color.gray, textcolor=color.white, text="cancel\nshort", size=size.tiny)

strategy.entry("Long", strategy.long, when=GoLong, stop=close+entry_distance*syminfo.mintick)
strategy.exit("XLong", from_entry="Long", stop=stoploss_long, profit=TakeProfitLevel)
strategy.cancel("Long", when = CancelLong)
strategy.entry("Short", strategy.short, when=GoShort, stop=close-entry_distance*syminfo.mintick)
strategy.exit("XShort", from_entry="Short", stop=stoploss_short, profit=TakeProfitLevel)
strategy.cancel("Short", when = CancelShort)

if GoLong
    alertsyntax_golong='long offset=' + tostring(entry_distance) + ' slprice=' + tostring(stoploss_long) + ' tp=' + tostring(TakeProfitLevel)
    alert(message=alertsyntax_golong, freq=alert.freq_once_per_bar_close)
if GoShort
    alertsyntax_goshort='short offset=' + tostring(-entry_distance) + ' slprice=' + tostring(stoploss_short) + ' tp=' + tostring(TakeProfitLevel)
    alert(message=alertsyntax_goshort, freq=alert.freq_once_per_bar_close)
if CancelLong
    alertsyntax_cancellong='cancel long'
    alert(message=alertsyntax_cancellong, freq=alert.freq_once_per_bar_close)
if CancelShort
    alertsyntax_cancelshort='cancel short'
    alert(message=alertsyntax_cancelshort, freq=alert.freq_once_per_bar_close)
    


Mais.