見出し画像

無料のTradingViewでも5つのEBBXを表示する方法


はじめに


TradingViewにお金を払っていない場合、同時に使えるインジケータは2つまでです。今回はインジケータを1つだけ使って、EBBXを5つ表示する方法を紹介します。

表示されるチャート例

今回のインジケータを1つ使うと、次のようにmain paneに1つ、sub paneに4つのEBBXを表示できます。

main paneと別のシンボルのチャートがsub paneで描かれます。そのシンボル名は画面左端に表示してあります。gは5つのEBBXで共通です。

表示を見やすくする方法

4つのシンボルのチャートをsub paneに詰め込んでいるので、表示が見にくくなることがあります。表示を調整するためのインジケータの設定として、シンボル共通のパラメータsと、各シンボルについてEBBXの±sσを表示する位置を用意してあります。

次のように重なりが多くなってしまったときには、広い範囲を詰めて表示するためにsを大きくするとよいです。

sのデフォルトは1です。sを2に設定すると2倍広い範囲が詰めて表示されるので、次のように見やすくなります。

次のような場合は、下から2番目のAUDJPYの振幅を減らしたくなります。AUDJPYの±sσを表示する位置を変えて対応するのですが、パラメータ設定画面を使わない方法を説明します。

インジケータの表示(ローソク足がお勧め)をクリックすると、次のように縦軸目盛に青のラベルが出てきます。

青のラベルから伸びた水平線が、画面左端でのEBBXの±sσです。22.000の青のラベルから伸びた水平線を21くらいまでドラッグ&ドロップすることで次のように見やすいチャートになります。

sub paneのシンボルの選ばれ方

main paneのシンボルに応じて、sub paneの4つのシンボルを切り替えるようにしてあります。必要に応じて次の部分を書き換えてください。

get_symbols() =>
    p = syminfo.prefix
    t = syminfo.ticker
    pt = p + ":" + t
    if t == "JPN225"
        [ "US30", "US100", "US500", "US2000"]
    else if t == "AMZN"
        [ ticker.modify("NVDA", session.extended),
          ticker.modify("MSFT", session.extended),
          ticker.modify("GOOGL", session.extended),
          ticker.modify("AAPL", session.extended) ]
    else if t == "1326"
        [ "TSE:1540", "TSE:1541", "TSE:1542", "TSE:1543"]
    else if pt == "OANDA:XAUUSD"
        [ "XAUUSD*USDJPY", "XAGUSD*USDJPY", "XPTUSD*USDJPY", "XPDUSD*USDJPY" ]
    else if t == "WHEATUSD"
        [ "OANDA:WHEATUSD", "OANDA:CORNUSD", "OANDA:SOYBNUSD", "OANDA:SUGARUSD" ]
    else if t == "WTICOUSD"
        [ "OANDA:BCOUSD", "OANDA:NATGASUSD", "URANIUM", "OANDA:XCUUSD" ]
    else if t == "USDJPY"
        [ "OANDA:EURJPY", "OANDA:GBPJPY", "OANDA:AUDJPY", "OANDA:NZDJPY" ] 
    else
        [ "OANDA:EURUSD", "OANDA:GBPUSD", "OANDA:AUDUSD", "OANDA:NZDUSD" ]
[sym1, sym2, sym3, sym4] = get_symbols()

sub paneの縦軸目盛への換算方法

複数のシンボルをsub paneに表示するために、シンボル価格の目盛とsub paneの縦軸目盛を管理して換算しています。o_* という変数でシンボル価格の目盛でのデータを、o_* 以外の変数でsub paneの目盛でのデータを管理しています。換算は比例部分とオフセット部分に分けて行っています。

シンボル価格の目盛での±sσであるo_plus_s_sigmaとo_minus_s_sigmaについては、chart.left_visible_bar_timeとtimeの比較するで画面左端での値を保持させています。

