Accumulation Bid & Ask Ratio [TradingLite Indicator]
TradingLite用のAccumulation Bid & Ask Ratioというインジケーターを作りました。
オーダーブックの買い板(需要)と売り板(供給)の不均衡による強弱を深度別に累積して表示するインジケーターです。
「Bid & Ask Ratio Strength」がシグナル形式のシステムトレード寄りのインジケーターなのに対し、こちらは指定した深度毎の需給の変化を追跡する裁量トレード寄りのインジケーターとなります。
内部ロジック的には「Bid & Ask Ratio Strength」とほぼ同じなので、ロジック説明は以下のnoteをご覧ください。
インジケーターの導入方法
このインジケーターでは板情報を扱っているため、GOLDプランが推奨条件となります。
チャート画面上部の「INDICATORS」をクリック
「Community Indicators」をクリック
「Accumulation Bid & Ask Ratio」というインジケーターを探して選択
「+ Add to Chart」をクリックしてチャートにインジケーターを追加
設定値の説明
インジケーターの「Settings」アイコンをクリックすると設定画面が開きます。
Depth
集計するオーダーブックの範囲を指定します。
画像ではそれぞれBest BidまたはBest Askから上下に
Depth1: 0 % ~ 1.0 %
Depth2: 1.0 % ~ 2.5 %
Depth3: 2.5 % ~ 5.0 %
で範囲指定しています。
チェックボックスを外すと指定した範囲のデータは非表示となります。
Multiply Orderbook
「Multiply orderbook size to histogram」にチェックを入れると、Ratioの計算に使用したオーダーブックのサイズをRatioに乗算します。
チェックなしの状態だと計算に使用した板のサイズに関係なくRatioが算出されるため、流動性のない場所とある場所での評価に差がつきません。
下の画像では急騰からの急落時に強い供給(買い圧)があるように見えます。
ここに板のサイズを乗算すると、直前の供給(売り圧)ほど需要(買い圧)が強くないと判明します。
デフォルトはチェックなしの状態ですので、お好みに併せてご利用ください。
Depth Colors
Depth毎の表示色を指定します。
使用例
BinanceのBTCUSDT無期限先物を例に見ていきましょう。
年末且つFUDで資金が抜かれている低流動性状況下での確認となります。
まずはインジケーター単体で見てみます。
需給の推移を眺めていると、Depth1のBest BidとBest Askから±1%の範囲で不均衡が強くなってくると価格が反転する傾向があるように見えます。
値動きに影響を及ぼしていると思われる傾向は、時期によって主導する取引所やオーダーブックの深度も変わってくるため、都度最適な設定を見つけて自分の得意とする手法と組み合わせるのが良さそうです。
次は清算と組み合わせてみます。
①は大きなロング清算が出ていますが、需給が拮抗した状態なので、買うのは待った方が良さそうです。
②のロング清算時はDepth1の需要(買い圧)が増加傾向で、Depth2は供給(売り圧)がちょっとだけ残っています。
面でポジションを構築していく方は、このあたりからリバ取りを始めても良いかもしれません。(※要過去検証)③のロング清算時はDepth1、2ともに需要に転じたので、このあたりは背を決めてリバ取りしても良さそうです。
こんな感じで清算時の需給を見ながら逆張りすると勝率が上がるかもしれないので、ぜひ検証してみてください。
あとは「Volume Bubbles」などのツッコミを検知できる指標と組み合わせたり。
売りツッコミで需要(買い圧)が強い+OIが増加している状況であれば、指値による吸収が起こっていると判断して逆張りする等が考えられます。
色々やり方はあると思いますが、自分はポジションを構築する際に需給を背にすることで勝率を上げるという使い方をしています。
面白い使い方や聖杯があればコッソリ教えてください!
LitScript(2023/11/21追記)
もうすぐTradingLiteのサブスクが期限切れとなるためコードを公開しておきます。
//@version=1
study("Accumulation Bid & Ask Ratio")
const showD1 = input("Show Depth1 [0~Depth1 %]", true)
const depth1 = input("Depth1(%)", 1.5, minval=0, maxval=100, step=0.1)
const showD2 = input("Show Depth2 [Depth1~Depth2 %]", true)
const depth2 = input("Depth2(%)", 3, minval=0, maxval=100, step=0.1)
const showD3 = input("Show Depth3 [Depth2~Depth3 %]", true)
const depth3 = input("Depth3(%)", 5, minval=0, maxval=100, step=0.1)
header("Multiply Orderbook")
const orderbookSize = input("Multiply orderbook size to histogram", false)
header("Depth Colors")
const plusColorD1 = input("D1 Plus", #81c784)
const plusColorD2 = input("D2 Plus", #4caf50)
const plusColorD3 = input("D3 Plus", #1b5e20)
const minusColorD1 = input("D1 Minus", #f77c80)
const minusColorD2 = input("D2 Minus", #f23645)
const minusColorD3 = input("D3 Minus", #801922)
var bestBid = bid_spread(0)
var bestAsk = ask_spread(0)
var bids1 = showD1 ? bid_sum(close - bestBid * (depth1 / 100), bestBid - bestBid * (0 / 100)) : 0
var asks1 = showD1 ? ask_sum(bestAsk + bestAsk * (0 / 100), close + bestAsk * (depth1 / 100)) : 0
var bids2 = showD2 ? bid_sum(close - bestBid * (depth2 / 100), bestBid - bestBid * (depth1 / 100)) : 0
var asks2 = showD2 ? ask_sum(bestAsk + bestAsk * (depth1 / 100), close + bestAsk * (depth2 / 100)) : 0
var bids3 = showD3 ? bid_sum(close - bestBid * (depth3 / 100), bestBid - bestBid * (depth2 / 100)) : 0
var asks3 = showD3 ? ask_sum(bestAsk + bestAsk * (depth2 / 100), close + bestAsk * (depth3 / 100)) : 0
var total1 = bids1 + asks1
var total2 = bids2 + asks2
var total3 = bids3 + asks3
var ratio1 = (bids1 - asks1) / (total1)
var ratio2 = (bids2 - asks2) / (total2)
var ratio3 = (bids3 - asks3) / (total3)
var plusRatio1 = ratio1 >= 0 ? ratio1 : 0
var minusRatio1 = ratio1 < 0 ? ratio1 : 0
var plusRatio2 = ratio2 >= 0 ? ratio2 : 0
var minusRatio2 = ratio2 < 0 ? ratio2 : 0
var plusRatio3 = ratio3 >= 0 ? ratio3 : 0
var minusRatio3 = ratio3 < 0 ? ratio3 : 0
plusRatio1 = orderbookSize ? plusRatio1 * total1 : plusRatio1
minusRatio1 = orderbookSize ? minusRatio1 * total1 : minusRatio1
plusRatio2 = orderbookSize ? plusRatio2 * total2 : plusRatio2
minusRatio2 = orderbookSize ? minusRatio2 * total2 : minusRatio2
plusRatio3 = orderbookSize ? plusRatio3 * total3 : plusRatio3
minusRatio3 = orderbookSize ? minusRatio3 * total3 : minusRatio3
histogram(plusRatio1 + plusRatio2 + plusRatio3, color=plusColorD3)
histogram(minusRatio1 + minusRatio2 + minusRatio3, color=minusColorD3)
histogram(plusRatio1 + plusRatio2, color=plusColorD2)
histogram(minusRatio1 + minusRatio2, color=minusColorD2)
histogram(plusRatio1, color=plusColorD1)
histogram(minusRatio1, color=minusColorD1)