趣旨
dydX v4をTradingViewアラートで自動売買するプログラムを公開してる方がいたので自分でも弄ってみました。
以下ローカルPCで実践する際のドキュメントです。
環境
以下の環境で実践しました。必要なものはTradingViewの有料アカウントとLinuxですね。Macなどでもできますが、常時起動するものなのでクラウドかラズパイのような電力消費の少ないコンピュータが良いと思います。
- Raspberry Pi
- Raspberry pi OS (64bit)の入ったマイクロSDカード(Debian amd64)
- TradingView 有料アカウント
- dydX v4 アカウント
実践編
tradingview-alert-connectorをダウンロード
git clone https://github.com/junta/tradingview-alert-connector.git
cd tradingview-alert-connector
# Githubから該当コードをクローン(DL)してます
シードフレーズをセット
mv .env.sample .env
# .env.sample" ファイルを".env"に書き換えてます
nano .env
# nanoで.envファイルを開き中身を以下のように書き換えます
DYDX_V4_MNEMONIC=<PLEASE_PUT_YOUR_PHRASE>
# サンプル DYDX_V4_MNEMONIC=try not being hacked
# ""などで囲む必要はなくミーモニックフレーズ取得したらそれをそのまま直張り
ngrokをインストールします
上のURLに以下のコードがLinux版として提示されてるのでそこからコピペしてラズパイのターミナルに貼り付けて実行します。
3つほどインストールする方法がありますが、僕が選んだのはInstall ngrok via Aptと書かれた項目です。
curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
| sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \
&& echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \
| sudo tee /etc/apt/sources.list.d/ngrok.list \
&& sudo apt update \
&& sudo apt install ngrok
次にDockerをインストールします。ドキュメントは以下のURLにあります。
DEB Packageという項目があるのでそこをラズパイのVNC接続からクリックしてダウンロードしておきます。DEBが入ったディレクトリまで移動してから以下のコマンドを打ちます。
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo apt-get install libseccomp2 libcap-ng0 pass libgtk-3-0 libx11-xcb1
sudo apt-get install ./docker-desktop-<version>-<arch>.deb
# ./より右側の名称をダウンロードしたDEBファイルの名称に書き換えてからコマンドを実行します
systemctl --user start docker-desktop
# systemctlによりDockerを起動します
systemctl --user enable docker-desktop
# systemctlによりDockerを常時起動状態に設定します
これだけで実行できるはずだと思ったんですが、docker composeの部分でエラーが発生してたのでGitHubから直接 docker compose持ってきました。
DockerとDocker Composeは全く同じものではないみたいで、僕は同じものだと思って接していたのでエラーの理由がわからず時間を無駄にしました。
以下の記事が参考になります。
docker composeをインストールします。
sudo curl -L "https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# docker composeのファイルをダウンロードして起動できる権限付与してます
docker-compose up -d
#これでdocker composeを起動してます
npmが必要なので入ってない場合はインストールします。
sudo apt update
sudo apt install nodejs npm
node --version
npm --version
# これはバージョン確認してるだけです
yarnでngrokを起動します。yarnが入ってない場合はyarnもインストールします。
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update
sudo apt install yarn
yarnを起動します。
npm start #ローカルホスト立ち上げ
yarn ngrok:docker #docker経由でngrokを立ち上げポートフォワードします
TradingViewからのアラートはwebhook(HTTP)なので外部向けに公開されているサーバーでないと受け取れないんですがngrokを使えば外部に公開されているサーバーで受け取ったwebhookをローカルホストにフォワードできます。故にローカルホストとngrokどちらも立ち上げる必要があります。
もしポート番号があっていなくて注文が通らない場合は package.json ファイル内のscriptの項目を弄る必要があります。
Dockerから起動した場合docker内で管理されたngrokを利用してポートフォワードするので多分ここいじらないと動きません。手探りでセットアップしてたので全ての場合をためせたわけではないのでわかりません。
"scripts": {
"start": "tsc && NODE_ENV=production node dist/index.js",
"start:test": "tsc && NODE_ENV=test ts-node dist/index.js",
"start:dev": "tsc && NODE_ENV=development tsc-watch --onSuccess \"ts-node dist/index.js\"",
"decode": "ts-node scripts/decode.ts",
"test": "jest",
"test:prod": "NODE_ENV=production jest",
"ngrok": "ngrok http 3000",
"ngrok:docker": "./node_modules/.bin/ngrok http http://localhost:3000 --authtoken=xxxx #ここ
},
/usr/local/bin/ngrokなどに置いてある本家ngrokとは異なるバージョンになることがあります。
その場合はnode_modulesのバージョンが古くてエラーを吐き出すことがあるので以下のコマンドで全てのngrokをアップデートします
npm install ngrok@latest
./node_modules/.bin/ngrok --version
# これでnode_modules内のngrokのバージョンを確認できます
ローカルホストのポートはデフォルト値でなくても好きな値で解放すればいいので環境に合わせて自由に変更できます。
あとはTradingViewの解説になるのでドキュメントを見ればわかります。
追記
Smee環境でngrokを代替した場合の追加設定
シェルスクリプトでsmeeがエラーで返ってきた時に再起動
#!/bin/bash
while true; do
/usr/local/bin/smee -u https://smee.io/yourURL
if [ $? -eq 0 ]; then
break
fi
echo "Retrying in 10 seconds..."
sleep 10
done
[Unit]
Description=Smee.io Client
After=network.target
[Service]
Type=simple
User=daniel
WorkingDirectory=/home/to/directory
ExecStart=/path/to/file/start_smee.sh
Restart=always
RestartSec=10
SyslogIdentifier=smee
[Install]
WantedBy=multi-user.target