
Двойная нижняя обратная среднелинейная DCA-стратегия используется в основном для среднелинейных ценовых обратных и DCA-стратегий, чтобы реализовать постепенное создание позиций в сетке. Она определяет возможность обратного обращения в зависимости от формы обратного обращения двойной нижней части. После того, как вызывается формат обратного обращения, используйте несколько заказов с разными ценами в сочетании с DCA для создания постепенных позиций в сетке.
В этой стратегии сначала определяется, есть ли две последовательные нижние точки, равные цене закрытия, что называется двойной нижней точкой. Если обнаруживается двойная нижняя точка, то считается, что может быть возможность обратной поворота цены. В этом случае стратегия устанавливает вблизи нижней части несколько ограничительных ценных бумаг, цены которых формируют сетчатую зону в соответствии с ATR и волатильностью. Это реализует эффект DCA, позволяя трейдерам постепенно строить позиции в разных ценовых точках, которые поворачиваются назад.
В частности, с помощью ta.atr сначала рассчитывается показатель ATR для последних 14 K-линий, а затем в сочетании с последними 5 K-линий рассчитывается волатильность цены, которая является основным параметром, используемым для определения сетчатого интервала. Сетчатый интервал делится на 4 ценовых пункта, соответственно, на нижнюю цену + волатильность, нижнюю цену + 0,75-кратное волатильность, и так далее.
Кроме того, в стратегии также устанавливаются стоп-стоп и стоп-офф. Стоп-офф является минимальной ценой двойного дна - минимальный рывок, а стоп-офф - в 5 раз больше, чем входная цена + ATR. Эти две цены обновляются в режиме реального времени, когда позиция не равна 0.
Эта стратегия имеет следующие преимущества:
Основные риски:
Эта стратегия также может быть оптимизирована в следующих направлениях:
Двойная нижняя обратная сетка DCA использует различные технические средства, такие как ценовые формы, индикаторы равновесия и сетевые сделки. Она обладает преимуществами, такими как точность времени суждения, контролируемая стоимость и защита от отказа.
/*backtest
start: 2024-02-12 00:00:00
end: 2024-02-19 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © cherepanovvsb
//@version=5
strategy("Reversal (only long)", overlay=true, margin_long=1, margin_short=1,initial_capital=1000,commission_type = strategy.commission.percent,commission_value =0.1,currency='USD', process_orders_on_close=true)
plotshape(low == low[1], style=shape.triangleup, location=location.belowbar, color=color.blue, title="1 Setup")
plotshape(low == low[1] and low[1]==low[2], style=shape.triangleup, location=location.belowbar, color=color.red, title="Triple Setup")
ATRlenght = input.int(title="ATR length for taking profit", defval=14, group="Strategy Settings")
rewardMultiplier= input.int(title="ATR multiplier", defval=5, group="Strategy Settings")
Volatility_length=input.int(title='Volatility length',defval=5,group="Strategy Settings")
Volatility_multiplier=input.float(title='Volatility multiplier',defval=0.5,step=0.1, group="Strategy Settings")
Candles_to_wait=input.int(title='How many candles to wait after placing orders grid?',defval=4,group="Strategy Settings")
// Get ATR
atr1 = ta.atr(ATRlenght)
//Get volatility values (not ATR)
float result = 0
for i = 0 to Volatility_length
result+=high[i]-low[i]
volatility=result*Volatility_multiplier/Volatility_length
//Validate entrance points
validlow = low [2]== low[1] and not na(atr1)
validlong = validlow and strategy.position_size == 0 and low[1]<low
// Calculate SL/TP
longStopPrice = low[1]-syminfo.mintick
longStopDistance = close - longStopPrice
longTargetPrice = close + (longStopDistance * rewardMultiplier)
strategy.initial_capital = 50000
//Assign all variables
var tradeStopPrice = 0.0
var tradeTargetPrice = 0.0
var point1=0.0
var point2=0.0
var point3=0.0
var point4=0.0
var contracts = int(strategy.initial_capital/close)/4
if validlong
tradeStopPrice := longStopPrice
tradeTargetPrice := longTargetPrice
point1:=low[1]+volatility
point2:=low[1]+volatility*0.75
point3:=low[1]+volatility*0.5
point4:=low[1]+volatility*0.25
strategy.entry ("Long1", strategy.long,limit=point1,qty=contracts, when=validlong)
strategy.entry ("Long2", strategy.long,limit=point2,qty=contracts, when=validlong)
strategy.entry ("Long3", strategy.long,limit=point3,qty=contracts, when=validlong)
strategy.entry ("Long4", strategy.long,limit=point4,qty=contracts, when=validlong)
stopcondition = ta.barssince(validlong) == Candles_to_wait
strategy.cancel("Long1",when=stopcondition)
strategy.cancel("Long2",when=stopcondition)
strategy.cancel("Long3",when=stopcondition)
strategy.cancel("Long4",when=stopcondition)
strategy.exit(id="Long Exit", limit=tradeTargetPrice, stop=tradeStopPrice, when=strategy.position_size > 0)
plot(strategy.position_size != 0 or validlong ? tradeStopPrice : na, title="Trade Stop Price", color=color.red, style=plot.style_linebr, linewidth=3)
plot(strategy.position_size != 0 or validlong ? tradeTargetPrice : na, title="Trade Target Price", color=color.green, style=plot.style_linebr, linewidth=3)
plot(strategy.position_size != 0? point1 : na, title="Long1", color=color.green, style=plot.style_linebr, transp=0)
plot(strategy.position_size != 0? point2 : na, title="Long2", color=color.green, style=plot.style_linebr, transp=0)
plot(strategy.position_size != 0? point3 : na, title="Long3", color=color.green, style=plot.style_linebr, transp=0)
plot(strategy.position_size != 0? point4 : na, title="Long4", color=color.green, style=plot.style_linebr, transp=0)