
이 전략은 MACD 지표를 사용하여 다공간 방향을 식별하는 트렌드 추적 전략이다. 그것은 빠른 이동 평균과 느린 이동 평균의 차이를 계산하여 MACD 주선을 생성한다. 전략은 MACD 주선과 신호 선의 황금 횡단을 사용하여 구매 신호를 생성하고, 사다리 횡단을 사용하여 판매 신호를 생성하여 다공간 균형 추적을 구현한다.
코드는 먼저 역측정 시작 시간을 설정하여 전략의 역사적 성능을 테스트합니다.
그 다음으로 MACD 지표의 계산이 이루어지며, 빠른 이동 평균, 느린 이동 평균, MACD 평균선의 길이가 설정된다. 빠른 선은 더 민감하게 반응하고 느린 선은 더 안정적으로 반응한다. 그들의 차이는 MACD 주선을 형성하고, 이후 평균선으로 MACD 신호선을 형성한다. 차이는 0축을 통과할 때 다중 머리 신호를 생성하고, 0축을 통과할 때 공백 신호를 생성한다.
다중 및 공백 신호에 따라 마지막으로 신호를 생성한 시간을 기록하십시오. 빠른 라인과 느린 라인이 교차 할 때 구매 / 판매 신호를 확인하고 기록하면 입장을 열 수 있습니다.
진입 후, 상위 가격과 하위 가격을 지속적으로 추적한다. 손실이 그 비율에 도달했을 때 손실을 중지하고 퇴출한다.
MACD 지표는 트렌드를 효과적으로 식별할 수 있으며, 기술 분석의 고전 지표 중 하나입니다.
빠른 속도 평균의 차차 디자인은 가격 변화의 동력과 방향을 조기에 파악할 수 있다.
평행선의 필터링 작용을 이용하여 일부 가짜 신호를 필터링할 수 있다.
이 전략은 위험을 통제하기 위해 스톱로스 메커니즘을 추가했습니다.
MACD 지표는 가짜 신호를 발생하기 쉽다. 지표 자체는 최적화 공간이 제한된다.
스톱포인트 설정이 잘못되면 너무 활성화되거나 보수적으로 변할 수 있으며, 다른 품종에 따라 개별적으로 최적화해야 합니다.
고정된 수량 포지션은 레버리지를 너무 높게 만들 수 있으며, 자본 규모에 따라 리스크 을 설정하는 것을 고려할 수 있다.
회귀 시간 창을 선택하는 합리성은 확인해야 하며, 과 적합함을 피한다.
속속평균선변수组合을 최적화하여, 서로 다른 품종에 대한 최적의 변수를 찾아 모색한다.
K선 형태, 브린 밴드, RSI 등과 같은 다른 지표 필터를 추가하여 신호를 검증하십시오.
회수, 샤프 비율 등의 지표에 따라 다양한 스톱포드의 효과를 평가할 수 있다.
손해 중지 전략의 최적화, 예를 들어 이동 손해 중지, 단 하나 손해 중지 등의 방법.
자금의 변화, 변동성 등에 따라 역동적인 포지션을 설정하십시오.
MACD 다공간 균형 전략은 클래식 기술 지표에 기반한 트렌드 추적 전략이다. 가격 변화 동력에 민감한 포착 능력을 가지고 있으며, 파라미터 최적화를 통해 다양한 품종에 잘 적응할 수 있다. 더 많은 파동 지표, 스톱 스포트 방식 및 동적 포지션 관리와 결합하면 전략의 안정성과 수익성을 계속 향상시킬 수 있다.
/*backtest
start: 2023-09-16 00:00:00
end: 2023-10-16 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
strategy("MACD 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)
/////////////// Component Code Start ///////////////
testStartYear = input(2017, "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)
// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)
testPeriod() => true
/////////////// MACD Component - Default settings for one day. ///////////////
fastLength = input(12) // 72 for 4hr
slowlength = input(26) // 156 for 4 hr
MACDLength = input(12) // 12 for 4hr
MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD
long = crossover(delta, 0)
short = crossunder(delta, 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)
last_open_long_signal = long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal = short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = long_signal ? time : nz(last_long_signal[1])
last_short_signal = short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low = not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
sl_inp = input(5.0, title='Stop Loss %', type=float)/100
/////////////// Strategy Component ///////////////
// Strategy Entry
if testPeriod()
strategy.entry("Long Entry", strategy.long, when=long_signal)
strategy.entry("Short Entry", strategy.short, when=short_signal)
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL
slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na
// Strategy SL Exit
if testPeriod()
strategy.exit("Long SL", "Long Entry", stop=long_sl, when=since_longEntry > 1)
strategy.exit("Short SL", "Short Entry", stop=short_sl, when=since_shortEntry > 1)
//plot(strategy.equity, title="equity", color=blue, linewidth=2, style=areabr)