Tài nguyên đang được tải lên... tải...

Chiến lược DCA động dựa trên khối lượng

Tác giả:ChaoZhang, Ngày: 2024-04-12 17:12:07
Tags:QFLDCATPSLATRADXEMASMARSIMACD

img

Tổng quan

Chiến lược này là một chiến lược DCA năng động dựa trên khối lượng sử dụng giá phá vỡ. Nó xác định mức giá thấp nhất gần đây và bắt đầu xây dựng các vị trí khi giá phá vỡ dưới mức thấp đó và khối lượng giao dịch tăng lên. Khi giá tiếp tục giảm, chiến lược điều chỉnh động số lượng của mỗi vị trí dựa trên kích thước tổn thất nổi cho đến khi đạt đến tổng số vị trí đã đặt. Đồng thời, chiến lược thiết lập giá lấy lợi nhuận dựa trên trung bình của tỷ lệ phần trăm giảm giá lịch sử.

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

  1. Sử dụng hàm ta.pivotlow() để xác định mức giá thấp gần đây nhất và coi nó là mức hỗ trợ.
  2. Tính toán tỷ lệ phần trăm giảm giá trong lịch sử sau khi phá vỡ mức hỗ trợ và lấy trung bình làm tham chiếu cho khoảng cách an toàn và tỷ lệ phần trăm lợi nhuận.
  3. Khởi động tín hiệu xây dựng vị trí khi giá vượt dưới mức hỗ trợ và khối lượng giao dịch tương đối lớn hơn số lần đặt.
  4. Dựa trên tổng số vị trí được đặt, chia tổng số tiền thành tỷ lệ bằng nhau. Mỗi khi một vị trí được xây dựng, điều chỉnh động kích thước vị trí dựa trên số lượng vị trí hiện tại, đạt được sự tăng trưởng theo cấp số nhân.
  5. Trong quá trình xây dựng vị trí, nếu lỗ biến động đạt ngưỡng đã thiết lập, tiếp tục thêm các vị trí cho đến khi đạt đến tổng số vị trí.
  6. Khi giá tăng lên mức lấy lợi nhuận, đóng tất cả các vị trí.

Ưu điểm chiến lược

  1. Điều chỉnh kích thước vị trí năng động: Bằng cách điều chỉnh kích thước của mỗi vị trí dựa trên tổn thất nổi trong thời gian giảm giá, chiến lược kiểm soát rủi ro đồng thời cho phép lợi nhuận lớn hơn khi giá phục hồi.
  2. Thiết lập tham số dựa trên dữ liệu lịch sử: Bằng cách tính toán trung bình của tỷ lệ giảm giá lịch sử sau khi phá vỡ mức hỗ trợ và sử dụng nó làm tham chiếu cho khoảng cách an toàn và tỷ lệ phần trăm lợi nhuận, các tham số chiến lược phù hợp hơn với điều kiện thị trường thực tế.
  3. Giới hạn tổng số vị trí: Bằng cách thiết lập tổng số vị trí, chiến lược kiểm soát rủi ro tổng thể của nó và tránh tổn thất quá mức do đặt vị trí quá mức.

Rủi ro chiến lược

  1. Nguy cơ thất bại mức hỗ trợ: Nếu thị trường gặp những điều kiện cực đoan và giá tiếp tục giảm mạnh sau khi phá vỡ mức hỗ trợ, cơ chế gia tăng vị trí của chiến lược có thể dẫn đến tổn thất đáng kể.
  2. Đặt tham số rủi ro: Hiệu suất của chiến lược phụ thuộc phần lớn vào các thiết lập tham số.
  3. Rủi ro đặt giá lấy lợi nhuận: Nếu giá lấy lợi nhuận được đặt quá cao, lợi nhuận tiềm năng có thể bị bỏ lỡ. Nếu được đặt quá thấp, các vị trí có thể được đóng quá sớm, bỏ lỡ cơ hội tận dụng đầy đủ sự phục hồi giá.

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

  1. Giới thiệu nhiều chỉ số hơn: Khi xác định tín hiệu xây dựng vị trí, có thể giới thiệu nhiều chỉ số kỹ thuật hơn như RSI và MACD để cải thiện độ chính xác tín hiệu.
  2. Tối ưu hóa quản lý tiền: Dựa trên các yếu tố như biến động thị trường và dung nạp rủi ro tài khoản, điều chỉnh năng động tỷ lệ tiền cho mỗi vị trí để kiểm soát rủi ro tốt hơn.
  3. Lợi nhuận thích nghi và dừng lỗ: Điều chỉnh năng động tỷ lệ phần trăm lợi nhuận và dừng lỗ dựa trên những thay đổi về biến động thị trường để thích nghi tốt hơn với những thay đổi của thị trường.

Tóm lại

Bằng cách điều chỉnh động kích thước vị trí và thiết lập các tham số dựa trên dữ liệu lịch sử, chiến lược này nhằm mục đích kiểm soát rủi ro trong khi tìm kiếm lợi nhuận lớn hơn trong thời gian giá phục hồi. Tuy nhiên, hiệu suất của chiến lược phần lớn phụ thuộc vào cài đặt tham số và điều kiện thị trường, và rủi ro vẫn tồn tại. Bằng cách giới thiệu nhiều chỉ số hơn, tối ưu hóa quản lý tiền, và sử dụng lợi nhuận thích nghi và dừng lỗ, hiệu suất của chiến lược có thể được cải thiện hơn nữa.


/*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)


Có liên quan

Thêm nữa