Điều chỉnh động chiến lược DCA dựa trên khối lượng giao dịch

QFL DCA TP SL ATR ADX EMA SMA RSI MACD
Ngày tạo: 2024-04-12 17:12:07 sửa đổi lần cuối: 2024-04-12 17:12:07
sao chép: 5 Số nhấp chuột: 995
1
tập trung vào
1617
Người theo dõi

Điều chỉnh động chiến lược DCA dựa trên khối lượng giao dịch

Tổng quan

Chiến lược này là một chiến lược DCA động dựa trên khối lượng giao dịch và giá phá vỡ. Nó bắt đầu đặt hàng bằng cách xác định mức giá thấp gần đây nhất và bắt đầu đặt hàng khi giá phá vỡ mức thấp đó và khối lượng giao dịch tăng. Trong quá trình giá tiếp tục giảm, chiến lược sẽ điều chỉnh số lượng đặt hàng mỗi lần theo kích thước lỗ hổng nổi, động lực, cho đến khi đạt được số lần đặt hàng tổng cộng.

Nguyên tắc chiến lược

  1. Thông qua hàm ta.pivotlow (()) nhận ra mức giá thấp gần đây và sử dụng nó như là mức hỗ trợ.
  2. Tính toán mức giảm của giá sau khi phá vỡ mức hỗ trợ lịch sử, lấy số đó làm tham chiếu cho khoảng cách an toàn và mức dừng.
  3. Khi giá vượt ngưỡng hỗ trợ và khối lượng giao dịch tương đối lớn hơn so với số nhân được thiết lập, kích hoạt tín hiệu lập vị trí.
  4. Theo số lần xây dựng tổng kho, chia tổng vốn thành nhiều phần tương đương, mỗi lần xây dựng kho, điều chỉnh số lượng kho theo động lực của số lần xây dựng kho hiện tại, để đạt được sự tăng trưởng chỉ số của vị trí.
  5. Trong quá trình xây dựng kho, nếu lỗ hổng nổi đạt đến ngưỡng thiết lập, tiếp tục đặt hàng cho đến khi đạt đến tổng số lần xây dựng kho.
  6. Khi giá tăng đến giá dừng, xóa tất cả các vị trí.

Lợi thế chiến lược

  1. Đổi số lượng đặt hàng: Đổi số lượng mỗi lần đặt hàng theo biến động trong quá trình giảm giá, kiểm soát rủi ro, đồng thời có thể thu được nhiều lợi nhuận hơn khi giá tăng trở lại.
  2. Tham khảo các tham số thiết lập dữ liệu lịch sử: Bằng cách tính toán mức giảm sau khi giá phá vỡ mức hỗ trợ lịch sử, lấy số trong đó làm tài liệu tham khảo khoảng cách an toàn và mức dừng, làm cho tham số chiến lược gần gũi hơn với tình hình thị trường thực tế.
  3. Hạn chế tổng số lần đặt hàng: Bằng cách thiết lập tổng số lần đặt hàng, kiểm soát lỗ hổng rủi ro tổng thể của chiến lược, tránh thiệt hại do đặt hàng quá mức.

Rủi ro chiến lược

  1. Rủi ro thất bại của mức hỗ trợ: Nếu thị trường xảy ra tình huống cực đoan, giá sẽ tiếp tục giảm mạnh sau khi phá vỡ mức hỗ trợ, và cơ chế đặt hàng chiến lược có thể dẫn đến tổn thất lớn.
  2. Rủi ro thiết lập tham số: Hiệu suất của chiến lược phụ thuộc rất nhiều vào thiết lập tham số, nếu thiết lập tham số không đúng cách, có thể dẫn đến hiệu suất chiến lược kém.
  3. Rủi ro đặt giá dừng: Nếu giá dừng quá cao, bạn có thể bỏ lỡ một phần lợi nhuận; Nếu giá dừng quá thấp, bạn có thể rút ngắn quá sớm và không tận dụng đầy đủ cơ hội phục hồi giá.

Hướng tối ưu hóa chiến lược

  1. Nhập nhiều chỉ số: Trong việc đánh giá tín hiệu kho, có thể đưa ra nhiều chỉ số kỹ thuật hơn, chẳng hạn như RSI, MACD, v.v., để cải thiện độ chính xác của tín hiệu.
  2. Quản lý quỹ tối ưu: Có thể điều chỉnh động tỷ lệ tiền mỗi lần tạo vị trí dựa trên các yếu tố như biến động của thị trường, khả năng chịu rủi ro của tài khoản, để kiểm soát rủi ro tốt hơn.
  3. Tự thích ứng với lỗ dừng: Định mức lỗ dừng theo biến động của thị trường để thích ứng tốt hơn với sự thay đổi của thị trường.

