XEMの自動積立システムの改良(昨年の日本発大型ICOの残滓を噛みしめながら…

(この記事はNEM #2 Advent Calender 2018 11日目に登録しています。)

#記事投稿のきっかけ
先日、NEM #2 Advent Calender 2018 10日目に、[XEMの自動積立システム](https://qiita.com/salaryman-toushi/items/c8dee009b3e841c1d75d)に関する記事をQiita初投稿させて頂きました。

Zaifのハッキング事件に悲しみに暮れるあまり？不思議なテンションで、短期間で勢いで作ってしまったこともあって、実際に動かしてみるとバグもありましたし、色々と改良したいポイントもでてきました。それらを修正している内に、Advent Calender最終日となったのですが、意外にもかなり枠が余っている！ということで、過去日の枠ですが、再び、投稿させて頂こうと思います。

ところどころさりげなく散りばめられたネタも楽しみながら、お付き合い頂けますと幸いです。

いつもと同様、不具合、バグ、改善提案などあれば、ぜひ色々ご指摘頂けますと幸いです。よろしくお願いします。

なお、本記事のプログラムは取引所の本番環境に実際に注文を出すため、見方によってはリスクの高いプログラムです。本記事の内容によっていかなる損害が発生したとしても、当方としては責任を取ることはできません。適切に設定することで、発注はデフォルトではかからないはずですが、それでも、慎重なトライをお勧めします。

#概要おさらいと改良点
作りたい仕組みの概要は以下の通りですが、今回、自動積立可能な取引所をZaifだけでなく、Liquid、bitbankまで対応しました。(ここはNEMあまり関係ないかもしれませんが、ご容赦頂けますと幸いですm(__)m)
また、積立可能な対象も、NEMだけでなく、CMS:XEM等、NEMberな皆様ならご存知であろう、マイナー？な銘柄も選択可能に拡張しました。(ここもNEMあまり関係ないかもしれませんが、CMS:XEMはNEMのモザイクなのでセーフ？)
少し整理すると以下のような内容になります。

1. 取引所への入金は手動**←前回と同じ**
2. 毎日の対象通貨買付けは、「Node.js」とnpmパッケージ「ccxt」と取引所APIを利用して、自動的に個人保有のPCから現物の買い注文を出す**←仕組みは同じだが、Zaifだけでなく、Liquid、bitbankにも対応し、設定情報とプログラム本体を分割**
3. 対象通貨
    4. 前回記事時点(取引所Zaifのみ)
        5. XEM
        6. BTC
        7. ETH
        8. (MONA…ただし、Zaifではハッキング事件の後遺症で、MONAは取引停止中のため実質的には非対応)
    9. **今回の改良で追加した通貨その1(ここまではある程度知名度のある銘柄？)**
        10. **MONA…bitbank**
        11. **XRP…Liquid, bitbank**
        12. **BCH…Zaif, Liquid, bitbank**
    13. **今回の改良で追加した通貨その2(マイナー銘柄…昨年の日本発大型ICOを思い起こしながらどうぞ(涙))**
        14. **CMS:XEM…Zaif**
        15. **CMS:ETH…Zaif**
        16. **QASH…Liquid**

#必要なもの
1. PC(WindowsでもMacでもLinuxでもNode.jsが動くならOK？)
2. Zaif取引所アカウント
    3. API key
    4. API secret
5. Liquid取引所アカウント
    6. API key
    7. API secret
8. bitbank取引所アカウント
    9. API key
    10. API secret

取引所のアカウントとAPI key、API secretは事前に準備しておきましょう。info, trade的な権限が必要だと思います。いうまでもないかもしれませんが、これらの情報は第三者に決して教えてはいけません。

#手順
##Node.jsのインストール
[Node.js公式](https://nodejs.org/ja/)からダウンロードして普通にインストールします。今回作成する仕組みではバージョン依存性はそんなに無いと思われるので、LTS推奨版くらいで良いと思います。(8以上くらいの縛りがccxtであったかもしれません。)

##リリースデータをGithubからダウンロードして展開
Githubにソースコードを公開しましたので、適当なフォルダにGithubの以下URLからリリースデータをダウンロードして展開してください。v-0.1.2-betaを使って頂く形で良いと思います。
https://github.com/salaryman-toushi/abc2p/releases

Gitを使っている方はクローンして利用して頂くほうが慣れていてやりやすいでしょうか？

##ひとつ前の作業で出来上がったフォルダでnpm init
コマンドプロンプトなどで対象フォルダに移動し、

npm init

を実行します。
色々聞かれますが、全部そのままエンターで良いです。

##ccxtのインストール
引き続き、対象フォルダにてコマンドプロンプトで

npm install ccxt --save

コマンドを実行します。少し時間がかかった後に何か出てくると思います。警告らしきものが出てきますが、ここではあまり気にする必要はないでしょう。コマンドプロンプトの作業はいったんここまでですが、また後でコマンドプロンプトをこの状態で使用するので、閉じずにそのままにしておきましょう。

##config_dummy.jsonファイルの修正とconfig.jsonファイルへのリネームしての保存
対象フォルダに「config_dummy.json」ファイルがあると思います。PUT_YOUR_API_KEY_HERE、PUT_YOUR_API_SECRET_HEREと書かれた箇所にご自身のアカウントのAPI情報を書き込み、積立頻度、積立金額や積立対象の通貨についても、必要に応じて書き換えて、名前をつけて保存で「config.json」にリネームして保存してください。デフォルトでは、全取引所とも、積立頻度1日1回(= 86400000ミリ秒 = 24時間 * 60分 * 60秒 * 1000ミリ秒)、積立金額0円/年、全銘柄比率0%という設定にしてあります。

```json:config.json
{
    "zaif": {
	    "api": {
		    "key": "PUT_YOUR_API_KEY_HERE",
		    "secret": "PUT_YOUR_API_SECRET_HERE"
	    },
	    "fee": {
		    "btc": {
			    "maker": 0,
			    "taker": 0
		    },
		    "eth": {
			    "maker": 0,
			    "taker": 0.1
		    },
		    "xem": {
			    "maker": 0,
			    "taker": 0.1
		    },
		    "mona": {
			    "maker": 0,
			    "taker": 0.1
		    },
		    "bch": {
			    "maker": 0,
			    "taker": 0.3
		    },
		    "cms_xem": {
			    "maker": 0,
			    "taker": 0.1
		    },
		    "cms_eth": {
			    "maker": 0,
			    "taker": 0.1
		    }
	    },
	    "tsumitate": {
		    "per_year": 0,
		    "ratio": {
			    "btc": 0,
			    "eth": 0,
			    "xem": 0,
			    "mona": 0,
			    "bch": 0,
			    "cms_xem": 0,
			    "cms_eth": 0
		    },
	    	"interval": 86400000
	    }
    },
    "liquid": {
	    "api": {
		    "key": "PUT_YOUR_API_KEY_HERE",
		    "secret": "PUT_YOUR_API_SECRET_HERE"
	    },
	    "fee": {
		    "btc": {
			    "maker": 0,
			    "taker": 0
		    },
		    "eth": {
			    "maker": 0,
			    "taker": 0
		    },
		    "xrp": {
			    "maker": 0,
			    "taker": 0
		    },
		    "bch": {
			    "maker": 0,
			    "taker": 0
		    },
		    "qash": {
			    "maker": 0,
			    "taker": 0
		    }
	    },
	    "tsumitate": {
		    "per_year": 0,
		    "ratio": {
			    "btc": 0,
			    "eth": 0,
			    "xrp": 0,
			    "bch": 0,
			    "qash": 0
		    },
		    "interval": 86400000
	    }
    },
    "bitbank": {
	    "api": {
		    "key": "PUT_YOUR_API_KEY_HERE",
		    "secret": "PUT_YOUR_API_SECRET_HERE"
	    },
	    "fee": {
		    "btc": {
			    "maker": -0.05,
			    "taker": 0.15
		    },
		    "xrp": {
			    "maker": -0.05,
			    "taker": 0.15
		    },
		    "mona": {
			    "maker": -0.05,
			    "taker": 0.15
		    },
		    "bch": {
			    "maker": -0.05,
			    "taker": 0.15
		    }
	    },
	    "tsumitate": {
		    "per_year": 0,
		    "ratio": {
			    "btc": 0,
			    "xrp": 0,
			    "mona": 0,
			    "bch": 0
		    },
		    "interval": 86400000
	    }
    }
}
```
##Node.jsでabc2p.jsを実行
対象フォルダにて、コマンドプロンプトで以下コマンドを実行すれば、「Ctrl」+「C」等で強制的に終了するまで、24時間毎に現在価格を調べて積立分の金額だけ自動的に買付注文を出し続けてくれるでしょう。注意点としては、設定情報の読み込みは初回起動時のみで、積立毎のタイミングで設定情報を読み込んでいるわけではないため、設定を変更したい場合は、一度プログラムを止めて、再度実行する必要があると思います。

### Zaif取引所での自動積立を実行したい場合
node abc2p-jp-zaif.js

### Liquid取引所での自動積立を実行したい場合
node abc2p-jp-liquid.js

### bitbank取引所での自動積立を実行したい場合
node abc2p-jp-bitbank.js

#所感
##最小発注数量が小さいことが積立では重要
###最小発注数量はbitbankが優秀な印象
発注数量が最小発注数量に満たない場合、そのままAPIで注文を出すとエラーが返ってくるので、最小発注数量を上回る場合のみ発注を出すロジックを入れています。この点はbitbankが優れていました。

##発注金額誤差を減らすためには、発注数量の刻み幅と価格の刻み幅を小さくできることが重要
###発注数量の刻み幅と価格の刻み幅はLiquidが優秀な印象
ここはLiquidが優秀な印象でした。QASHのICOを原資とした、全世界の仮想通貨取引所の流動性を集約するプロジェクトの成果が、ささやかで地味ですが、出はじめているのでしょうか。とはいえ、伝統的な金融の世界に比べると、まだまだ、スプレッドの広さを感じてしまいます。今回自分が作ったツールが流動性の増大にほんの少しでも良い影響をもたらしてくれると嬉しいです。
2018/12/29追記…Liquidの自動積立でエラーが出ていて確認したところ、取引所のログイン画面で書面の確認要求が出ていました。書面の確認を行わないと、エラーが解決されないようです。この仕様は自動化にとっては、正直残念な感じですね…皆様もエラー出ていたら確認してみてください。

#最後に
長文お付き合い頂きありがとうございました。今年は仮想通貨にとっては大きな試練の年になったと思いますが、NEMをはじめとする、技術的な魅力をしっかり持ったブロックチェーンの将来には、まだまだ期待しています。
インターネットのように良い意味で世の中に普及して、世界の人々の暮らしをよりよくしていくことができますように。
それでは良いお年を！

NEM Address: NDU7JGAEOIEFOYZYOIL4ZZDMRAL222XR6C5Q55QU