Thực hiện một ý tưởng với 60 dòng mã - Chiến lược đánh bắt cá dưới hợp đồng

Tác giả:Lydia., Tạo: 2022-11-08 15:30:01, Cập nhật: 2023-09-20 09:05:08

img

Chiến lược lưới, chiến lược Martingale, mà thích biến động thị trường, có nhược điểm của riêng mình, và họ đã được thử nghiệm trong một thời gian trong thị trường hợp đồng ETH.FMZ.COMMột điều về loại chiến lược này rất đồng ý với một người bạn, đó là, như với các hợp đồng, đi dài có ít rủi ro hơn đi ngắn trong thị trường tiền kỹ thuật số.

Vì vậy, Martingale, Grid và các chiến lược khác sẽ chỉ đi dài, không đi ngắn, và phân tán rủi ro đánh bắt đáy trong một phạm vi dài sẽ tốt hơn so với vị trí song phương? Ý tưởng này nghe có vẻ rất tốt, nhưng không ai biết liệu nó có thể được thực hiện. Nhưng, ít nhất, chúng ta có thể kiểm tra lại nó một cách đơn giản. Vì vậy, chúng ta có chủ đề bài viết hôm nay thiết kế một chiến lược đánh bắt đáy hợp đồng.

Sự phát triển nhanh chóng dựa trênFMZ.COM

Mã để thực hiện ý tưởng này thực sự đơn giản, nhờ tính linh hoạt của nền tảng, kết nối kết nối, hệ thống backtesting mạnh mẽ và vân vân. Mã hoàn chỉnh chỉ có 60 dòng (đối với đặc điểm kỹ thuật viết mã, nhiều trong số đó không được viết tắt).

Ý tưởng thiết kế của chiến lược rất đơn giản. Đặt lệnh mua xuống theo khoảng thời gian theo giá ban đầu ở đầu logic và nếu giá tiếp tục giảm, chúng ta tiếp tục đặt lệnh mua, và tiếp tục đi câu cá đáy. Sau đó chúng ta đặt lệnh đóng vị trí dựa trên giá vị trí tăng một biên lợi nhuận nhất định, và chờ cho vị trí đóng. Nếu vị trí được đóng, logic trên sẽ được lặp lại với giá hiện tại là giá ban đầu. Chiến lược sẽ không đi ngắn để giữ vị trí, nhưng chỉ đi dài.

Mã nguồn chiến lược:

function cancelAll() {
    while (true) {
        var orders = _C(exchange.GetOrders)
        if (orders.length == 0) { 
            break 
        }
        for (var i = 0 ; i < orders.length ; i++) {
            exchange.CancelOrder(orders[i].Id, orders[i])
            Sleep(interval)
        }
    }
}

function getLong(arr, kind) {
    var ret = null 
    for (var i = 0 ; i < arr.length ; i++) {
        if (arr[i].Type == (kind == "pos" ? PD_LONG : ORDER_TYPE_BUY)) {
            ret = arr[i]
        }
    }
    return ret
}

function pendingBidOrders(firstPrice) {
    var index = 0
    var amount = baseAmount
    while (true) {
        var pos = _C(exchange.GetPosition)
        var price = firstPrice - index * baseSpacing
        amount *= ratio
        index++
        exchange.SetDirection("buy")
        exchange.Buy(price, amount)        
        if (pos.length != 0) {
            var longPos = getLong(pos, "pos")
            if (longPos) {
                exchange.SetDirection("closebuy")
                exchange.Sell(longPos.Price + profitTarget, longPos.Amount)
            }
        }
        while (true) {
            Sleep(interval)
            if (!getLong(_C(exchange.GetOrders), "orders")) {
                cancelAll()
                break
            }
            if (!getLong(_C(exchange.GetPosition), "pos")) {
                cancelAll()
                return 
            }
        }
    }
}

function main() {
    exchange.SetContractType(symbol)
    while (true) {
        pendingBidOrders(_C(exchange.GetTicker).Last)
    }
}

Thiết kế tham số cũng rất đơn giản:

img

Chỉ với 6 thông số này.

Nhìn vào kết quả backtesting.

Đặt khoảng thời gian backtesting ngẫu nhiên:

img

Kiểm tra hậu quả:

img

img

img

Nó trông giống như chiến lược lưới, chiến lược Martingale rất nhiều ~. Học sinh mới bắt đầu thường sợ chiến lược với mã dài, dễ dàng bị thuyết phục. Một chiến lược ngắn gọn và ngắn gọn để bắt đầu là dễ dàng hơn và phù hợp hơn để hiểu các ý tưởng chiến lược và học thiết kế logic.

Mã chiến lược chỉ dành cho mục đích nghiên cứu và nghiên cứu.


Có liên quan

Thêm nữa