いろいろ置いておくところ

こちらは自分が検証用に作ったものをソースコード付きで置いておくところになります。

PineScriptで書いたものの置き場はこちら。

導入サポートとかは特にありません。
DMとかいただいても対応いたしかねますのでご了承ください。



[Aggr.Trade] Delta Divergence Reversal Map(2024/05/19)

複数のCEXにおける売買圧力の転換を統合された形はなく、個別に見たいなあと思って作成したものの、あまり利用価値を見出せなかった失敗作の供養になります。

黄色で囲ってあるやつ

今回のインジケーターの中身に使ったDelta Divergence Reversalの元ネタは以下のサイトになります。

Delta DivergenceだとCVD DivergenceやExoChartsのDelta Divergenceと混同するため、この名称を見つけるまで自分はSingle Delta Divergenceって呼んでました。

買いシグナル

・現在足の安値が前の足の安値を下回っている
・前の足のVolume Deltaがマイナス(売りの出来高が多かった)
・現在足のVolume Deltaがプラス(買いの出来高が多かった)

売りシグナル

・現在足の高値が前の足の高値を上回っている
・前の足のVolume Deltaがプラス(買いの出来高が多かった)
・現在足のVolume Deltaがマイナス(売りの出来高が多かった)

元ネタとは若干条件を変えています。

各CEXのDelta Divergence Reversalを一覧表示し観察することで、Buying (Selling) Climaxからの転換を捉えようと時間軸を変えたりしながら観察を続けたのですが、あまり日常的に使えるインジケータには仕上がりませんでした。

もう少し工夫すれば使えるような気もするので、誰かが何かする際のヒントになればってことで置いておきます。


インジケーター&ソースコード

Aggrはカスタム関数を使えないため、ちょっとコードが冗長になっています。

bn_spot_high = source(high, exchange=BINANCE, type=spot)
bn_spot_low = source(low, exchange=BINANCE, type=spot)
bn_spot_vbuy = source(vbuy, exchange=BINANCE, type=spot)
bn_spot_vsell = source(vsell, exchange=BINANCE, type=spot)
cb_spot_high = source(high, exchange=COINBASE, type=spot)
cb_spot_low = source(low, exchange=COINBASE, type=spot)
cb_spot_vbuy = source(vbuy, exchange=COINBASE, type=spot)
cb_spot_vsell = source(vsell, exchange=COINBASE, type=spot)
ok_spot_high = source(high, exchange=OKEX, type=spot)
ok_spot_low = source(low, exchange=OKEX, type=spot)
ok_spot_vbuy = source(vbuy, exchange=OKEX, type=spot)
ok_spot_vsell = source(vsell, exchange=OKEX, type=spot)
by_spot_high = source(high, exchange=BYBIT, type=spot)
by_spot_low = source(low, exchange=BYBIT, type=spot)
by_spot_vbuy = source(vbuy, exchange=BYBIT, type=spot)
by_spot_vsell = source(vsell, exchange=BYBIT, type=spot)
bn_perp_high = source(high, exchange=BINANCE_FUTURES, type=perp)
bn_perp_low = source(low, exchange=BINANCE_FUTURES, type=perp)
bn_perp_vbuy = source(vbuy, exchange=BINANCE_FUTURES, type=perp)
bn_perp_vsell = source(vsell, exchange=BINANCE_FUTURES, type=perp)
dr_perp_high = source(high, exchange=DERIBIT, type=perp)
dr_perp_low = source(low, exchange=DERIBIT, type=perp)
dr_perp_vbuy = source(vbuy, exchange=DERIBIT, type=perp)
dr_perp_vsell = source(vsell, exchange=DERIBIT, type=perp)


bn_spot_high_change = bn_spot_high - bn_spot_high[1]
bn_spot_low_change = bn_spot_low - bn_spot_low[1]
bn_spot_vd = bn_spot_vbuy - bn_spot_vsell
cb_spot_high_change = cb_spot_high - cb_spot_high[1]
cb_spot_low_change = cb_spot_low - cb_spot_low[1]
cb_spot_vd = cb_spot_vbuy - cb_spot_vsell
ok_spot_high_change = ok_spot_high - ok_spot_high[1]
ok_spot_low_change = ok_spot_low - ok_spot_low[1]
ok_spot_vd = ok_spot_vbuy - ok_spot_vsell
by_spot_high_change = by_spot_high - by_spot_high[1]
by_spot_low_change = by_spot_low - by_spot_low[1]
by_spot_vd = by_spot_vbuy - by_spot_vsell
bn_perp_high_change = bn_perp_high - bn_perp_high[1]
bn_perp_low_change = bn_perp_low - bn_perp_low[1]
bn_perp_vd = bn_perp_vbuy - bn_perp_vsell
dr_perp_high_change = dr_perp_high - dr_perp_high[1]
dr_perp_low_change = dr_perp_low - dr_perp_low[1]
dr_perp_vd = dr_perp_vbuy - dr_perp_vsell


