적응형 변동성 및 모멘텀 양적 거래 시스템(AVMQTS)

ATR MACD SMA TP SL
생성 날짜: 2024-11-27 14:20:24 마지막으로 수정됨: 2024-11-27 14:20:24
복사: 1 클릭수: 459
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

적응형 변동성 및 모멘텀 양적 거래 시스템(AVMQTS)

개요

이 전략은 변동률과 동력 지표가 결합된 자기 적응 거래 시스템으로, 여러 기술 지표의 협동 조합을 통해 시장 추세를 포착한다. 이 전략은 ATR 지표를 사용하여 시장 변동성을 모니터링하고, MACD는 트렌드 동력을 판단하며, 가격 동력 지표와 결합하여 거래 신호를 확인하고, 유연한 스톱 스톱 손실 메커니즘을 설정한다. 이 시스템은 매우 적응성이 강하여 시장 상황에 따라 거래 주파수와 포지션 통제를 자동으로 조정할 수 있다.

전략 원칙

전략은 주로 트리플 지표 체계를 핵심 거래 논리로 의존한다. 첫째, ATR을 사용하여 시장의 변동성을 측정하여 거래 의사 결정에 변동성을 참조한다. 둘째, MACD 지표의 금포크 사십자를 사용하여 트렌드 전환점을 포착한다. MACD 빠른 선과 느린 선의 교차는 주요 거래 촉발 신호로 사용된다.

전략적 이점

  1. 다중 지표 크로스 검증: 변동률, 경향, 동력의 3 차원의 지표의 연동으로 거래 신호의 신뢰도를 크게 향상시킵니다.
  2. 자기 적응력: 전략은 시장의 변동 상황에 따라 동적으로 조정되어 다른 시장 환경에 적응할 수 있다.
  3. 리스크 관리가 완벽합니다: 단편 거래의 위험을 효과적으로 제어하기 위해 Stop Loss 및 Stop Stop 비율을 설정합니다.
  4. 거래 주파수 제어: 최소 거래 간격과 신호 교환 메커니즘을 설정하여 과도한 거래를 피하십시오.
  5. 시스템 구조는 명확하다: 코드 모듈화가 높고, 각 기능 모듈의 경계도 명확하여 유지 및 최적화를 용이하게 한다.

전략적 위험

  1. 흔들림 시장의 위험: 가로판 흔들림 시장에서, 거짓 신호가 여러 번 발생하여 연속적인 손실이 발생할 수 있습니다.
  2. 슬라이드 포인트 위험: 급격한 변동 기간 동안 실제 거래 가격은 신호 촉발 가격과 큰 편차가 있을 수 있다.
  3. 매개 변수 감수성: 전략은 여러 가지 기술 지표를 사용하며, 매개 변수 설정의 합리성은 전략의 성능에 직접적인 영향을 미친다.
  4. 시장 환경 의존성: 전략은 트렌드가 뚜렷한 시장에서 잘 작동하지만 다른 시장 조건에서는 효과가 좋지 않을 수 있다.

전략 최적화 방향

  1. 시장 환경 식별 메커니즘을 도입: 트렌드 강도 지표를 추가할 수 있으며, 다른 시장 환경에서 다른 파라미터 구성을 채택한다.
  2. 스톱 스톱 손실 메커니즘을 최적화: ATR의 동력에 따라 스톱 스톱 손실 비율을 조정하여 시장의 변동에 더 적합하도록 고려할 수 있습니다.
  3. 포지션 관리를 늘리십시오: 변동성에 기반한 동적 포지션 관리 시스템을 도입하여 높은 변동성 기간 동안 거래 규모를 적절하게 줄이는 것이 좋습니다.
  4. 더 많은 필터링 조건을 추가합니다. 신호 품질을 높이기 위해 트래픽, 변동률 등의 필터링 지표를 추가하는 것이 고려될 수 있습니다.

요약하다

