我在 poloniex.com 上制作用于剥头皮的软件为此,我需要了解有关订单簿的最新信息。 API DOCUMENTATION谈到了推送 api。据我了解,它是这样工作的:
- 使用 returnOrderBook(公共方法 API)获取快照
- 从响应中获取序列号(seq key)
- 使用快照中的序列号订阅推送 api
接收新数据并对快照数据进行更正。
<?php namespace Crypto\Scalper\Cli; use AppConfig; use Monolog\Logger; use Monolog\Handler\StreamHandler; use AndreasGlaser\PPC\PPC; use Thruway\ClientSession; use Thruway\Peer\Client; use Thruway\Transport\PawlTransportProvider; use Psr\Log\NullLogger; /** * Class PoloniexSyncCli * @package Crypto\Scalper\Cli */ class PoloniexSyncCli { private $log; private $orderbooks; /** * Constructor. */ public function __construct() { // Logging $this->log = new Logger('PoloniexSyncCli'); $this->log->pushHandler(new StreamHandler('php://stdout', Logger::DEBUG)); } public function loop() { $this->log->info('Sync poloniex data'); while (true) { $this->getOrderbooks(); $this->subscribe(); sleep(10); } } /** * Get orderbook snapshot */ private function getOrderbooks() { $this->log->info('Getting order book snapshot (REST API)'); $poloniex = AppConfig::get('poloniex'); $ppc = new PPC($poloniex['apiKey'], $poloniex['secret']); $result = $ppc->getOrderBook('USDT_BTC', 50); if (array_key_exists('error', $result->decoded)) { $this->log->error("Error on REST API request: {$result->decoded['error']}"); exit; } $this->orderbooks = $result->decoded; $this->log->info("Seq: {$this->orderbooks['seq']}"); // THIS IS sequence number } /** * Subscribe to feed for getting fresh orderbook data */ private function subscribe() { $this->log->info('Subscribe to feed (WAMP)'); $client = new Client("realm1"); $client->addTransportProvider(new PawlTransportProvider("wss://api.poloniex.com")); $client->on('open', function (ClientSession $session) { $marketEvent = function ($args, $argsKw, $details, $publicationId) { echo "Orderbook update: seq: $argsKw->seq, args count: ".count($args)."\n"; }; /** * All problem here * As i understand right i need send seq number on subscribe * and start recive data from that number * But i recive data with another numbers -( */ $session->subscribe('USDT_BTC', $marketEvent, ['seq' => $this->orderbooks['seq']]); }); $client->on('close', function ($reason){ $this->log->info("Соединение с Web socket было закрыто со стороны сервера, причина: $reason"); }); $client->on('error', function ($errorUri){ $this->log->error("Произошла ошибка во время синхронизации по Web socket, причина: $errorUri"); exit; }); $client->start(); } }
这是脚本日志:
./poloniex-sync.php
PoloniexSyncCli.INFO: Sync poloniex data
PoloniexSyncCli.INFO: Getting order book snapshot (REST API)
PoloniexSyncCli.INFO: Seq: 106470819
PoloniexSyncCli.INFO: Subscribe to feed (WAMP)
Orderbook update: seq: 106307669, args count: 2
Orderbook update: seq: 106307670, args count: 2
Orderbook update: seq: 106307671, args count: 1
Orderbook update: seq: 106307672, args count: 5
Orderbook update: seq: 106307673, args count: 2
Orderbook update: seq: 106307674, args count: 2
Orderbook update: seq: 106307675, args count: 1
Orderbook update: seq: 106307676, args count: 2
Orderbook update: seq: 106307677, args count: 1
Orderbook update: seq: 106307678, args count: 1
Orderbook update: seq: 106307679, args count: 2
Orderbook update: seq: 106307680, args count: 1
Orderbook update: seq: 106307681, args count: 2
Orderbook update: seq: 106307682, args count: 1
Orderbook update: seq: 106307683, args count: 1
Orderbook update: seq: 106307684, args count: 1
如您所见,快照中的序列号为:106470819 但从推送 API 接收的序列号与快照序列号无关:106307669、106307670、...
为了使用 WAMP,我使用 Thruway。我阅读了文档和谷歌搜索,但找不到解决方案。
PS 现在我认为我不明白 poloniex api 是如何工作的-( PPS 对不起我丑陋的英语。这不是我的母语