plothistogram({ time: time, value: 6, color: bn_spot_low_change < 0 && bn_spot_vd > 0 && bn_spot_vd[1] <= 0 ? options.PositiveColor : bn_spot_high_change > 0 && bn_spot_vd < 0 && bn_spot_vd[1] >= 0 ? options.NegativeColor : options.color}, title="BN DDR")
plothistogram({ time: time, value: 5, color: cb_spot_low_change < 0 && cb_spot_vd > 0 && cb_spot_vd[1] <= 0 ? options.PositiveColor : cb_spot_high_change > 0 && cb_spot_vd < 0 && cb_spot_vd[1] >= 0 ? options.NegativeColor : options.color}, title="CB")
plothistogram({ time: time, value: 4, color: ok_spot_low_change < 0 && ok_spot_vd > 0 && ok_spot_vd[1] <= 0 ? options.PositiveColor : ok_spot_high_change > 0 && ok_spot_vd < 0 && ok_spot_vd[1] >= 0 ? options.NegativeColor : options.color}, title="OK")
plothistogram({ time: time, value: 3, color: by_spot_low_change < 0 && by_spot_vd > 0 && by_spot_vd[1] <= 0 ? options.PositiveColor : by_spot_high_change > 0 && by_spot_vd < 0 && by_spot_vd[1] >= 0 ? options.NegativeColor : options.color}, title="BY")
plothistogram({ time: time, value: 2, color: bn_perp_low_change < 0 && bn_perp_vd > 0 && bn_perp_vd[1] <= 0 ? options.PositiveColor : bn_perp_high_change > 0 && bn_perp_vd < 0 && bn_perp_vd[1] >= 0 ? options.NegativeColor : options.color}, title="BN.P")
plothistogram({ time: time, value: 1, color: dr_perp_low_change < 0 && dr_perp_vd > 0 && dr_perp_vd[1] <= 0 ? options.PositiveColor : dr_perp_high_change > 0 && dr_perp_vd < 0 && dr_perp_vd[1] >= 0 ? options.NegativeColor : options.color}, title="DR.P")



[Aggr.Trade] source関数を使った汎用CVDテンプレート(2023/09/22)

Aggr.Trade(以下Aggr)に最近追加されたsource関数が便利だからみんな使おうぜ!ってことで、試作した汎用CVDテンプレートを置いておきます。

既存の有名なテンプレートもsource関数で書き直すと便利なので、先にちょっとだけsource関数の使い方を解説します。


Aggrは予めチャートに読み込むシンボル(Sources)を指定しておき、Sourcesをもとに価格やインジケーターを描画します。

Sourcesで検索する取引所の指定
Sourcesで読みこむシンボルを指定

これまでSpotとPerpsを分けたインジケーターを作成したい場合、SpotならすべてのSpotのシンボルを直接指定してやる必要がありました。
取引所を指定してやる場合も同様です。

これがsource関数の登場によって、一括でSpotを指定したり、取引所を指定したりできるようになりました。

とはいえ、言葉だけだと分かりにくいので具体例を示します。


例えばAggrで買いの出来高を取得する場合は、

vbuy

と記述しますが、この場合はSourcesの読み込まれたシンボルすべての買いの出来高の合算となります。


従来の書き方でSpotだけの買いの出来高を取得してみます。

_vbuy=(KUCOIN:BTC-USDT.vbuy+BITFINEX:BTCUSD.vbuy+BITSTAMP:btcusd.vbuy+KRAKEN:XBT/USD.vbuy+BINANCE:btcusdt.vbuy+BITFINEX:BTCUST.vbuy+HUOBI:btcusdt.vbuy+KRAKEN:XBT/USDT.vbuy+OKEX:BTC-USDT.vbuy+COINBASE:BTC-USD.vbuy+COINBASE:BTC-USDT.vbuy+BINANCE:btcbusd.vbuy)

Spotに属するシンボルすべてを手作業で追加してやらなければなりません。大変ですね。


次にsource関数を使って、Spotだけの買いの出来高を取得してみます。

_vbuy = source(vbuy, type=spot)

source関数のtypeを指定してやるだけで終わりです。簡単ですね。


ここから更にBinanceのSpotだけの買いの出来高を取得してみましょう。

_vbuy = source(vbuy, exchange=BINANCE, type=spot)

exchangeを追加で指定してやるだけです。

_vbuy = source(vbuy, exchange=BINANCE_FUTURES, type=perp)

Perpsはこのような感じです。
取引所名はSourcesにある取引所名を指定してやってください。SpotとPerpsで名前が分かれてるのはBinanceだけですが。


では、SpotのAggregated CVDインジケーターを従来の書き方とsource関数を使った書き方で比較してみましょう。

