Python - Poloniex Push API

Я пытаюсь получить живые данные в Python 2.7.13 от Poloniex через push-API. Я прочитал много постов (в том числе Как подключиться к API веб-сокета poloniex.com с помощью библиотеки Python) и пришел к следующему коду:

from autobahn.twisted.wamp import ApplicationSession
from autobahn.twisted.wamp import ApplicationRunner
from twisted.internet.defer import inlineCallbacks
import six


class PoloniexComponent(ApplicationSession):
    def onConnect(self):
        self.join(self.config.realm)

    @inlineCallbacks
    def onJoin(self, details):
        def onTicker(*args):
            print("Ticker event received:", args)

        try:
            yield self.subscribe(onTicker, 'ticker')
        except Exception as e:
            print("Could not subscribe to topic:", e)


def main():
    runner = ApplicationRunner(six.u("wss://api.poloniex.com"), six.u("realm1"))
    runner.run(PoloniexComponent)


if __name__ == "__main__":
    main()

Теперь, когда я запускаю код, похоже, что он работает успешно, но я не знаю, где я получаю данные. У меня есть два вопроса:

  1. Я был бы очень признателен, если бы кто-нибудь помог мне пройти процедуру подписки и получения данных тикера, которые я разработаю на python, начиная с шага 0: я запускаю программу на Spyder в Windows. Я должен как-то активировать Crossbar?

  2. Как мне выйти из соединения? Я просто убил процесс с Ctrl+c и теперь, когда я пытаюсь запустить его, я получаю сообщение об ошибке: ReactorNonRestartable,

2 ответа

Я столкнулся с множеством проблем, связанных с использованием Poloniex с Python2.7, но, наконец, нашел решение, которое, надеюсь, поможет вам.

Я обнаружил, что Poloniex поддержал исходную конечную точку сокета WAMP, поэтому я бы, вероятно, вообще отказался от этого метода. Может быть, это полный ответ, который вам нужен, но если нет, то это альтернативный способ получения информации о тикере.

Код, который работал лучше всего для меня, на самом деле взят из поста, на который вы ссылались выше, но была некоторая информация относительно идентификаторов валютных пар, которую я нашел в другом месте.

import websocket
import thread
import time
import json

def on_message(ws, message):
    print(message)

def on_error(ws, error):
    print(error)

def on_close(ws):
    print("### closed ###")

def on_open(ws):
    print("ONOPEN")
    def run(*args):
        # ws.send(json.dumps({'command':'subscribe','channel':1001}))
        ws.send(json.dumps({'command':'subscribe','channel':1002}))
        # ws.send(json.dumps({'command':'subscribe','channel':1003}))
        # ws.send(json.dumps({'command':'subscribe','channel':'BTC_XMR'}))
        while True:
            time.sleep(1)
        ws.close()
        print("thread terminating...")
    thread.start_new_thread(run, ())


if __name__ == "__main__":
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("wss://api2.poloniex.com/",
                              on_message = on_message,
                              on_error = on_error,
                              on_close = on_close)
    ws.on_open = on_open
    ws.run_forever()

Я закомментировал строки, которые извлекают данные, которые вам, по-видимому, не нужны, но для справки приведем еще немного информации из этого предыдущего поста:

1001 = trollbox (you will get nothing but a heartbeat)
1002 = ticker
1003 = base coin 24h volume stats
1010 = heartbeat
'MARKET_PAIR' = market order books

Теперь вы должны получить данные, которые выглядят примерно так:

[121,"2759.99999999","2759.99999999","2758.000000‌​00","0.02184376","12‌​268375.01419869","44‌​95.18724321",0,"2767‌​.80020000","2680.100‌​00000"]]

Это также раздражает, потому что "121" в начале является идентификатором валютной пары, и это недокументировано, а также без ответа в другом вопросе переполнения стека, упомянутом здесь.

Однако, если вы посещаете этот URL: https://poloniex.com/public?command=returnTicker кажется, что идентификатор отображается в качестве первого поля, поэтому вы можете создать собственное отображение пары id-> валют или проанализировать данные с помощью идентификаторы, которые вы хотите от этого.

В качестве альтернативы, так же просто, как:

import urllib
import urllib2
import json

ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/public?command=returnTicker'))
print json.loads(ret.read())

вернет вам данные, которые вы хотите, но вы должны будете поместить их в цикл, чтобы получать постоянно обновляемую информацию. Не уверен в своих потребностях после получения данных, поэтому я оставлю все остальное на ваше усмотрение.

Надеюсь это поможет!

С помощью других постов я сделал следующий код для получения последних данных с использованием Python 3.x. Я надеюсь, это поможет вам:

#TO SAVE THE HISTORICAL DATA (X MINUTES/HOURS) OF EVERY CRYPTOCURRENCY PAIR IN POLONIEX:

    from poloniex import Poloniex
    import pandas as pd
    from time import time
    import os

    api = Poloniex(jsonNums=float)

    #Obtains the pairs of cryptocurrencies traded in poloniex
    pairs = [pair for pair in api.returnTicker()]

    i = 0
    while i < len(pairs):
        #Available candle periods: 5min(300), 15min(900), 30min(1800), 2hr(7200), 4hr(14400), and 24hr(86400)
        raw = api.returnChartData(pairs[i], period=86400, start=time()-api.YEAR*10)
        df = pd.DataFrame(raw)

        # adjust dates format and set dates as index
        df['date'] = pd.to_datetime(df["date"], unit='s')
        df.set_index('date', inplace=True)

        # Saves the historical data of every pair in a csv file
        path=r'C:\x\y\Desktop\z\folder_name'
        df.to_csv(os.path.join(path,r'%s.csv' % pairs[i]))

        i += 1
Другие вопросы по тегам