롱 전략을 수행하기 위해 이동 평균과 결합된 모멘텀 지표


생성 날짜: 2024-02-29 11:57:18 마지막으로 수정됨: 2024-02-29 11:57:18
복사: 7 클릭수: 536
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

롱 전략을 수행하기 위해 이동 평균과 결합된 모멘텀 지표

개요

이 전략은 MACD 동력 지표와 DMI 트렌드 지표와 결합하여 조건이 있을 때 여러 작업을 수행한다. 그것의 exits는 수익을 잠금하기 위해 고정된 정지 및 사용자 정의 변동성 트레일링 스톱을 설정한다.

원칙

이 전략의 항목은 MACD와 DMI 지표에 의존합니다:

  • MACD가 양호한 경우 (MACD 라인이 신호 라인보다 높습니다) 시장의 흔들림이 강화된다는 것을 나타냅니다.
  • DMI의 DI+가 DI-보다 높을 때, 시장이 상승 추세에 있음을 나타냅니다.

위 두 가지 조건이 동시에 충족될 때, 더 많은 포지션을 니다.

Position exits는 두 가지 기준을 가지고 있습니다.

  • 고정 정지:close 가격 상승률이 설정된 시간 정지
  • 변동성 추적 스톱: ATR과 최근 최고 가격을 사용하여 동적으로 조정된 스톱 위치를 계산한다. 이것은 시장의 변동성에 따라 트레일링 스톱 손실이 될 수 있습니다.

장점

  • MACD와 DMI의 조합은 시장의 추세 방향을 더 안정적으로 판단하여 잘못된 작업을 줄일 수 있습니다.
  • 정지 조건은 고정 정지와 변동성 정지를 결합하여 수익을 유연하게 고정합니다.

위험

  • MACD와 DMI 모두 가짜 신호를 만들어 불필요한 손실을 초래할 수 있습니다.
  • 고정금액은 수익을 극대화하지 못할 수도 있습니다.
  • 변동성이 손상된 trails 속도는 부적절하게 조정되거나 너무 급진적이거나 보수적이 될 수 있습니다.

최적화 방향

  • KDJ 지표를 사용하여 과매매 또는 과매매를 판단하는 것과 같은 다른 지표 필터링 진입 신호를 추가하는 것을 고려할 수 있습니다.
  • 더 나은 정지 손실을 얻기 위해 다양한 매개 변수를 테스트 할 수 있습니다.
  • 특정 거래 유형에 따라 이동 평균과 같은 매개 변수를 조정할 수 있으며, 시스템을 최적화 할 수 있습니다.

요약하다

이 전략은 여러 지표들을 종합하여 시장의 경향과 조건을 판단하고, 확률이 유리할 경우에 개입한다. 정지 조건도 최적화 설계되어 있으며, 일정 수익을 보장하면서도 수익 잠금의 유연성을 고려한다. 매개 변수 조정과 추가적인 위험 관리를 통해 이 전략은 안정적인 출력을 가진 정량 거래 시스템으로 될 수 있다.

전략 소스 코드
/*backtest
start: 2024-01-29 00:00:00
end: 2024-02-28 00:00:00
period: 2h
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/
//@version=4
strategy(shorttitle='(MACD + DMI Scalping with Volatility Stop',title='MACD + DMI Scalping with Volatility Stop by (Coinrule)', overlay=true, initial_capital = 100, process_orders_on_close=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type=strategy.commission.percent, commission_value=0.1)

// Works better on 3h, 1h, 2h, 4h

//Backtest dates
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2021, title = "From Year",       type = input.integer, minval = 1970)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2112, title = "Thru Year",       type = input.integer, minval = 1970)

showDate  = input(defval = true, title = "Show Date Range", type = input.bool)

start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => true

// DMI and MACD inputs and calculations

[pos_dm, neg_dm, avg_dm] = dmi(14, 14)
[macd, macd_signal, macd_histogram] = macd(close, 12, 26, 9)


Take_profit= ((input (3))/100)

longTakeProfit = strategy.position_avg_price * (1 + Take_profit)

length = input(20, "Length", minval = 2)
src = input(close, "Source")
factor = input(2.0, "vStop Multiplier", minval = 0.25, step = 0.25)
volStop(src, atrlen, atrfactor) =>
    var max     = src
    var min     = src
    var uptrend = true
    var stop    = 0.0
    atrM        = nz(atr(atrlen) * atrfactor, tr)
    max         := max(max, src)
    min         := min(min, src)
    stop        := nz(uptrend ? max(stop, max - atrM) : min(stop, min + atrM), src)
    uptrend     := src - stop >= 0.0
    if uptrend != nz(uptrend[1], true)
        max    := src
        min    := src
        stop   := uptrend ? max - atrM : min + atrM
    [stop, uptrend]

[vStop, uptrend] = volStop(src, length, factor)


closeLong = close > longTakeProfit or crossunder(close, vStop)


//Entry 
strategy.entry(id="long", long = true, when = crossover(macd, macd_signal) and pos_dm > neg_dm and window())


//Exit
strategy.close("long", when = closeLong and window())