do_all(symbol, float level0, float level1, index) =>
    // o_* はoriginal scaleのデータ
    // o_* 以外はsub pane scaleのデータ
    [o_o, o_h, o_l, o_c] = request.security(symbol, timeframe.period, [open, high, low, close])
    [o_e0p, o_e0d, o_e1p] = dd11.ebbx(o_o, o_h, o_l, o_c, g, lic)

    var o_plus_s_sigma = 0.0
    var o_minus_s_sigma = 0.0
    o_plus_s_sigma := chart.left_visible_bar_time < time ? o_plus_s_sigma : o_e0p + o_e0d*s // 画面左端でのoriginal scaleの+sσ
    o_minus_s_sigma := chart.left_visible_bar_time < time ? o_minus_s_sigma : o_e0p - o_e0d*s // 画面左端でのoriginal scaleの-sσ

    var plus_s_sigma = math.max(level0, level1) // sub pane scaleで+sσを描く高さ
    var minus_s_sigma = math.min(level0, level1)  // sub pane scaleで-sσを描く高さ

    // original scaleからsub pane scaleに変換する
    ratio = (plus_s_sigma-minus_s_sigma) / (o_plus_s_sigma-o_minus_s_sigma)
    o = (o_o-o_minus_s_sigma)*ratio + minus_s_sigma
    h = (o_h-o_minus_s_sigma)*ratio + minus_s_sigma
    l = (o_l-o_minus_s_sigma)*ratio + minus_s_sigma
    c = (o_c-o_minus_s_sigma)*ratio + minus_s_sigma
    e0p = (o_e0p-o_minus_s_sigma)*ratio + minus_s_sigma
    e0d = o_e0d*ratio
    e1p = (o_e1p-o_minus_s_sigma)*ratio + minus_s_sigma

    var ticker = str.split(ticker.standard(symbol), ":").last()
    if chart.left_visible_bar_time < time
        var lb = label.new(bar_index+1, e0p+e0d*2, // +2σにラベルを描く
          style=label.style_label_lower_left, textcolor=black, color=dd11b.gray(70, 50), text=ticker)

    [o, h, l, c, e0p, e0d, e1p, get_col(o_e0p, o_e0d, o_e1p)]

おわりに

縦に5つのチャートを表示するのはちょっときついので、縦長画面で使ったほうがいいと思います。

1つのインジケータで5つのEBBXを表示できるので、インジケータを2つ使えばEBBXを9とか10表示できます。無料のTradingViewだと縦にチャートを配置するしかないです。よほどの好条件でなければ、縦に9つのEBBXを表示するのは見にくいと思います。

ソースを書き換えてチャートの数を減らしてもいいくらいかもしれません。

上ではソースの注目部分のみを取り上げましたが、最後にソース全体をつけておきます。使っているライブラリ dig_dig_11/lib_beta/3 は前回のこちらで貼ったものと全く同じです。

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © dig_dig_11

//@version=5
indicator("ebbxs 202409")

import dig_dig_11/lib202408/1 as dd11
import dig_dig_11/lib_beta/3 as dd11b

var g_value = input.float(0, title="​g value", minval=0, inline="g")
var g_unit = input.string("b", title="​unit", options=["b", "s", "m", "h", "D", "W", "M", "Y"], inline="g")
var g_shift = input.int(0, title="​shift", inline="g",
  tooltip="value\n"
  + "  0: テーブルで設定\n"
  + "  他: 次のunitとともに解釈\n"
  + "unit\n"
  + "  b: bars\n  s: seconds\n  m: minutes\n  h: hours\n  D: days\n  W: weeks\n  M: months\n  Y: years\n"
  + "shift\n"
  + "  規定テーブルをずらす量")

var exclude = 5 // 最初のexclude*gで、塗りつぶしをしない")

var lic = input.string("", title="​lic", display=display.none,
  tooltip="入力なしで15分足まで使えます\n"
  + "より短い足で使うには https://x.com/dig_dig_11 のプロフィールから")

var s = input.float(1, title="​s", minval=0, step=0.1, tooltip="続く8つのboxのためのsの値")

var level10 = input.price(40, title="​symbol 1 ±sσ", inline="p1", display=display.none)
var level11 = input.price(42, title="", inline="p1", display=display.none,
  tooltip="画面左端でebbxの±sσを描く高さ\n左右どちらの入力が大きくても構わない")
var level20 = input.price(30, title="​symbol 2 ±sσ", inline="p2", display=display.none)
var level21 = input.price(32, title="", inline="p2", display=display.none)
var level30 = input.price(20, title="​symbol 3 ±sσ", inline="p3", display=display.none)
var level31 = input.price(22, title="", inline="p3", display=display.none)
var level40 = input.price(10, title="​symbol 4 ±sσ", inline="p4", display=display.none)
var level41 = input.price(12, title="", inline="p4", display=display.none)

var vline_width = input.int(1, title="​vline width", display=display.none,
  tooltip="g毎に描かれる縦線の太さ")

var info_position = input.string(position.bottom_left, title="​info table position",
  options=[position.bottom_left, position.bottom_right, position.top_right], display=display.none)