Tóm tắt

Chiến lược này cố gắng đạt được lợi nhuận nhiều hơn khi giá tăng trở lại bằng cách thay đổi số lượng vị trí và tham khảo các tham số thiết lập dựa trên dữ liệu lịch sử, trong khi kiểm soát rủi ro. Tuy nhiên, hiệu suất của chiến lược phụ thuộc rất nhiều vào thiết lập các tham số và tình hình thị trường.

Mã nguồn chiến lược
/*backtest
start: 2024-04-04 00:00:00
end: 2024-04-11 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © AHMEDABDELAZIZZIZO

//@version=5

strategy("Qfl Dca strategy", overlay=true)

// Parameters
swing = input(3 , title = "Swing Points")
mediandropmult = input.float(1.1, "Median drop Mult", step=0.1 , tooltip = "The script Calculate The Median Drop for all last Bases That Was cracked you can Increase or decrease it")
floatinglossvalue = input(-5 , "Floating Loss" , tooltip = "Position Floating Loss to start firs DCA order")
num_orders = input(5 , "Number of all orders" , tooltip = " The number of orders is including the base order and the DCA orders the script will alculate every order qty based on the orders number So that the position size doubles with every order")
length = input(20, title="Length of relative volume" ,tooltip =  " the length of relative volume indicator")
mult = input(2.0, title="Volume Multiplier" , tooltip = "you can adjust the relative volume multiplier to find best parameter")
tpmult = input.float(1, step=0.1 ,title = "Take Profit Multiplier" ,tooltip =  " By default, the script is set to take profits based on the same median drop percent you can adjust it as you like")



// Pivot Calculation
p = ta.pivotlow(low, swing, swing)
v = ta.valuewhen(p, low[swing], 0)

// Variables
var float[] lows = array.new_float()
var float chn = na

// Calculate drops
if v < v[1]
    chn := (v[1] - v) / v[1] * 100
    if array.size(lows) < 4000
        array.push(lows, chn)
    else
        array.shift(lows)
        array.push(lows, chn)

mediandrop = array.avg(lows)
maxdrop = array.max(lows)
mindrop = array.min(lows)

// Table display
textcolor = color.white
// tabl = table.new(position=position.top_right, columns=4, rows=4)
// table.cell(table_id=tabl, column=1, row=1, text="Avg Drop %", width=15, text_color=textcolor)
// table.cell(table_id=tabl, column=2, row=1, text="Min Drop %", width=15, text_color=textcolor)
// table.cell(table_id=tabl, column=3, row=1, text="Max Drop %", width=15, text_color=textcolor)
// table.cell(table_id=tabl, column=1, row=2, text=str.tostring(mediandrop), width=10, text_color=textcolor)
// table.cell(table_id=tabl, column=2, row=2, text=str.tostring(mindrop), width=10, text_color=textcolor)
// table.cell(table_id=tabl, column=3, row=2, text=str.tostring(maxdrop), width=10, text_color=textcolor)

// Plot support
t = fixnan(ta.pivotlow(low, swing, swing))
plot(t, color=ta.change(t) ? na : #03f590b6, linewidth=3, offset=-(swing), title="Support")

// Calculate relative volume
avgVolume = ta.sma(volume, length)
relVolume = volume / avgVolume

// Base Activation
var bool baseisactive = na
if not na(p)
    baseisactive := true

// Buy Signal Calculation
buyprice = v * (1 - (mediandrop / 100) * mediandropmult)
signal = close <= buyprice and relVolume > mult and baseisactive

// Take Profit Calculation
tpsl = (mediandrop / 100)
tp = (strategy.position_avg_price * (1 + (tpsl * tpmult)))

// Position Sizing
capital_per_order(num_orders, equity) =>
    equity / math.pow(2, (num_orders - 1))

equity_per_order = capital_per_order(num_orders, strategy.equity)

qty_per_order(equity_per_order, order_number) =>
    equity_per_order * order_number / close

// Calculate floating loss
floatingLoss = ((close - strategy.position_avg_price) / strategy.position_avg_price) * 100

// Strategy Entries
if signal and strategy.opentrades == 0
    strategy.entry("Buy", strategy.long, qty=qty_per_order(equity_per_order, 1))
    baseisactive := false

for i = 1 to num_orders -1
    if signal and strategy.opentrades == i and floatingLoss <= floatinglossvalue
        strategy.entry("Buy", strategy.long, qty=qty_per_order(equity_per_order, i), comment="DCA Order" + str.tostring(i))
        baseisactive := false

// Strategy Exit
strategy.exit("exit", "Buy", limit=tp)

// Plot
plot(strategy.position_avg_price, color=color.rgb(238, 255, 0), style=plot.style_linebr, linewidth=2)