
Chiến lược lưới DCA đường trung bình đảo ngược hai bên dưới được sử dụng chủ yếu để thực hiện sự đảo ngược giá đường trung bình và chiến lược DCA để thực hiện việc xây dựng lưới dần dần. Nó đánh giá cơ hội đảo ngược dựa trên hình thức đảo ngược hai bên dưới. Một khi kích hoạt hình thức đảo ngược, sử dụng nhiều đơn đặt hàng với giá khác nhau, kết hợp với DCA để xây dựng vị trí lưới dần dần.
Chiến lược này đầu tiên đánh giá xem liệu K-line có xuất hiện hai đáy cùng giá đóng cửa liên tiếp hay không, điều này được gọi là đáy đáy đôi. Nếu phát hiện được đáy đôi, nó cho rằng có thể có cơ hội đảo ngược giá. Tại thời điểm này, chiến lược sẽ đặt nhiều lệnh giá giới hạn gần đáy, giá của các lệnh sẽ được tính theo ATR và tỷ lệ biến động, tạo thành một khu vực lưới. Điều này thực hiện hiệu quả của DCA, cho phép các nhà giao dịch đặt hàng dần dần tại các điểm giá khác nhau.
Cụ thể, ta.atr đầu tiên tính toán chỉ số ATR cho 14 đường K gần nhất, sau đó kết hợp với 5 đường K gần nhất tính toán tỷ lệ biến động giá, đây là tham số chính được sử dụng để xác định dải lưới. Dải lưới được chia thành 4 điểm giá, tương ứng là giá đáy + tỷ lệ biến động, giá đáy + 0,75 lần biến động, v.v. Khi điều kiện đáy kép được kích hoạt, theo công thức tính toán này, đặt 4 lệnh giới hạn giá tương ứng với giá, mỗi lệnh có số lượng bằng nhau.
Ngoài ra, chiến lược cũng đặt mức dừng lỗ và mức dừng. Giá dừng là giá thấp nhất của đáy kép - mức nhảy tối thiểu, giá dừng là giá nhập cảnh + chỉ số ATR gấp 5 lần.
Chiến lược này có những ưu điểm sau:
Những rủi ro chính là:
Chiến lược này cũng có thể được tối ưu hóa theo các hướng sau:
Chiến lược lưới DCA xoay ngược đường trung bình hai bên dưới sử dụng nhiều phương tiện kỹ thuật như hình dạng giá, chỉ số đường trung bình, giao dịch lưới. Nó có các lợi thế như độ chính xác thời điểm phán quyết, chi phí có thể kiểm soát được, có bảo vệ rút lui.
/*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)