
この戦略は,双指数漸進DCA戦略と呼ばれています.これは,ブリン・チャネルと相対強度指数 (RSI) の2つの指標に基づいて取引信号を構築し,同時に漸進加仓の方法を利用してリスク管理を行います.その主な考えは,牛市でトレンドを捕捉し,指数を使用して多頭信号を構築することであり,下落時に漸進DCA戦略を利用してコストを削減することです.
この戦略は,ブリン・チャネルとRSIの2つの指標を融合している.ブリン・チャネルは,市場トレンドを明確に判断し,ブリンの中間軌道上は牛市,下は熊市である.RSIは,超買い超売り現象を判断する.戦略は,ブリン・チャネル価格差とRSIのK値を重み付け平均としてMIX指標を構築している.MIX指標が上から20を突破すると,多頭シグナルが生じる.
漸進的なDCA部分では,まずMIX指標が20突破した時に最初の注文を開きます. その後,価格が一定幅に下落するたびに,一定額でポジションを追加します.最大保有量または止損退出に達するまで. このように,市場状況の低点で複数のポジションを加え,コスト平均価格の下落を実現することができます.
この2つの指標は,明確な判断傾向と組み合わせて,信号の正確性を高めます.
漸進的なDCA戦略は,下落時にポジションコストを低くし,損失のリスクを減らすことができます.
ストップ・ロズとストップ・ストップの条件を設定することで,早期にストップ・ロズを制御し,利潤の一部を確保することができる.
ポジション開設日付の範囲パラメータを追加し,特定の時間周期に対してテストおよび最適化することができます.
ブリン・チャネルとRSIの両方が失敗する可能性があります. 異なるパラメータの組み合わせをテストして最適な位置を探します.
漸進的なDCAは,大下落の状況で継続的にポジションを追加して損失を拡大する可能性があります.最大加仓回数を設定し,ストップラインを適切に高め,リスクコントロールを完善することができます.
突発的な出来事を防ぐことができない異常な行動. 大盤指標で体系的リスクを判断し,異常な期間を回避することができる.
MIX指標のパラメータを最適化して,より正確な取引シグナルを得るためにテストする.
ストップダストストップのパラメータを最適化し,損益比率を最大化します.
ポジションの幅と回数をテストし,最適な組み合わせを探します.
取引量制御モジュールを追加し,特定の取引量条件で戦略をオンまたはオフすることを検討することができます.
双指標漸進DCA戦略は,複数の定量化技術指標と方法を総合的に適用する. それは,明確なトレンド判断指標を構築し,漸進的加仓を活用してコストを削減する. 同時に,厳格な止損とリスク管理手段は,それを安全に実用化することができる. 更にテストと最適化することにより,この戦略は,独特の優位性を持つ定量化取引方案になる可能性がある.
/*backtest
start: 2023-01-11 00:00:00
end: 2024-01-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// © lagobrian23
//@version=4
strategy(title = 'Bollinger Bands and RSI mix with DCA', shorttitle = 'BB/RSI with DCA',pyramiding = 20, calc_on_every_tick = true, overlay = false )
source=close
smoothK = input(3, "K", minval=1)
smoothD = input(3, "D", minval=1)
lengthRSI = input(14, "RSI Length", minval=1)
lengthStoch = input(14, "Stochastic Length", minval=1)
src = input(close, title="RSI Source")
rsi1 = rsi(src, lengthRSI)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)
// Bollinger Band
length = input(20,title = 'BB lookback length', minval=1)
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
BBval = (src - basis)/dev*30+50
offset = input(0, title = "Offset", type = input.integer, minval = -500, maxval = 500)
mix=(d + BBval)/2
//plot
//plot(k, "K", color=#606060)
plot(BBval, "BBval", color=#872323, offset = offset)
plot(d, "D", color=#FF6A00)
h0 = hline(80, "Upper Band", color=#606060)
h1 = hline(20, "Lower Band", color=#606060)
plot(mix, "MIX", color=#888888, linewidth=3)
//background MIX
bgcolor(mix < 20 ? color.green : color.white, transp=50)
bgcolor(mix > 80 ? color.red : color.white, transp=50)
// Choosing the date range
fromMonth = input(defval = 1, title = "From Month", type = input.integer, minval = 1, maxval = 12)
fromDay = input(defval = 1, title = "From Day", type = input.integer, minval = 1, maxval = 31)
fromYear = input(defval = 2020, title = "From Year", type = input.integer, minval = 1970)
toMonth = input(defval = 1, title = "To Month", type = input.integer, minval = 1, maxval = 12)
toDay = input(defval = 1, title = "To Day", type = input.integer, minval = 1, maxval = 31)
toYear = input(defval = 2112, title = "To Year", type = input.integer, minval = 1970)
start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window
finish = timestamp(toYear, toMonth, toDay, 23, 59) // backtest finish window
window() => true
// Initializing the strategy paraeters
P = input(defval = 1, title = 'Amount (P)' , type = input.integer, minval = 1, maxval = 100)
X = input(defval = 2, title = '% Price drop for consecutive entries(X)', type = input.float, minval = 1, maxval = 100)
B_tp = input(defval = 10, title = '% Level for Take Profit (B)', type = input.float , minval = 1, maxval = 100)
D_sl = input(defval = 10, title = '% Level for Stop Loss (D)', type = input.float, minval = 1, maxval = 100)
A = input(defval = 5, title = 'Max consecutive entries (A)', type = input.integer, minval = 2, maxval = 20)
Z = input(defval = 0.5, title = 'Z', type = input.float , minval = 0, maxval = 10)
// Declaring key DCA variables
entry_price = 0.0
entry_price := na(entry_price[1]) ? na : entry_price[1]
new_entry = 0.0
consec_entryCondition = false
// Implementing the strategy
longEntry = crossover(mix,20)
exitLongs = crossunder(mix, 80)
if(longEntry)
entry_price := close
strategy.entry('main_LE', strategy.long , P, when = window() and longEntry)
// Exiting conditions
stoploss = strategy.position_avg_price*(1-(D_sl/100))
takeprofit = strategy.position_avg_price*(1+(B_tp/100))
slCondition = crossunder(close, stoploss)
tpCondition = crossover(close, takeprofit)
// We want to exit if the 'mix' indicator crosses 80, take profit is attained or stop loss is tagged.
exitConditions = exitLongs or slCondition or tpCondition
// Consecutive entries upto A times
// strategy.risk.max_intraday_filled_orders(A)
//Dollar-Cost-Averaging
// Enter long whenever price goes down X%: amount set to (P+Y)*Z
newAmount = (P+X)*Z
// If we haven't reached max open trades, buy newAmount immediately price crosses under X% lower the previous entry price
new_entry := entry_price - ((X/100)*entry_price)
consec_entryCondition := crossunder(close, new_entry)
if(consec_entryCondition and strategy.opentrades != A)
strategy.entry('consec_LE', strategy.long, newAmount, oca_name = 'consecLongs', when = window() and consec_entryCondition)
entry_price := close
// Exiting
// The main trade is closed only when the main exit conditions are satisfied
strategy.close('main_LE', comment = 'Main Long Closed', when = window() and exitConditions)
// A consective long is closed only when tp or sl is tagged
strategy.exit('ext a consec', 'consec_LE', loss = D_sl*strategy.position_avg_price , profit = B_tp*strategy.position_avg_price, oca_name = 'consecLongs')