MarketMakerBOTのソースコード(by magito氏)読解メモ3

の続きです。
題材は https://note.mu/magimagi1223/n/n5fba7501dcfd です。

get_effective_tickメソッドの続きから。

# 板情報から実効Ask/Bid(=指値を入れる基準値)を計算する関数
def get_effective_tick(size_thru, rate_ask, size_ask, rate_bid, size_bid):
   while True:
       try:
           value = bitflyer.fetchOrderBook(PAIR)
           break
       except Exception as e:
           logger.info(e)
           time.sleep(2)
   i = 0
   s = 0
   while s <= size_thru:
       if value['bids'][i][0] == rate_bid:
           s += value['bids'][i][1] - size_bid
       else:
           s += value['bids'][i][1]
       i += 1
   j = 0
   t = 0
   while t <= size_thru:
       if value['asks'][j][0] == rate_ask:
           t += value['asks'][j][1] - size_ask
       else:
           t += value['asks'][j][1]
       j += 1
   time.sleep(0.5)
   return {'bid': value['bids'][i-1][0], 'ask': value['asks'][j-1][0]}
   i = 0
   s = 0
   while s <= size_thru:
       if value['bids'][i][0] == rate_bid:
           s += value['bids'][i][1] - size_bid
       else:
           s += value['bids'][i][1]
       i += 1

i,sに0を入れて、sがsize_thruで指定された値未満の間はループ処理します。
valueには板情報が下記形式で入っています。
参考: https://lightning.bitflyer.com/docs?lang=ja#%E6%9D%BF%E6%83%85%E5%A0%B1

{
 "mid_price": 33320,
 "bids": [
   {
     "price": 30000,
     "size": 0.1
   },
   {
     "price": 25570,
     "size": 3
   }
 ],
 "asks": [
   {
     "price": 36640,
     "size": 5
   },
   {
     "price": 36700,
     "size": 1.2
   }
 ]
}

value['bids'][i][0]にはi番目のbids priceが入ります。
value['bids'][i][1]にはi番目のbids sizeが入ります。
i番目のbids priceが指定されたrate_bidと同値であれば、sにi番目のbids sizeから指定されたsize_bidを引いた値を加算します。
同値でない場合は、sにi番目のbids sizeを加算します。
最後にiに1加算します。

   j = 0
   t = 0
   while t <= size_thru:
       if value['asks'][j][0] == rate_ask:
           t += value['asks'][j][1] - size_ask
       else:
           t += value['asks'][j][1]
       j += 1

askについても同様の処理をします。

   time.sleep(0.5)
   return {'bid': value['bids'][i-1][0], 'ask': value['asks'][j-1][0]}

0.5秒sleepした後に、bidのi-1番目の価格とaskのi-1番目の価格を返します。

# 成行注文する関数
def market(side, size):
   while True:
       try:
           value = bitflyer.create_order(PAIR, type = 'market', side = side, amount = size)
           break
       except Exception as e:
           logger.info(e)
           time.sleep(2)
   time.sleep(0.5)
   return value

成り行き注文を行います。
sendchildorderAPIを利用しています。
https://lightning.bitflyer.com/docs?lang=ja#%E6%96%B0%E8%A6%8F%E6%B3%A8%E6%96%87%E3%82%92%E5%87%BA%E3%81%99
他のAPIと違って処理後に0.5sのsleepを入れています。
ある程度間を取って注文したいかAPIの参照上限に達さないための工夫と思われます。

15分経ったので今日はここまで。

↓次


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