Cryptocurrency Contract Simple Order-Supervising Bot

Tác giả:Ninabadass, Tạo: 2022-04-11 10:47:42, Cập nhật: 2022-04-11 10:53:37

Cryptocurrency Contract Simple Order-Supervising Bot

Trong bài viết trước, chúng tôi đã thực hiện một đơn giản giao dịch lệnh giám sát bot, và ngày hôm nay chúng tôi sẽ thực hiện một phiên bản hợp đồng của một đơn giản lệnh giám sát bot.

Ý tưởng thiết kế

Có một sự khác biệt lớn giữa bot giám sát lệnh của phiên bản hợp đồng và phiên bản giao ngay. Việc giám sát lệnh giao ngay chủ yếu có thể được thực hiện bằng cách theo dõi sự thay đổi tài sản tài khoản. Phiên bản tương lai cần theo dõi sự thay đổi vị trí trong tài khoản. Do đó, tình hình của phiên bản tương lai phức tạp hơn, bởi vì có các hợp đồng khác nhau cho các vị trí dài và ngắn của tương lai, cần phải giải quyết một loạt các chi tiết. Ý tưởng cốt lõi là theo dõi các thay đổi vị trí và kích hoạt hành động giám sát lệnh dựa trên các thay đổi vị trí. Ban đầu nó được thiết kế để xử lý các vị trí dài và ngắn cùng nhau, nhưng chúng tôi thấy sẽ phức tạp để giải quyết điều đó. Sau khi phân tích vấn đề, quyết định xử lý các vị trí dài và ngắn riêng biệt.

Thực hiện chiến lược

Parameter chiến lược:

img

Nó hỗ trợ backtest, và có thể trực tiếp sử dụng các cài đặt mặc định để backtest để quan sát.

Mã nguồn:

/*backtest
start: 2021-03-18 00:00:00
end: 2021-04-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"},{"eid":"Futures_OKCoin","currency":"BTC_USD"},{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*/

function test() {
    // test function 
    var ts = new Date().getTime()    
    if (ts % (1000 * 60 * 60 * 6) > 1000 * 60 * 60 * 5.5) {
        Sleep(1000 * 60 * 10)
        var nowPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
        var longPosAmount = nowPosAmount.long
        var shortPosAmount = nowPosAmount.short
        var x = Math.random()
        if (x > 0.7) {
            exchange.SetDirection("buy")
            exchange.Buy(-1, _N(Math.max(1, x * 10), 0), "the reference account tests ordering#FF0000")
        } else if(x < 0.2) {
            exchange.SetDirection("sell")
            exchange.Sell(-1, _N(Math.max(1, x * 10), 0), "the reference account tests ordering#FF0000")
        } else if(x >= 0.2 && x <= 0.5 && longPosAmount > 4) {
            exchange.SetDirection("closebuy")
            exchange.Sell(-1, longPosAmount, "the reference account tests closing positions#FF0000")
        } else if(shortPosAmount > 4) {
            exchange.SetDirection("closesell")
            exchange.Buy(-1, _N(shortPosAmount / 2, 0), "he reference account tests closing position#FF0000")
        }
    }
}

function getPosAmount(pos, ct) {
    var longPosAmount = 0
    var shortPosAmount = 0
    _.each(pos, function(ele) {
        if (ele.ContractType == ct && ele.Type == PD_LONG) {
            longPosAmount = ele.Amount
        } else if (ele.ContractType == ct && ele.Type == PD_SHORT) {
            shortPosAmount = ele.Amount
        }
    })
    return {long: longPosAmount, short: shortPosAmount}
}

function trade(e, ct, type, delta) {
    var nowPosAmount = getPosAmount(_C(e.GetPosition), ct)
    var nowAmount = type == PD_LONG ? nowPosAmount.long : nowPosAmount.short
    if (delta > 0) {
        // open position
        var tradeFunc = type == PD_LONG ? e.Buy : e.Sell
        e.SetDirection(type == PD_LONG ? "buy" : "sell")
        tradeFunc(-1, delta)
    } else if (delta < 0) {
        // close position 
        var tradeFunc = type == PD_LONG ? e.Sell : e.Buy
        e.SetDirection(type == PD_LONG ? "closebuy" : "closesell")
        if (nowAmount <= 0) {
            Log("no position detected")
            return 
        }
        tradeFunc(-1, Math.min(nowAmount, Math.abs(delta)))
    } else {
        throw "error"
    }
}

