동적 이동 평균 전략

저자:차오장날짜: 2023-11-23 11:39:24
태그:

img

전반적인 설명

이 전략은 동적 이동 평균 전략 (Dynamic Moving Average Strategy) 이라고 불린다. 주요 아이디어는 이동 평균의 방향과 가격과의 관계를 사용하여 트렌드를 결정하는 것이다. 트렌드 방향에 따라 시장에 진입하고 트렌드가 없을 때 포지션을 닫는다.

전략 원칙

이 전략은 이동 평균을 계산하기 위해 장기 기간 동안의 원천 가격을 사용합니다. 원천 가격은 OHLC4, HLC3, 폐쇄 가격 등이 될 수 있습니다. 결과 이동 평균은 sma로 정의됩니다. 그 다음 긴 라인과 짧은 라인은 이동 평균 값의 비율에 따라 그래프화되어 현재 상승 또는 하락 추세인지 결정합니다.

구체적으로, 짧은 선은: shortline = sma * ((100 + shortlevel) / 100) 으로 계산되며, shortlevel은 사용자가 설정한 긍정적 인 숫자이며, 짧은 선이 이동 평균보다 높은 비율을 나타냅니다. 긴 선은 비슷하며, longline = sma * ((100 + longlevel) / 100) 으로 계산되며, longlevel은 사용자가 설정한 부정적인 숫자이며, 긴 선이 이동 평균보다 낮은 비율을 나타냅니다.

따라서, 짧은 라인 값은 항상 이동 평균보다 크며, 긴 라인 값은 항상 이동 평균보다 작다. 가격이 짧은 라인을 넘으면 상승 추세가 시작된다는 것을 나타냅니다. 이 시점에서, 긴 라인을 허용하면 긴 라인 가격 수준에서 긴 주문을 할 것입니다. 가격이 긴 라인을 넘으면 하락 추세가 시작된다는 것을 나타냅니다. 이 시점에서, 짧은 라인을 허용하면 짧은 라인 가격 수준에서 짧은 주문을 할 것입니다.

긴 또는 짧은 상관없이, 가격이 이동 평균으로 돌아 갈 때, 그것은 트렌드가 끝나는 것을 의미합니다. 이 시점에서 모든 이전 포지션을 닫을 것입니다.

따라서 트렌드 방향과 그에 해당하는 엔트리와 존재는 긴 / 짧은 라인과 이동 평균 라인의 역학적 관계에 의해 결정됩니다.

장점

이 전략의 가장 큰 장점은 동적으로 긴 라인과 짧은 라인을 설정함으로써 상대적으로 유연하게 주요 트렌드 방향을 파악 할 수 있다는 것입니다. 고정 수준에서 입출을 유발하는 전략에 비해이 전략은 더 진보되고 지능적입니다.

둘째, 이동 평균 자체는 어느 정도 필터링 효과를 가지고 있으며, 이는 높은 주파수 변동에 의해 어느 정도 포획되는 것을 피합니다. 또한 이동 평균 수준에 따라 추세가 지나간 것으로 판단되면 적절한 시간에 빠져 나가는 것이 매우 중요합니다.

위험성

이 전략의 가장 큰 위험은 이동 평균의 성능이 서로 다른 기간에 차이가 있다는 것입니다. 일반적으로 이동 평균은 트렌드 방향을 나타내는 데 충분하지만, 일부 극단적인 시장 조건에서 이동 평균은 단기간에 침투하여 잘못된 입력이나 상위 오차 등을 유발할 수 있습니다. 이 경우 트렌드 판단의 정확성을 보장하기 위해 더 긴 기간 이동 평균이 필요합니다.

위험의 또 다른 측면은 이동 평균 자체는 높은 관성을 가지고 있다는 것입니다. 일부 짧고 강렬한 가격 변동에 대해 이동 평균은 시간에 반응하기가 어렵고 따라서 입문 또는 출구 지점을 놓치고 있습니다. 이동 평균의 반응 속도를 가속화하기 위해 기간이 줄여야합니다.

강화

이 전략은 다음 측면에서 더 이상 최적화 될 수 있습니다.

  1. 스톱 로스 로직을 추가하십시오. 이동 평균은 트렌드를 판단하는 데 지연을 가지고 있기 때문에, 함정에 빠지는 것은 완전히 피할 수 없습니다. 따라서 적절한 트레이링 스톱은 위험을 더욱 줄일 수 있습니다.

  2. 긴/단 줄의 매개 변수를 최적화한다. 현재 긴/단 줄이 이동 평균에서 벗어나는 비율이 고정되어 있다. 이 매개 변수는 최적 값을 찾기 위해 다른 데이터 세트에 테스트될 수 있다.

  3. 트렌드 강도 판단을 추가하십시오. 긴 / 짧은 라인 포지션 이외에 알고리즘은 또한 약한 트렌드 신호의 오류를 피하기 위해 트렌드의 강도를 판단 할 수 있습니다.

  4. 다른 거래 상품에 이동 평균을 적용하여 크로스 제품 성능을 확인해보세요.

결론

이 전략은 이동 평균에 기반한 입점 및 출구 지점을 동적으로 설정하여 트렌드를 결정하고 대응하는 긴 / 짧은 거래를 배치합니다. 이동 평균에 기반한 트레이딩 신호를 동적으로 생성하는이 방법은 정적 트리거 레벨에 비해 가격 트렌드를 캡처하는 데 더 유연하고 지능적입니다. 또한 이동 평균 자체의 시기 부족 문제를 해결합니다. 체계적인 백테스팅과 매개 변수 최적화로이 전략은 좋은 수익을 얻을 수 있습니다.


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

//Noro
//2018

//@version=3
strategy(title = "Noro's ShiftMA Strategy v1.1", shorttitle = "ShiftMA str 1.1", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 100)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(false, defval = false, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %")
per = input(3, title = "Length")
src = input(ohlc4, title = "Source")
shortlevel = input(10.0, title = "Short line (red)")
longlevel = input(-5.0, title = "Long line (lime)")
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")

//SMAs
sma = sma(src, per) 
//sma = lowest(low, per)
shortline = sma * ((100 + shortlevel) / 100)
longline = sma * ((100 + longlevel) / 100)
plot(shortline, linewidth = 2, color = red, title = "Short line")
plot(sma, linewidth = 2, color = blue, title = "SMA line")
plot(longline, linewidth = 2, color = lime, title = "Long line")

//plot(round(buy * 100000000), linewidth = 2, color = lime)
//plot(round(sell * 100000000), linewidth = 2, color = red)

//Trading
size = strategy.position_size
lot = 0.0
lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1]

if (not na(close[per])) and size == 0 and needlong
    strategy.entry("L", strategy.long, lot, limit = longline, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if (not na(close[per])) and size == 0 and needshort
    strategy.entry("S", strategy.short, lot, limit = shortline, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if (not na(close[per])) and size > 0 
    strategy.entry("Close", strategy.short, 0, limit = sma, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if (not na(close[per])) and size < 0 
    strategy.entry("Close", strategy.long, 0, limit = sma, 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()

더 많은