Posição dinâmica trailing stop loss SMA estratégia de cruzamento retração

SMA MA RRR TP SL
Data de criação: 2025-02-21 13:51:50 última modificação: 2025-02-21 13:51:50
cópia: 0 Cliques: 338
2
focar em
319
Seguidores

Posição dinâmica trailing stop loss SMA estratégia de cruzamento retração Posição dinâmica trailing stop loss SMA estratégia de cruzamento retração

Visão geral

Esta estratégia é um sistema de negociação automatizado baseado em cruzamentos de equilíbrio e gerenciamento de posições dinâmicas. Utiliza a média móvel simples de 50 e 200 dias (SMA) como indicador principal, combinado com o ajuste de posições dinâmicas e o mecanismo de rastreamento de stop loss, para procurar oportunidades de negociação em tendências de mercado. O núcleo da estratégia é determinar a direção do mercado através da relação entre o preço e a equilíbrio, ao mesmo tempo em que aplica gerenciamento de capital e controle de risco para garantir a estabilidade da negociação.

Princípio da estratégia

A estratégia funciona com base nos seguintes princípios:

  1. O sinal de entrada é baseado no cruzamento do preço com a linha média de 50 dias, enquanto que a referência à posição relativa da linha média de 50 dias com a linha média de 200 dias para julgar a grande tendência
  2. Quando o preço se move para baixo da linha média, um sinal de multiplicação é acionado; o contrário, um sinal de ruptura é acionado
  3. Gerenciamento de posições com mecanismo de ajuste dinâmico, aumentando o número de posições mantidas quando o lucro da conta ultrapassa 4000
  4. O Stop Loss usa um mecanismo de tracking de stop loss, que ajusta dinamicamente a posição de stop loss à medida que o lucro aumenta
  5. A taxa de risco-benefício é definida em 1:2.5, garantindo que os lucros esperados de cada transação sejam maiores do que os riscos

Vantagens estratégicas

  1. A lógica de negociação é clara, combinada com indicadores técnicos e comportamento de preços para determinar o momento de entrada
  2. Adotar gestão de posições dinâmicas para aumentar a escala de negociação adequadamente e aumentar a eficiência de utilização de fundos em momentos de lucro
  3. O mecanismo de tracking de stop-loss é eficaz para bloquear os lucros e evitar grandes retrações
  4. Configuração de filtro de horário de negociação, operando apenas durante os principais horários de negociação, evitando o risco de períodos de baixa liquidez
  5. Mecanismos de controlo de risco, incluindo paradas, metas de ganhos e gestão de posições

Risco estratégico

  1. Pode desencadear frequentemente falsos sinais de ruptura em mercados turbulentos, resultando em interrupções contínuas
  2. A gestão de posições dinâmicas pode trazer grandes perdas em momentos de mudanças bruscas no mercado.
  3. A dependência de um sistema linear pode atrasar a reação em mercados de rápida oscilação
  4. Risco-benefício fixo pode perder algumas oportunidades de grandes tendências em potencial
  5. A restrição do horário de negociação pode ter deixado escapar importantes oportunidades de mercado.

Direção de otimização da estratégia

  1. Pode introduzir indicadores de volatilidade para ajustar dinamicamente os parâmetros em diferentes cenários de mercado
  2. Considere adicionar um indicador de sentimento de mercado para melhorar a precisão dos sinais de entrada
  3. Optimizar os parâmetros de stop loss para melhor adaptá-los a diferentes cenários de mercado
  4. Aumentar a análise de múltiplos ciclos de tempo e aumentar a estabilidade do sistema de negociação
  5. Introdução de análise de tráfego para aumentar a confiabilidade do sinal

Resumir

A estratégia, combinando um sistema de linha uniforme, gerenciamento de posição dinâmica e mecanismo de rastreamento de stop loss, constrói um sistema de negociação relativamente completo. A vantagem da estratégia é ter uma lógica de negociação clara e um mecanismo de controle de risco perfeito, mas também há algumas áreas que precisam de otimização.

