見出し画像

【FTX LEGEND】FTXでAPIを使って出来高を取得する

こんにちは。仮想通貨でシステムトレード、いわゆるBOTを運用しているさぼりーまんパパ(@akihitot1)と言います。
タイトルの通り、仮想通貨取引所FTXのAPIで出来高(取引履歴)を取得する方法について書きます(有料設定ですが、内容は全て無料部分にあります)。

FTX LEGEND キャンペーン

IEOのSRMや寿司などで最近話題のFTXですが、ただいまFTX LEGENDと銘打ったキャンペーンが開催されております。
2〜5人のチームを作り、チーム全体で9月中に1000万ドル以上の出来高を達成したら賞金が貰えると言うもの。

私もこのキャンペーンに参加していますが、出来高を効率的に稼ぐ戦略を考えるにあたって、複数のサブアカウントの出来高を正確に把握する必要がありました。

各サブアカウントから、CSVで約定履歴を取得して解析するのでも良いのですが、継続的に監視したかったのでスクリプトを作成しましたので共有させていただきます。

import ccxt
import time
from datetime import datetime as dt

base_timestamp = 1598889600000 # 2020-09-01 00:00:00(HKT)
# base_timestamp = 1598889600000 + 60*1000*60*24 * day # 日数
   
def get_member_info(api_key, api_secret, name):
   """
   チームのメンバーそれぞれの出来高と手数料情報を取得し表示する

   Parameters
   ----------
   api_key : string 
   api_secret : string
   name : string メンバー名(出力時に使う)
   
   Returns
   -------
   volume : float
   fee : float
   """
   
   def get_subaccount_info(subaccount):
       """
       サブアカウントの出来高と手数料情報を取得し表示する
   
       Parameters
       ----------
       subaccount : object ccxtで取得したサブアカウント情報
       
       Returns
       -------
       vol : float
       fee : float
       """
       
       # nicknameがあればサブアカウント
       if 'nickname' in subaccount:
           ftx = ccxt.ftx({'apiKey': api_key,'secret': api_secret, 'headers': {'FTX-SUBACCOUNT': subaccount['nickname']}})
           nickname = subaccount['nickname']
       else:
           # nicknameがないのはメインアカウントとみなして処理する
           ftx = ccxt.ftx({'apiKey': api_key,'secret': api_secret})
           nickname = 'main'
   
       since = time.time()
       limit = 100
       all_orders = {}
       while True:
           orders = ftx.fetch_my_trades(None, since, limit, {'order': 'asc'})
           if len(orders) > 0 and not since == orders[-1]['timestamp']:
               since = orders[-1]['timestamp']
               for order in orders:
                   if not order['id'] in all_orders and order['timestamp'] >= base_timestamp:
                       all_orders[order['id']] = order
           else:
               break
           
       vol = fee = 0.0
       for order in list(all_orders.values()) :
           vol = vol + order['amount']*order['price']
           fee = fee+order['fee']['cost'] if not order == None else 0.0  
       print(f'{nickname} vol:${vol:,.2f} fee:${fee:.2f}')
       
       return (vol, fee)
   
   # ftxクライアント生成
   ftx = ccxt.ftx({'apiKey': api_key,'secret': api_secret,})
   
   # サブアカウント情報取得
   subaccounts = ftx.privateGetSubaccounts()
   
   # メインアカウントをまず処理する
   volume, fee = get_subaccount_info({})
   # サブアカウントを順に処理する
   for subaccount in subaccounts['result']:
       v,f = get_subaccount_info(subaccount)
       volume += v
       fee += f
       
   print(f'{name} Total volume: ${volume:,.2f} fee:${fee:,.2f}')
   return (volume, fee)
   
start = time.time()
members = []
members.append({
   'name': 'leader',
   'api_key': "LEADER_API_KEY",
   'api_secret': "LEADER_API_SECRET"
})
members.append({
   'name': 'member1',
   'api_key': "MAMBER1_API_KEY",
   'api_secret': "MEMBER1_API_SECRET",
})
total_volume = total_fee = 0.0
for user in members:
   volume, fee = get_member_info(user['api_key'], user['api_secret'], user['name'])
   total_volume += volume
   total_fee += fee
   print('-'*10 )
print(f'TOTAL VOLUME: ${total_volume:,.2f} fee: ${total_fee:,.2f} {dt.now()}')
print(f'executed time: {time.time() - start}')

使い方

このファイルだけで完結しますが、APIの呼び出しにCCXTを使用しています。古いバージョンのCCXTFTXをサポートしていないかもしれないので、エラーが出る場合は最新バージョンを使ってみてください。

こんな感じで結果が表示されます。

main vol:$2,401.99 fee:$0.00
bot1 vol:$182,727.63 fee:$0.00
sushi_bot vol:$26,558.55 fee:$0.39
bot2 vol:$657,397.94 fee:$0.76
bot3 vol:$539,546.40 fee:$29.16
bot4 vol:$451,097.23 fee:$6.15
bot5 vol:$1,005,905.46 fee:$1.59
HGET-IEO vol:$0.00 fee:$0.00
bot6 vol:$130,861.95 fee:$74.80
leader Total volume: $2,996,497.16 fee:$112.86
----------
main vol:$303,395.20 fee:$2.72
FTT vol:$845.43 fee:$0.23
HGET-IEO vol:$0.00 fee:$0.00
bot1 vol:$1,661,352.33 fee:$13.50
bot2 vol:$499,690.62 fee:$1.87
bot3 vol:$23,472.80 fee:$14.19
member1 Total volume: $2,488,756.39 fee:$32.50
----------
TOTAL VOLUME: $5,485,253.55 fee: $145.37 2020-09-05 16:51:33.542918
executed time: 44.4482536315918

大したことはしていないですが、

base_timestamp = 1598889600000 # 2020-09-01 00:00:00(HKT)

ここでキャンペーンの対象となる起点の時間を定義しています。
この部分を変えれば、直近1週間や今日の出来高など取得する事も出来ます。

私の場合は、このスクリプトを元に、もうちょっといろんな情報を取って来るよう追記して、cronで定期的に実行し、discordとinfluxdbに飛ばして監視できる環境を作っています。

キャンペーンの感想(2020/09/05時点)

9月1日 から相棒と2人でキャンペーンに参加しています。始まるまではもうちょっと厳しいかと予想していました。ですが、実際のところ出来高は順調にこなしており、今のところ順調です。ツイッターにも毎日進捗報告させてもらっています。

最初の区切りとしての1000万ドルを達成した際には、もうちょっと詳しい戦略や検証内容、やってしまった失敗談など、noteの記事に出来たらなと思っています。

内容はこれで終わりですが今回は有料部分を設けています。
5歳の息子が隣のおじいちゃんに捕まえてもらって、ひと夏飼ってるツチガエルの写真を載せておきます。
ソースコードが役立ったという方、もしくはツチガエル見てみたいという方は、ご購入いただけると幸いです。励みになります。

ここから先は

248字 / 1画像

¥ 300

この記事が気に入ったらサポートをしてみませんか?