I making software for scalping on poloniex.com To do this, I need to have fresh information about order book. API DOCUMENTATION said about push api. As i understand right it work like that:
- Use returnOrderBook (public method API) for getting snapshot
- Take sequence number (seq key) from responce
- Subscribe to push api with sequence number from snapshot
Recive fresh data and make correction on snapshot data.
<?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(); } }
This is script log:
./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
As you can see sequence number in snapshot is: 106470819 But sequence number recived from push API is not correlation with snapshot sequence number: 106307669, 106307670, ...
For working with WAMP i use Thruway. I read docs and googling, but can't found solution.
P.S. Now i think that i not understand right how poloniex api work -( P.P.S sorry for my ugly English. It is not my native