이 문서에서는 간단한 이동 평균에 기반한 거래 전략을 논의합니다. 전략은 폐쇄 가격을 17 기간 이동 평균과 비교하여 종료 가격이 이동 평균 이상으로 넘어가면 길게 이동하고 아래로 넘어가면 짧게 이동합니다.
이 전략은 이동평균을 계산하기 위해 다음과 같은 매개 변수를 사용합니다.
이 매개 변수들을 바탕으로 getMAType (() 함수는 종료 가격의 17주기 SMA를 계산하기 위해 호출됩니다.
그 다음 폐쇄 가격과 이동 평균 사이의 관계를 비교합니다.
닫기 가격이 아래에서 이동 평균을 넘을 때, 긴 신호가 생성됩니다. 위에서 아래로 넘을 때, 짧은 신호가 생성됩니다.
백테스트 기간 동안 긴 신호가 나타나면 긴 포지션을 열고 짧은 신호가 나타나면 짧은 포지션을 열어야 합니다.
이 전략의 가장 큰 장점은 논리가 매우 간단하고 명확하다는 것입니다. 단 하나의 지표로 지표의 방향 변경에 따라 트렌드 역전을 판단합니다. 전략은 이해하기 쉽고 적용하기 쉽고 초보자도 배울 수 있습니다.
또한, 이동 평균은 트렌드를 따르는 지표에 속하며, 이는 트렌드 변화를 효과적으로 추적하고 단기 시장 소음의 간섭을 피할 수 있습니다.
매개 변수를 조정함으로써, 다른 사이클과 다른 제품에 적응할 수 있습니다.
첫째, 이 전략은 하나의 지표에만 의존하기 때문에 판단 기준은 비교적 단일화되어 더 많은 잘못된 신호를 생성할 수 있습니다.
또한, 추세를 따르는 시스템으로서, 범위와 측면 시장에서 잘 작동하지 않습니다.
게다가, 손해를 멈추거나 이익을 취하지 않으면 손실이 늘어날 위험이 있습니다.
해결책은 다른 지표를 통합하고, 잘못된 신호를 줄이기 위해 매개 변수 조합을 최적화하고, 위험을 통제하고, 마이너 다운을 최적화하기 위해 스톱 로스를 추가하고, 이윤을 취하는 것입니다.
전략 최적화를 위한 몇 가지 아이디어는 다음과 같습니다.
이동 평균 매개 변수를 조정하고 기간 수를 최적화합니다. 예를 들어 30 기간 또는 50 기간으로 변경하십시오.
EMA, VIDYA 등과 같은 다른 종류의 이동 평균을 시도하십시오. 그들은 가격 변화에 대한 다양한 감수성을 가지고 있습니다.
다른 지표를 조합하여 추가하십시오. 예를 들어 강도를 판단하기 위해 MACD; 잘못된 신호를 줄이기 위해 RSI.
스톱 로스 메커니즘을 추가합니다. 단일 거래 손실 금액을 제어하기 위해 고정 비율 또는 ATR 기반 후속 스톱 로스를 설정합니다.
이윤 취득 메커니즘을 추가하고 이윤을 극대화하기 위해 목표 수익 비율을 설정합니다.
이러한 최적화는 전략 성과를 더 안정적으로 만들 수 있고 과도한 마감을 피할 수 있습니다.
이 문서에서는 17주기 이동평균을 기반으로 한 간단한 거래 전략을 분석합니다. 전략은 간단한 신호 소스를 가지고 있으며, 이해하기 쉽고 구현하기 쉽고, 전형적인 트렌드 다음 시스템에 속합니다. 전략의 심층 해석을 통해 장단점을 분석하고, 최적화 아이디어의 여러 차원을 제안합니다. 지속적인 최적화와 풍부화를 통해이 전략이 점차 진화하고 라이브 거래에서도 안정적인 수익을 얻을 수 있다고 믿습니다.
/*backtest start: 2023-12-05 00:00:00 end: 2024-01-04 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Simple 17 BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0) /////////////// Time Frame /////////////// testStartYear = input(2012, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true ///////////// Moving Average ///////////// source = input(title="MA Source", defval=ohlc4) maType = input(title="MA Type", defval="sma", options=["sma", "ema", "swma", "wma", "vwma", "rma"]) length = input(title="MA Length", defval=17) ///////////// Get MA Function ///////////// getMAType(maType, sourceType, maLen) => res = sma(close, 1) if maType == "ema" res := ema(sourceType, maLen) if maType == "sma" res := sma(sourceType, maLen) if maType == "swma" res := swma(sourceType) if maType == "wma" res := wma(sourceType, maLen) if maType == "vwma" res := vwma(sourceType, maLen) if maType == "rma" res := rma(sourceType, maLen) res MA = getMAType(maType, source, length) /////////////// Strategy /////////////// long = close > MA short = close < MA last_long = 0.0 last_short = 0.0 last_long := long ? time : nz(last_long[1]) last_short := short ? time : nz(last_short[1]) long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) /////////////// Execution /////////////// if testPeriod() strategy.entry("L", strategy.long, when=long_signal) strategy.entry("S", strategy.short, when=short_signal) /////////////// Plotting /////////////// p1 = plot(MA, color = long ? color.lime : color.red, linewidth=2) p2 = plot(close, linewidth=2) fill(p1, p2, color=strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=80)