以前ご紹介した BitMEX 提供の自動売買ソフト(BitMEX sample market maker)、いくつかの欠点があり、運用が 1週間も続きませんでした。
その後も懲りずに自動売買について模索する中で MACDヒストリカル を用いたシンプルなボットを発見。
とりあえず無料なので試してみました。
BitMEX で自動売買を検討している方の参考になれば幸いです。
今回ご紹介する無料の自動売買プログラム
BitMEX-simple-trading-robot
- GitHub(MITライセンス)、 紹介記事 Medium
- MACD ヒストリカルを用いた自動売買
- Python3 プログラム
自動売買の様子
Windows Serverで稼働中の様子。
味気ないコマンド画面ですが、システムが動いていることは確認できます。
自動取引の様子
自動売買の運用成績
まだ 12時間しか動かしていないので手探りの部分は多いですが、 以下のように感覚としてはよさそう。
** 画像内の + $5 などは、ポジション取得時からポジション決済時のビットコイン価格差を示すものです。実際の利益とは異なります。
このボットのメリット
- 落ちない、動き続ける
- 暴落時に強い??
- 無料
- シンプルなコード
このボットのデメリット
- 成り行き注文になるので手数料が取られる
- 私の場合、MACDヒストリカル、、、、がよく分かっていません。。。
- Windowsサーバーの場合、 C++ の開発環境がないので visual-cpp-build-tools のインストールが必要
現在運用中のパラメーターなど
GitHubからダウンロードしただけでは本番環境で利用できません。
現在稼働中のコードを以下に紹介します。
【configuration.py】
TEST_EXCHANGE=False
API_KEY="ご自身のBitMEX APIキー"
API_SECRET="ご自身のBitMEX APIシークレットキー"
AMOUNT_MONEY_TO_TRADE=1 #これで $100 分のポジションとる
LEVERAGE=100
TIMEFRAME = '5m' # 本当は 30m をやってみたいが、ちょっと下の設定を変えたぐらいではダメだった
time_to_wait_new_trade = {'1m': 60,
'5m': 60*5,
'1h': 60*60,
'1d': 60*60*24}
【main_loop.py】
import bitmex
import time
from configuration import *
from strategy import Strategy
from trader import Trader
client = bitmex.bitmex(
test=TEST_EXCHANGE,
api_key=API_KEY,
api_secret=API_SECRET
)
strategy = Strategy(client, timeframe=TIMEFRAME)
trader = Trader(client, strategy, money_to_trade=AMOUNT_MONEY_TO_TRADE, leverage=LEVERAGE)
while True:
if round(time.time()) % time_to_wait_new_trade[TIMEFRAME] == 0:
trader.execute_trade()
time.sleep(10)
【strategy.py】
import talib
import pandas as pd
class Strategy():
def __init__(self, client, timeframe='5m'):
self.client = client
self.timeframe = timeframe
def predict(self):
ohlcv_candles = pd.DataFrame(self.client.Trade.Trade_getBucketed(
binSize=self.timeframe,
symbol='XBTUSD',
count=100,
reverse=True
).result()[0])
ohlcv_candles.set_index(['timestamp'], inplace=True)
macd, signal, hist = talib.MACD(ohlcv_candles.close.values,
fastperiod=8, slowperiod=28, signalperiod=9)
# sell
if hist[-2] > 0 and hist[-1] < 0:
return -1
# buy
elif hist[-2] < 0 and hist[-1] > 0:
return 1
# do nothing
else:
return 0
【trader.py】
class Trader():
def __init__(self, client, strategy, money_to_trade=100, leverage=5): #leverage=5
self.client = client
self.strategy = strategy
self.money_to_trade = money_to_trade
self.leverage = leverage
def execute_trade(self):
prediction = self.strategy.predict()
print(f"Last prediction: {prediction}")
try:
if prediction == -1:
response = self.client.Order.Order_new(
symbol="XBTUSD",
side="Buy", #元 side="Sell",
orderQty=self.money_to_trade * self.leverage,
).result()
if prediction == 1:
response = self.client.Order.Order_new(
symbol="XBTUSD",
side="Sell", #元 side="Buy"
orderQty=self.money_to_trade * self.leverage,
).result()
except Exception:
print("Something goes wrong!")
return
今後
現在は 5分足で動かしていますのでどうしても だまし値 を拾って、ムダなポジション取りが発生しているように思います。
時間を見ては 30m で運用してみたいですね。