// gを計算
var g = dd11b.get_g(g_value, g_unit, g_shift, min_g_in_bars=90)
var margin = dd11b.get_margin(g*timeframe.in_seconds()/60)

var black = color.rgb(0, 0, 0)
var color_band = color.rgb(200, 200, 200)

get_symbols() =>
    p = syminfo.prefix
    t = syminfo.ticker
    pt = p + ":" + t
    if t == "JPN225"
        [ "US30", "US100", "US500", "US2000"]
    else if t == "AMZN"
        [ ticker.modify("NVDA", session.extended),
          ticker.modify("MSFT", session.extended),
          ticker.modify("GOOGL", session.extended),
          ticker.modify("AAPL", session.extended) ]
    else if t == "1326"
        [ "TSE:1540", "TSE:1541", "TSE:1542", "TSE:1543"]
    else if pt == "OANDA:XAUUSD"
        [ "XAUUSD*USDJPY", "XAGUSD*USDJPY", "XPTUSD*USDJPY", "XPDUSD*USDJPY" ]
    else if t == "WHEATUSD"
        [ "OANDA:WHEATUSD", "OANDA:CORNUSD", "OANDA:SOYBNUSD", "OANDA:SUGARUSD" ]
    else if t == "WTICOUSD"
        [ "OANDA:BCOUSD", "OANDA:NATGASUSD", "URANIUM", "OANDA:XCUUSD" ]
    else if t == "USDJPY"
        [ "OANDA:EURJPY", "OANDA:GBPJPY", "OANDA:AUDJPY", "OANDA:NZDJPY" ] 
    else
        [ "OANDA:EURUSD", "OANDA:GBPUSD", "OANDA:AUDUSD", "OANDA:NZDUSD" ]

[sym1, sym2, sym3, sym4] = get_symbols()

get_col(e0p, e0d, e1p) =>
    pos = dd11b.get_ebbx_pos(e1p, e0p, e0d, margin)
    dd11b.pos2col4(pos, not_enough=bar_index<g*exclude) // 4色版

do_all(symbol, float level0, float level1, index) =>
    // o_* はoriginal scaleのデータ
    // o_* 以外はsub pane scaleのデータ
    [o_o, o_h, o_l, o_c] = request.security(symbol, timeframe.period, [open, high, low, close])
    [o_e0p, o_e0d, o_e1p] = dd11.ebbx(o_o, o_h, o_l, o_c, g, lic)

    var o_plus_s_sigma = 0.0
    var o_minus_s_sigma = 0.0
    o_plus_s_sigma := chart.left_visible_bar_time < time ? o_plus_s_sigma : o_e0p + o_e0d*s // 画面左端でのoriginal scaleの+sσ
    o_minus_s_sigma := chart.left_visible_bar_time < time ? o_minus_s_sigma : o_e0p - o_e0d*s // 画面左端でのoriginal scaleの-sσ

    var plus_s_sigma = math.max(level0, level1) // sub pane scaleで+sσを描く高さ
    var minus_s_sigma = math.min(level0, level1)  // sub pane scaleで-sσを描く高さ

    // original scaleからsub pane scaleに変換する
    ratio = (plus_s_sigma-minus_s_sigma) / (o_plus_s_sigma-o_minus_s_sigma)
    o = (o_o-o_minus_s_sigma)*ratio + minus_s_sigma
    h = (o_h-o_minus_s_sigma)*ratio + minus_s_sigma
    l = (o_l-o_minus_s_sigma)*ratio + minus_s_sigma
    c = (o_c-o_minus_s_sigma)*ratio + minus_s_sigma
    e0p = (o_e0p-o_minus_s_sigma)*ratio + minus_s_sigma
    e0d = o_e0d*ratio
    e1p = (o_e1p-o_minus_s_sigma)*ratio + minus_s_sigma

    var ticker = str.split(ticker.standard(symbol), ":").last()
    if chart.left_visible_bar_time < time
        var lb = label.new(bar_index+1, e0p+e0d*2, // +2σにラベルを描く
          style=label.style_label_lower_left, textcolor=black, color=dd11b.gray(70, 50), text=ticker)

    [o, h, l, c, e0p, e0d, e1p, get_col(o_e0p, o_e0d, o_e1p)]

