Hợp đồng tiền kỹ thuật số dễ dàng theo dõi robot

Tác giả:Giấc mơ nhỏ, Tạo: 2021-04-07 21:30:05, Cập nhật: 2023-09-24 19:35:33

img

Hợp đồng tiền kỹ thuật số dễ dàng theo dõi robot

Trong bài viết trước, chúng tôi đã thực hiện một robot thanh toán trực tiếp đơn giản, và hôm nay chúng tôi thực hiện một robot thanh toán đơn giản theo hợp đồng.

Ý tưởng thiết kế

Có một sự khác biệt lớn giữa bản hợp đồng và bản hiện tại, bản hiện tại có thể được thực hiện chủ yếu 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 tài khoản. Vì vậy, các phiên bản tương lai có một số vấn đề phức tạp hơn, bởi vì tương lai có nhiều đầu nắm giữ, đầu trống nắm giữ, các hợp đồng khác nhau. Các động thái theo dõi đơn được kích hoạt dựa trên biến động của cổ phiếu. Ban đầu, dự định xử lý nhiều đầu, không đầu cùng nhau, nhưng điều này trở nên phức tạp. Sau khi phân tích vấn đề, quyết định xử lý nhiều đầu, không đầu riêng biệt cho cổ phiếu.

Chiến lược thực hiện

Các tham số chiến lược:

img

Hỗ trợ kiểm tra lại, bạn có thể trực tiếp sử dụng cài đặt mặc định để kiểm tra lại quan sát.

Nguồn mã chiến lược:

/*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() {
    // 测试函数
    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), "参考账户测试开单#FF0000")
        } else if(x < 0.2) {
            exchange.SetDirection("sell")
            exchange.Sell(-1, _N(Math.max(1, x * 10), 0), "参考账户测试开单#FF0000")
        } else if(x >= 0.2 && x <= 0.5 && longPosAmount > 4) {
            exchange.SetDirection("closebuy")
            exchange.Sell(-1, longPosAmount, "参考账户测试平仓#FF0000")
        } else if(shortPosAmount > 4) {
            exchange.SetDirection("closesell")
            exchange.Buy(-1, _N(shortPosAmount / 2, 0), "参考账户测试平仓#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) {
        // 开仓
        var tradeFunc = type == PD_LONG ? e.Buy : e.Sell
        e.SetDirection(type == PD_LONG ? "buy" : "sell")
        tradeFunc(-1, delta)
    } else if (delta < 0) {
        // 平仓
        var tradeFunc = type == PD_LONG ? e.Sell : e.Buy
        e.SetDirection(type == PD_LONG ? "closebuy" : "closesell")
        if (nowAmount <= 0) {
            Log("未检测到持仓")
            return 
        }
        tradeFunc(-1, Math.min(nowAmount, Math.abs(delta)))
    } else {
        throw "错误"
    }
}

function main() {
    LogReset(1)
    if (exchanges.length < 2) {
        throw "没有跟单的交易所"
    }
    var exName = exchange.GetName()
    // 检测参考交易所
    if (!exName.includes("Futures_")) {
        throw "仅支持期货跟单"
    }
    Log("开始监控", exName, "交易所", "#FF0000")
    
    // 检测跟单交易所
    for (var i = 1 ; i < exchanges.length ; i++) {
        if (exchanges[i].GetName() != exName) {
            throw "跟单的期货交易所和参考交易所不同!"
        }
    }
    
    // 设置交易对、合约
    _.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()) {    // 回测时才模拟
            test()            // 测试函数,模拟参考账户主动交易,触发跟单账户跟单        
        }
        Sleep(5000)
        var nowRefPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
        var tbl = {
            type : "table", 
            title : "持仓",
            cols : ["名称", "标签", "多仓", "空仓", "账户资产(Stocks)", "账户资产(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) + "`")
        
        // 计算仓位变动量
        var longPosDelta = nowRefPosAmount.long - initRefPosAmount.long
        var shortPosDelta = nowRefPosAmount.short - initRefPosAmount.short

        // 检测变动
        if (longPosDelta == 0 && shortPosDelta == 0) {
            continue
        } else {
            // 检测到仓位变动
            for (var i = 1 ; i < exchanges.length ; i++) {
                // 执行多头动作
                if (longPosDelta != 0) {
                    Log(exchanges[i].GetName(), exchanges[i].GetLabel(), "执行多头跟单,变动量:", longPosDelta)
                    trade(exchanges[i], refCt, PD_LONG, longPosDelta)
                }
                // 执行空头动作
                if (shortPosDelta != 0) {
                    Log(exchanges[i].GetName(), exchanges[i].GetLabel(), "执行空头跟单,变动量:", shortPosDelta)
                    trade(exchanges[i], refCt, PD_SHORT, shortPosDelta)
                }
            }
        }

        // 执行跟单操作后,更新
        initRefPosAmount = nowRefPosAmount
    }
}

Kiểm tra

Vì OKEX đã cập nhật giao diện V5 và có thể sử dụng ổ đĩa OKEX, tôi đã thử nghiệm rất thuận tiện với hai ổ đĩa OKEX API KEY.

Đối tượng giao dịch đầu tiên được thêm vào là giao dịch tham khảo, và các giao dịch theo dõi tài khoản giao dịch này. Trên trang OKEX, hãy tham khảo tài khoản sàn giao dịch và tự động chuyển đổi 3 hợp đồng tiền tệ theo quý.

img

Bạn có thể thấy đĩa thực đã phát hiện ra sự thay đổi trong tài khoản giao dịch tài khoản tham khảo, sau đó theo dõi các hoạt động.

img

Chúng ta hãy thử một lần nữa để cân bằng hai vị trí hợp đồng vừa được mở, và sau khi cân bằng, chúng ta sẽ thấy như sau:

img

Theo đó, các đối thủ đã có cơ hội tham gia vào các cuộc thi đấu.

img

Chiến lược này được thiết kế theo cách đơn giản và dễ hiểu, không được tối ưu hóa, phần hoàn thiện cũng cần xử lý các chi tiết như kiểm tra tài sản khi thanh toán. Để thiết kế đơn giản, chỉ sử dụng danh sách giá thị trường.

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

Chào mừng bạn để ý nhé.


Có liên quan

Thêm nữa

pw1013Hai sàn giao dịch khác nhau không thể giao dịch.

Mingxi1005Khi nào các nhà phát minh có thể kết nối đồng tiền và giành chiến thắng trong hợp đồng tương lai?

aklkcTôi hy vọng có một phiên bản thanh toán của Bitcoin USDT.

lau99Bạn muốn có phiên bản hợp đồng vĩnh cửu của Bitcoin usdt, API của người thực hiện????

ZhousoneTôi mong muốn có một phiên bản hợp đồng vĩnh viễn của token usdt.

QQlove23Xin cảm ơn bạn đã chia sẻ, rất đáng để học.

Giấc mơ nhỏDo các giao dịch có thể có các đặc điểm khác nhau về hợp đồng, mã đơn hàng có thể được điều chỉnh theo từng trường hợp cụ thể.

pw1013Tôi sử dụng sàn giao dịch bibox, với 80% hoàn lại, FMZ hoàn toàn hỗ trợ.

pw1013Tôi đang sử dụng Bibox tương lai, nếu tôi muốn liên kết với các sàn giao dịch okx của người khác, tôi cần thay đổi ở đâu?

Giấc mơ nhỏCó thể thực hiện được, chỉ cần thay đổi mã là được.

Giấc mơ nhỏTrong khi đó, các nhà đầu tư khác cũng đã liên lạc với chúng tôi để đánh giá thị trường này.