取得データをMongoDBに入れる2 ブックデータ

概要

ここではオーダーブック、オーダーポジションのデータの取得を行います。

手順

MongoDBは前回入れたので、 今回は、指定した日から現在までのブックを取得するプログラムを作成します。

使用するretryパッケージをインストールします。

(venv) $ pip install retry

コード

import v20
import pymongo
from retry import retry
import yaml

from datetime import datetime, timedelta
import time
import sys

MONGO_URL = 'mongodb://localhost:27017/'
AUTH_PATH = "auth.yaml"

ACCOUNT_TYPE = "live"
DATETIME_FROM = datetime(2019, 1, 1)

with open(AUTH_PATH, "r") as f:
    auth = yaml.safe_load(f)

api = v20.Context(
    auth[ACCOUNT_TYPE]["url"],
    auth[ACCOUNT_TYPE]["port"],
    token=auth[ACCOUNT_TYPE]["token"],
)

@retry(
    (v20.errors.V20Timeout, v20.errors.V20ConnectionError),
    tries=5,
    delay=1,
    backoff=2,
)
def fetch_orderbook(instrument, time):
    if time == None:
        return api.instrument.order_book(instrument)
    else:
        return api.instrument.order_book(instrument, time=time)

def fetch_orderbook_dict(instrument, time=None):
    response = fetch_orderbook(instrument, time)

    if response.status != 200:
        print(response.body["errorMessage"])
        return

    orderBook = response.body["orderBook"]
    return orderBook.dict()

@retry(
    (v20.errors.V20Timeout, v20.errors.V20ConnectionError),
    tries=5,
    delay=1,
    backoff=2,
)
def fetch_positionbook(instrument, time):
    if time == None:
        return api.instrument.position_book(instrument)
    else:
        return api.instrument.position_book(instrument, time=time)

def fetch_positionbook_dict(instrument, time=None):
    response = fetch_positionbook(instrument, time)

    if response.status != 200:
        print(response.body["errorMessage"])
        return

    positionBook = response.body["positionBook"]
    return positionBook.dict()


instrument = "USD_JPY"

now = datetime.now()

client = pymongo.MongoClient(MONGO_URL)
database = client[ACCOUNT_TYPE]

o_key = instrument + ".order"
order_collection = database[o_key]
order_collection.create_index(
    [
        ("unixtime", 1),
    ],
    unique=True,
)

p_key = instrument + ".position"
position_collection = database[p_key]
position_collection.create_index(
    [
        ("unixtime", 1),
    ],
    unique=True,
)

latest = order_collection.find_one(
    sort=[("unixtime", pymongo.DESCENDING)])
#latest = order_collection.find_one(
#    sort=[("unixtime", pymongo.ASCENDING)])  # for check
if latest:
    dt_from = datetime.utcfromtimestamp(latest["unixtime"])
    print(o_key, dt_from)
else:
    dt_from = DATETIME_FROM
t = dt_from

while t < now:
    t += timedelta(minutes=20)  # min interval 5 minutes

    print("{} {} ".format(instrument, t), end='', flush=True)
    iso_time = api.datetime_to_str(t)

    hit = order_collection.find_one({"unixtime": t.timestamp()})
    if not hit:
        orderBook = fetch_orderbook_dict(instrument, iso_time)
        if orderBook == None:
            print()
            continue
        else:
            print("order ", end='', flush=True)

            unixtime = datetime.strptime(
                orderBook["time"], '%Y-%m-%dT%H:%M:%SZ'
                ).timestamp()
            orderBook.update({"unixtime": unixtime})

            try:
                order_collection.insert_one(orderBook)
            except pymongo.errors.DuplicateKeyError:
                pass
    else:
        print("hit:order ", end='', flush=True)

    hit = position_collection.find_one({"unixtime": t.timestamp()})
    if not hit:
        positionBook = fetch_positionbook_dict(instrument, iso_time)
        if positionBook == None:
            print()
            continue
        else:
            print("position ", end='', flush=True)

            unixtime = datetime.strptime(
                positionBook["time"], '%Y-%m-%dT%H:%M:%SZ'
                ).timestamp()
            positionBook.update({"unixtime": unixtime})

            try:
                position_collection.insert_one(positionBook)
            except pymongo.errors.DuplicateKeyError:
                pass
    else:
        print("hit:position ", end='', flush=True)

    print()

上記コードで2019年初からの現在までのオーダーブック・オーダーポジションデータをMongoDBに保存できます。

次にMongoDBからデータを取得します。

import pymongo

from datetime import datetime

MONGO_URL = 'mongodb://localhost:27017/'
ACCOUNT_TYPE = "live"

instrument = "USD_JPY"
book_type = "order"

client = pymongo.MongoClient(MONGO_URL)
database = client[ACCOUNT_TYPE]
collection = database[instrument + "." + book_type]

dt = datatime(2019, 1, 7)

book = collection.find_one({
    "unixtime": {dt.timestamp(),}}).sort("unixtime")

print(book)

上記のコードで、ブックデータが表示できます。

ブックデータはローソク足と異なり、ブックデータ時刻はその時点のデータママなので 扱いが楽です。


免責事項;本サイトの情報を利用し直接的または間接的に損害を被った場合でも一切の責任を負いません。 また本サイトが提供する情報の確実性、完全性、安全性等について一切の保証をしません。

Home > rest-live-v20 > tips > mongo

prev: 取得データをMongoDBに入れる1 ローソク足

next: -