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

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

# 指値注文する関数
def limit(side, size, price):
   while True:
       try:
           value = bitflyer.create_order(PAIR, type = 'limit', side = side, amount = size, price = price)
           break
       except Exception as e:
           logger.info(e)
           time.sleep(2)
   time.sleep(0.5)
   return value
# 注文をキャンセルする関数
def cancel(id):
   try:
       value = bitflyer.cancelOrder(symbol = PAIR, id = id)
   except Exception as e:
       logger.info(e)
       # 指値が約定していた(=キャンセルが通らなかった)場合、
       # 注文情報を更新(約定済み)して返す
       value = get_status(id)
   time.sleep(0.5)
   return value

指値注文と注文キャンセル処理です。
どちらも成り行き注文などと同じようにbitflyerのapiを叩いて実行しています。
cancelは他のAPIと異なり、例外が飛んだ場合にループさせるのではなく約定済みかどうかを判断する処理を進めます。
bitflyerのAPIドキュメントは失敗時の挙動について記載がないため不明ですが、約定済みなら200以外の何らかのstatus codeを返すのかもしれません。

# 指定した注文idのステータスを参照する関数
def get_status(id):
   if PAIR == 'BTC/JPY':
       PRODUCT = 'BTC_JPY'
   else:
       PRODUCT = PAIR
   while True:
       try:
           value = bitflyer.private_get_getchildorders(params = {'product_code': PRODUCT, 'child_order_acceptance_id': id})[0]
           break
       except Exception as e:
           logger.info(e)
           time.sleep(2)
   # APIで受け取った値を読み換える
   if value['child_order_state'] == 'ACTIVE':
       status = 'open'
   elif value['child_order_state'] == 'COMPLETED':
       status = 'closed'
   else:
       status = value['child_order_state']
   # 未約定量を計算する
   remaining = float(value['size']) - float(value['executed_size'])
   time.sleep(0.1)
   return {'id': value['child_order_acceptance_id'], 'status': status, 'filled': value['executed_size'], 'remaining': remaining, 'amount': value['size'], 'price': value['price']}

発注したorderのステータスを確認します。
getchildordersAPIを使っています。
https://lightning.bitflyer.com/docs?lang=ja#%E6%B3%A8%E6%96%87%E3%81%AE%E4%B8%80%E8%A6%A7%E3%82%92%E5%8F%96%E5%BE%97
APIのレスポンスを受け取ったら、child_order_stateの状態によってstatusに入れる値を変えます。
executed_sizeには約定済サイズが入っているので、sizeとexecuted_sizeの差分を未約定としてremainingに入れます。
id, status, filled(約定済み量), remaining(未約定量), amount(orderサイズ), priceを返します。

# 未約定量が存在することを示すフラグ
remaining_ask_flag = 0
remaining_bid_flag = 0
# 指値の有無を示す変数
pos = 'none'

後々の判定に使われるであろう変数を定義しています。

logger.info('--------TradeStart--------')
logger.info('BOT TYPE      : MarketMaker @ bitFlyer')
logger.info('SYMBOL        : {0}'.format(PAIR))
logger.info('LOT           : {0} {1}'.format(LOT, COIN))
logger.info('SPREAD ENTRY  : {0} %'.format(SPREAD_ENTRY * 100))
logger.info('SPREAD CANCEL : {0} %'.format(SPREAD_CANCEL * 100))

bot起動時に現在設定をログ出力します。

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

↓次


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