이 전략은 상품의 방향 움직임 지수 (DI) 를 계산하고 이중 방향 거래를 구현하기 위해 한계 매개 변수와 결합합니다. DI +가 한계 매개 변수보다 크면 길고 DI-가 한계 매개 변수보다 크면 짧습니다.
이 전략의 핵심 지표는 방향 운동 지수 (DI) 이다. DI는 다음 공식으로 계산된다:
DI+ = (DM+/진정한 범위) × 100 DI- = (DM-/진정한 범위) × 100
DM+는 방향 움직임의 긍정, DM-는 방향 움직임의 부정을 나타냅니다. 진정한 범위는 3 일 동안 전날의 최고 가격, 최저 가격 및 폐쇄 가격의 최대 값을 계산하여 최근의 변동성을 나타냅니다.
DI의 정의에 따르면, DI+ > DI-는 현재 시장 추진력이 강하다는 것을 의미하며, 황소 시장에 속합니다. DI- > DI+는 하위 시장의 추진력이 황소 시장에 속하는 황소 시장보다 강하다는 것을 의미합니다.
이 전략은 이 특징을 활용하여 한계 매개 변수를 설정한다. DI+가 한계 매개 변수보다 크면, 현재 시장이 황소 시장이며, 긴 시장을 가한다는 것을 결정한다. DI-가 한계 매개 변수보다 크면, 현재 시장이 곰 시장이며, 짧은 시장을 가한다는 것을 결정한다.
예를 들어, 한계 매개 변수가 3로 설정되면, 구체적인 거래 규칙은 다음과 같습니다.
DI+와 DI- 사이에 종종 작은 변동 차이가 있기 때문에 제한 매개 변수를 설정하면 중요한 방향성이없는 일부 거래를 필터링하고 불필요한 거래를 줄일 수 있습니다. 이것은이 전략의 장점입니다.
이 전략의 주요 장점은 다음과 같습니다.
DI는 시장 방향성을 판단하는 데 신뢰할 수 있습니다.
DI는 황소와 곰의 힘을 계산하여 시장 추세를 직접 판단합니다. 이론은 곡선 적합성 같은 복잡한 알고리즘 없이 간단하고 신뢰할 수 있습니다.
한계 매개 변수는 신호를 효과적으로 필터할 수 있습니다.
한계 매개 변수는 중요한 방향성이 없는 작은 변동을 필터링하여 중요한 방향성을 가진 섹션을 선택하여 함락되는 것을 피합니다.
자동화 된 쌍방향 거래
긴 포지션과 짧은 포지션은 DI 지표에 따라 수동 판단 없이 자동으로 전환될 수 있어 거래의 어려움을 줄일 수 있습니다.
사용자 정의 가능한 거래 시간 프레임
사용자 지정 가능한 날짜 범위 내에서만 거래하도록 설정하고 모든 포지션을 자동으로 닫는 것을 지원합니다. 유연하고 편리합니다.
길거나 짧은 것을 선택할 수 있습니다
긴 스위치와 짧은 스위치를 통해, 단방향 신호만 선택하여 다른 시장 환경에 적합한 긴 또는 짧은 전략을 구현할 수 있습니다.
이 전략에는 몇 가지 위험도 있습니다.
DI가 잘못된 신호를 줄 수 있는 가능성
DI는 급격한 시장 변동이 발생했을 때 단기적으로 잘못된 신호를 줄 수 있으며 실패한 거래로 이어질 수 있습니다. 확인을 위해 다른 지표가 결합되어야합니다.
잘못된 제한 매개 변수 설정
부적절한 높은 또는 낮은 제한 매개 변수 설정은 너무 적거나 너무 많은 거래 신호로 이어질 수 있습니다. 매개 변수는 시장에 따라 조정해야합니다.
트렌드 엔드포인트를 결정할 수 없습니다.
DI는 현재 동향 방향만을 결정할 수 있으며 동향이 종료되었는지 또는 역전되었는지 판단할 수 없습니다. 다른 지표가 결합되어야합니다.
위험에 대한 해결책은 다음과 같습니다.
이동 평균과 다른 지표를 결합하여 DI 신호를 필터링합니다.
백테스트 결과를 기반으로 한 한계 매개 변수를 조정
트렌드 반전 여부를 결정하기 위해 볼륨, MACD 등을 결합합니다.
이 전략은 다음과 같은 방법으로 더 이상 최적화 될 수 있습니다.
시장 프로파일과 같은 다른 트렌드 판단 지표를 결합하십시오.
시장 프로파일과 같은 지표를 결합하여 길고 짧은 전력을 DI와 직관적으로 판단하면 판단 정확도를 향상시킬 수 있습니다.
스톱-프로프트 및 스톱-러스 전략을 추가합니다
후속 스톱프로프트, 시간 또는 비율 스톱프로스트를 설정하면 수익을 확보하고 손실을 줄일 수 있습니다.
특정 제품의 매개 변수를 조정
다른 제품 특성에 따라 제한 매개 변수와 거래 시간을 조정하면 전략 성과를 향상시킬 수 있습니다.
기계 학습을 이용한 동적 최적화
강화 학습 알고리즘을 적용하여 실시간 신호에 기반한 매개 변수 설정을 동적으로 최적화합니다.
요약하자면, 이 전략은 비교적 간단하고 실용적입니다. 시장 방향을 결정하기 위해 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()