트렌드 트래킹 역전 전략은 이동 평균과 가격 극단에 기반한 트렌드 거래 전략이다. 이 전략은 두 개의 이동 평균을 사용하여 가격 추세를 추적하고 트렌드가 역전되면 역전 포지션을 개설합니다. 동시에 최근 K 라인의 가장 높고 가장 낮은 가격에 기반한 가격 채널을 계산하여 가격이 채널 경계에 접근하면 손실을 중지하여 위험을 제어합니다.
이 전략은 3 기간의 높은 점과 낮은 점 이동 평균 (HMA) 과 LMA를 사용하여 가격 트렌드를 추적합니다. 가격이 HMA를 넘을 때, 상승률로 해석됩니다. 가격이 LMA 아래로 떨어지면, 하락률로 해석됩니다.
이 전략은 또한 최근 바 K 라인 내의 가장 높고 가장 낮은 가격에 기초하여 가격 채널의 상위 및 하위 레일 (uplevel 및 dnlevel) 을 계산합니다. uplevel은 최근 바 K 라인 내의 가장 높은 가격이며, 상향으로 리트레이싱 계수가 더됩니다. dnlevel은 최근 바 K 라인 내의 가장 낮은 가격이며, 하향으로 리트레이싱 계수가 더됩니다. 이것은 가격 채널 범위를 구성합니다.
긴 포지션을 열 때, 스톱 로스 가격은 채널의 상단 레일로 설정되며, 짧은 포지션을 열 때 스톱 로스 가격은 채널의 하단 레일로 설정됩니다. 이것은 가격 역전으로 인한 손실 위험을 효과적으로 제어합니다.
리버스 신호가 나타나면, 전략은 새로운 가격 트렌드를 추적하기 위해 즉시 오픈 포지션을 뒤집습니다. 이것은 리버스 추적의 기본 원칙입니다.
개선 사항:
더 많은 최적화를 할 수 있습니다.
MACD, KD 등과 같은 일부 유효하지 않은 신호를 필터링하기 위해 다른 지표가 도입 될 수 있습니다.
적응적인 스톱 로스 로직을 추가할 수 있습니다. 예를 들어, 이동 스톱 로스, 균형 스톱 로스 등이 추가로 위험을 제어합니다.
전략 성능에 대한 다른 매개 변수의 영향을 테스트하고 MA 주기의 길이가, 재구성 계수 크기 등 매개 변수 조합을 최적화합니다.
이 전략은 현재 시간 세션으로 거래됩니다. 또한 하루 종일 거래하도록 조정할 수 있습니다. 추가 필터링 규칙이 필요할 수 있습니다.
요약하자면, 이것은 가격 채널과 이동 평균을 결합한 트렌드 역전 거래 전략이다. 트렌드를 추적하고 적시에 역 오픈 포지션을 통해 가격 움직임을 효과적으로 추적 할 수 있습니다. 동시에 가격 채널과 역 오픈의 위험 제어 조치는 단일 손실을 효과적으로 제어 할 수 있습니다. 전략 아이디어는 간단하고 명확하며 라이브 거래에서 추가 테스트 및 최적화에 가치가 있습니다.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2019 //@version=3 strategy(title = "Noro's 3Bars Strategy by Larry Williams", shorttitle = "3Bars", overlay = true, 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, %") corr = input(0.0, title = "Correction, %") bars = input(1, minval = 1) revers = input(false, defval = false, title = "revers") showll = input(true, defval = true, title = "Show Levels") showos = input(true, defval = true, title = "Show Levels one side") showcl = input(false, defval = false, title = "Show Levels continuous line") showbg = input(false, defval = false, title = "Show Background") showar = input(false, defval = false, title = "Show Arrows") 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") len = input(3) hma = sma(high, len) lma = sma(low, len) plot(hma) plot(lma) //Levels hbar = 0 hbar := high > high[1] ? 1 : high < high[1] ? -1 : 0 lbar = 0 lbar := low > low[1] ? 1 : low < low[1] ? -1 : 0 uplevel = 0.0 dnlevel = 0.0 hh = highest(high, bars + 1) ll = lowest(low, bars + 1) uplevel := hbar == -1 and sma(hbar, bars)[1] == 1 ? hh + ((hh / 100) * corr) : uplevel[1] dnlevel := lbar == 1 and sma(lbar, bars)[1] == -1 ? ll - ((ll / 100) * corr) : dnlevel[1] //Background size = strategy.position_size trend = 0 trend := size > 0 ? 1 : size < 0 ? -1 : high >= uplevel ? 1 : low <= dnlevel ? -1 : trend[1] col = showbg == false ? na : trend == 1 ? lime : trend == -1 ? red : na bgcolor(col) //Lines upcol = na upcol := showll == false ? na : uplevel != uplevel[1] and showcl == false ? na : showos and trend[1] == 1 ? na : lime plot(uplevel, color = upcol, linewidth = 2) dncol = na dncol := showll == false ? na : dnlevel != dnlevel[1] and showcl == false ? na : showos and trend[1] == -1 ? na : red plot(dnlevel, color = dncol, linewidth = 2) //Arrows longsignal = false shortsignal = false longsignal := size > size[1] shortsignal := size < size[1] plotarrow(longsignal and showar and needlong ? 1 : na, colorup = blue, colordown = blue, transp = 0) plotarrow(shortsignal and showar and needshort ? -1 : na, colorup = blue, colordown = blue, transp = 0) //Trading lot = 0.0 lot := size != size[1] ? strategy.equity / close * capital / 100 : lot[1] if uplevel > 0 and dnlevel > 0 and revers == false strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, stop = uplevel) strategy.entry("Long stop", strategy.short, 0, stop = lma) strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, stop = dnlevel) strategy.entry("Short stop", strategy.long, 0, stop = hma) // if time > timestamp(toyear, tomonth, today, 23, 59) // strategy.close_all()