이 전략은 합리적이고 논리적으로 설계된 정량 거래 시스템으로, 다수의 기술 지표의 조합을 통해 시장 추세를 효과적으로 포착합니다. 시스템은 위험 제어 및 거래 실행 측면에서 세심한 고려를 하고 있으며, 실용성이 좋습니다. 약간의 잠재적인 위험이 있지만, 제안된 최적화 방향에 의해 전략의 안정성과 수익성은 더욱 향상될 것으로 예상됩니다.

전략 소스 코드
/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-25 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("[ETH] Volatility & Momentum Adaptive Strategy", shorttitle="Definitive 1 day Ethereum Signal", overlay=true, initial_capital=10000, currency=currency.USD)

// === Input Parameters === //
trade_size = input.float(5, title="Trade Size (ETH)")
atr_length = input.int(8, minval=1, title="ATR Length")
macd_fast = input.int(8, minval=1, title="MACD Fast Length")
macd_slow = input.int(7, minval=1, title="MACD Slow Length")
macd_signal = input.int(9, minval=1, title="MACD Signal Length")
momentum_length = input.int(37, title="Momentum Length")
stop_loss_percent = input.float(9.9, title="Stop Loss Percentage (%)")
take_profit_percent = input.float(9.0, title="Take Profit Percentage (%)")
alternate_signal = input.bool(true, title="Alternate Buy/Sell Signals")

// === Indicators === //
// ATR to measure volatility
atr = ta.atr(atr_length)

// MACD for trend momentum
[macd_line, signal_line, _] = ta.macd(close, macd_fast, macd_slow, macd_signal)
macd_cross_up = ta.crossover(macd_line, signal_line)
macd_cross_down = ta.crossunder(macd_line, signal_line)

// Momentum
momentum = ta.mom(close, momentum_length)

// === Signal Control Variables === //
var bool last_signal_long = na
var int last_trade_bar = na
min_bars_between_trades = 5 // Adjust for minimal trade frequency control
time_elapsed = na(last_trade_bar) or (bar_index - last_trade_bar) >= min_bars_between_trades

// === Buy and Sell Conditions === //
// Buy when:
buy_signal = (macd_cross_up and momentum > 0 and close > ta.sma(close, 50) and time_elapsed)

// Sell when:
sell_signal = (macd_cross_down and momentum < 0 and close < ta.sma(close, 50) and time_elapsed)

// Enforce alternate signals if selected
if alternate_signal
    buy_signal := buy_signal and (na(last_signal_long) or not last_signal_long)
    sell_signal := sell_signal and (not na(last_signal_long) and last_signal_long)

// === Trade Execution === //
// Buy Position
if (buy_signal)
    if strategy.position_size < 0
        strategy.close("Short")
    strategy.entry("Long", strategy.long, qty=trade_size)
    last_signal_long := true
    last_trade_bar := bar_index

// Sell Position
if (sell_signal)
    if strategy.position_size > 0
        strategy.close("Long")
    strategy.entry("Short", strategy.short, qty=trade_size)
    last_signal_long := false
    last_trade_bar := bar_index

// === Stop Loss and Take Profit === //
if strategy.position_size > 0
    long_take_profit = strategy.position_avg_price * (1 + take_profit_percent / 100)
    long_stop_loss = strategy.position_avg_price * (1 - stop_loss_percent / 100)
    strategy.exit("TP/SL Long", from_entry="Long", limit=long_take_profit, stop=long_stop_loss)

if strategy.position_size < 0
    short_take_profit = strategy.position_avg_price * (1 - take_profit_percent / 100)
    short_stop_loss = strategy.position_avg_price * (1 + stop_loss_percent / 100)
    strategy.exit("TP/SL Short", from_entry="Short", limit=short_take_profit, stop=short_stop_loss)

// === Visual Signals === //
plotshape(series=buy_signal and time_elapsed, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="BUY")
plotshape(series=sell_signal and time_elapsed, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL")