dydX v4 x TradingViewでDYDXマイニングしよう！

# 趣旨
dydX v4をTradingViewアラートで自動売買するプログラムを公開してる方がいたので自分でも弄ってみました。

以下ローカルPCで実践する際のドキュメントです。

https://tv-connector.gitbook.io/docs/setup/run-on-local-pc

# 環境
以下の環境で実践しました。必要なものはTradingViewの有料アカウントとLinuxですね。Macなどでもできますが、常時起動するものなのでクラウドかラズパイのような電力消費の少ないコンピュータが良いと思います。

- Raspberry Pi 
- Raspberry pi OS (64bit)の入ったマイクロSDカード（Debian amd64）
- TradingView 有料アカウント
- dydX v4 アカウント

# 実践編
tradingview-alert-connectorをダウンロード
```bash
git clone https://github.com/junta/tradingview-alert-connector.git
cd tradingview-alert-connector
# Githubから該当コードをクローン（DL）してます
```
シードフレーズをセット
```bash
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をインストールします

https://ngrok.com/download

上のURLに以下のコードがLinux版として提示されてるのでそこからコピペしてラズパイのターミナルに貼り付けて実行します。

:::note info 
3つほどインストールする方法がありますが、僕が選んだのはInstall ngrok via Aptと書かれた項目です。
:::

```bash
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にあります。

https://docs.docker.com/desktop/install/debian/

![Screenshot 2024-05-12 at 09.53.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670541/2f3dfa16-994f-eaf5-1513-8bc821e94ad8.png)

DEB Packageという項目があるのでそこをラズパイのVNC接続からクリックしてダウンロードしておきます。DEBが入ったディレクトリまで移動してから以下のコマンドを打ちます。

```bash
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を常時起動状態に設定します
```
:::note alert
これだけで実行できるはずだと思ったんですが、docker composeの部分でエラーが発生してたのでGitHubから直接 docker compose持ってきました。
:::

:::note info
DockerとDocker Composeは全く同じものではないみたいで、僕は同じものだと思って接していたのでエラーの理由がわからず時間を無駄にしました。

以下の記事が参考になります。

https://o2mamiblog.com/docker-beginner-2/
:::

docker composeをインストールします。
```bash
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が必要なので入ってない場合はインストールします。
```bash
sudo apt update
sudo apt install nodejs npm

node --version
npm --version
# これはバージョン確認してるだけです
```

yarnでngrokを起動します。yarnが入ってない場合はyarnもインストールします。

```bash
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を起動します。

```bash 
npm start #ローカルホスト立ち上げ
yarn ngrok:docker #docker経由でngrokを立ち上げポートフォワードします
```

:::note info 
TradingViewからのアラートはwebhook(HTTP)なので外部向けに公開されているサーバーでないと受け取れないんですがngrokを使えば外部に公開されているサーバーで受け取ったwebhookをローカルホストにフォワードできます。故にローカルホストとngrokどちらも立ち上げる必要があります。
:::

もしポート番号があっていなくて注文が通らない場合は package.json ファイル内のscriptの項目を弄る必要があります。

:::note alert
Dockerから起動した場合docker内で管理されたngrokを利用してポートフォワードするので多分ここいじらないと動きません。手探りでセットアップしてたので全ての場合をためせたわけではないのでわかりません。
:::

```package.json
	"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をアップデートします

```bash
npm install ngrok@latest

./node_modules/.bin/ngrok --version
# これでnode_modules内のngrokのバージョンを確認できます
```

ローカルホストのポートはデフォルト値でなくても好きな値で解放すればいいので環境に合わせて自由に変更できます。

あとはTradingViewの解説になるのでドキュメントを見ればわかります。

https://tv-connector.gitbook.io/docs/additional-usage/execute-order-from-non-strategy-alert

https://tv-connector.gitbook.io/docs/setup/test-tradingview-strategy-alert

https://tv-connector.gitbook.io/docs/setup/set-tradingview-strategy-alert


# 追記
Smee環境でngrokを代替した場合の追加設定

シェルスクリプトでsmeeがエラーで返ってきた時に再起動
```bash start_smee.sh
#!/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
```

```/etc/systemd/system/smee.service
[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
```