Chiến lược giao dịch vị trí động Martingale dài dựa trên lưới

Tác giả:ChaoZhang, Ngày: 2024-03-22 15:12:33
Tags:

img

Tổng quan chiến lược

Chiến lược này là một chiến lược giao dịch lưới giao dịch vị trí động Martingale dựa trên lưới. Ý tưởng chính là điều chỉnh kích thước vị trí dựa trên số lượng vị trí hiện có khi giá chạm vào đường lưới, trong khi thiết lập tổng số vị trí mở tối đa. Khi giá tăng và đạt mức lợi nhuận, tất cả các vị trí dài sẽ bị đóng.

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

  1. Chia giá thành các lưới có khoảng cách đồng đều dựa trên tham số Kích thước lưới.
  2. Đặt lệnh giới hạn dài ở mỗi đường lưới.
  3. Khi giá hiện tại chạm vào đường lưới:
    • Nếu số lượng các vị trí mở hiện tại là 0, mở một vị trí với kích thước start_lot.
    • Nếu số lượng các vị trí mở hiện tại lớn hơn 0 và giá lưới hiện tại thấp hơn giá đầu vào trước đó, mở một vị trí dài mới với giá lưới hiện tại với kích thước là nhân nhân kích thước vị trí trước đó.
  4. Số lượng tối đa các vị trí mở được điều khiển bởi tham số Max Open Orders.
  5. Sau khi mở một vị trí, đặt mức lấy lợi nhuận ở mức TakeProfit điểm trên giá nhập trung bình.
  6. Khi giá hiện tại đạt đến mức lợi nhuận, đóng tất cả các vị trí dài và đặt lại các tham số.

Bằng cách này, kích thước vị trí tăng dần trong thời gian giảm, và lợi nhuận được lấy khi giá phục hồi và đạt mức lợi nhuận.

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

  1. Định kích thước vị trí động: Điều chỉnh động kích thước vị trí cho mỗi mục dựa trên số lượng vị trí mở hiện tại. Điều này tăng dần rủi ro trong thời gian xu hướng giảm liên tục, tăng tiềm năng lợi nhuận của chiến lược.
  2. Các tham số linh hoạt: Kích thước lưới, start_lot, multifactor và các tham số khác cho phép kiểm soát linh hoạt về kích thước lưới, kích thước vị trí ban đầu, yếu tố mở rộng vị trí, v.v.
  3. Rủi ro có thể kiểm soát được: Parameter Max Open Orders kiểm soát số lượng tối đa các vị trí mở để ngăn ngừa tiếp xúc quá mức.

Rủi ro chiến lược

  1. Không có lỗ dừng: Chiến lược không có lỗ dừng. Nếu giá tiếp tục giảm, nó có thể phải đối mặt với rủi ro lỗ đáng kể.
  2. Tính nhạy cảm của các tham số: Hiệu suất của chiến lược khá nhạy cảm với các tham số như đa yếu tố.
  3. Sự biến động cao: Chiến lược có thể thường xuyên mở và đóng các vị trí trong điều kiện thị trường biến động cao, có khả năng gây ra chi phí trượt và hoa hồng bổ sung.

Các biện pháp kiểm soát rủi ro:

  1. Cẩn thận thiết lập các tham số như multifactor dựa trên khả năng chấp nhận rủi ro.
  2. Cẩn thận backtest và buôn bán giấy để chọn các thông số thích hợp.
  3. Đánh giá hiệu suất của chiến lược trong điều kiện thị trường biến động cao. Nếu cần thiết, rủi ro có thể được giảm thiểu bằng cách điều chỉnh các tham số hoặc hạn chế các kịch bản sử dụng.

Hướng dẫn tối ưu hóa

  1. Thêm phát hiện xu hướng: Xác định xu hướng dựa trên hành động giá khi mở các vị trí. Nếu xu hướng xuất hiện giảm, tránh mở các vị trí dài mới để giảm rủi ro.
  2. Lợi nhuận năng động: Điều chỉnh năng động mức lợi nhuận dựa trên hành động giá, biến động và các chỉ số khác.
  3. Tối ưu hóa quản lý vị trí: Khi thêm vào các vị trí, ngoài việc xem xét yếu tố mở rộng, cũng kết hợp số dư tài khoản, rủi ro hiện tại, v.v. để kiểm soát chính xác hơn kích thước vị trí.
  4. Kết hợp với các tín hiệu khác: Kết hợp giao dịch lưới với các tín hiệu phát hiện xu hướng, phát hiện dao động và các tín hiệu chỉ số khác để đánh giá toàn diện thị trường và hướng dẫn giao dịch.

Những tối ưu hóa này có thể cải thiện khả năng thích nghi của chiến lược để nắm bắt tốt hơn các biến động của thị trường, tăng tiềm năng lợi nhuận và độ bền.

Tóm lại

