
Эта стратегия называется “Двойная пошаговая стратегия DCA с двумя индикаторами”. Она строит торговые сигналы на основе буринского канала и индекса относительной силы (RSI), а также использует метод постепенного наращивания позиций для управления риском. Основная идея заключается в том, чтобы захватить тенденции в бычьих рынках и использовать индикаторы для построения многосторонних сигналов.
Стратегия объединяет два показателя: канал Бринга и RSI. Канал Бринга позволяет четко определять тенденции, средний путь Бринга находится вверху бычьего рынка, а внизу - медвежьего.
Постепенная часть DCA, сначала открывается первое предложение, когда показатель MIX превышает 20. После этого каждый раз, когда цена снижается определенной величиной, добавляется позиция на определенную сумму.
Двойные показатели в сочетании с четкой тенденцией к суждению повышают точность сигнала.
Постепенная стратегия DCA позволяет снизить стоимость позиции в падении, уменьшить риск потери.
Установлены условия для остановки и сдерживания убытков, которые позволяют своевременно сдерживать убытки, контролировать риски и гарантировать частичную прибыль.
Добавление параметров диапазона дат открытия позиции, которые могут быть протестированы и оптимизированы для конкретного периода времени.
В некоторых случаях могут быть нарушены как канал Бурин, так и RSI. Можно проверить различные комбинации параметров, чтобы найти оптимальные точки.
Постепенное DCA может приводить к увеличению убытков в случае постоянного добавления позиций в условиях резкого падения. Можно установить максимальное количество пополнений и надлежащим образом повысить контроль риска.
Не исключенные случаи, при которых не удалось предотвратить внезапные события. Можно добавить крупный диапазон показателей для оценки системного риска, чтобы избежать необычных периодов.
Тестирование оптимизации параметров индикатора MIX для получения более точных торговых сигналов.
Оптимизация параметров Stop Loss Stop Loss, чтобы максимизировать убыточность.
Проверяйте разные размеры и частоты открытия позиций, чтобы найти оптимальную комбинацию.
Можно рассмотреть возможность добавления модуля управления объемом сделок, который открывает или закрывает стратегию при определенных условиях объема сделок.
Двойная последовательная стратегия 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')