pe氏pybottersinagoflyer読み解き殴り書きメモ

最近botを作成するにあたってとても参考にさせていただいてるpe氏の記事

ただ、前の記事に書いたように本職が全く違う系統のため、プログラムをさらさら読むこともままならない。

なので、少しずつ読み解いて理解しようという根端。
なお、自分用のメモなので、参考にならないかもしれません。

前回は、mmbotの記事のわからないところだけを読み解いた。
今回は、2作目のinagoflyerの記事を最初から読みといて理解することを目標とする。

ここまでのボリュームのプログラムを無料で公開してくれているpe氏、pybottersを公開してくれてるまちゅけん氏にはとても感謝しています。
問題、間違いがあったら指摘してください。

import

importされてるモジュールから見ていく

from __future__ import annotations

from typing import TYPE_CHECKING, Callable, Generator, Union

if TYPE_CHECKING:
    from pybotters.store import DataStoreManager

import asyncio
from collections import deque

import loguru
import numpy as np
import pandas as pd
import pybotters
import pybotters.models.bitflyer

早速一行目のfutureからはまる
参考にさせていただいた記事は以下

とりあえず、型アノテーションっていうものがあって、今までなにかしらの関数をインポートしなきゃいけなかったっぽいけど省略できるものらしい。

続いて二行目ではまる
typingに関しては以下の記事がまとめてくれてたので参考にさせていただいた

typingというモジュールは型を記載するのに必要らしい

また、TYPE_CHECKINGは以下のサイトを参考にした

これに関しては完全に理解できなかったけど、循環参照っていうのを防ぐためにするらしい

asyncioやpybottersに関してはまちゅけんさんの記事がわかりやすい


dequeに関しても調べた。

Pythonのコンテナデータ型の1種。
データの追加を先頭、末尾両方に対してO(1)のコストで実施できる。
通常のlistだと先頭に追加する場合にO(n)のコストで実施できる。

末尾だけでなく先頭にもデータを追加するような場合に役立ちます。

https://qiita.com/ryosuke0825/items/bbc5c0673e6c6c958d66

なにか処理をする際にリストをいじくるより便利らしい。今のところまだ使用するタイミングはわからない

loguruはlogを出力するのに使いやすくするもの

pandas、numpyは計算や処理をするのに使う

起動

上から順にみていくより、私は起動の順番で見ないとまだ読んでいけないので次にmain処理の起動から読む

if __name__ == "__main__":
    from argparse import ArgumentParser

    parser = ArgumentParser()
    parser.add_argument("--api_key", required=True, help="apiキーが入ったJSONファイル")
    parser.add_argument("--symbol", default="FX_BTC_JPY", help="取引通過")
    parser.add_argument(
        "--side", default="BOTH", choices=["BUY", "SELL", "BOTH"], help="エントリーサイド"
    )
    parser.add_argument("--size", default=0.01, type=float, help="注文サイズ")
    parser.add_argument("--bar_unit_seconds_long", default=60, type=int, help="長期足")
    parser.add_argument("--bar_unit_seconds_short", default=5, type=int, help="短期足")
    parser.add_argument("--bar_maxlen", default=999, type=int, help="足の最大履歴")
    parser.add_argument(
        "--lower_threshold",
        default=1,
        type=float,
        help="短期足のボリューム(log)がこの閾値以上であればエントリー待機",
    )
    parser.add_argument(
        "--upper_threshold",
        default=float("inf"),
        type=float,
        help="短期足のボリューム(log)がこの閾値以下であればエントリー待機",
    )
    parser.add_argument(
        "--entry_patience_seconds", default=3, type=int, help="閾値クリア後の経過観察時間"
    )
    parser.add_argument(
        "--entry_price_change", default=500, type=int, help="経過観察後の価格変動がこの閾値以上であればエントリー"
    )
    parser.add_argument("--trail_margin", default=2000, type=int, help="トレイル値幅")
    args = parser.parse_args()

    try:
        asyncio.run(main(args))
    except KeyboardInterrupt:
        pass

様々な引数をここでmainに渡している
ここで出てきた、ArgumentParserというのは

プログラム実行時にコマンドラインで引数を受け取る処理を簡単に実装できる標準ライブラリ

https://qiita.com/kzkadc/items/e4fc7bc9c003de1eb6d0

とのこと。この引用先のサイトがとても丁寧に説明してくれてた。

瞬時にパラメータを変更できるのは、何度もフォワードテストを行う上で便利なのかな?

引数に関しては大体helpで記載してくれてるため、調べなくてもよさそう
ただし、api_keyだけに関してはrequiredがTrueになっているため、コマンドラインから起動する際に必ず引数として渡さなければならないっぽい。


とりあえずここまで。
次はmain処理を見ていこうと思います。





この記事が気に入ったらサポートをしてみませんか?