noteのタイトル画像

「ビットコイン自動売買用ccxt拡張」 バックテスト用LocalOHLCVサーバの立て方(対象: BitMEX)

目次
・BitMEXの過去OHLCVデータをローカルに取得する
・インストール、ビルドと実行
・値のチェック
・定周期OHLCVデータ収集機能の実行 
・配信サーバの実行
・データ取得を確認しましょう
・cBitMEXクラスへの設定

●BitMEXの過去OHLCVデータをローカルに取得する

以前紹介した「ビットコイン自動売買用ccxt拡張」のシミュレーション機能は、デフォルト設定のままでは実際にBitMEXサイトから過去OHLCVデータの取得を行なっています。

そのため、あまり高頻度でアクセスすると、通信エラーに遭遇したり、APIの負荷が上がってデータ取得が拒否されるケースもあります。

そこで今回は

過去OHLCVデータをローカルに取得して利用する

ためのプロジェクトを用意しました。

「ビットコイン自動売買用ccxt拡張」ご購入者の方は、ご案内しているgitlabにアクセスいただき

 https://gitlab.com/bitcoin-bot

から、「bitmex_get_ohlcv」プロジェクトをチェックアウトしてください。

●インストール、ビルドと実行

プロジェクトをチェックアウトして、以下のコマンドを実行してください。

yarn

(注意) yarnの導入がまだの場合は、以下のサイトにアクセスして、yarnを導入ください。
npm インストールでも良いのですが、今後は極力yarnを使用していきます。

モジュールの導入(初回は時間がかかります)が終わったら、

yarn run build

を実行し、ビルドを行います。

次に、BitMEXサイトからローカルにOHLCVデータを取得しましょう。
取得先はsqliteというファイルベースのデータベースです。
(自動でデータベースファイルが作成されるので、ご安心ください)

node ./dist/getolddata.js

を実行すると、

接続先[www.bitmex.com] dbName[bitmex_ohlcv.db] tableName[ohlcvs_60m] span[60]分
収集開始時刻(UNIX時間): 1480518000
収集終了時刻(UNIX時間)(開始時刻から1000 * 60分後): 1516518000
・・・(中略)・・・

のように表示され、数秒後には

insert [1529751600, 6140, 6199, 6131.5, 6148.5, 137645319]
insert [1529755200, 6148.5, 6153, 6090, 6143.5, 146099633]
sleep: 3600

のように「sleep: 3600」という表示になると思います。
3600が表示されたら、過去データから現在時刻までほぼ追いついたので、
 ctrl + c
ボタンを押してプロセスを強制終了させます。
(過去データの開始日は 2016/12/01です)

プロジェクト直下に

bitmex_ohlcv.db

というファイルが作成されているはずです。
これがsqliteのデータベースファイルです。

●値のチェック

値に欠損がないかどうかをチェックします。

node ./dist/check.js

を実行すると、

接続先[www.bitmex.com] dbName[bitmex_ohlcv.db] tableName[ohlcvs_60m] span[60]

と表示され、エラー(データ欠損)がなければ、そのままプログラムが終了します。
もし、欠損があったら

false! a='XXXXXXXX' b='YYYYYYYY'

のようなメッセージが出ますので、再度「node ./dist/getolddata.js」を実行してください。

●定周期OHLCVデータ収集機能の実行

このままでは、今の時点までの過去OHLCVデータの取得だけで止まってしまうので、以降のOHLCVデータも定周期で収集させましょう。

forever start ./dist/collector.js

を実行します。
forever の導入がまだな場合は

を参考にして、インストールをお願いします。

実行すると、

warn:    --minUptime not set. Defaulting to: 1000ms
warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info:    Forever processing file: ./dist/collector.js

のように出力されます。ワーニングが2つほど出ていますが気にしなくて良いです。

●配信サーバの実行

次に、外部アプリケーション(今回の場合は「ビットコイン自動売買用ccxt拡張」で作ったアプリケーションです)からOHLCVデータの要求があった時OHLCVデータを配信するためのサーバを立てます。