_vbuy=(KUCOIN:BTC-USDT.vbuy+BITFINEX:BTCUSD.vbuy+BITSTAMP:btcusd.vbuy+KRAKEN:XBT/USD.vbuy+BINANCE:btcusdt.vbuy+BITFINEX:BTCUST.vbuy+HUOBI:btcusdt.vbuy+KRAKEN:XBT/USDT.vbuy+OKEX:BTC-USDT.vbuy+COINBASE:BTC-USD.vbuy+COINBASE:BTC-USDT.vbuy+BINANCE:btcbusd.vbuy)
_vsell=(KUCOIN:BTC-USDT.vsell+BITFINEX:BTCUSD.vsell+BITSTAMP:btcusd.vsell+KRAKEN:XBT/USD.vsell+BINANCE:btcusdt.vsell+BITFINEX:BTCUST.vsell+HUOBI:btcusdt.vsell+KRAKEN:XBT/USDT.vsell+OKEX:BTC-USDT.vsell+COINBASE:BTC-USD.vsell+COINBASE:BTC-USDT.vsell+BINANCE:btcbusd.vsell)

line(cum(_vbuy-_vsell), title="AGGR.S CVD")
_vbuy = source(vbuy, type=spot)
_vsell = source(vsell, type=spot)

line(cum(_vbuy-_vsell), title="AGGR.S CVD")

これの何が便利かというと、例えばBTCからETHにテンプレートを流用したい場合、これまでは「KUCOIN:BTC-USDT.vbuy」を「KUCOIN:ETH-USDT.vbuy」といった具合に全てのインジケーターの全てのシンボルを手作業で書き換えてやる必要がありました。

source関数を使うとSourcesで読み込むシンボルを入れ替えてやるだけで、テンプレートは書き換えなくて済むわけです。


あとはこれを応用していくだけです。
いまお使いのテンプレートをsource関数仕様に改造してやるのもいいですし、ぼくのかんがえたさいきょうのテンプレートを作ってみるのもいいと思います。

たたき台としてsource関数のみで作ったCVDテンプレートを以下に貼り付けておきます。


テンプレート

テンプレートをアップロードする方法は以下の画像を見ていただければ分かると思います。

テンプレートのアップロード方法

インジケーターをカスタマイズしたり、設定を変えたりする場合は以下の通りです。

インジケーターのカスタマイズ画面

Wikiを見れば分かるような質問は遠慮していただきたいですが、テンプレート作成中にお困りごとなどあればDMください。
気づいたとき&仕事で疲れてない日に返信させていただきます。


参考: Aggr.TradeのWiki
https://github.com/Tucsky/aggr/wiki/introduction-to-scripting



[TradingLite] Net Longs & Net Shorts(2023/09/13)

ExoChartsのNet LongsとNet Shortsの計算おかしくね?ってことで検証用に作ったTradingLite版のNL&NSインジケーター。

TradingLite - Bybit

TradingLiteなら誰か作ってるでしょーと思って検索してみたものの、誰でも使えるやつはなさそうでしたので、検証用に簡易的なものを作りました。


Net LongsとNet Shortsって何?って方は以下のページをご覧ください。

https://help.exocharts.com/hc/en-us/articles/4408306460689-Main-settings

上のページから重要な部分を抜き出したのが以下。


計算がおかしいとされてるのは、価格が上昇しているにもかかわらず、Net Longsが下降し、Net Shortsが増加している赤枠で囲った部分です。

Exocharts - Binance
Exocharts - Bybit
TradingLite - Binance

なぜかBinanceの赤枠期間だけ、Net LongsとNet Shortsの数値が逆転しているように見受けられます。
このバグり方を見た瞬間に「めんどくさっ」ってなったのと、原因が特定できなかったため、開発にバグレポートは出していません。

赤枠以降は正常化してるように見えるの意味不明ですが、今後バグらないようであれば放っておいてもいいんじゃないでしょうか。
バグが再発した時点で、ExochartsのDiscord内にあるバグレポート用のチャンネルに報告しておけばいいと思います。


前置きが長くなりましたが、以下がTradingLite用のLitScriptコードになります。
デフォルトはプライベートになってますが、間違ってパブリックを選んで保存すると全世界に公開されますので注意してください。


LitScript

//@version=1
study("Net Longs")

var oiChange = oi_close - oi_open
var priceChange = close - open

seq upLong = oiChange > 0 && priceChange > 0 ? oiChange : 0
seq downLong = oiChange < 0 && priceChange < 0 ? oiChange : 0

seq netLong = upLong + downLong
seq netLongs = cum(netLong)

var o = netLongs[1]
var h = netLongs[0] >= netLongs[1] ? netLongs[0] : netLongs[1]
var l = netLongs[0] <= netLongs[1] ? netLongs[0] : netLongs[1]
var c = netLongs[0]

plotcandle(o, h, l, c)
//@version=1
study("Net Shorts")

var oiChange = oi_close - oi_open
var priceChange = close - open

seq upShort = oiChange > 0 && priceChange < 0 ? oiChange : 0
seq downShort = oiChange < 0 && priceChange > 0 ? oiChange : 0

seq netShort = upShort + downShort
seq netShorts = cum(netShort)

var o = netShorts[1]
var h = netShorts[0] >= netShorts[1] ? netShorts[0] : netShorts[1]
var l = netShorts[0] <= netShorts[1] ? netShorts[0] : netShorts[1]
var c = netShorts[0]

plotcandle(o, h, l, c)


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