Esta estratégia é um sistema de negociação longo-curto que combina sinais de cruzamento de média móvel simples (SMA) com controle de pico de retirada. Ele usa o cruzamento de SMAs de 14 períodos e 28 períodos para gerar sinais de negociação longos e curtos enquanto monitora simultaneamente o pico de retirada da estratégia. Quando o drawdown excede um limiar pré-definido, a estratégia para automaticamente a negociação. Além disso, a estratégia inclui um recurso detalhado de análise de ciclo de pico a limite para ajudar os traders a entender melhor as características de risco da estratégia.
Geração de sinais comerciais:
Controle de extracção máxima:
Análise do ciclo de pico a pico:
Combina o seguimento de tendências e o controlo de riscos: A estratégia de cruzamento da SMA é um método clássico de seguimento de tendências, enquanto o controle de retirada de pico fornece uma camada adicional de gestão de risco.
Alta adaptabilidade: Ao parametrizar os limiares máximos e mínimos de utilização, a estratégia pode ser adaptada de forma flexível aos diferentes ambientes de mercado e às preferências pessoais em matéria de risco.
Indicadores de risco transparentes: A análise do ciclo de pico a fundo fornece informações históricas detalhadas sobre o aproveitamento, permitindo que os operadores entendam intuitivamente as características de risco da estratégia, ajudando a tomar decisões de negociação mais informadas.
Controle automatizado dos riscos: Quando a retirada excede o limiar pré-estabelecido, a estratégia para automaticamente as negociações.
Análise abrangente do desempenho: Além das métricas de backtesting convencionais, a estratégia fornece dados detalhados do pico ao mínimo do ciclo, incluindo percentagens de início, percentagens de retirada e informações sobre o tempo, facilitando uma análise aprofundada do desempenho da estratégia.
Sobreconfiança em dados históricos: A estratégia de cruzamento da SMA baseia-se em dados históricos de preços e pode reagir lentamente em mercados em rápida mudança, levando a sinais falsos.
Negociação frequente: Em mercados oscilantes, as SMAs podem cruzar-se com frequência, resultando em negociações excessivas e custos elevados de transação.
Potencial de grandes saques: Apesar do controlo máximo da retirada, uma única grande queda durante a forte volatilidade do mercado pode ainda resultar em perdas significativas.
Sensibilidade do parâmetro: O desempenho da estratégia é altamente dependente da escolha dos períodos de SMA e dos limiares de retirada.
Oportunidades perdidas de reversão: Quando a negociação para após atingir o limiar máximo de retirada, a estratégia pode perder oportunidades trazidas por reversões de mercado.
Introduzir Ajuste de Parâmetros Dinâmicos: Considerar o ajustamento dinâmico dos períodos de SMA e dos limiares de retirada com base na volatilidade do mercado para se adaptarem aos diferentes ambientes de mercado.
Filtros de mercado adicionais: Incorporar outros indicadores técnicos ou fatores fundamentais, tais como RSI ou volume, para filtrar potenciais sinais falsos.
Implementar a entrada e saída por fases: Em vez de operações de "tudo ou nada", implementar a construção e o encerramento de posições em fases para reduzir o risco de decisões únicas.
Adicionar Mecanismo de Aproveitamento: Além do controle de retirada, adicione uma função dinâmica de lucro para bloquear os lucros e melhorar os retornos globais.
Optimize a gestão do dinheiro: Implementar um dimensionamento dinâmico das posições com base no tamanho da conta e na volatilidade do mercado para um melhor controlo dos riscos.
Introduzir algoritmos de aprendizagem de máquina: Usar técnicas de aprendizagem de máquina para otimizar os processos de seleção de parâmetros e geração de sinais, melhorando a adaptabilidade e precisão da estratégia.
A estratégia de curto-longo cruzamento da SMA combinada com controle de pico e terminação automática é um sistema de negociação quantitativo que equilibra o seguimento da tendência e a gestão de riscos. Captura as tendências do mercado através de cruzamento de médias móveis simples, enquanto gerencia o risco de queda usando controle de pico. A característica única da estratégia reside em sua análise detalhada do ciclo pico a pico, fornecendo aos traders uma ferramenta para entender profundamente as características de risco da estratégia.
Embora a estratégia tenha alguns riscos inerentes, como a dependência excessiva de dados históricos e sensibilidade de parâmetros, ela pode melhorar significativamente sua robustez e lucratividade através de otimização e melhorias apropriadas.
Em geral, esta estratégia fornece aos traders um bom ponto de partida que pode ser personalizado e otimizado para atender aos objetivos individuais de negociação e preferências de risco.
/*backtest start: 2023-07-23 00:00:00 end: 2024-07-28 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ capital = 10000 //@version=5 strategy(title = "Correct Strategy Peak-Drawdown Cycles [Tradingwhale]", shorttitle = "Peak-Draw [Tradingwhale]", initial_capital = capital, overlay=true, margin_long=100, margin_short=100) // The code below is from Tradingwhale LLC /// ============================================================================== // Peak-Trough Cycles with Date and Prev. RunUp // Initialize variables showTable = input.bool(true, title = "Plot Peak to Bottom Drawdown Cycles table?") min_trough = input.float(3.0, title = "Define Minimum Drawdown/Trough to Display (%)", minval = 1, maxval = 100, step = 0.5, tooltip = "Peaks and Trough Cycles have to be roped in by either a lookback period or minmimum troughs to show. If you don't then every bar could be a peak or trough/bottom. I've decided to use minimum declines here because lookback seems more arbitrary.") maxdraw = input.float(40.0, title = "Max Drawdown", minval = 1, maxval = 100, step = 0.5, tooltip = "Define the drawdown level where the srtategy stops executing trades.") var float equityPeak = na var float equityTrough = na var int cycleCount = 0 var bool inDrawdown = false var float initialCapital = capital var float prevTrough = initialCapital var float prevRunUp = na var bool useLighterGray = true var int lastYear = na // Variable to indicate whether the strategy should end var bool end_strategy = false // Table to display data var table resultTable = table.new(position.top_right, 5, 30, bgcolor=#ffffff00, frame_color=#4f4040, frame_width=1) // Function to convert float to percentage string f_to_percent(value) => str.tostring(value, "#.##") + "%" // Function to get month/year string without commas get_month_year_string() => str.tostring(year) + "/" + str.tostring(month) // Update the table headers if (bar_index == 0 and showTable) table.cell(resultTable, 0, 0, "Show Min Trough: " + f_to_percent(min_trough), bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 1, 0, "Cycle Count", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 2, 0, "Prev.RunUp(%)", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 3, 0, "Drawdown(%)", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 4, 0, "Year/Month", bgcolor=#a8a8a88f, text_size=size.normal) // Track peaks and troughs in equity if (na(equityPeak) or strategy.equity > equityPeak) if (inDrawdown and strategy.equity > equityPeak and not na(equityTrough)) // Confirm end of drawdown cycle drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100 if drawdownPercentage > min_trough cycleCount += 1 prevRunUp := (equityPeak - prevTrough) / prevTrough * 100 if cycleCount <= 20 and showTable currentYear = year if na(lastYear) or currentYear != lastYear useLighterGray := not useLighterGray lastYear := currentYear rowColor = useLighterGray ? color.new(color.gray, 80) : color.new(color.gray, 50) table.cell(resultTable, 1, cycleCount, str.tostring(cycleCount), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 2, cycleCount, f_to_percent(prevRunUp), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 3, cycleCount, f_to_percent(drawdownPercentage), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 4, cycleCount, get_month_year_string(), bgcolor=rowColor, text_size=size.normal) prevTrough := equityTrough equityPeak := strategy.equity equityTrough := na inDrawdown := false else if (strategy.equity < equityPeak) equityTrough := na(equityTrough) ? strategy.equity : math.min(equityTrough, strategy.equity) inDrawdown := true // Calculate if the strategy should end if not na(equityPeak) and not na(equityTrough) drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100 if drawdownPercentage >= maxdraw end_strategy := true // This code below is from Tradingview, but with additions where commented (see below) longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28)) if (longCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/ strategy.entry("My Long Entry Id", strategy.long) shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28)) if (shortCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/ strategy.entry("My Short Entry Id", strategy.short)