Делаю софт для скальпинга на poloniex.com. Для этого мне нужно иметь свежую информацию о стакане. В API DOCUMENTATION говорится о push API. Я правильно понимаю, что это работает так:
- Используйте returnOrderBook (API общедоступного метода) для получения моментального снимка
- Взять порядковый номер (seq key) из ответа
- Подпишитесь на push 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 Но порядковый номер, полученный из push API, не коррелирует с порядковым номером снимка: 106307669, 106307670, ...
Для работы с WAMP я использую Thruway. Я читал документы и гуглил, но не нашел решения.
P.S. Теперь я думаю, что я не совсем понимаю, как работает poloniex api -( P.P.S извините за мой ужасный английский. Это не мой родной