이 전략은 간단한 이동 평균 (SMA) 크로스오버 신호와 피크 드래운드 컨트롤을 결합한 긴 짧은 거래 시스템이다. 전략의 피크 드래운드를 동시에 모니터링하는 동안 장기 및 짧은 거래 신호를 생성하기 위해 14 기간 및 28 기간 SMA의 크로스오버를 사용합니다. 드래운드가 미리 설정된 임계치를 초과하면 전략은 자동으로 거래를 중단합니다. 또한 전략에는 트레이더가 전략의 위험 특성을 더 잘 이해하는 데 도움이되는 상세한 피크-투트 사이클 분석 기능이 포함되어 있습니다.
무역 신호 생성:
피크 드래운드 컨트롤:
피크에서 투 투 사이클 분석:
트렌드 추적과 위험 통제를 결합합니다. SMA 크로스오버 전략은 트렌드를 따르는 고전적인 방법이며, 피크 드래운 다운 컨트롤은 추가적인 리스크 관리 계층을 제공합니다. 이 조합은 시장 추세를 파악하면서 하향 리스크를 효과적으로 제어 할 수 있습니다.
높은 적응력: 최대 마이너스 마이너스 마이너스 마이너스 마이너스 마이너스 마이너스 마이너스 마이너스 마이너스 마이너스
투명한 위험 지표: 최고에서 최하위 사이클 분석은 역사적인 마감 정보를 상세히 제공하여 거래자가 전략의 위험 특성을 직관적으로 이해할 수 있으며 더 정보화된 거래 결정을 돕습니다.
자동화된 위험 관리: 유출액이 미리 설정된 임계치를 초과하면 전략은 자동으로 거래를 중단합니다. 이 메커니즘은 불리한 시장 조건에서 지속적인 손실을 효과적으로 방지 할 수 있습니다.
종합적인 성능 분석:
기존의 백테스팅 메트릭 외에도 전략은
역사적 자료에 지나치게 의존하는 것 SMA 크로스오버 전략은 역사적인 가격 데이터에 기초하고 있으며 빠르게 변화하는 시장에서 느리게 반응하여 잘못된 신호로 이어질 수 있습니다.
빈번한 거래 오스실레이션 시장에서, SMA는 자주 교차할 수 있으며, 이로 인해 과도한 거래와 높은 거래 비용이 발생할 수 있습니다.
큰 수출 가능성: 최대 마감 통제에도 불구하고, 심각한 시장 변동성 중 단 한 번의 큰 하락은 여전히 상당한 손실을 초래할 수 있습니다.
매개 변수 민감도: 전략 성능은 SMA 기간과 마감 기준의 선택에 크게 의존합니다. 부적절한 매개 변수 설정으로 인해 최적 이하의 결과가 발생할 수 있습니다.
놓친 기회: 최대 마이너그램에 도달한 후에 거래가 중단되면 전략은 시장 역전으로 인한 기회를 놓칠 수 있습니다.
동적 매개 변수 조정: 다른 시장 환경에 적응하기 위해 시장 변동성에 기초하여 동적으로 SMA 기간과 유출 문턱을 조정하는 것을 고려하십시오.
추가 시장 필터: 다른 기술적 지표나 RSI나 부피와 같은 근본적인 요소를 포함하여 잠재적 인 잘못된 신호를 필터링합니다.
단계적 입국과 출입을 실행: 모든 것 또는 아무것도 아닌 작업 대신, 단 하나의 결정의 위험을 줄이기 위해 단계적으로 포지션 구축 및 폐쇄를 실행하십시오.
이윤 취득 메커니즘을 추가: 유출 통제 외에도, 이윤을 확보하고 전체 수익을 향상시키기 위해 동적인 영업수익 기능을 추가합니다.
돈 관리 를 최적화 하라: 더 나은 위험 통제를 위해 계좌 크기 및 시장 변동성에 기초한 동적 위치 크기를 구현합니다.
기계 학습 알고리즘을 소개합니다: 기계 학습 기술을 사용하여 매개 변수 선택 및 신호 생성 프로세스를 최적화하여 전략 적응성과 정확성을 향상시킵니다.
스마 (SMA) 크로스오버 긴 단위 전략은 피크 드라우다운 컨트롤과 자동 종료와 결합하여 트렌드 따라와 리스크 관리를 균형 잡는 양적 거래 시스템이다. 간단한 이동 평균 크로스오버를 통해 시장 트렌드를 포착하고 피크 드라우다운 컨트롤을 사용하여 하향 리스크를 관리합니다. 전략의 독특한 특징은 세부적인 피크에서 최저 사이클 분석에 있으며, 거래자에게 전략의 리스크 특성을 깊이 이해하는 도구를 제공합니다.
이 전략은 역사적 데이터와 매개 변수 민감도에 대한 과도한 의존과 같은 일부 고유한 위험을 가지고 있지만 적절한 최적화 및 개선으로 안정성과 수익성을 크게 향상시킬 수 있습니다. 여기에는 동적 매개 변수 조정, 추가 시장 필터 추가 및 더 스마트한 돈 관리를 구현하는 것이 포함됩니다.
전체적으로,이 전략은 거래자에게 개인 거래 목표와 위험 선호도를 충족시키기 위해 추가로 사용자 정의 및 최적화 할 수있는 좋은 출발점을 제공합니다. 전략의 모듈형 설계는 또한 다른 거래 전략 또는 위험 관리 기술과 쉽게 통합 할 수 있으며, 더 복잡하고 포괄적인 거래 시스템을 구축하는 기초를 마련합니다.
/*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)