방향 이동 지수 쌍방향 거래 전략

저자:차오장, 날짜: 2023-12-19 14:13:52
태그:

img

전반적인 설명

이 전략은 상품의 방향 움직임 지수 (DI) 를 계산하고 이중 방향 거래를 구현하기 위해 한계 매개 변수와 결합합니다. DI +가 한계 매개 변수보다 크면 길고 DI-가 한계 매개 변수보다 크면 짧습니다.

전략 원칙

이 전략의 핵심 지표는 방향 운동 지수 (DI) 이다. DI는 다음 공식으로 계산된다:

DI+ = (DM+/진정한 범위) × 100 DI- = (DM-/진정한 범위) × 100

DM+는 방향 움직임의 긍정, DM-는 방향 움직임의 부정을 나타냅니다. 진정한 범위는 3 일 동안 전날의 최고 가격, 최저 가격 및 폐쇄 가격의 최대 값을 계산하여 최근의 변동성을 나타냅니다.

DI의 정의에 따르면, DI+ > DI-는 현재 시장 추진력이 강하다는 것을 의미하며, 황소 시장에 속합니다. DI- > DI+는 하위 시장의 추진력이 황소 시장에 속하는 황소 시장보다 강하다는 것을 의미합니다.

이 전략은 이 특징을 활용하여 한계 매개 변수를 설정한다. DI+가 한계 매개 변수보다 크면, 현재 시장이 황소 시장이며, 긴 시장을 가한다는 것을 결정한다. DI-가 한계 매개 변수보다 크면, 현재 시장이 곰 시장이며, 짧은 시장을 가한다는 것을 결정한다.

예를 들어, 한계 매개 변수가 3로 설정되면, 구체적인 거래 규칙은 다음과 같습니다.

  1. DI+ - DI- > 3가 되면, 길게 가세요
  2. DI- - DI+ > 3이 되면 단축

DI+와 DI- 사이에 종종 작은 변동 차이가 있기 때문에 제한 매개 변수를 설정하면 중요한 방향성이없는 일부 거래를 필터링하고 불필요한 거래를 줄일 수 있습니다. 이것은이 전략의 장점입니다.

이점 분석

이 전략의 주요 장점은 다음과 같습니다.

  1. DI는 시장 방향성을 판단하는 데 신뢰할 수 있습니다.

    DI는 황소와 곰의 힘을 계산하여 시장 추세를 직접 판단합니다. 이론은 곡선 적합성 같은 복잡한 알고리즘 없이 간단하고 신뢰할 수 있습니다.

  2. 한계 매개 변수는 신호를 효과적으로 필터할 수 있습니다.

    한계 매개 변수는 중요한 방향성이 없는 작은 변동을 필터링하여 중요한 방향성을 가진 섹션을 선택하여 함락되는 것을 피합니다.

  3. 자동화 된 쌍방향 거래

    긴 포지션과 짧은 포지션은 DI 지표에 따라 수동 판단 없이 자동으로 전환될 수 있어 거래의 어려움을 줄일 수 있습니다.

  4. 사용자 정의 가능한 거래 시간 프레임

    사용자 지정 가능한 날짜 범위 내에서만 거래하도록 설정하고 모든 포지션을 자동으로 닫는 것을 지원합니다. 유연하고 편리합니다.

  5. 길거나 짧은 것을 선택할 수 있습니다

    긴 스위치와 짧은 스위치를 통해, 단방향 신호만 선택하여 다른 시장 환경에 적합한 긴 또는 짧은 전략을 구현할 수 있습니다.

위험 분석

이 전략에는 몇 가지 위험도 있습니다.

  1. DI가 잘못된 신호를 줄 수 있는 가능성

    DI는 급격한 시장 변동이 발생했을 때 단기적으로 잘못된 신호를 줄 수 있으며 실패한 거래로 이어질 수 있습니다. 확인을 위해 다른 지표가 결합되어야합니다.

  2. 잘못된 제한 매개 변수 설정

    부적절한 높은 또는 낮은 제한 매개 변수 설정은 너무 적거나 너무 많은 거래 신호로 이어질 수 있습니다. 매개 변수는 시장에 따라 조정해야합니다.

  3. 트렌드 엔드포인트를 결정할 수 없습니다.

    DI는 현재 동향 방향만을 결정할 수 있으며 동향이 종료되었는지 또는 역전되었는지 판단할 수 없습니다. 다른 지표가 결합되어야합니다.

위험에 대한 해결책은 다음과 같습니다.

  1. 이동 평균과 다른 지표를 결합하여 DI 신호를 필터링합니다.

  2. 백테스트 결과를 기반으로 한 한계 매개 변수를 조정

  3. 트렌드 반전 여부를 결정하기 위해 볼륨, MACD 등을 결합합니다.

최적화 방향

이 전략은 다음과 같은 방법으로 더 이상 최적화 될 수 있습니다.

  1. 시장 프로파일과 같은 다른 트렌드 판단 지표를 결합하십시오.

    시장 프로파일과 같은 지표를 결합하여 길고 짧은 전력을 DI와 직관적으로 판단하면 판단 정확도를 향상시킬 수 있습니다.

  2. 스톱-프로프트 및 스톱-러스 전략을 추가합니다

    후속 스톱프로프트, 시간 또는 비율 스톱프로스트를 설정하면 수익을 확보하고 손실을 줄일 수 있습니다.

  3. 특정 제품의 매개 변수를 조정

    다른 제품 특성에 따라 제한 매개 변수와 거래 시간을 조정하면 전략 성과를 향상시킬 수 있습니다.

  4. 기계 학습을 이용한 동적 최적화

    강화 학습 알고리즘을 적용하여 실시간 신호에 기반한 매개 변수 설정을 동적으로 최적화합니다.

요약

요약하자면, 이 전략은 비교적 간단하고 실용적입니다. 시장 방향을 결정하기 위해 DI의 계산을 활용하고, 한계 매개 변수를 통해 신호를 필터합니다. 이중 방향 거래 또는 단기 / 단기만 지원하고, 거래 시간 프레임을 설정할 수 있습니다. 주요 장점은 높은 신뢰성 및 효과적인 신호 필터링입니다. 또한 잘못된 신호 및 매개 변수 설정과 같은 문제가 있습니다. 다른 지표, 중지 손실 / 이익 설정, 매개 변수 조정 등을 결합하여 개선하거나 기계 학습으로 동적으로 최적화하여 개선 할 수 있습니다. 전반적으로 좋은 결과를 위해 다른 전략과 결합하는 방향 지표로 적합합니다.


/*backtest
start: 2022-12-12 00:00:00
end: 2023-12-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Noro's DI Strategy", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
len = input(title="Length", defval=14)
limit = input(3, title = "limit, %")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//DI
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementMinus = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100

//Trend
trend = 0
trend := DIPlus > DIMinus + limit ? 1 : DIPlus < DIMinus - limit ? -1 : trend[1]

//Background
col = trend == 1 ? lime : red
bgcolor(col, transp = 80)

//Lines
plot(DIPlus, color=lime, title="DI+", linewidth = 3)
plot(DIMinus, color=red, title="DI-", linewidth = 3)

//Trading
size = strategy.position_size
lot = 0.0
lot := size != size[1] ? strategy.equity / close * capital / 100 : lot[1]
if trend == 1
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if trend == -1
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()

더 많은