プルリング戦略は,ドンチアンチャネルをベースとしたトレンドフォロー戦略である.トレンド方向を特定し,引き下げに参入するために,迅速かつ遅いドンチアンチャネルを使用する.この戦略の利点は,トレンドが変化するときに自動的にトレンドを追跡し,時間をかけて損失を削減できるということです.しかし,引き下げやストップ損失があまりにも近いリスクもあります.
戦略では,まず高速チャネル期間を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)