풀링 전략 (Pulling strategy) 은 돈치안 채널 (Donchian Channels) 을 기반으로 한 트렌드 다음 전략이다. 트렌드 방향을 파악하고 인기를 끌기 위해 빠르고 느린 돈치안 채널을 사용합니다. 이 전략의 장점은 트렌드가 변경되면 트렌드를 자동으로 추적하고 손실을 시간적으로 절감 할 수 있다는 것입니다. 그러나 마감 및 스톱 손실이 너무 가깝다는 위험도 있습니다.
전략은 먼저 빠른 채널 기간을 20 바, 느린 채널 기간을 50 바로 정의합니다. 빠른 채널은 스톱 로스 가격을 설정하는 데 사용되며 느린 채널은 트렌드 방향과 엔트리 타이밍을 결정하는 데 사용됩니다.
먼저, 빠른 채널의 가장 높은 고와 가장 낮은 낮은 계산되고, 중간 지점은 중지 손실 라인으로 간주됩니다. 동시에, 느린 채널의 가장 높은 고와 가장 낮은 낮은 계산되고, 채널 상단과 하단은 입구 라인으로 사용됩니다.
가격이 느린 채널의 꼭대기를 넘으면, 장거리 가십시오. 가격이 느린 채널의 바닥을 넘으면, 짧게 가십시오. 포지션을 입력 한 후, 빠른 채널의 중간 지점에 스톱 로스를 설정하십시오.
따라서 느린 채널은 주요 트렌드 방향을 결정하고, 빠른 채널은 작은 범위 내의 소규모 브레이크오프를 추적하여 스톱 로스 포인트를 결정합니다. 주요 트렌드가 역전되면 가격은 먼저 빠른 채널의 스톱 로스 라인을 통과하여 스톱 로스를 실현합니다.
트렌드를 자동으로 추적하고 시간으로 손실을 줄입니다. 이중 채널 구조는 트렌드를 자동으로 추적하고 트렌드가 역전되면 신속하게 손실을 줄일 수 있습니다.
일부 트렌드 필터링 효과와 함께 인기를 끌기 위해 입력합니다. 채널 경계를 통과 할 때 엔트리를 얻는 경우에만 실제 트렌드가없는 일부 가짜 브레이크오프를 필터링 할 수 있습니다.
통제 가능한 위험. 근접 스톱 손실 거리는 단일 손실을 제어 할 수 있습니다.
더 큰 마감: 트렌드를 따르는 전략은 심리적 준비가 필요한 상대적으로 큰 마감을 가질 수 있습니다.
스톱 손실이 너무 가깝습니다. 빠른 채널 기간이 짧기 때문에 스톱 손실이 가깝고 중단 될 가능성이 있습니다. 우리는 적절한 방식으로 빠른 채널 기간을 느리게 할 수 있습니다.
너무 많은 거래. 이중 채널 구조는 과도한 입력을 생성 할 수 있으며 합리적인 위치 크기를 요구합니다.
엔트리 필터를 추가합니다. 우리는 충분한 트렌드 강도가 없는 브레이크오웃을 필터링하기 위해 엔트리 조건에 변동성 등을 추가할 수 있습니다.
채널 기간 매개 변수를 최적화합니다. 우리는 최적의 채널 매개 변수 조합을 체계적으로 찾을 수 있습니다.
여러 시간 프레임을 결합. 더 높은 시간 프레임에서 주요 추세를 결정 하 고 더 낮은 시간 프레임에서 거래.
동적 스톱 손실 거리 시장 변동성에 따라 동적으로 스톱 거리를 조정합니다
풀링 전략은 전체적으로 트렌드를 따르는 표준 전략이다. 트렌드 방향을 결정하고 위험을 제어하기 위해 스톱 로스를 설정하기 위해 가격 채널을 사용합니다. 전략은 몇 가지 장점이 있지만 드라우다운과 스톱 로스의 문제도 너무 가깝습니다. 채널 매개 변수를 조정하고 필터를 추가하여 최적화 할 수 있습니다. 그러나 트렌드 다음 전략은 드라우다운을 견딜 수있는 강력한 심리학을 필요로한다는 점에 유의해야합니다.
/*backtest start: 2023-09-30 00:00:00 end: 2023-10-30 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2020 //@version=4 strategy("Noro's RiskTurtle Strategy", shorttitle = "RiskTurtle str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, commission_value = 0.1) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") risk = input(2, minval = 0.1, maxval = 99, title = "Risk size, %") fast = input(20, minval = 1, title = "Fast channel (for stop-loss)") slow = input(50, minval = 1, title = "Slow channel (for entries)") showof = input(true, defval = true, title = "Show offset") showll = input(true, defval = true, title = "Show lines") showdd = input(true, defval = true, title = "Show label (drawdown)") showbg = input(true, defval = true, title = "Show background") 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") //Donchian price channel fast hf = highest(high, fast) lf = lowest(low, fast) center = (hf + lf) / 2 //Donchian price chennal slow hs = highest(high, slow) ls = lowest(low, slow) //Lines colorpc = showll ? color.blue : na colorsl = showll ? color.red : na offset = showof ? 1 : 0 plot(hs, offset = offset, color = colorpc, title = "Slow channel high") plot(ls, offset = offset, color = colorpc, title = "Slow channel low") plot(center, offset = offset, color = colorsl, title = "Fast channel stop-loss") //Background size = strategy.position_size colorbg = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na bgcolor(colorbg, transp = 70) //Var loss = 0.0 maxloss = 0.0 equity = 0.0 truetime = true //Lot size risksize = -1 * risk risklong = ((center / hs) - 1) * 100 coeflong = abs(risksize / risklong) lotlong = (strategy.equity / close) * coeflong riskshort = ((center / ls) - 1) * 100 coefshort = abs(risksize / riskshort) lotshort = (strategy.equity / close) * coefshort //Orders strategy.entry("Long", strategy.long, lotlong, stop = hs, when = needlong and strategy.position_size == 0 and hs > 0 and truetime) strategy.entry("Short", strategy.short, lotshort, stop = ls, when = needshort and strategy.position_size == 0 and ls > 0 and truetime) strategy.exit("LongExit", "Long", stop = center, when = needlong and strategy.position_size > 0) strategy.exit("Short", stop = center, when = needshort and strategy.position_size < 0) if time > timestamp(toyear, tomonth, today, 23, 59) strategy.close_all() strategy.cancel("Long") strategy.cancel("Short") if showdd //Drawdown max = 0.0 max := max(strategy.equity, nz(max[1])) dd = (strategy.equity / max - 1) * 100 min = 100.0 min := min(dd, nz(min[1])) //Max loss size equity := strategy.position_size == 0 ? strategy.equity : equity[1] loss := equity < equity[1] ? ((equity / equity[1]) - 1) * 100 : 0 maxloss := min(nz(maxloss[1]), loss) //Label min := round(min * 100) / 100 maxloss := round(maxloss * 100) / 100 labeltext = "Drawdown: " + tostring(min) + "%" + "\nMax.loss " + tostring(maxloss) + "%" var label la = na label.delete(la) tc = min > -100 ? color.white : color.red osx = timenow + round(change(time)*10) osy = highest(100) // la := label.new(x = osx, y = osy, text = labeltext, xloc = xloc.bar_time, yloc = yloc.price, color = color.black, style = label.style_labelup, textcolor = tc)