趣旨
dydXの Tradingview Alert Connector の Tradingview の部分をTa-Libに置き換えたらわざわざngrok使う必要もないし別途コネクターを自分で用意する必要もないし楽だなと思ったので、やり方を簡単に紹介しておきます。Smeeを使うとStaticになるのでそっちでも良いと思いますが、自分でテクニカル分析やった方が応用できるので、Ta-Lib使う方が良いんじゃないかと。
元記事はこちらです。
dydXのbotをいちから作るのCEXやハイリキに比べてかなり難しそうだったので、あるものは利用しましょう!無料ですし、デベロッパーに感謝。
実践
上の記事を参考にしてコネクターを準備したらさっそく実践してみましょう。
Ta-Libのインストール
初心者にはちょっとむずかしいです。僕も難しくて以前botterさんにやり方教えてもらいました。
webhookの実装
他の機能を全て排除してwebhookの実装だけを抽出したらこんな感じになります。今回はこれが元になっていてTa-Libでシグナル発生してペイロード作ってWebhookとして内部サーバーに送信します。
その他
- ccxtのインストール
ccxtだとdydxv4の価格データ取ってこれないので実際はこれで運用すべきじゃないです。dydXの仕様が面倒でわざわざそこまでしなくていいやと思ってしまったのでccxt使わせてもらいます。
サンプルコード
サンプル用にテストコード用意するの面倒だったのでGPT先生に用意してもらいました。適当に聞いただけなので実装面はご自由にお好みでどうぞ。Payloadさえ正しいフォーマットであればどんなシグナルでもよいです。
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については以前一度記事書きました。
シェルスクリプトを用意します。仮想環境でライブラリをインストールしたのでCronでそれを環境指定して起動すればよいのですが、なぜかGPT先生はシェルスクリプトを用意してそこに環境セットしてそれを毎回起動する方法を指定されたので、先生の言うとおりそちらを紹介します。
#!/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トレードのガイドを出してますけど、多分コネクターを使った方が早いです。コネクターはダウンロードしてニーモニックさえ保存すればすぐに使えるので便利です。
僕はこのガイド見ても「うわあ…面倒臭そうだなあ…」と思っただけで実践してないので実際簡単にできるかどうかわかりません。