2017-06-17 2 views
0

Je fais des logiciels pour le scalping sur poloniex.com Pour ce faire, j'ai besoin de nouvelles informations sur le carnet de commandes. API DOCUMENTATION dit à propos de push api. Comme je comprends bien, il fonctionne comme ça:Comment mettre à jour le carnet de commandes poloniex via push api (protocole WAMP)

  1. Utilisez returnOrderBook (API de méthode publique) pour obtenir l'instantané
  2. Prenez le numéro de séquence (touche seq) de responce
  3. Abonnez-vous à pousser api avec le numéro de séquence de capture instantanée
  4. Recuez des données fraîches et corrigez les données d'instantanés.

    <?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(); 
        } 
    } 
    

C'est journal de script:

./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 

Comme vous pouvez le voir le numéro de séquence dans l'instantané est: 106470819 Mais le numéro de séquence recived de l'API push n'est pas corrélation avec le numéro de séquence d'instantané: 106307669 , 106307670, ...

Pour travailler avec WAMP, j'utilise Thruway. Je lis docs et googling, mais je ne trouve pas de solution.

P.S. Maintenant, je pense que je ne comprends pas bien comment fonctionne apone poloniex - ( PPS désolé pour mon anglais laid.Il n'est pas mon natif

+0

Peut-être quelqu'un a-t-il un exemple JS pour ce cas? 1. Obtenir un instantané (api publique) 2. Abonnez-vous pour pousser api (en utilisant SEQ num de l'instantané) –

Répondre

1

(Cela devrait probablement être un commentaire au lieu d'une réponse, mais je ne peux pas poster de commentaires Poloniex semble avoir un problème avec son serveur WAMP: non seulement la plupart des messages streamés sont à 3 heures de retard, mais ils sont parfois complètement "hors séquence", avec un saut de 100'000 ou plus entre Une seule paire a été élevée au support de Poloniex, mais aucune réponse jusqu'à présent

+0

Oui, j'ai lu à ce sujet lorsque je cherche info. Mais pourriez-vous avoir un exemple pour mon cas? php/js sera ok pour moi. –

+0

Je n'utilise pas php/js. Mais votre logique semble être correcte, sauf que vous ne devriez pas avoir à utiliser le numéro de séquence dans l'abonnement. Il devrait suffire de: 1) tirer le carnet de commandes du RESTApi et ensuite 2) traiter les messages entrants dans l'ordre approprié. Mais comme cela a été dit, cela ne fonctionne pas actuellement car le serveur WAMP envoie d'anciens messages. –

2

La chose WAMP semble être complètement inutile en ce moment, mais vous le faites mal de toute façon: d'abord vous avez besoin pour vous abonner à la chaîne (vous n'utilisez aucun numéro de seq pour l'abonnement, juste le nom de la chaîne, par ex. BTC_ETH), commencez à recevoir les mises à jour (avec les numéros SEQ), et obtenez seulement le carnet de commandes via l'API REST, vous pouvez donc commencer immédiatement à le mettre à jour avec les entrées que vous recevez via la connexion WAMP (vous pouvez ignorer ce que vous avez reçu avec des numéros seq avant cela à partir du téléchargement complet du carnet de commandes.)