이 전략은 빠른 이동 평균선과 느린 이동 평균선 사이의 차이를 계산하여 MACD 지표를 생성하고 신호선과 함께 금융 시장의 트렌드 및 과잉 구매 / 과잉 판매 영역을 판단합니다. 가격이 200 일 MA 이상인 동안 MACD 및 신호선이 황금 십자가를 형성 할 때 길게 이동하고 가격이 200 일 MA 이하인 동안 죽은 십자가를 형성 할 때 짧게됩니다. 이것은 전형적인 이중 이동 평균 크로스오버 브레이크오버 전략에 속합니다.
기본 논리는 시장 트렌드 방향을 결정하기 위해 빠르고 느린 MA 차이에서 생성된 MACD 지표를 사용하고, 과잉 구매 / 과잉 판매 수준을 판단하기 위해 신호 라인을 사용합니다. MACD와 신호 라인이 골든 크로스를 형성할 때, 그것은 긴 신호입니다. 죽은 크로스를 형성할 때, 그것은 짧은 신호입니다. 한편, 그것은 200 일 MA와 가격의 관계를 사용하여 신호를 필터링합니다.
특정 계산 방법은 다음과 같습니다.
MACD가 신호선을 넘어서면 둘 다 0보다 낮을 때, 그것은 골든 크로스 긴 신호입니다. MACD가 신호선을 넘어서면 둘 다 0보다 높을 때, 그것은 죽은 크로스 짧은 신호입니다. 한편, 가격이 200 일 MA 이상일 때만 길고 가격이 200 일 MA 이하일 때 짧습니다.
MA 기간을 단축하고 다른 지표를 추가하고 스톱 로스를 추가함으로써 위험을 줄일 수 있습니다.
1.15M에서 1D까지의 다양한 시간 프레임에서 테스트, 위험 조정 수익에서 4H에서 최적의 결과
2. 빠른 및 느린 MA를 최적화하여 MACD가 주기를 포착합니다. 7-21은 15m에 좋습니다.
3.MACD에 대한 Hull MA는 좋은 결과를 얻었습니다.
4.후속 손실 중단은 위험 관리에 도움이 됩니다
이것은 전체적으로 매우 간단하고 실용적인 전략이며, 이중 지표 시스템과 가격 필터링을 통해 높은 확률의 거래 신호를 생성합니다. 비교적 높은 이익 마진을 가지고 있으며, 과도한 최적화를 피하기 위해 고전적인 MACD 매개 변수 조합을 사용합니다. 여전히 MA 매개 변수를 조정하여 최적화 할 수있는 많은 공간이 있으며, 성능을 더 향상시키기 위해 다른 지표와 스톱 로스 메커니즘을 추가합니다. 전반적으로 기본에 기반한 전형적인 양적 전략입니다.
/*backtest start: 2024-02-14 00:00:00 end: 2024-02-21 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Hurmun //@version=4 strategy("Simple MACD strategy ", overlay=true, margin_long=100, margin_short=100) fast_length = input(title="Fast Length", type=input.integer, defval=12) slow_length = input(title="Slow Length", type=input.integer, defval=26) src = input(title="Source", type=input.source, defval=close) signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9) sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=false) sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=false) // Plot colors col_grow_above = #26A69A col_grow_below = #FFCDD2 col_fall_above = #B2DFDB col_fall_below = #EF5350 col_macd = #0094ff col_signal = #ff6a00 // Calculating fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length) slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length) macd = fast_ma - slow_ma signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length) hist = macd - signal movinga2 = input(title="movinga 2", type=input.integer, defval=200) movinga200 = sma(close, movinga2) plot(movinga200, "MA", color.orange) longCondition = crossover(macd, signal) and macd < 0 and signal < 0 and close > movinga200 if (longCondition) strategy.entry("My Long Entry Id", strategy.long) shortCondition = crossunder(macd, signal) and macd > 0 and signal > 0 and close < movinga200 if (shortCondition) strategy.entry("My Short Entry Id", strategy.short) shortProfitPerc = input(title="Short Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100 longProfitPerc = input(title="Long Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100 stoploss = input(title="stoploss in %", minval = 0.0, step=1, defval=2) /100 longStoploss = strategy.position_avg_price * (1 - stoploss) longExitPrice = strategy.position_avg_price * (1 + longProfitPerc) shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc) shortStoploss = strategy.position_avg_price * (1 + stoploss) if (strategy.position_size > 0 ) strategy.exit(id="XL TP", limit=longExitPrice, stop=longStoploss) if (strategy.position_size < 0 ) strategy.exit(id="XS TP", limit=shortExitPrice, stop=shortStoploss)