function main() {
    LogReset(1)
    if (exchanges.length < 2) {
        throw "no platform with order supervision"
    }
    var exName = exchange.GetName()
    // detect the platform for reference 
    if (!exName.includes("Futures_")) {
        throw "only support futures order supervising"
    }
    Log("start monitoring", exName, "platform", "#FF0000")
    
    // detect the order supervising platform 
    for (var i = 1 ; i < exchanges.length ; i++) {
        if (exchanges[i].GetName() != exName) {
            throw "The order supervising platform is different from the reference platform!"
        }
    }
    
    // set trading pair and contract 
    _.each(exchanges, function(e) {
        if (!IsVirtual()) {
            e.SetCurrency(refCurrency)
            if (isSimulate) {
                if (e.GetName() == "Futures_OKCoin") {
                    e.IO("simulate", true)
                }
            }
        }
        e.SetContractType(refCt)
    })

    var initRefPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
    while(true) {
        if (IsVirtual()) {    // only simulate during backtest 
            test()            // test function, which simulates a reference account to trade automatically, to trigger the order supervising of the account        
        }
        Sleep(5000)
        var nowRefPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
        var tbl = {
            type : "table", 
            title : "position",
            cols : ["name", "label", "long", "short", "account asset (Stocks)", "account assest (Balance)"],
            rows : []
        }
        _.each(exchanges, function(e) {
            var pos = getPosAmount(_C(e.GetPosition), refCt)
            var acc = _C(e.GetAccount)
            tbl.rows.push([e.GetName(), e.GetLabel(), pos.long, pos.short, acc.Stocks, acc.Balance])
        })
        LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`")
        
        // calculate the position amount of change 
        var longPosDelta = nowRefPosAmount.long - initRefPosAmount.long
        var shortPosDelta = nowRefPosAmount.short - initRefPosAmount.short

        // detect the change 
        if (longPosDelta == 0 && shortPosDelta == 0) {
            continue
        } else {
            // detect the position change 
            for (var i = 1 ; i < exchanges.length ; i++) {
                // execute the action of long
                if (longPosDelta != 0) {
                    Log(exchanges[i].GetName(), exchanges[i].GetLabel(), "Execute long order supervising, amount of change:", longPosDelta)
                    trade(exchanges[i], refCt, PD_LONG, longPosDelta)
                }
                // execute the action of short
                if (shortPosDelta != 0) {
                    Log(exchanges[i].GetName(), exchanges[i].GetLabel(), "Execute short order supervising, amount of change:", shortPosDelta)
                    trade(exchanges[i], refCt, PD_SHORT, shortPosDelta)
                }
            }
        }

        // after the operation of order supervising, update
        initRefPosAmount = nowRefPosAmount
    }
}

Kiểm tra

Với thực tế rằng sau khi OKEX cập nhật giao diện V5, và OKEX mô phỏng bot có thể được sử dụng, tôi đã sử dụng API KAYs của hai OKEX mô phỏng bot để thử nghiệm, rất thuận tiện.

Đối tượng trao đổi đầu tiên được thêm vào là nền tảng tham chiếu và nền tảng giám sát lệnh theo tài khoản của nền tảng tham chiếu để hoạt động. Trên trang bot mô phỏng của OKEX, tài khoản nền tảng tham khảo đặt 3 hợp đồng ký quỹ mật mã hàng quý bằng ETH.

img

Nó có thể thấy rằng bot phát hiện ra sự thay đổi vị trí, và các hoạt động sau.

img

Chúng ta hãy thử đóng 2 vị trí hợp đồng mà chúng ta vừa mở.

img

Robot đã theo dõi và đóng 2 hợp đồng.

img

Chiến lược được thiết kế một cách đơn giản và dễ hiểu mà không cần tối ưu hóa. Phần được cải tiến cũng cần phải giải quyết các chi tiết như phát hiện tài sản khi giám sát lệnh. Để đơn giản hóa thiết kế, lệnh thị trường được sử dụng để giám sát lệnh. Chiến lược chỉ cung cấp các ý tưởng học tập và bot có thể được tối ưu hóa theo nhu cầu của bạn.

Địa chỉ chiến lược:https://www.fmz.com/strategy/270012

Chào mừng bạn để lại bình luận của bạn.


Thêm nữa