forever start ./dist/server.js

を実行します。
先ほどと同じようにワーニングが出ますが気にしません。

デフォルトの設定ではポート3000番にexpressサーバが起動しています。

サーバ等を止める場合は

forever stopall

を実行してサーバを止めます。(今はまだ止めないでくださいね)
一旦サーバを止めた後のデータ再収集は

forever start ./dist/collector.js
 
forever start ./dist/server.js

を実行するだけで大丈夫です。
server.jsが起動時間から1万件前のデータを再収集するので、1時間×1万件(約416日前のデータ)の時間を開けなければデータ間欠することはありません。

●データ取得を確認しましょう

ブラウザに次のURLを入力してみましょう。

http://localhost:3000/ohlcv/60/5

うまくサーバが動いていれば

[{"timestamp":1529740800,"open":6110,"high":6136.5,"low":6083.5,"close":6091,"volume":94476341},
{"timestamp":1529744400,"open":6091,"high":6188,"low":6091,"close":6133,"volume":91572479},
{"timestamp":1529748000,"open":6133,"high":6148.5,"low":6121,"close":6140,"volume":49979368},
{"timestamp":1529751600,"open":6140,"high":6199,"low":6131.5,"close":6148.5,"volume":137645319},
{"timestamp":1529755200,"open":6148.5,"high":6153,"low":6090,"close":6143.5,"volume":146099633}]

のように5件のOHLCVデータが取得されるはずです。

上記のURLの意味は「ohlcv」データの「60分」足を「5」個取得したい、というメッセージです。
(今回のデータ収集では60分足しか取得していません)

●cBitMEXクラスへの設定

cBitMEXクラスへの設定で、以下のように設定するとBitMEXサイトに接続せずに、ローカルのOHLCVサーバへ接続するようになります。

// ==================================================================
// bitmexオブジェクトを習得
// ==================================================================
const mex = new cBitMEX({
    fSimulation: Simulation || false,       // シミュレーションモードフラグ true: シミュレーション、false: 本番
    fOrigin: Origin || false,               // デモサイトかどうかのフラグ   true : 本家(www.bitmex.com)、true: デモサイト(testnet.bitmex.com)
// ■■ ↓ ■■■ このuseLocalOHLCVフラグをONにする
    useLocalOHLCV: true,                    // シミュレーション時にLocalOHLCVサーバを使用するか? true: 使用、false: 未使用
    resolution: Resolution || 60,           // OHLCVデータ取得の足幅、1,5,60,1440のどれか
    count: Count || 60,                     // OHLCVデータの収集個数 (default: 60)
    useClose: true,                         // marketOrderの戻り値には、true: close, false: open を使う
    sleepTime: SleepTime || 10000,          // メインループのsleepTimeを設定する (default: 10秒)
    toDateTime: Simulation == true ? new Date(year,month,day,0,0,0) : new Date(),  // ohlcvデータ収集終了日時を設定する
    apiKey : ApiKey,
    secret : ApiSecret
});

BitMEXサイトへのアクセスを10ミリ秒でじっこうしたら、数回のアクセスでAPI例外が出まくりですが、ローカルのサーバなら自前のPCの能力次第ですので高速アクセスが可能です。

今回公開したサーバは
・BitMEX本家(デモサイトには対応していません)
・足は60分足のみ
ですが、簡単に拡張可能です。

ご期待いただければ「スキ」ボタンをポチっと、「フォロー」ボタンをクリック、よろしくお願いいたします。

note: https://note.mu/o_matsuo

twitter: @o_matsuo
もフォローしてくださると、喜びます。

あ、それから私の師匠である
コンドウ様のnoteもポチっとしていただけると、さらに喜びます。


ソフトウェア・エンジニアを40年以上やってます。 「Botを作りたいけど敷居が高い」と思われている方にも「わかる」「できる」を感じてもらえるように頑張ります。 よろしくお願い致します。