Как обновить книгу заказов Poloniex через push API (протокол WAMP)

Делаю софт для скальпинга на poloniex.com. Для этого мне нужно иметь свежую информацию о стакане. В API DOCUMENTATION говорится о push API. Я правильно понимаю, что это работает так:

  1. Используйте returnOrderBook (API общедоступного метода) для получения моментального снимка
  2. Взять порядковый номер (seq key) из ответа
  3. Подпишитесь на push API с порядковым номером из моментального снимка
  4. Получите свежие данные и внесите исправления в данные моментального снимка.

    <?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 извините за мой ужасный английский. Это не мой родной


person reactorx2015 X    schedule 17.06.2017    source источник
comment
Может быть у кого-нибудь есть пример JS для этого случая? 1. Получить моментальный снимок (общедоступный API) 2. Подписаться на push API (используя SEQ num из моментального снимка)   -  person reactorx2015 X    schedule 20.06.2017


Ответы (2)


WAMP сейчас кажется совершенно бесполезным, но вы все равно делаете это неправильно: сначала вам нужно подписаться на канал (вы не используете для подписки никаких порядковых номеров, только название канала, например, BTC_ETH), начните получать обновления (с порядковыми номерами) и получать книгу заказов только через REST API, чтобы вы могли немедленно начать обновлять ее с помощью записей, которые вы получаете через соединение WAMP (вы можете отказаться от всего, что вы получили с порядковыми номерами до это из полной загрузки книги заказов.)

person Tiana    schedule 10.07.2017

(Вероятно, это должен быть комментарий, а не ответ, но я пока не могу оставлять комментарии)

У Poloniex, похоже, проблема с их сервером WAMP. Мало того, что большинство потоковых сообщений отстают примерно на 3 часа, иногда они также приходят совершенно «не по порядку», со скачком в 100 000 и более между одной парой. Вопрос был передан в службу поддержки Poloniex, но ответа пока нет.

person Peter K.    schedule 20.06.2017
comment
Да, я читал об этом, когда искал информацию. Но может быть у вас есть пример для моего случая? php/js мне подойдет. - person reactorx2015 X; 21.06.2017
comment
Я не использую php/js. Но ваша логика кажется правильной, за исключением того, что вам не нужно использовать порядковый номер в подписке. Этого должно быть достаточно: 1) извлечь книгу заказов из RESTApi, а затем 2) обработать входящие сообщения в правильном порядке. Но, как уже говорилось, в настоящее время это не работает, поскольку сервер WAMP отправляет старые сообщения. - person Peter K.; 21.06.2017