Estratégia de negociação de flutuações de compensação da SMA

Autora:ChaoZhang, Data: 2023-12-19 10:52:10
Tags:

img

Estratégia geral

Esta estratégia usa médias móveis simples (SMA) e alguns cálculos matemáticos para determinar pontos de compra/venda. Mantemos uma linha SMA de 100 dias como nossa base. Se o preço de fechamento estiver abaixo desta linha, determinamos a posição de abertura com base na porcentagem em que o preço está abaixo da linha (low offset), que é configurável. Da mesma forma, definimos uma alta porcentagem de offset acima da SMA de 100 dias antes de fechar posições longas. Se tentarmos fechar cedo demais enquanto o preço ainda está subindo, o stop stop será acionado.

Estratégia lógica

A estratégia utiliza três linhas SMA: linha rápida (default 14 dias), linha lenta (default 100 dias) e linha de referência (default 30 dias).

Ele vai longo quando o preço de fechamento está abaixo da linha de referência, a porcentagem abaixo da linha lenta (baixo deslocamento) é maior do que o valor configurado, a linha rápida está subindo e a linha lenta está caindo.

Ele fecha longo quando o preço de fechamento está acima da linha de referência, a porcentagem acima da linha lenta (compensação alta) é maior do que o valor configurado, o preço de fechamento subiu por 3 velas consecutivas, temos lucros abertos e a linha rápida está acima da linha lenta.

O tamanho da ordem é baseado numa percentagem do capital total, isto controla o tamanho da nossa posição.

Análise das vantagens

  1. Utilizar a vantagem de a SMA ser capaz de suavizar as flutuações de preços e filtrar o ruído do mercado.
  2. Os crossovers da SMA têm alguma capacidade de prever mudanças de tendência.
  3. A fixação de desvios evita falsas rupturas das linhas SMA.
  4. A combinação de indicadores de tendência e de cruzamento melhora a precisão dos sinais de negociação.
  5. A suspensão de perdas bloqueia os lucros e impede a retirada.

Análise de riscos

  1. A própria SMA tem atraso e pode perder pontos de virada de preços.
  2. Uma configuração de deslocamento inadequada pode tornar a estratégia muito agressiva ou muito conservadora.
  3. Um parâmetro de stop loss inadequado pode provocar uma parada demasiado cedo ou um percentual de stop loss demasiado elevado.
  4. Incapaz de lidar com oscilações violentas de preços.

Melhorias correspondentes:

  1. Adicionar outros indicadores principais às entradas de filtro.
  2. Testar e otimizar deslocamentos.
  3. Faça testes e encontre parâmetros de stop loss ideais.
  4. Reduzir o tamanho da posição durante períodos de alta volatilidade.

Orientações de otimização

  1. Teste SMAs de diferentes períodos para encontrar parâmetros ótimos.
  2. Adicionar outros indicadores para determinar a estrutura e a tendência do mercado.
  3. Otimize os parâmetros de stop loss para obter mais lucros.
  4. Ajustar o tamanho das posições com base na volatilidade do mercado.
  5. Aplicar a estratégia a vários produtos simultaneamente para diversificação.

Conclusão

A estratégia de negociação de flutuação de compensação de SMA identifica pontos de entrada ideais, definindo compensações com base em diferentes linhas de SMA. O mecanismo de saída define um stop loss para bloquear ganhos. Esta estratégia é simples de entender e implementar. Ao otimizar parâmetros como períodos de SMA, compensações, níveis de stop loss, melhores resultados podem ser alcançados. É adequado para investidores de médio e longo prazo que buscam lucros estáveis.


/*backtest
start: 2022-12-12 00:00:00
end: 2023-12-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=4
// Author: Sonny Parlin (highschool dropout)
strategy(shorttitle="SMA+Strategy", title="SMA Offset Strategy",
                                      overlay=true,  currency=currency.USD,
                                      initial_capital=10000)

// Inputs and variables
ss = input(14, minval=10, maxval=50, title="SMA Fast (days)")
ff = input(100, minval=55, maxval=200, title="SMA Slow (days)")
ref = input(30, minval=20, maxval=50, title="SMA Reference (days)")
lowOffset = input(0.001, "Low Offset (%)", minval=0, step=0.001)
highOffset = input(0.0164, "High Offset (%)", minval=0, step=0.0001)
orderStake = input(0.96, "Order Stake (%)", minval=0, step=0.01)

// SMA
smaFast = sma(close, ss)
smaSlow = sma(close, ff)
smaRef = sma(close, ref)
distanceLow = (close - smaSlow) / close
distanceHigh = (close - smaSlow) / close

// Set up SMA plot but don't show by default
plot(smaFast, "smaFast", color=#00ff00, display = 0)
plot(smaSlow, "smaSlow", color=#ff0000, display = 0)
plot(smaRef, "smaRef", color=#ffffff, display = 0)

// The buy stratey:
// guard that the low is under our sma low reference line by our lowOffset %, 
// default is 0.001. (low < smaRef) and (distanceLow > lowOffset)
// SMA fast is on the rise and SMA slow is falling and they are very likely
// to cross. (rising(smaFast,1)) and (falling(smaSlow, 1)) 
enterLong = (low < smaRef) and (distanceLow > lowOffset) and (rising(smaFast,1)) and (falling(smaSlow, 1)) 

// The sell Strategy:
// Guard that close is higher than our sma high reference line by our 
// highOffset %, default is 0.0164. (close > smaRef) and (distanceHigh > highOffset)
// Guard that close has risen by 3 candles in a row (rising(close,3)) 
// Guard that we currently have profit (strategy.openprofit > 0)
// Guard that SMA fast is higher than smaSlow (smaFast > smaSlow)
// If it keeps going up past our close position the trailing stoploss will kick in!
enterShort = (close > smaRef) and (distanceHigh > highOffset) and (rising(close,3)) and (strategy.openprofit > 0) and (smaFast > smaSlow)

// Order size is based on total equity
// Example 1:
// startingEquity = 2000
// close = 47434.93
// orderStake = 0.45
// (2,000 × orderStake) / close = orderSize = 0.0189733599 = approx $900

// Example 2:
// startingEquity = 2000
// close = 1.272
// orderStake = 0.45
// (startingEquity × orderStake) / close = orderSize = 707.5471698113 = approx $900
orderSize = (strategy.equity * orderStake) / close

// Trailing Stoploss
// I'm using 1.35 as my default value, play with this for different results.
longTrailPerc = input(title="Trailing Stoploss (%)",
     type=input.float, minval=0.0, step=0.1, defval=1.35) * 0.01
     
longStopPrice = 0.0

longStopPrice := if (strategy.position_size > 0)
    stopValue = close * (1 - longTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0

if (enterLong)
    strategy.entry("Open Long Position", strategy.long, orderSize, when=strategy.position_size <= 0)
    
if (enterShort)
    strategy.exit(id="Close Long Position", stop=longStopPrice)


//plot(strategy.equity)

Mais.