输入/搜索内容

OKX&Binance Websocket高频交易模板 (多品种)

模板类库
创建日期: 2022-12-27 15:37:42
最后修改: 3 年前
复制: 236
点击次数: 5000
12
关注
656
关注者

实现功能:

  • 公共流订阅, trades及深度合成
  • 私有流订阅, 维护本地委托单与仓位以及余额信息
  • 维护取消订单超时状态, 支持OKX的amendOrders修改订单
  • 支持多个品种, 方便高频策略以最低的延迟同时操作多个市场
  • 添加函数 EventLoop(需要最新托管者支持), 此函数可以在多个websocket连接的情况下, 等待任意websocket数据返回, 避免轮询
  • 支持OKX与Binance期货与Binance的现货与现货杠杆交易, OKX的现货暂未加入支持, 感兴趣的可以自己更改一下
  • OKX的私有流订阅需要Key与密码已经做为参数写在模板里
  • 自动处理断线重连等一些基本的网络功能
  • 支持私有流订单成交取消回报的事件回调
  • 统一两个交易所的下单逻辑, 具体可以看模板源码或者例子
  • 支持同时订阅多个交易所的websocket接口
  • 订单的报单修改以及删除可以批量做为任务返回, 会自动处理交易任务

高频下单的时候,交易所返回的定单会不及时(private通道),但这时侯行情可能已经变化,我们需要本地维护一个订单状态, 策略已经实现,
模板会自动识别是OKX还是Binance, 下面是一个简单的例子, 强烈建议阅读源码,这样能更深层次的定制你自己的功能

下面是一个简单的例子

function onTick(ctx, event) { if (event.depth) { Log("depth update", event) } if (event.trades) { Log("trades received", event) } if (event.balance || event.positions) { Log("account update", event) } if (event.orders) { Log("private orders update", event) } // include orders, positions, balance for latest Log("account", ctx.wsPrivate.account) // for test only if (false) { return { amendOrders: [{ instId: event.instId, clOrdId: "xxxx*****", cxlOnFail: true, newSz: "2", }], newOrders: [{ instId: event.instId, clOrdId: UUID(), side: "sell", tdMode: "cross", ordType: "post_only", px: event.depth.asks[0].price.toFixed(4), sz: "1", }, { instId: event.instId, clOrdId: UUID(), side: "sell", tdMode: "cross", ordType: "post_only", px: event.depth.asks[0].price.toFixed(4), sz: "1", }], cancelOrders: [{ instId: order.instId, clOrdId: order.Id }] } } } function main() { let instId = exchange.SetContractType("swap").InstrumentID let ctx = $.NewWSS(exchange, function(ws) { let msg = null if (exchange.GetName() === 'Futures_OKCoin') { msg = { op: "subscribe", args: [{ channel: "books5", instId: instId, }, { channel: "trades", instId: instId, }] } } else { let symbol = exchange.GetCurrency().replace('_', '').toLowerCase() msg = { method: "SUBSCRIBE", params: [symbol + "@aggTrade", symbol + "@depth20@100ms"], id: "1", } } ws.write(JSON.stringify(msg)) Log("subscribe", msg, "channel") LogStatus("Ready") }, onTick, Debug) while (true) { ctx.poll() EventLoop(1000) } }

运行效果如下, 也可以在订阅函数里订阅多个品种

img

下面是一个基于此模板实现的OKX与币安通用的市商策略的效果

img

img

策略源码
JavaScript

/* jshint esversion: 6 */
// AccessKey and Phassphrase only need if OKX
$.NewWSS = function(e, onWSSLogin, onWSSTick, Debug, UseMargin, AccessKey, Passphrase) {
    function NewOKXWebSocketPrivate(ctx) {
        let self = {
            ws: null,
            isReadyDic: {},
            lastPing: 0,
            ctx: ctx,
            account: {
                orders: {},
评论
全部评论 (10)

    好顶赞

    2 年前

    Invalid request: request ID must be an unsigned integer报错不能跑了,

    3 年前

    再试一下,可以了,币安订阅的ID是数字才可以导致的

    3 年前

    Invalid request: request ID must be an unsigned integer ID格式好像有问题了

    3 年前

    有没有显示出错行OK还是Binance ?

    3 年前

    binance合约报错信息Invalid request: request ID must be an unsigned integer 没有出错行 img

    3 年前

    Debug这个设置false和true分别代表什么意思

    3 年前

    能不能简单说下EventLoop函数的执行逻辑,我看api文档立面没有相关介绍

    4 年前

    晚些会加到文档里去

    4 年前

    Zero总牛🍺

    4 年前
  • 1
社区
回测系统
APP 下载
iPhone 下载
© 2015 - ∞ INVENTOR PTE LTD (SG)