[覚書] bitFlyer API botter's把握メモ

このnoteは,弊覚書用 bitflyer botter's documentです.コードは言語明記がない場合,それっぽい英語で書いています.下記事項には疑ってかかってください.

平均回帰法やbestask/bestbid系mmbotなどのボトルネック解消・アイデアや頭の体操になれば嬉しいです.結果持ち寄ってe-sportっぽいドヤとオタクっぽい会話しましょう.

※ 検証時期が現在ではないことと,解読するものではないことをご理解ください.



# PublicAPIについての把握

- json_rpcよりsocket.ioが優秀,json_rpc*1.01 ≒ socket.io.

- websocket配信間隔はExecutions < Board < Ticker,故にExecutionsで遅配判断.

- order_idはFORMAT YMD-hms-μs(JRF20150707-200203-452209)でできている.


# PrivateAPIについての把握

- *order_acceptance_idは一意ではないため建玉管理の際はsizeやprice,REST API (getchildorders/getexecutions.getpositions)で補完 ※ 参考 Reon777さんによるbf問い合わせ

- Orderの返り値から板乗りまでの時間を測定できるが,thisOrderの返り値が返ってくる前にExecutionsからthisOrderの約定が返ってくることがある.order_timeとexec_timeとorder_id.to_time()の関係性は未検証.

- order_idが返ってくるまでは再注文拒否またはorderスレのロックが安定.

- minute_to_expireは板乗り後ではなく、注文到達起点の模様.minute_to_expire=1で遅延板乗りが1分の場合は相殺されるが,bitflyer内部処理誤差()とかで指値場所に板があれど約定したりしなかったりする.

- 指値は基本的に逆張りだってこと

- 1建玉解消時,利益方向では0<x<=1であるのに対し損失方向では確実に1で処理することを背景に枚数増加や急変・遅延対策で負ける,1全成り行きで損失処理しないこと.

- 1BTCを1指値するより,0.1BTCを10指値,0.01BTCを100指値するほうがマーケットインパクトが高い可能性,市場の状態・取引所・監視botで変わるものだと思われる.高頻度の場合マーケットインパクトは低いほうがいいが他botの挙動をコントロールしうる要素.

# 弊mmbotが損失状況と定義し対策しているもの

- midpriceからask/bidどちらかがspread <= 0で対応処理,恒常的であれば特殊処理

// 0 < spread
if 0 >= spread_ask { do_something() }

- 遅配建玉管理のズレによる発注制御不能
- 板乗り/キャンセル遅延による過去指値成行交差注文
  → 通常時利益が線形であれば急変や遅延後に急回収可能.対処するより遅延に向き合ったほうが良さげ?

// x: 許容上限

// Exections による遅配検出
time_diff = exec_date.sub()
if x < time_diff { do_something() }

// response order_idから時間を抜き出し板乗りまでの時間を算出
now = now()
order_id = order()
now.sub(order_id.to_time())


# おまけ

## もうずいぶん使ってないもの

- Ticker: いる?
- Helth: bf自身が定義できてなくない?
- Collateral: 悦か鬱に浸りたいとき用
- Positions: bfはぼくらの建玉状態などどうでもいいようです

## 特殊なことをやろうとして失敗したこと

- 遅延による特殊処理(線形にできなくなるので遅延やDDしょうがなしで安定)
- websocket 切断時注文
- code: 208 注文拒否時〇〇
- 指値線形バラマキ(遅延時にハイパフォーマンスで利益も線形だったがリスクを線形にできなかったためポイ)
- 指値待ちして,MI用指値でTaker誘導(召喚士っぽくて面白かったけど技術足りなくてお勉強中)
- mmbotロット限界突破(解消せざるを得ないときにヒゲ作っちゃってごめんなさいでポイ)

## 直近過去板の仮喰い関数

現処理ではすでに過去になった板情報から待機注文を喰うので変化量を考慮にいていません.直近板増減傾向を追加したり,Executionsから成行予測枚数を自炊したり,キャンセル時間との調整などが考えられます.

物理学: 反発力, 反発係数なども参考にしてみてください.

言語: go, EatBoard()

func EatBoard((b Board, size float64) (
                            predictionBestask float64,
                            predictionBestbid float64) {
	var wg sync.WaitGroup

        // 板を喰う枚数
	eatB := math.Abs(size) // 自前キャンセル時間を目安に直近数秒の約定などで自作
	eatS := math.Abs(size) // 自前キャンセル時間を目安に直近数秒の約定などで自作
        mid := int(math.Round((b.BestAsk + b.BestBid) / 2))

	wg.Add(1) // 1. 後述2と同時実行
	go func(board []Book, mid int, eat float64) {
		// 次も同約定あると想定し,売り板を喰ってみる
		for i := range board {
			price := mid + i
			eat = eat - board[price].Size
			if eat < 0 { // 買い約定枚数が負になったらそこが想定到達地点
				predictionBestask = float64(price - 1)
				break
			}
		}
		wg.Done()
	}(b, mid, eatB)

	wg.Add(1) // 2. 上述1と同時実行
	go func(board []Book, mid int, eat float64) {
		// 次も同約定あると想定し,買い板を喰ってみる
		for i := range board {
			price := mid - i
			eat = eat - board[price].Size
			if eat < 0 { // 売り約定枚数が負になったらそこが想定到達地点
				predictionBestbid = float64(price + 1)
				break
			}
		}
		wg.Done()
	}(b, mid, eatS)

	wg.Wait() // 1.2.処理が終わるのを待つ

	return predictionBestask, predictionBestbid
}


@_numbP
BitPay for BTC: 155siLBEzhfsVPt8jz8i3hJqvCq1joNwoA

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