트레이딩VMA 전략은 변동 이동 평균 라인을 기반으로 한 양적 거래 전략입니다. 시장 트렌드를 파악하고 그에 따라 거래 신호를 생성하기 위해 변화하는 이동 평균을 사용합니다.
트레이딩VMA 전략의 핵심은 변수 길이 이동 평균 (Variable Moving Average, VMA) 의 계산이다. 이동 평균은 특정 기간 동안의 평균 가격을 계산하는 널리 알려진 기술적 지표이다. 트레이딩VMA 전략에서 사용되는 VMA는 다양한 기간 길이를 가지고 있다.
구체적으로, 전략은 먼저 가격 방향 움직임 지표 (PDM, MDIM), 부드러운 데이터 (PDM, MDMs) 와 같은 일련의 중간 양을 계산합니다. 이러한 데이터는 궁극적으로 지표 강도 (iS) 를 얻기 위해 사용됩니다. 이 지표는 가격 변동의 강도를 반영합니다.
다음으로, TradingVMA 전략은 지표 강도에 따라 이동 평균 기간을 동적으로 조정합니다. 시장 변동성이 증가하면 이동 평균 기간이 짧아지고 반대로됩니다. 이것은 시장 변화에 더 빠르게 대응 할 수 있습니다.
마지막으로, 전략은 현재 가격을 VMA와 비교하여 거래 신호를 생성합니다. 가격이 VMA보다 높을 때 길고 가격이 VMA보다 낮을 때 짧습니다.
트레이딩VMA 전략은 다음과 같은 주요 장점을 가지고 있습니다.
변수 기간 필터 소음 더 안정적
가격 변화에 더 빠른 반응은 반응성을 향상시킵니다 변동 이동 평균은 가격 변화에 신속하게 반응하고 트렌드 반전 지점을 파악 할 수 있습니다.
거래 빈도를 줄이고 과잉 거래가 적습니다. 고정 기간 지표와 비교하면 TradingVMA는 불필요한 거래를 줄일 수 있습니다.
사용자 지정 가능한 매개 변수 유연성 - 전략은 사용자가 다른 시장 환경에 맞게 선호도에 따라 매개 변수를 선택할 수 있습니다.
트레이딩VMA 전략은 또한 다음과 같은 주요 위험을 가지고 있습니다.
급격한 반전이 없는 경우 트렌드가 급격히 반전될 때, 지속적으로 조정되는 이동 평균은 반응에 지연할 수 있습니다.
뒤떨어진 편향
잘못된 신호
어려운 매개 변수 최적화
이러한 위험은 스톱 손실, 파라미터 조합 조정 등과 같은 방법을 통해 제어 할 수 있습니다.
트레이딩VMA 전략은 또한 다음과 같은 측면에서 향상될 수 있습니다.
다른 트렌드와 함께 다른 트렌드 표시기를 사용하면 신호 품질을 향상시킬 수 있습니다.
매개 변수 최적화
적응적인 거래 규칙
체계화
트레이딩VMA는 적응적인 양적 전략이다. 특히 설계된 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)