ああああさんのbitFlyer約定情報 to OHLCVが便利だったので改造してみた
元ネタnote(※有料noteですが無料部分に全内容があります)
上記がとても便利だったのでn秒足で取れるように改造しました。
差分だけ貼ります。
本コードは上記元noteを見ていただければ。
ITV_SLEEP下にOHLC_INTERVAL_SEC追加
ITV_SLEEP = 0.001
OHLC_INTERVAL_SEC = 5
get_executionsメソッド下にメソッド3つ追加
def calc_next_date(dt: datetime) -> datetime:
return dt + timedelta(seconds=OHLC_INTERVAL_SEC)
def is_empty_execution(executions_date: datetime, ohlc_date: datetime) -> bool:
return ohlc_date + timedelta(seconds=OHLC_INTERVAL_SEC) <= executions_date
def fix_ohlc_date(executions_date: datetime, ohlc_date: datetime) -> datetime:
if not is_empty_execution(executions_date, ohlc_date):
return ohlc_date
ohlc_date = ohlc_date + timedelta(seconds=OHLC_INTERVAL_SEC)
return fix_ohlc_date(executions_date, ohlc_date)
dateUntil初期化下にnextDate追加
dateUntil = datetime(2018, 8, 23, 0, 0, 0)
nextDate = calc_next_date(dateSince)
`if dateSince <= date <= dateUntil:` ブロック下の順序を下記のように変更し、
「# ※ここをいじれば好きな解像度にできるはず、このコードは1秒足でデータ作成(抜けの補完はしてないので注意)」のところをいじって好きな解像度にする。
# 日付が変わったらファイルハンドラ変更
if date.day != datePrev.day:
... # このif文内はコード変更なし
# 秒が変わったらOHLCVリセット
# ※ここをいじれば好きな解像度にできるはず、このコードは1秒足でデータ作成(抜けの補完はしてないので注意)
if nextDate <= date:
ohlcDate = fix_ohlc_date(date, nextDate)
logger.info("{ohlcDate},{op},{hi},{lo},{cl},{vol}".format(
ohlcDate=ohlcDate.strftime("%Y-%m-%d %H:%M:%S"),
op=int(op),
hi=int(hi),
lo=int(lo),
cl=int(cl),
vol=vol,
)
)
op, hi, lo, cl, vol = price, price, price, price, size
nextDate = calc_next_date(ohlcDate)
price = ex["price"]
size = ex["size"]
# ここから下は変更なし
データの検算はしていませんがおそらくこれで取れるはず・・!
5秒足はそれっぽく取れています。
2018-08-16 00:00:05,713435,714000,713350,713354,60.4068843
2018-08-16 00:00:10,713354,713532,712100,712100,89.44809699000005
2018-08-16 00:00:15,712795,712999,712070,712551,52.932906040000006
2018-08-16 00:00:20,712551,713151,712500,712995,51.72138477000002
2018-08-16 00:00:25,712995,713867,712750,713867,69.93597181000005
2018-08-16 00:00:30,713867,714729,713200,714729,148.54807072
OHLC_INTERVAL_SEC を変更するとn秒足が取れます。
※もしバグってそうなら教えていただけるとありがたいです
この記事が気に入ったらサポートをしてみませんか?