동적 이동 평균 전략


생성 날짜: 2023-11-23 11:39:24 마지막으로 수정됨: 2023-11-23 11:39:24
복사: 0 클릭수: 374
1
집중하다
1166
수행원

동적 이동 평균 전략

개요

이 전략은 동적 이동 평균선 전략이라고 불린다. 주요 아이디어는 이동 평균선의 방향과 가격의 관계를 사용하여 트렌드를 판단하고, 트렌드 방향에 들어서, 트렌드없는 상태에서 평지한다.

전략 원칙

이 전략은 length 주기의 소스 가격을 사용하여 이동 평균을 계산합니다. 소스 가격은 OHLC4, HLC3, 닫기 가격 등을 선택할 수 있습니다. 계산된 이동 평균은 sma로 정의됩니다. 그리고는 이동 평균 값의 비율에 따라 긴 선과 짧은 선을 그리고, 긴 선과 짧은 선의 위치 관계를 통해 현재 상승 추세 또는 하향 추세에 있다고 판단합니다.

구체적으로, 짧은 선의 계산 공식은: shortline = sma * ((100 + shortlevel) / 100), 여기서 shortlevel은 사용자가 설정할 수 있는 양수이며, 짧은 선 거리 이동 평균선의 비율을 나타냅니다. 긴 선은 비슷한 계산 공식은: longline = sma * ((100 + longlevel) / 100), longlevel은 사용자가 설정할 수 있는 음수이며, 긴 선 거리 이동 평균선의 비율을 나타냅니다.

이렇게 하면, 짧은 선 값은 항상 이동 평균선보다 크며, 긴 선 값은 항상 이동 평균선보다 작습니다. 가격이 상단선을 통과할 때, 상승 추세에 진입하는 것을 나타냅니다. 이 때, needlong가 더 많은 것을 허용하면, 긴 선 가격 수준에서 더 많은 것을 주문합니다. 가격이 긴 선을 통과할 때, 하향 추세에 진입하는 것을 나타냅니다.

오이즈나 하락의 경우, 가격이 이동 평균선으로 다시 돌아온다면, 트렌드가 끝나는 것을 나타냅니다. 이 시점에는 이전 포지션이 모두 평행됩니다.

이렇게 하면 긴 짧은 선과 움직이는 평균 선의 동적인 관계를 통해 트렌드 방향을 판단하고 이에 따라 입지와 출전을 판단할 수 있다.

전략적 이점

이 전략의 가장 큰 장점은 긴 짧은 선의 동적으로 매매점을 설정하여 주요 트렌드 방향을 유연하게 파악할 수 있다는 것입니다. 이 전략은 단순히 고정된 수준에서 매매점을 유발하는 전략에 비해 더 고급스럽고 지능적입니다.

둘째, 이동평균선 자체도 약간의 파동 작용을 가지고 있으며, 어느 정도 높은 주파수 흔들림에 갇히지 않습니다. 이동평균선 수준에 따라 트렌드가 끝날 때 적시에 출전하는지 판단하는 것도 매우 중요합니다.

전략적 위험

이 전략의 가장 큰 위험은 이동 평균이 다른 기간 동안의 성능이 다르다는 것입니다. 일반적으로 이동 평균은 트렌드 방향을 나타내기 위해 충분하지만, 일부 극단적인 상황에서 이동 평균은 짧은 시간에 파열되어 잘못된 입장을 초래하거나 상단에서 벗어날 수 있습니다. 이 경우 더 긴 기간의 이동 평균을 사용하여 트렌드 판단의 정확성을 보장해야합니다.

위험의 또 다른 측면은 이동 평균선 자체가 느린다는 것입니다. 일부 짧은 급격한 가격 변동에 대해 이동 평균선이 어렵고 시간에 따라 추적 할 때, 입구 지점이나 출구 지점을 놓칠 수 있습니다. 이동 평균선의 반응 속도를 가속화하기 위해 주기를 줄여야합니다.

전략 최적화

이 전략은 다음의 몇 가지 측면에서 계속 개선될 수 있습니다.

  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()