2.8 切换行情数据更新模式(详解)

Author: 小小梦, Created: 2016-07-13 10:08:50, Updated: 2017-10-11 10:21:29

切换行情数据更新模式

  • 以下是API文档中的介绍:
// 只支持Websocket模式(huobi, okcoin.cn, BTCC支持)与商品期货CTP协议
exchange.IO("websocket"); // 切换行情通信协议到websocket(默认为rest), Ticker, Depth会切换为websocket协议来更新, 商品期货CTP无需切换
// 切换GetTicker, GetDepth数据更新模式
exchange.IO("mode", 0); // 立即返回模式, 如果当前还没有接收到交易所最新的行情数据推送, 就立即返回旧的行情数据, 如果有新的数据就返回新的数据
exchange.IO("mode", 1); // 缓存模式(默认模式), 如果当前还没有收到交易所最新的行情数据(同上一次api获取的数据比较), 就等待接收然后再返回, 
                        //如果调用该函数之前收到了最新的行情数据, 就立即返回最新的数据
exchange.IO("mode", 2); // 强制更新模式, 进入等待一直到接收到交易所下一次的最新推送数据后返回
// 如果想第一时间获取最新的行情可以切换到websocket后不Sleep的立即检测数据, GetTicker, GetDepth用缓存模式进行工作
exchange.IO("websocket");
while (true) {
    Log(exchange.GetTicker());
}
  • 为了方便用户理解,下面详细介绍下:

    • 1、平台系统默认的是rest模式:在rest模式下一次API 数据请求,交易所服务器返回一次数据(当前最新的), 交易所服务器不会主动向用户推送最新数据。所以策略在使用rest模式的时候需要频繁请求数据保证能及时获取最新数据(不一定能在新数据产生的第一时间拿到,因为一问一答,问了才回答)

    • 2、websocket 模式支持的API 有GetTicker , GetDepth 。 在调用exchanges[0].IO("websocket"); 函数后,开启websocket模式, 有细心的同学可能看到为什么是exchanges[0]这样写呢。看下图 img 比如在一个策略中添加了两个交易所(也可以是多个),在平台定义的全局对象中有一个数组代表了所有在策略中添加的交易所,这个数组就是 exchanges — 交易所对象数组,主交易所对象就是数组的第一个(索引为0的元素):exchanges[0] 火币交易所对象。第二个交易所对象: exchanges[1] OKCoin交易所对象。exchange 就是 exchanges[0] 。支持websocket的交易所有火币、OKCoin现货、BTCC 。 CTP商品期货默认的是CTP协议,类似websocket ,使用时无需切换。

    • 3、websocket模式与rest的区别:在websocket 模式下,托管者会向交易所服务器发送订阅请求,交易所服务器收到后。每当有最新数据时,会主动推送给托管者。托管者缓存这些数据,当策略机器人请求数据时会快速获得,并且数据是最新的。(因为交易所服务器有新数据更新时会主动推送过来)

    • 4、websocket模式开启后,有3种工作模式可以设置:

      • <1> exchange.IO("mode",0);//立即返回模式: 该模式立即返回当前的数据(当前最新)。

      • <2> exchange.IO("mode",1);//缓存模式(默认模式): 该模式分2个处理分支, 第一,API请求数据时,如果当前缓存的数据同上一次API获取的数据比较不是最新的,请求数据的API会等待接收,收到返回。 第二,API请求数据时,如果当前缓存的数据同上一次API获取的数据比较是最新的(即调用API请求数据前收到了最新的行情数据),就立即返回最新的数据。

      • <3> exchange.IO("mode",2);//强制更新模式: 该模式猛一看介绍可能与 缓存模式 的一个逻辑分支 容易混淆,但是想想就明白了。 缓存模式是对 缓存的数据进行判断是否最新。而强制更新模式则是不论现在的行情是否是最新的,都强行等到下一次最新的行情数据推送过来。(此期间请求数据的API一直等待)


More

hokshelato ```js function main() { exchange.IO("websocket"); while (true) { Log(exchange.GetTicker()); } } ``` 1. 不能回测,报错 `main:2:12 - ReferenceError: setLastError is not defined`,推测是因为回测系统不支持异步推送数据。 2. 模拟盘报错,`Futures_OP 4: period not support`,然后只能接收到一条 ticker 数据,且机器人无法正常停止,一直提示“停止中”,需手动杀掉。

FangBei 缓存的数据有多少条?会缓存多久才被清理?

hokshelato 明白了,谢谢!

小小梦 1、 回测 中 没有 rest ,websocket 之分。。。>_< 2、 模拟盘 也没有 websocket 模式。 文档写 只有 OKEX 火币pro 支持 websocket 协议。

小小梦 会最多缓存几百上千条,具体的我要查阅下。