0

我在 poloniex.com 上制作用于剥头皮的软件为此,我需要了解有关订单簿的最新信息。 API DOCUMENTATION谈到了推送 api。据我了解,它是这样工作的:

  1. 使用 returnOrderBook(公共方法 API)获取快照
  2. 从响应中获取序列号(seq key)
  3. 使用快照中的序列号订阅推送 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 但从推送 API 接收的序列号与快照序列号无关:106307669、106307670、...

为了使用 WAMP,我使用 Thruway。我阅读了文档和谷歌搜索,但找不到解决方案。

PS 现在我认为我不明白 poloniex api 是如何工作的-( PPS 对不起我丑陋的英语。这不是我的母语

4

2 回答 2

2

WAMP的东西现在似乎完全没用了,但无论如何你做错了:首先你需要订阅频道(你不使用任何seq号订阅,只是频道名称,例如BTC_ETH),开始接收更新(使用 seq 编号),然后仅通过 REST API 获取订单簿,因此您可以立即使用通过 WAMP 连接接收到的条目开始更新它(您可以丢弃之前收到的带有 seq 编号的任何内容来自完整的订单下载。)

于 2017-07-10T21:27:42.557 回答
1

(这应该是评论而不是答案,但我还不能发表评论)

Poloniex 的 WAMP 服务器似乎有问题。大多数流媒体消息不仅落后约 3 小时,有时它们还完全“乱序”,在一对之间跳跃 100'000 或更多。这已提交给 Poloniex 支持,但到目前为止没有任何回应。

于 2017-06-20T23:29:45.627 回答