How to up to date poloniex orderbook via push api

2019-06-08 20:00发布

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:

  1. Use returnOrderBook (public method API) for getting snapshot
  2. Take sequence number (seq key) from responce
  3. Subscribe to push api with sequence number from snapshot
  4. 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

2条回答
我欲成王,谁敢阻挡
2楼-- · 2019-06-08 20:14

(This should likely be a comment instead of an answer, but I can't post comments yet)

Poloniex seems to have a problem with their WAMP server. Not only are most of the streamed messages about 3 hours behind, sometimes they also come completely "out of sequence", with jump of 100'000 or more between a single pair. This has been raised to Poloniex support, but no response so far.

查看更多
Summer. ? 凉城
3楼-- · 2019-06-08 20:24

The WAMP thing seems to be completely useless right now, but you're doing it wrong anyway: first you need to subscribe to the channel (you don't use any seq numbers for subscribing, just the channel name, e.g. BTC_ETH), start receiving the updates (with the seq numbers), and only get the orderbook through the REST API then, so you can immediately start updating it with the entries you're receiving through the WAMP connection (you can discard whatever you received with seq numbers before that from the full order book download.)

查看更多
登录 后发表回答