前回の記事に引き続き、bot開発の状況をまとめていきます。
今回は「CCXTライブラリ使う」がテーマです。
メインの作業は4行のコード書くだけのシンプルなものですが、たったこれだけのコードを理解するのにもそれなりのリサーチが必要でした。
CCXTを使ってみる
まずは、以下のコードを実行して、ccxtライブラリをインストールします。
pip install ccxt
この時点でpipもccxtもよく分からないのでググってみます。
CCXTライブラリ:世界中の仮想通貨取引所のAPIを使うことができる。
CCXTのDocs、ccxtを活用した仮想通貨・ビットコイン取引の自動売買、ccxtを使用した仮想通貨のデータ取得の基礎、ccxtの使い方をpython自動売買botで解説【初心者向け実践】
pip:pythonファイルのパッケージ管理ツール。インターネット上で公開されているpythonで開発されたパッケージ(≒コードなどをひとまとめにしたプログラム部品)を取り寄せるために使う。pipコマンドを利用してパッケージの取得や削除などができる。
pipとは、パッケージとは
要するに、このコードはpipという機能を使ってccxtをインストールする指示を出すということが分かりました。
続いて、実行するのがこちらのコード。
import ccxt
from pprint import pprint
bitflyer = ccxt.bitflyer()
pprint( bitflyer.has )
まず、最初の2行でCCXTライブラリとpprintライブラリをインポートします。
すでに2行目から意味が分からない,,,
解説サイトにまとめられていたことと、自分で調べたことをあわせて理解をしようとしますが,,,
from pprint import pprint:文字を改行してキレイに見せるためのコード。出力はpprintで対応。
Pythonのprint() と pprint() と display() の違いとは?
う〜ん、なんだか分かったような分からないような感じです。
ここで「1行目はimportを使っているのに2行目はfromとimportを使っているのはなぜなのか」が気になって調べてみました。
というのも、この部分はfromとimportの後に続く文字がどちらもpprintになっているため、import〜〜では問題があるのか?と思ったのです。
試しにimport pprintと書いてコードを実行したらエラーが出ました。
以下のように書いても、エラーが出る,,,
import ccxt
import pprint
bitflyer = ccxt.bitflyer()
pprint( bitflyer.has )
その原因を調べてみると、以下のような理由があることが分かりました。
Importはモジュールの全体を使う。fromはモジュールの一部を使う。モジュールとは.pyで作成したファイルのこと。
つまり、今回のコードでは、「pprintモジュールの中のpprintという関数(≒機能)を使うよ」という約束事を決めている。
この約束事があるおかげで、コードの最後の行でpprint一つだけで処理を済ませることができる。
単にimport pprintだけだと、コードの4行目はpprint.pprint(~~)という形で書いて「pprintモジュールの中からpprintという関数(≒)を使いなさい」という処理をしなければいけない。
Pythonのモジュールとimportとfrom入門、Pythonでimportを使う方法について徹底解説!
要するに、from~~import~~は後半のコードを省略するための準備をしていたということですね。
さて、コード解説の続きです。
3行目でbitflyerという関数を設定しています。つまり、「今後bitflyerという文字列が出てきたらCCTXというライブラリの中からbitflyerに関する情報を使うんだよ」という約束事のようなものですね。この点については=の右側を別の取引所のidに変えることで、別のデータを取得することができます。この辺りはアソビなので、後で書きますね。
4行目は、「pprintという処理でCCXTにあるbitflyer(という関数)が対応しているプログラムを改行しながら書き出しなさい」という意味です。
コードを実行する
今回のコードを実行することで、bitFlyerで使える共通関数を取得することができました!
無事に、作業完了です。
ところが、今回はコードの記述について理解を深めることができたのでそれもあわせてまとめておきます。
それは「どこを書き換えれば、別の取引所のデータを取得できるのか?」という疑問を持ったことが原因でした。
今回のコードの一部だけ書き換えれば、Binanceのデータも取得できるはずです。
少しだけ試して、書き換えた結果、Biananceのデータを得られたコードは以下の通りです。
import ccxt
from pprint import pprint
bitflyer = ccxt.binance()
pprint( bitflyer.has )
書き換えたのは赤字の部分です。4行目は書き換えていません。
しかし、出力されたのはBinanceのデータです。
4行目でpprint( bitflyer.has )と記述しているのに、Binanceのデータが出力されるのはなぜなのか?
その理由は、赤字の部分があくまでbitflyerという文字列が意味することを設定しているためです。
つまり、3行目で「bitflyerという文字列はccxtモジュールのbainaceというデータを参照するんだぞ」という約束事を決めていたということです。
プログラミング初心者の私にとっては、=で関数を指定するということの意味をはっきりと理解した瞬間でした。
コードのどこを書き換えれば、最短で求める処理ができるのかということに一歩近づいた気がします!
まとめ
そろそろ、分からないことを調べることが苦にならなくなってきました。
それに加えて「分からない」という感覚をより解像度高く受け入れられるようになってきたため、疑問を持つことの精度も高くなってきた自覚があります。
これはじっくり考えることが得意な私自身の特性がよく生きていると感じますね。
作業量自体は大したことではないものの、コードのどこを書き換えると良いのかということについて理解を深めることができました。
また、自分でコードを書くときに関数の設定を分かりやすくしておくことの重要性も理解しました。
コードを雑に書いていると文字列と意味の不一致が起こる可能性もあるため、文字列と関数を一致させておく癖をつけたいです。
思いついた疑問を自分なりに解決しようとしてみる。その土台となる理論がある。
この2点がうまく結びついてきた感覚があり、単なる調べ物&作業から少しだけ発展的なこともできました。
次回も作業をコツコツと進めていきます。