// 描画0
[e0p0, e0d0, e1p0] = dd11.ebbx(open, high, low, close, g, lic)
col0 = get_col(e0p0, e0d0, e1p0)
plot(e0p0 + e0d0*2, color=color_band, force_overlay=true)
plot(e0p0 + e0d0*1, color=color_band, force_overlay=true)
plot(e0p0 - e0d0*1, color=color_band, force_overlay=true)
plot(e0p0 - e0d0*2, color=color_band, force_overlay=true)
pe0p0 = plot(e0p0, editable=false, display=display.none+display.price_scale, force_overlay=true)
pe1p0 = plot(e1p0, editable=false, display=display.none+display.price_scale, force_overlay=true)
fill(pe0p0, pe1p0, col0)
plotcandle(open, high, low, close, color=open<close ? na : black, wickcolor=black, bordercolor=black, editable=false, force_overlay=true) // main paneにもともとあるplotは最前面に表示できない

// 描画1
[o1, h1, l1, c1, e0p1, e0d1, e1p1, col1] = do_all(sym1, level10, level11, 1)
plot(e0p1 + e0d1*2, color=color_band)
plot(e0p1 + e0d1*1, color=color_band)
plot(e0p1 - e0d1*1, color=color_band)
plot(e0p1 - e0d1*2, color=color_band)
pe0p1 = plot(e0p1, editable=false, display=display.none+display.price_scale)
pe1p1 = plot(e1p1, editable=false, display=display.none+display.price_scale)
fill(pe0p1, pe1p1, col1)
plotcandle(o1, h1, l1, c1, color=o1<c1 ? na : black, wickcolor=black, bordercolor=black)

// 描画2
[o2, h2, l2, c2, e0p2, e0d2, e1p2, col2] = do_all(sym2, level20, level21, 2)
plot(e0p2 + e0d2*2, color=color_band)
plot(e0p2 + e0d2*1, color=color_band)
plot(e0p2 - e0d2*1, color=color_band)
plot(e0p2 - e0d2*2, color=color_band)
pe0p2 = plot(e0p2, editable=false, display=display.none+display.price_scale)
pe1p2 = plot(e1p2, editable=false, display=display.none+display.price_scale)
fill(pe0p2, pe1p2, col2)
plotcandle(o2, h2, l2, c2, color=o2<c2 ? na : black, wickcolor=black, bordercolor=black)

// 描画3
[o3, h3, l3, c3, e0p3, e0d3, e1p3, col3] = do_all(sym3, level30, level31, 3)
plot(e0p3 + e0d3*2, color=color_band)
plot(e0p3 + e0d3*1, color=color_band)
plot(e0p3 - e0d3*1, color=color_band)
plot(e0p3 - e0d3*2, color=color_band)
pe0p3 = plot(e0p3, editable=false, display=display.none+display.price_scale)
pe1p3 = plot(e1p3, editable=false, display=display.none+display.price_scale)
fill(pe0p3, pe1p3, col3)
plotcandle(o3, h3, l3, c3, color=o3<c3 ? na : black, wickcolor=black, bordercolor=black)

// 描画4
[o4, h4, l4, c4, e0p4, e0d4, e1p4, col4] = do_all(sym4, level40, level41, 4)
plot(e0p4 + e0d4*2, color=color_band)
plot(e0p4 + e0d4*1, color=color_band)
plot(e0p4 - e0d4*1, color=color_band)
plot(e0p4 - e0d4*2, color=color_band)
pe0p4 = plot(e0p4, editable=false, display=display.none+display.price_scale)
pe1p4 = plot(e1p4, editable=false, display=display.none+display.price_scale)
fill(pe0p4, pe1p4, col4)
plotcandle(o4, h4, l4, c4, color=o4<c4 ? na : black, wickcolor=black, bordercolor=black)

// 情報テーブル出力
if barstate.islast
    var a_str = array.from(dd11b.second2readable(g*timeframe.in_seconds()))
    var a_str_tt = array.from(str.tostring(g, "g=#.#bars ") + str.tostring(margin, "margin=#.0%"))
    var tbl = dd11b.get_table(a_str, a_str_tt, columns=2, force_overlay=true)
    tbl.cell_set_text(2, 0, text=str.tostring(e0d0/syminfo.mintick, "#"))
    for x = 1 to 2 // 0はextra spaceに使われている
        tbl.cell_set_bgcolor(x, 0, dd11b.tune_color(col0, transp=20))

// 背景色表示
c = dd11b.get_bg_color(g, vline_width=vline_width)
bgcolor(c, title="​colored session (main pane)", force_overlay=true)
bgcolor(c, title="​colored session (sub pane)")

ここから先は

0字

メンバー特典記事、メンバー限定掲示板が、他のnoteメーンバーシップと同様にあります。 このメンバ…

スタンダードプラン

¥500 / 月
初月無料

プレミアムプラン

¥1,500 / 月

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