Estratégia composta de stop loss e take profit baseada em entrada aleatória


Data de criação: 2024-01-24 15:38:49 última modificação: 2024-01-24 15:38:49
cópia: 5 Cliques: 688
1
focar em
1617
Seguidores

Estratégia composta de stop loss e take profit baseada em entrada aleatória

Visão geral

A ideia principal desta estratégia é determinar o ponto de entrada por meio de números aleatórios, com três pontos de parada e um ponto de perda para gerenciar o risco e controlar a perda de cada transação.

Princípio da estratégia

A estratégia usa o número aleatório rd_number_entry para decidir o número de entradas entre 11 e 13, e o número rd_exit entre 20 e 22 para decidir a posição vazia. Depois de fazer o número de entradas, o stop loss é definido como o preço de entrada menos oatr(14) * slx. Ao mesmo tempo, são definidos três pontos de parada, o primeiro ponto de parada é o preço de entrada mais oatr(14) * tpx, o segundo ponto de parada é o preço de entrada mais 2 * tpx, o terceiro ponto de parada é o preço de entrada mais 3 * tpx.

A estratégia pode controlar o risco ajustando tpx (o coeficiente de parada) e slx (o coeficiente de perda).

Análise de vantagens

A estratégia tem as seguintes vantagens:

  1. O uso de entrada aleatória pode reduzir a probabilidade de curvatura
  2. Configurar vários pontos de parada e perda para controlar o risco de uma única transação
  3. O atr é usado para definir um stop loss, que pode ser baseado na volatilidade do mercado para definir pontos de ganho e perda
  4. O risco de transação pode ser controlado através de um ajuste de fator

Análise de Riscos

A estratégia também apresenta os seguintes riscos:

  1. A entrada aleatória pode ser um erro.
  2. Um ponto de paragem muito pequeno pode ser paralisado.
  3. O espaço de paragem é grande demais e pode não ser rentável
  4. Parâmetros errados podem aumentar os prejuízos

Pode-se reduzir o risco através do ajuste do coeficiente de stop-loss e da otimização da lógica de entrada aleatória.

Direção de otimização

A estratégia pode ser melhorada em vários aspectos:

  1. Melhoria da lógica de entrada aleatória, combinada com o julgamento de indicadores de tendência
  2. Otimização do Stop Loss Factor para tornar o lucro mais razoável do que o prejuízo
  3. Aumento do controle de posição, com diferentes espaços de parada em diferentes fases
  4. Parâmetros de otimização combinados com algoritmos de aprendizagem de máquina

Resumir

Esta estratégia baseia-se em entrada aleatória, com o estabelecimento de vários pontos de stop-loss para controlar o risco de uma única transação. Uma vez que a forte aleatoriedade pode reduzir a probabilidade de encaixe curvo, o risco de transação pode ser reduzido através da otimização de parâmetros.

Código-fonte da estratégia
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Random Strategy with 3 TP levels and SL", overlay=true,max_bars_back = 50)

tpx = input(defval = 0.8, title = 'Atr multiplication for TPs?')
slx = input(defval = 1.2, title = 'Atr multiplication for SL?')
isLong = false
isLong := nz(isLong[1])

isShort = false
isShort := nz(isShort[1])

entryPrice = 0.0
entryPrice := nz(entryPrice[1])
tp1 = true
tp1 := nz(tp1[1])
tp2 = true
tp2 := nz(tp2[1])

sl_price = 3213.0
sl_price := nz(sl_price[1])

sl_atr = atr(14)*slx
tp_atr = atr(14)*tpx

rd_number_entry = 1.0
rd_number_entry := (16708 * nz(rd_number_entry[1], 1) % 2147483647)%17

rd_number_exit = 1.0
rd_number_exit := ((16708 * time % 2147483647) %17)


//plot(rd_number_entry)

shortCondition = (rd_number_entry == 13? true:false) and (year >= 2017) and not isLong and not isShort
longCondition = (rd_number_entry == 11 ? true:false) and (year >= 2017) and not isShort and not isShort
//Never exits a trade:
exitLong = (rd_number_exit == 22?true:false) and (year >= 2018) and not isShort
exitShort = (rd_number_exit ==  22?true:false) and (year >= 2018) and not isLong


//shortCondition = crossunder(sma(close, 14), sma(close, 28)) and year >= 2017
//longCondition = crossover(sma(close, 14), sma(close, 28)) and year >= 2017

//exitLong = crossunder(ema(close, 14), ema(close, 28)) and year >= 2017
//exitShort = crossover(ema(close, 14), ema(close, 28)) and year >= 2017

if (longCondition and not isLong)
    strategy.entry('Long1', strategy.long)
    strategy.entry('Long2', strategy.long)
    strategy.entry('Long3', strategy.long)
    isLong := true
    entryPrice := close
    isShort := false
    tp1 := false
    tp2 := false
    sl_price := close-sl_atr

if (shortCondition and not isShort)
    strategy.entry('Short1', strategy.short)
    strategy.entry('Short2', strategy.short)
    strategy.entry('Short3', strategy.short)
    isShort := true
    entryPrice := close
    isLong := false
    tp1 := false
    tp2 := false
    sl_price := close+sl_atr
    
if (exitShort and isShort)
    strategy.close('Short1')
    strategy.close('Short2')
    strategy.close('Short3')
    isShort :=  false

if (exitLong and isLong)
    strategy.close('Long1')
    strategy.close('Long2')
    strategy.close('Long3')
    isLong :=  false

if isLong
    if (close > entryPrice + tp_atr) and not tp1
        strategy.close('Long1')
        tp1 := true
        sl_price := close - tp_atr
    if (close > entryPrice + 2*tp_atr) and not tp2
        strategy.close('Long2')
        tp2 := true
        sl_price := close - tp_atr
    if (close > entryPrice + 3*tp_atr)
        strategy.close('Long3')
        isLong := false
    if (close < sl_price)
        strategy.close('Long1')
        strategy.close('Long2')
        strategy.close('Long3')
        isLong := false

if isShort
    if (close < entryPrice - tp_atr) and not tp1
        strategy.close('Short1')
        sl_price := close + tp_atr
        tp1 := true
    if (close < entryPrice - 2*tp_atr) and not tp2
        strategy.close('Short2')
        sl_price := close + tp_atr
        tp2 := true
    if (close < entryPrice - 3*tp_atr)
        strategy.close('Short3')
        isShort := false
    if (close > sl_price)
        strategy.close('Short1')
        strategy.close('Short2')
        strategy.close('Short3')
        isShort := false
plot(atr(14)*slx)
plot(sl_price)