Chiến lược giao dịch vị trí động Martingale dài dựa trên lưới này cố gắng giảm giá nắm giữ trung bình trong thời gian xu hướng giảm bằng cách dần dần thêm các vị trí và kiếm lợi nhuận khi giá tăng. Chiến lược cung cấp sự linh hoạt mạnh mẽ thông qua cài đặt tham số. Tuy nhiên, nó cũng mang lại những rủi ro tiềm năng đáng kể đòi hỏi phải đánh giá và kiểm soát cẩn thận. Nếu phát hiện xu hướng, lợi nhuận năng động, tối ưu hóa vị trí và các tính năng khác có thể được thêm vào, hiệu suất của chiến lược có thể được tăng thêm. Chiến lược thực hiện các chức năng để tự động mở và thêm các vị trí khi giá chạm vào đường lưới, và tự động đóng tất cả các vị trí khi giá chạm mức lợi nhuận. Lý thuyết tổng thể tương đối rõ ràng, nhưng có chỗ cho tối ưu hóa. Chiến lược phù hợp để sử dụng thận trọng sau khi đánh giá kỹ các điều kiện và tham số thị trường.


/*backtest
start: 2023-03-16 00:00:00
end: 2024-03-21 00:00:00
period: 1d
basePeriod: 1h
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/
// © lagerta13
//@version=4
strategy("Grid A.", shorttitle="Grid(A)", overlay=true, format=format.price, precision=4, pyramiding = 100)

input_tf=input("15", "Started TimeFrame", 
 options = ["1", "5", "15", "30", "1H", "4H", "1D", "1W", "1M"],
 group="TimeFrame") 

// avg_tf=input("5", "Average TimeFrame", 
//  options = ["1", "5", "15", "30", "1H", "4H", "1D", "1W", "1M"],
//  group="TimeFrame")

slip_Hilo = input(3.0, "Slippage by open order", group="Strategy Settings")
start_lot = input(0.01, "Start lot", group="Strategy Settings")
start_avg = input(2, "Started average since Order #", group="Strategy Settings")
MaxTrades_Hilo = input(10, "Max Open Orders", group="Strategy Settings")
dropdown_selection = input("Only Long", "Direction", options=["Only Long", "Only Short", "Long & Short"],
 group="Strategy Settings")
type_selection = input("By Close", "Type input", options=["By Close", "By grid line"],
 group="Strategy Settings")

multifactor = input(1.5, "Multifactor", group="Strategy Settings")
precision_lot = input(2, "Number of precision", group="Strategy Settings")
take_profit = input(1, "TakeProfit", group="Strategy Settings")

// PipStep_S1 = input(30)
// PipStepX_S1 = input(1.2)
// dinamicStep = input(false, "Dinamic Step for AVG")

get_size_lot_order(number, multi, prec, avg_from, lot_from) =>
	res = lot_from
	for i = 1 to number
		if i >= avg_from
			res := round(res * multi, precision = prec)
	res

var float[] entry_levels = array.new_float(MaxTrades_Hilo + 1)

for i = 0 to MaxTrades_Hilo
    array.push(entry_levels, 0)

gridSize = input(0.5, title="Grid Size")
gridLevels = int(close / gridSize) * gridSize

var int num_open_orders = 0
var float sum_price_orders = 0
var float entry_lot = 0

buy_condition = num_open_orders < MaxTrades_Hilo and gridLevels[0]<gridLevels[1] and dropdown_selection != "Only Short"

if (buy_condition)

    if num_open_orders == 0
        lot = get_size_lot_order(num_open_orders, multifactor, precision_lot, start_avg, start_lot)
        sum_price_orders := sum_price_orders + gridLevels[1] * lot 

        strategy.entry("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]+slip_Hilo) 
        // strategy.order("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]) 

        array.set(entry_levels, num_open_orders, gridLevels[1])

        entry_lot := entry_lot + lot
        num_open_orders := num_open_orders + 1

    else
        if gridLevels[1] < (array.get(entry_levels, num_open_orders - 1))
            lot = get_size_lot_order(num_open_orders, multifactor, precision_lot, start_avg, start_lot)
            sum_price_orders := sum_price_orders + gridLevels[1] * lot 
            entry_lot := entry_lot + lot

            strategy.entry("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]+slip_Hilo) 

            // +" S:" + tostring(sum_price_orders / (entry_lot)) + " Prev:" + tostring(array.get(entry_levels, num_open_orders - 1))
            // strategy.order("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]) 
            array.set(entry_levels, num_open_orders, gridLevels[1])

            num_open_orders := num_open_orders + 1


take = sum_price_orders > 0 and take_profit + (sum_price_orders / entry_lot) < high ? high : na
plotshape(take, location = location.belowbar, color = color.white)


strategy.exit("tp", comment = "TP " + tostring(num_open_orders), qty = entry_lot, limit = take_profit + (sum_price_orders / entry_lot))


if sum_price_orders > 0 and take_profit + (sum_price_orders / entry_lot) <= high
    num_open_orders := 0
    sum_price_orders := 0
    entry_lot := 0
    for i = 0 to MaxTrades_Hilo
        array.set(entry_levels, i, 0)

plot(gridLevels, color=color.blue, style=plot.style_circles, linewidth=2)

 

Thêm nữa