Código-fonte da estratégia
/*backtest
start: 2024-02-22 00:00:00
end: 2025-02-19 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/

//@version=5
strategy("15m - Rebound 50SMA with Dynamic Lots & Trailing Stop, RRR 2:1, Date Filter (Closed Bars Only)", 
     overlay=true, 
     initial_capital=50000, 
     default_qty_type=strategy.fixed, 
     default_qty_value=1, 
     pyramiding=0, 
     calc_on_order_fills=true)

// ===== INPUTS =====
sma50Period  = input.int(50, "50 SMA Period", minval=1)
sma200Period = input.int(200, "200 SMA Period", minval=1)

// ===== CALCULATE SMAs =====
sma50  = ta.sma(close, sma50Period)
sma200 = ta.sma(close, sma200Period)

// ===== PLOT SMAs =====
plot(sma50, color=color.red, title="50 SMA")
plot(sma200, color=color.blue, title="200 SMA")

// ===== DEFINE TRADING SESSIONS =====
// Trading is allowed 15 minutes after market open:
//   - New York: 09:45–16:00 (America/New_York)
//   - London:   08:15–16:00 (Europe/London)
nySession     = not na(time("15", "0945-1600", "America/New_York"))
londonSession = not na(time("15", "0815-1600", "Europe/London"))
inSession     = nySession or londonSession

// ===== DEFINE DATE RANGE =====
// Only allow orders on or after January 1, 2024.
// (We include seconds in the timestamp for proper parsing.)
startDate   = timestamp("UTC", 2024, 1, 1, 0, 0, 0)
inDateRange = time >= startDate

// ===== DEFINE ENTRY CONDITIONS =====
// ----- LONG ENTRY CONDITION -----
// A long entry is triggered when:
//   - The previous candle closed below the 50 SMA and the current candle closes above it,
//   - And the 50 SMA is above the 200 SMA.
longCondition = (close[1] < sma50[1]) and (close > sma50) and (sma50 > sma200)

// ----- SHORT ENTRY CONDITION -----
// A short entry is triggered when:
//   - The previous candle closed above the 50 SMA and the current candle closes below it,
//   - And the 50 SMA is below the 200 SMA.
shortCondition = (close[1] > sma50[1]) and (close < sma50) and (sma50 < sma200)

// ===== DEBUG PLOTS =====
plotshape(longCondition and barstate.isconfirmed, title="Long Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.tiny)
plotshape(shortCondition and barstate.isconfirmed, title="Short Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.tiny)

// ===== VARIABLES FOR STOP LOSS MANAGEMENT =====
// For long positions.
var float initialLongStop = na   // Set at entry: low of the rebound candle.
var float trailStopLong   = na   // Updated trailing stop for long.
// For short positions.
var float initialShortStop = na  // Set at entry: high of the rebound candle.
var float trailStopShort   = na  // Updated trailing stop for short.

// ===== DYNAMIC LOT SIZE =====
// If current profit (strategy.equity - 50000) exceeds 4000, lot size becomes 3; otherwise, 2.
lotSize = (strategy.equity - 50000 > 4000) ? 3 : 2

// ===== ENTRY LOGIC (EXECUTED ON CONFIRMED BARS) =====
if barstate.isconfirmed and inSession and inDateRange and longCondition and strategy.position_size <= 0
    initialLongStop := low
    trailStopLong   := initialLongStop
    if strategy.position_size < 0
        strategy.close("Short", comment="Close Short before Long")
    // Submit a market order entry (no offset).
    strategy.entry("Long", strategy.long, qty=lotSize, comment="Enter Long")
    
if barstate.isconfirmed and inSession and inDateRange and shortCondition and strategy.position_size >= 0
    initialShortStop := high
    trailStopShort   := initialShortStop
    if strategy.position_size > 0
        strategy.close("Long", comment="Close Long before Short")
    // Submit a market order entry (no offset).
    strategy.entry("Short", strategy.short, qty=lotSize, comment="Enter Short")
    
// ===== TRAILING STOP LOGIC & EXIT ORDERS (ON CLOSED BARS) =====

if barstate.isconfirmed and strategy.position_size > 0
    // For Long Positions:
    floatingProfitLong = (close - strategy.position_avg_price) / syminfo.mintick
    newTrailLong = trailStopLong  // Default: no change.
    if floatingProfitLong >= 20 and floatingProfitLong < 30
        newTrailLong := initialLongStop + 5 * syminfo.mintick
    else if floatingProfitLong >= 31 and floatingProfitLong < 40
        newTrailLong := initialLongStop + 10 * syminfo.mintick
    else if floatingProfitLong >= 41 and floatingProfitLong < 50
        newTrailLong := initialLongStop + 15 * syminfo.mintick
    // Update trailing stop only if the new value is more favorable.
    trailStopLong := math.max(trailStopLong, newTrailLong)
    
    longRisk = strategy.position_avg_price - trailStopLong
    tpLong   = strategy.position_avg_price + 2.5 * longRisk
    strategy.exit("Exit Long", from_entry="Long", stop=trailStopLong, limit=tpLong)

if barstate.isconfirmed and strategy.position_size < 0
    // For Short Positions:
    floatingProfitShort = (strategy.position_avg_price - close) / syminfo.mintick
    newTrailShort = trailStopShort  // Default: no change.
    if floatingProfitShort >= 20 and floatingProfitShort < 30
        newTrailShort := initialShortStop - 5 * syminfo.mintick
    else if floatingProfitShort >= 31 and floatingProfitShort < 40
        newTrailShort := initialShortStop - 10 * syminfo.mintick
    else if floatingProfitShort >= 41 and floatingProfitShort < 50
        newTrailShort := initialShortStop - 15 * syminfo.mintick
    // Update trailing stop only if the new value is more favorable.
    trailStopShort := math.min(trailStopShort, newTrailShort)
    
    shortRisk = trailStopShort - strategy.position_avg_price
    tpShort = strategy.position_avg_price - 2.5 * shortRisk
    strategy.exit("Exit Short", from_entry="Short", stop=trailStopShort, limit=tpShort)