Mã 60 dòng thực hiện một ý tưởng - Săn cá đáy hợp đồng

Tác giả:Ninabadass, Tạo: 2022-04-02 18:27:54, Cập nhật: 2022-04-02 18:29:47

Mã 60 dòng thực hiện một ý tưởng - Săn cá đáy hợp đồng

Chiến lược lưới và chiến lược Martingale, mà thích dao động báo giá thị trường, có nhược điểm vốn có, và các chiến lược tương tự đã được thử nghiệm trong thị trường hợp đồng ETH trong một khoảng thời gian.FMZ.COMCó một điều mà tôi thực sự đồng ý với một người bạn về loại chiến lược này. đó là làm các hợp đồng trong vòng đồng tiền, và rủi ro của việc mua dài là ít hơn so với việc mua ngắn. hoặc nói đơn giản, sự sụt giảm tồi tệ nhất là quay trở lại không, nhưng sự gia tăng là vô hạn.

Vì vậy, các chiến lược như Martingale và Grid chỉ làm cho dài, nhưng không phải ngắn? Có tốt hơn để phân tán rủi ro đánh bắt đáy trong một phạm vi dài hơn là làm 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ể chịu được cuộc chiến thực tế. Nhưng ít nhất chúng ta có thể chỉ đơn giản là backtest ý tưởng này. Do đó, chúng ta có chủ đề của bài viết ngày hôm nay - Thiết kế một Chiến lược đánh bắt đáy hợp đồng.

Phát triển nhanh dựa trênFMZ.COM

Mã để thực hiện ý tưởng này rất đơn giản, nhờ vào tính linh hoạt, kết cấu giao diện và hệ thống backtest mạnh mẽ của nền tảng FMZ, v.v. Toàn bộ mã chỉ có 60 dòng (đối với các thông số kỹ thuật viết mã, nhiều dòng có thể được rút ngắn, không được rút ngắn).

Thiết kế của ý tưởng chiến lược rất đơn giản. Theo giá ban đầu ở đầu logic, đặt lệnh mua, nếu khoảng cách khoảng cách đang giảm. Nếu giá tiếp tục giảm, tiếp tục đặt lệnh mua, và giữ đáy câu cá. Sau đó chờ lệnh đóng vị trí sau khi giá vị trí thêm một mức chênh lệch lợi nhuận nhất định, và chờ để đóng. Nếu vị trí được đóng, logic trên được lặp lại với giá hiện tại là giá ban đầu. Chiến lược không làm ngắn, chỉ làm 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ế các thông số cũng rất đơn giản:

img

Chỉ có một vài thông số.

Hãy xem kết quả backtest của hàng chục dòng mã

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

img

Kiểm tra hậu quả:

img

img

Nó trông giống như một chiến lược kiểu lưới hoặc Martingale. Những người mới học chỉ mới bắt đầu rất sợ các chiến lược dài và dễ dàng bị thuyết phục bỏ đi? Một giới thiệu chiến lược ngắn gọn và ngắn gọn phù hợp hơn, và dễ dàng tiêu hóa ý tưởng chiến lược và học thiết kế logic.

Các mã chiến lược ở trên chỉ được sử dụng cho nghiên cứu và nghiên cứu.


Thêm nữa