가변 이동 평균 트레이딩 VMA 전략


생성 날짜: 2024-02-21 11:47:43 마지막으로 수정됨: 2024-02-21 11:47:43
복사: 2 클릭수: 828
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

가변 이동 평균 트레이딩 VMA 전략

개요

트레이딩 VMA 전략은 변동 이동 평균에 기반한 정량 거래 전략이다. 이 전략은 변화하는 이동 평균을 사용하여 시장 추세를 포착하고 그에 따라 거래 신호를 생성한다.

전략 원칙

트레이딩 VMA 전략의 핵심은 변화하는 길이의 이동 평균을 계산하는 것이다. 이동 평균은 널리 알려진 기술 지표로, 일정 기간 동안의 평균 가격을 계산한다. 트레이딩 VMA 전략에서 사용되는 VMA에는 변화하는 주기 길이가 있다.

구체적으로, 이 전략은 우선 가격 방향 운동 지표 ((PDM, MDIM) 와 같은 일련의 중간값을 계산하고, 부드럽게 처리 된 데이터 ((PDMs, MDMs) 를 얻습니다. 이 데이터는 결국 지표의 강도를 얻는데 사용됩니다. (iS) 는 가격 변동의 강도를 반영합니다.

다음으로, TradingVMA 전략은 지표의 강도에 따라 이동 평균의 길이를 동적으로 조정합니다. 시장의 변동성이 증가하면 이동 평균의 주기가 짧아지고 반대로 주기가 길어집니다. 이것은 시장 변화에 더 빨리 반응 할 수 있습니다.

마지막으로, 전략은 현재 가격과 VMA의 크기를 비교하여 거래 신호를 생성합니다. 가격이 VMA보다 높을 때 더 많이하고, 가격이 VMA보다 낮을 때 더 많이하지 않습니다.

우위 분석

트레이딩 VMA 전략은 다음과 같은 주요 장점을 가지고 있습니다.

  1. 변동 주기 Filters Noise 더 안정적 - 변동 이동 평균 주기 시장 변화에 따라 조정되어, 파동 잡음을 필터링하여 더 안정적인 트렌드 신호를 얻을 수 있다.

  2. 가격 변화에 빠르게 반응 Improves Responsiveness - 변동 이동 평균은 가격 변화에 빠르게 반응하여 새로운 트렌드의 전환점을 잡을 수 있습니다.

  3. 거래 빈도를 줄여 Reduce Overtrading - 고정 주기 지표에 비해, TradingVMA는 불필요한 거래 횟수를 줄일 수 있다.

  4. 사용자 정의 가능한 매개 변수 (Flexible Parameters) - 이 정책은 사용자가 자신의 취향에 따라 매개 변수를 선택하여 다른 시장 환경에 적응하도록 허용합니다.

위험 분석

VMA 거래 전략에는 다음과 같은 주요 위험도 있습니다.

  1. Miss Rapid Reversals - 트렌드가 급격히 역전될 때, 지속적으로 조정되는 이동 평균은 반응하는 데 지연될 수 있다.

  2. 따라오기 편차에 영향을 받는 Lagging Bias - 모든 이동 평균 전략은 어느 정도 따라오기 편차를 갖는다.

  3. 다공간 실수 Wrong Signals - 가로 수직으로 정리된 시장에서, TradingVMA는 잘못된 다공간 신호를 생성할 수 있다.

  4. 매개 변수 최적화 난이도 - 최적의 매개 변수 조합을 찾는 것이 더 어려울 수 있다.

이 위험은 스톱 로즈, 변수 조합 조정 등의 방법으로 제어할 수 있다.

최적화 방향

트레이딩 VMA 전략은 다음과 같은 방향으로 최적화될 수 있습니다.

  1. 다른 지표와 통합 Combine Other Indicators - 다른 추세, 추세 역전과 같은 지표 조합을 사용하면 신호 품질을 향상시킬 수 있습니다.

  2. 최적의 파라미터 최적화 - 역사 회수 및 파라미터 최적화를 통해 최적의 파라미터 조합을 찾는다.

  3. 적응 트레이딩 규칙 (Adaptive Trading Rules) - 다른 시장 환경에 따라 다른 포지션 개시 규칙, 중단 규칙 등을 채택한다.

  4. 알고리즘 거래 체계화 Systemization - 전략을 알고리즘화하고 체계화하여 재검토 및 최적화를 용이하게 한다.

요약하다

트레이딩 VMA는 자기 적응형의 양적 전략이다. 그것은 시장의 추세를 포착하기 위해 특별히 설계된 VMA 지표를 사용하며, 신속한 반응과 소음을 필터링하는 장점을 가지고 있다. 이 전략은 더 나은 성능을 얻기 위해 여러 가지 방법으로 최적화 될 수 있다.

전략 소스 코드
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-24 23:59:59
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/
// © laptevmaxim92

//@version=4
strategy("Variable Moving Average Strategy", overlay=true)

src=close
l =input(5, title="VMA Length") 
std=input(true, title="Show Trend Direction Colors")

utp = input(false, "Use take profit?")
pr = input(100, "Take profit pips")
usl = input(false, "Use stop loss?")
sl = input(100, "Stop loss pips")
fromday = input(01, defval=01, minval=01, maxval=31, title="From Day")
frommonth = input(01, defval=01, minval= 01, maxval=12, title="From Month")
fromyear = input(2000, minval=1900, maxval=2100, title="From Year")
today = input(31, defval=01, minval=01, maxval=31, title="To Day")
tomonth = input(12, defval=12, minval=01, maxval=12, title="To Month")
toyear = input(2019, minval=1900, maxval=2100, title="To Year")

use_date = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 00, 00))

k = 1.0/l
pdm = 0.0
pdm := max((src - src[1]), 0)
mdm = 0.0
mdm := max((src[1] - src), 0)
pdmS = 0.0
pdmS := ((1 - k)*nz(pdmS[1]) + k*pdm)
mdmS = 0.0
mdmS := ((1 - k)*nz(mdmS[1]) + k*mdm)
s = pdmS + mdmS
pdi = pdmS/s
mdi = mdmS/s
pdiS = 0.0
pdiS := ((1 - k)*nz(pdiS[1]) + k*pdi)
mdiS = 0.0
mdiS := ((1 - k)*nz(mdiS[1]) + k*mdi)
d = abs(pdiS - mdiS)
s1 = pdiS + mdiS
iS = 0.0
iS := ((1 - k)*nz(iS[1]) + k*d/s1)
hhv = highest(iS, l) 
llv = lowest(iS, l) 
d1 = hhv - llv
vI = (iS - llv)/d1
vma = 0.0
vma := (1 - k*vI)*nz(vma[1]) + k*vI*src
vmaC=(vma > vma[1]) ? color.lime : (vma<vma[1]) ? color.red : (vma==vma[1]) ? color.yellow : na 
plot(vma, color=std?vmaC:color.white, linewidth=3, title="VMA")

longCondition = vma > vma[1]
if (longCondition)
    strategy.entry("BUY", strategy.long and use_date)

shortCondition = vma < vma[1]
if (shortCondition)
    strategy.entry("SELL", strategy.short and use_date)

if (utp and not usl)
    strategy.exit("TP", "BUY", profit = pr)
    strategy.exit("TP", "SELL", profit = pr)
    
if (usl and not utp)
    strategy.exit("SL", "BUY", loss = sl)
    strategy.exit("SL", "SELL", loss = sl)
    
if (usl and utp)
    strategy.exit("TP/SL", "BUY", loss = sl, profit = pr)
    strategy.exit("TP/SL", "SELL", loss = sl, profit = pr)