ngrokを使わない方法

# 趣旨
dydXの Tradingview Alert Connector の Tradingview の部分をTa-Libに置き換えたらわざわざngrok使う必要もないし別途コネクターを自分で用意する必要もないし楽だなと思ったので、やり方を簡単に紹介しておきます。Smeeを使うとStaticになるのでそっちでも良いと思いますが、自分でテクニカル分析やった方が応用できるので、Ta-Lib使う方が良いんじゃないかと。

元記事はこちらです。

https://qiita.com/danieltanaka/items/3c9504ec514ac0e601d0

dydXのbotをいちから作るのCEXやハイリキに比べてかなり難しそうだったので、あるものは利用しましょう！無料ですし、デベロッパーに感謝。

# 実践
上の記事を参考にしてコネクターを準備したらさっそく実践してみましょう。

## Ta-Libのインストール
初心者にはちょっとむずかしいです。僕も難しくて以前botterさんにやり方教えてもらいました。

https://qiita.com/danieltanaka/items/2eceb81d303e2634bb87

## webhookの実装
他の機能を全て排除してwebhookの実装だけを抽出したらこんな感じになります。今回はこれが元になっていてTa-Libでシグナル発生してペイロード作ってWebhookとして内部サーバーに送信します。

https://qiita.com/danieltanaka/items/33059755ed60080a5368

## その他
- ccxtのインストール

ccxtだとdydxv４の価格データ取ってこれないので実際はこれで運用すべきじゃないです。dydXの仕様が面倒でわざわざそこまでしなくていいやと思ってしまったのでccxt使わせてもらいます。

## サンプルコード
サンプル用にテストコード用意するの面倒だったのでGPT先生に用意してもらいました。適当に聞いただけなので実装面はご自由にお好みでどうぞ。Payloadさえ正しいフォーマットであればどんなシグナルでもよいです。

```python sample.py
import ccxt
import talib
import numpy as np
import requests
import json
import os

def fetch_and_save_historical_data(symbol='DOGE/USDT', timeframe='1m', limit=100, filename='historical_data.json'):
    exchange = ccxt.binance()]# ccxtにdydxv4ないのでBinanceで代用
    ohlcv = exchange.fetch_ohlcv(symbol, timeframe, limit=limit)
    # Extract closing prices
    close_prices = [x[4] for x in ohlcv]
    # Save to file
    with open(filename, 'w') as file:
        json.dump(close_prices, file)
    return np.array(close_prices)

def load_historical_data(filename='historical_data.json'):
    if not os.path.exists(filename):
        return None
    with open(filename, 'r') as file:
        close_prices = json.load(file)
    return np.array(close_prices)

def generate_signals(filename='historical_data.json'):
    close_prices = load_historical_data(filename)
    if close_prices is None:
        print("No data to generate signals.")
        return None
    
    # Print the fetched data for debugging
    print("Fetched Close Prices:")
    print(close_prices)

    # Calculate RSI
    rsi = talib.RSI(close_prices, timeperiod=14)
    
    # Print the calculated RSI for debugging
    print("Calculated RSI:")
    print(rsi)

    # Example signal based on RSI
    if rsi[-1] < 30:
        return 'buy'
    elif rsi[-1] > 70:
        return 'sell'
    else:
        return None

# Webhook URL (Node.js server URL)
webhook_url = 'http://localhost:3000/webhook'

# Fetch and save historical data
fetch_and_save_historical_data()

# Generate signal
signal = generate_signals()　

# Only send the webhook if there is a valid signal (BUY or SELL)
if signal:
    # Get the current DOGE price
    current_price = load_historical_data()[-1]

    # Prepare the payload
    payload = {
        "exchange": "dydxv4",
        "strategy": "RSI",
        "market": "DOGE_USD",
        "reverse": True,
        "order": signal,
        "position": "short" if signal == 'sell' else "long",
        "price": str(current_price),
        "size": "10000"
    }

    # Send the POST request
    response = requests.post(webhook_url, json=payload)

    # Check the response
    if response.status_code == 200:
        print('Webhook sent successfully!')
    else:
        print(f'Error sending webhook: {response.text}')
else:
    print('No valid trading signal generated.')
```

TradingViewを使わずに実装すると自分のサーバー内で情報が完結するので、WEBHOOKを逆手に取った攻撃をされるリスクも軽減できますし、TradingViewのフォーマットに限定されず自分で自由な注文をセットしてなげられるので、こっちの方が本来の使い方なのかなと。

あとはこれをcronjobにセットして毎分起動とかセットします。Websocketを使えばcronjobとかいらないですが、GPT先生にこっちをお勧めされたのでとりあえずcronjobの方法も載せておきます。

Cronについては以前一度記事書きました。

https://qiita.com/danieltanaka/items/661aa8734c555b8cd5df#cron%E8%A8%AD%E5%AE%9A

シェルスクリプトを用意します。仮想環境でライブラリをインストールしたのでCronでそれを環境指定して起動すればよいのですが、なぜかGPT先生はシェルスクリプトを用意してそこに環境セットしてそれを毎回起動する方法を指定されたので、先生の言うとおりそちらを紹介します。

```bash run_script.sh
#!/bin/bash
source /home/username/Library/myenv/bin/activate
/home/username/Library/myenv/bin/python /home/username/Library/dydx/sample.py
```
実行権限を与えます。
```
chmod +x /home/usernmae/Library/dydx/run_script.sh
```
crontabを開きます。
```
crontab -e
```
最後の行にこれを追加して保存します。
```
* * * * * /home/username/Library/dydx/run_script.sh
```

これで毎分テクニカル分析がされて条件が合えばシグナル生成が発生し、それがnpmサーバーにPostされて注文がはいるはずです。

# 補足

一応本家がラズパイを使ったAPIトレードのガイドを出してますけど、多分コネクターを使った方が早いです。コネクターはダウンロードしてニーモニックさえ保存すればすぐに使えるので便利です。

https://docs.dydx.exchange/api_integration-guides/setting_up_raspberry_pi_for_api_trading

僕はこのガイド見ても「うわあ…面倒臭そうだなあ…」と思っただけで実践してないので実際簡単にできるかどうかわかりません。