這是一個根據前一個期間的最高價、最低價及中線,在當前期間繪製出方框的指標。
您可以配合方框的範圍,繪製各種不同的線條。
為了防止顯示錯誤,我將「過去期間」與「當前期間」的版本分開製作。
顯示過去歷史紀錄的是 "Hist",僅顯示最新一筆資料的是 "Current"。
您可以調整方框顯示的左右偏移,若因不同的交易標的而產生位置偏移時,請使用此功能。即使調整了左右偏移,顯示線條的計算結果依然相同。
⇩ 上方為 "Hist",下方為 "Current"
您可以配合方框的範圍,繪製各種不同的線條。
為了防止顯示錯誤,我將「過去期間」與「當前期間」的版本分開製作。
顯示過去歷史紀錄的是 "Hist",僅顯示最新一筆資料的是 "Current"。
您可以調整方框顯示的左右偏移,若因不同的交易標的而產生位置偏移時,請使用此功能。即使調整了左右偏移,顯示線條的計算結果依然相同。
來源: TradingView
⇩ 上方為 "Hist",下方為 "Current"
[NOTICE & LICENSE]
・僅供學習與提供資訊之用,不構成投資建議。對於因使用本工具而產生之任何經濟損失,概不負責。
・已於 Pine Script v6 測試運作。以「現狀 (As-is)」提供,不保證因未來 TradingView 系統規格變更而進行更新,亦不接受個別的安裝支援或修改請求。
・適用 MIT 授權條款。
// SPDX-FileCopyrightText: 2026 NK-report https://www.nk-report.com/
// SPDX-License-Identifier: MIT
//
// Disclaimer: This script is for educational purposes only and does not constitute investment advice.
//@version=6
indicator("NK-box (History)", shorttitle="NK-box (Hist)", overlay=true, max_boxes_count=500, max_lines_count=500)
// ==============================================================================
// 【01】 免責・ライセンス
// ==============================================================================
//
// 本指標免費公開: https://www.nk-report.com/p/tw-tradingview.html
//
// 免責聲明:本腳本僅供學習與資訊參考之用,不構成任何投資建議。
//
// 1. 本程式碼截至 2026 年,已在 Pine Script v6 環境下完成運作測試。
// 日後若因規格變動而導致任何異常,恕不提供個別的技術支援或修改服務。
// 2. 本腳本係基於一般的計算邏輯,並透過 LLM 獨立編寫而成。
// 本程式碼採用 MIT 授權條款 (MIT License) 進行發布。
// ------------------------------------------------------------------------------
// MIT License
//
// Copyright 2026 NK-report https://www.nk-report.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
// of the Software, and to permit persons to whom the Software is furnished to do
// so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// ==============================================================================
// 【02】 UI設定と言語
// ==============================================================================
// 1. 言語辞書の定義(テキストの定数化)
// ※外国語版を作成する際は、このブロックの「右辺のテキスト」のみを翻訳してください
const string GRP_GENERAL = "▼ 基本設定"
const string GRP_OFFSET = "▼ 繪圖位置微調 (偏移)"
const string GRP_BOX_FRAME = "▼ 區間框設定 (高點・低點)"
const string GRP_BOX_BG = "▼ 區間背景設定"
const string GRP_MID = "▼ 中線設定"
const string GRP_ANL = "▼ 分析線設定 (計算前一週期的數據)"
const string GRP_ZONE = "▼ 中線背景區域"
const string LBL_TF = "基準週期"
const string TT_TF = "※請指定大於或等於當前圖表時間級別的週期。\n(例:在日線圖上指定「1週」或「1個月」)"
const string OPT_TF_D = "1天"
const string OPT_TF_W = "1週"
const string OPT_TF_1M = "1個月"
const string OPT_TF_3M = "3個月"
const string OPT_TF_12M = "12個月"
const string LBL_OFS_L = "左端偏移調整 (K線數)"
const string LBL_OFS_R = "右端偏移調整 (K線數)"
const string TT_OFS = "負值向左移動,正值向右移動。"
const string LBL_FRAME = "高低點外框"
const string LBL_BG = "區間背景"
const string LBL_MID = "中線"
const string LBL_OPEN = "開盤價"
const string LBL_CLOSE = "收盤價"
const string LBL_WCL = "加權收盤價"
const string LBL_PIVOT = "樞軸點 (Pivot)"
const string LBL_MEDIAN = "實體中位數"
const string LBL_TWAP = "TWAP"
const string OPT_STY_S = "實線"
const string OPT_STY_D = "虛線"
const string OPT_STY_DT = "點線"
const string LBL_DATA_H = "最高價"
const string LBL_DATA_L = "最低價"
// 2. UI(ユーザー入力画面)の構築
// ※言語辞書で定義した定数を呼び出してUIを構築します
i_tf_str = input.string(OPT_TF_1M, title=LBL_TF, options=[OPT_TF_D, OPT_TF_W, OPT_TF_1M, OPT_TF_3M, OPT_TF_12M], group=GRP_GENERAL, tooltip=TT_TF)
i_offset_left = input.int(-1, title=LBL_OFS_L, group=GRP_OFFSET, tooltip=TT_OFS)
i_offset_right = input.int(0, title=LBL_OFS_R, group=GRP_OFFSET, tooltip=TT_OFS)
// ボックス枠
i_show_frame = input.bool(true, title=LBL_FRAME, group=GRP_BOX_FRAME, inline="frame")
i_col_frame = input.color(color.black, title="", group=GRP_BOX_FRAME, inline="frame")
i_wid_frame = input.int(2, title="", minval=1, maxval=5, group=GRP_BOX_FRAME, inline="frame")
i_sty_frame = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_BOX_FRAME, inline="frame")
// ボックス背景
i_show_bg = input.bool(false, title=LBL_BG, group=GRP_BOX_BG, inline="bg")
i_col_bg = input.color(color.new(color.teal, 90), title="", group=GRP_BOX_BG, inline="bg")
// ミッドライン
i_show_mid = input.bool(true, title=LBL_MID, group=GRP_MID, inline="mid")
i_col_mid = input.color(color.black, title="", group=GRP_MID, inline="mid")
i_wid_mid = input.int(2, title="", minval=1, maxval=5, group=GRP_MID, inline="mid")
i_sty_mid = input.string(OPT_STY_DT, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_MID, inline="mid")
// 分析ライン
i_show_open = input.bool(false, title=LBL_OPEN, group=GRP_ANL, inline="l1")
i_col_open = input.color(color.yellow, title="", group=GRP_ANL, inline="l1")
i_wid_open = input.int(2, title="", minval=1, maxval=5, group=GRP_ANL, inline="l1")
i_sty_open = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_ANL, inline="l1")
i_show_close = input.bool(false, title=LBL_CLOSE, group=GRP_ANL, inline="l2")
i_col_close = input.color(color.purple, title="", group=GRP_ANL, inline="l2")
i_wid_close = input.int(2, title="", minval=1, maxval=5, group=GRP_ANL, inline="l2")
i_sty_close = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_ANL, inline="l2")
i_show_wcl = input.bool(false, title=LBL_WCL, group=GRP_ANL, inline="l3")
i_col_wcl = input.color(color.red, title="", group=GRP_ANL, inline="l3")
i_wid_wcl = input.int(2, title="", minval=1, maxval=5, group=GRP_ANL, inline="l3")
i_sty_wcl = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_ANL, inline="l3")
i_show_piv = input.bool(false, title=LBL_PIVOT, group=GRP_ANL, inline="l4")
i_col_piv = input.color(color.blue, title="", group=GRP_ANL, inline="l4")
i_wid_piv = input.int(2, title="", minval=1, maxval=5, group=GRP_ANL, inline="l4")
i_sty_piv = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_ANL, inline="l4")
i_show_med = input.bool(false, title=LBL_MEDIAN, group=GRP_ANL, inline="l5")
i_col_med = input.color(color.green, title="", group=GRP_ANL, inline="l5")
i_wid_med = input.int(2, title="", minval=1, maxval=5, group=GRP_ANL, inline="l5")
i_sty_med = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_ANL, inline="l5")
i_show_twap = input.bool(false, title=LBL_TWAP, group=GRP_ANL, inline="l6")
i_col_twap = input.color(color.orange, title="", group=GRP_ANL, inline="l6")
i_wid_twap = input.int(2, title="", minval=1, maxval=5, group=GRP_ANL, inline="l6")
i_sty_twap = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_ANL, inline="l6")
// 背景塗りつぶし
i_fill_open = input.bool(false, title=LBL_OPEN, group=GRP_ZONE, inline="z1")
c_fill_open = input.color(color.new(color.yellow, 90), title="", group=GRP_ZONE, inline="z1")
i_fill_close = input.bool(false, title=LBL_CLOSE, group=GRP_ZONE, inline="z1")
c_fill_close = input.color(color.new(color.purple, 90), title="", group=GRP_ZONE, inline="z1")
i_fill_wcl = input.bool(false, title=LBL_WCL, group=GRP_ZONE, inline="z2")
c_fill_wcl = input.color(color.new(color.red, 90), title="", group=GRP_ZONE, inline="z2")
i_fill_piv = input.bool(false, title=LBL_PIVOT, group=GRP_ZONE, inline="z2")
c_fill_piv = input.color(color.new(color.blue, 90), title="", group=GRP_ZONE, inline="z2")
i_fill_med = input.bool(false, title=LBL_MEDIAN, group=GRP_ZONE, inline="z3")
c_fill_med = input.color(color.new(color.green, 90), title="", group=GRP_ZONE, inline="z3")
i_fill_twap = input.bool(false, title=LBL_TWAP, group=GRP_ZONE, inline="z4")
c_fill_twap = input.color(color.new(color.orange, 90), title="", group=GRP_ZONE, inline="z4")
// ==============================================================================
// 【03】 全コード共通仕様(時間・インフラ処理)
// ==============================================================================
// UIで選択された定数をPine内部のシステム識別子に変換
string req_tf = switch i_tf_str
OPT_TF_D => "1D"
OPT_TF_W => "1W"
OPT_TF_1M => "1M"
OPT_TF_3M => "3M"
OPT_TF_12M => "12M"
// ==============================================================================
// 【04】 各カテゴリ共通仕様 (描画インフラと判定ロジック)
// ==============================================================================
bool is_new_period = timeframe.change(req_tf) or barstate.isfirst
f_get_style(sty_str) =>
sty_str == OPT_STY_S ? line.style_solid : sty_str == OPT_STY_D ? line.style_dashed : line.style_dotted
// ==============================================================================
// 【05】 このコード固有の計算仕様 (Specific Indicator Logic)
// ==============================================================================
var float curr_o = na
var float curr_h = na
var float curr_l = na
var float prev_o = na
var float prev_h = na
var float prev_l = na
var float prev_c = na
var int start_bar = na
// --- 描画エンジンへ引き渡すためのスナップショット変数(MVC分離用) ---
bool do_draw = false
int draw_start = na
int draw_end = na
float draw_o = na
float draw_h = na
float draw_l = na
float draw_c = na
if is_new_period
// ① 描画キューの生成:計算用の変数が新しい期間のもので上書きされる前に、描画用の確定値を退避させます。
if not na(prev_o) and not na(start_bar)
do_draw := true
draw_start := math.max(0, start_bar + i_offset_left)
draw_end := math.max(0, bar_index[1] + i_offset_right)
draw_o := prev_o
draw_h := prev_h
draw_l := prev_l
draw_c := prev_c
// ② 次の期間へのバケツリレー
prev_o := curr_o
prev_h := curr_h
prev_l := curr_l
prev_c := close[1]
curr_o := open
curr_h := high
curr_l := low
start_bar := bar_index
else
curr_h := math.max(curr_h, high)
curr_l := math.min(curr_l, low)
// ==============================================================================
// 【06】 描画と出力 (Rendering & Outputs)
// ==============================================================================
// 1. チャートへの視覚的出力(スタンプ描画)
if do_draw
// 【05】で退避したスナップショットを用いて純粋な計算を行います
float val_mid = (draw_h + draw_l) / 2.0
float val_wcl = (draw_h + draw_l + draw_c * 2.0) / 4.0
float val_piv = (draw_h + draw_l + draw_c) / 3.0
float val_med = (draw_o + draw_c) / 2.0
float val_twap = (draw_o + draw_h + draw_l + draw_c) / 4.0
if i_show_frame or i_show_bg
box.new(draw_start, draw_h, draw_end, draw_l, border_color=i_show_frame ? i_col_frame : na, border_width=i_wid_frame, border_style=f_get_style(i_sty_frame), bgcolor=i_show_bg ? i_col_bg : na)
bool need_mid = i_show_mid or i_fill_open or i_fill_close or i_fill_wcl or i_fill_piv or i_fill_med or i_fill_twap
line l_mid = need_mid ? line.new(draw_start, val_mid, draw_end, val_mid, color=i_show_mid ? i_col_mid : na, width=i_wid_mid, style=f_get_style(i_sty_mid)) : na
if i_show_open or i_fill_open
line l_open = line.new(draw_start, draw_o, draw_end, draw_o, color=i_show_open ? i_col_open : na, width=i_wid_open, style=f_get_style(i_sty_open))
if i_fill_open and not na(l_mid)
linefill.new(l_mid, l_open, c_fill_open)
if i_show_close or i_fill_close
line l_close = line.new(draw_start, draw_c, draw_end, draw_c, color=i_show_close ? i_col_close : na, width=i_wid_close, style=f_get_style(i_sty_close))
if i_fill_close and not na(l_mid)
linefill.new(l_mid, l_close, c_fill_close)
if i_show_wcl or i_fill_wcl
line l_wcl = line.new(draw_start, val_wcl, draw_end, val_wcl, color=i_show_wcl ? i_col_wcl : na, width=i_wid_wcl, style=f_get_style(i_sty_wcl))
if i_fill_wcl and not na(l_mid)
linefill.new(l_mid, l_wcl, c_fill_wcl)
if i_show_piv or i_fill_piv
line l_piv = line.new(draw_start, val_piv, draw_end, val_piv, color=i_show_piv ? i_col_piv : na, width=i_wid_piv, style=f_get_style(i_sty_piv))
if i_fill_piv and not na(l_mid)
linefill.new(l_mid, l_piv, c_fill_piv)
if i_show_med or i_fill_med
line l_med = line.new(draw_start, val_med, draw_end, val_med, color=i_show_med ? i_col_med : na, width=i_wid_med, style=f_get_style(i_sty_med))
if i_fill_med and not na(l_mid)
linefill.new(l_mid, l_med, c_fill_med)
if i_show_twap or i_fill_twap
line l_twap = line.new(draw_start, val_twap, draw_end, val_twap, color=i_show_twap ? i_col_twap : na, width=i_wid_twap, style=f_get_style(i_sty_twap))
if i_fill_twap and not na(l_mid)
linefill.new(l_mid, l_twap, c_fill_twap)
// 2. データウィンドウへの出力 (辞書定数を参照)
float out_mid = (prev_h + prev_l) / 2.0
float out_wcl = (prev_h + prev_l + prev_c * 2.0) / 4.0
float out_piv = (prev_h + prev_l + prev_c) / 3.0
float out_med = (prev_o + prev_c) / 2.0
float out_twap = (prev_o + prev_h + prev_l + prev_c) / 4.0
plot(prev_h, title=LBL_DATA_H, color=i_col_frame, display=display.data_window, editable=false)
plot(prev_l, title=LBL_DATA_L, color=i_col_frame, display=display.data_window, editable=false)
plot(out_mid, title=LBL_MID, color=i_col_mid, display=display.data_window, editable=false)
plot(prev_o, title=LBL_OPEN, color=i_col_open, display=display.data_window, editable=false)
plot(prev_c, title=LBL_CLOSE, color=i_col_close, display=display.data_window, editable=false)
plot(out_wcl, title=LBL_WCL, color=i_col_wcl, display=display.data_window, editable=false)
plot(out_piv, title=LBL_PIVOT, color=i_col_piv, display=display.data_window, editable=false)
plot(out_med, title=LBL_MEDIAN, color=i_col_med, display=display.data_window, editable=false)
plot(out_twap, title=LBL_TWAP, color=i_col_twap, display=display.data_window, editable=false)
// SPDX-FileCopyrightText: 2026 NK-report https://www.nk-report.com/
// SPDX-License-Identifier: MIT
//
// Disclaimer: This script is for educational purposes only and does not constitute investment advice.
//@version=6
indicator("NK-box (Current)", shorttitle="NK-box (Curr)", overlay=true)
// ==============================================================================
// 【01】 免責・ライセンス
// ==============================================================================
//
// 本指標免費公開: https://www.nk-report.com/p/tw-tradingview.html
//
// 免責聲明:本腳本僅供學習與資訊參考之用,不構成任何投資建議。
//
// 1. 本程式碼截至 2026 年,已在 Pine Script v6 環境下完成運作測試。
// 日後若因規格變動而導致任何異常,恕不提供個別的技術支援或修改服務。
// 2. 本腳本係基於一般的計算邏輯,並透過 LLM 獨立編寫而成。
// 本程式碼採用 MIT 授權條款 (MIT License) 進行發布。
// ------------------------------------------------------------------------------
// MIT License
//
// Copyright 2026 NK-report https://www.nk-report.com/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
// of the Software, and to permit persons to whom the Software is furnished to do
// so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// ==============================================================================
// 【02】 UI設定と言語
// ==============================================================================
// 1. 言語辞書の定義(テキストの定数化)
// ※外国語版を作成する際は、このブロックの「右辺のテキスト」のみを翻訳してください
const string GRP_GENERAL = "▼ 基本設定"
const string GRP_OFFSET = "▼ 繪圖位置微調 (偏移)"
const string GRP_BOX_FRAME = "▼ 區間框設定 (高點・低點)"
const string GRP_BOX_BG = "▼ 區間背景設定"
const string GRP_MID = "▼ 中線設定"
const string GRP_ANL = "▼ 分析線設定 (計算前一週期的數據)"
const string GRP_ZONE = "▼ 中線背景區域"
const string LBL_TF = "基準週期"
const string TT_TF = "※請指定大於或等於當前圖表時間級別的週期。\n(例:在日線圖上指定「1週」 或 「1個月」)"
const string OPT_TF_D = "1天"
const string OPT_TF_W = "1週"
const string OPT_TF_1M = "1個月"
const string OPT_TF_3M = "3個月"
const string OPT_TF_12M = "12個月"
const string LBL_OFS_L = "左端偏移調整 (K線數換算)"
const string LBL_OFS_R = "右端偏移調整 (K線數換算)"
const string TT_OFS = "負值向左移動,正值向右移動。\n※Current版為基於時間計算(毫秒)的概估位移。"
const string LBL_FRAME = "高低點外框"
const string LBL_BG = "區間背景"
const string LBL_MID = "中線"
const string LBL_OPEN = "開盤價"
const string LBL_CLOSE = "收盤價"
const string LBL_WCL = "加權收盤價"
const string LBL_PIVOT = "樞軸點 (Pivot)"
const string LBL_MEDIAN = "實體中位數"
const string LBL_TWAP = "TWAP"
const string OPT_STY_S = "實線"
const string OPT_STY_D = "虛線"
const string OPT_STY_DT = "點線"
const string LBL_DATA_H = "最高價"
const string LBL_DATA_L = "最低價"
// 2. UI(ユーザー入力画面)の構築
// ※言語辞書で定義した定数を呼び出してUIを構築します
i_tf_str = input.string(OPT_TF_1M, title=LBL_TF, options=[OPT_TF_D, OPT_TF_W, OPT_TF_1M, OPT_TF_3M, OPT_TF_12M], group=GRP_GENERAL, tooltip=TT_TF)
i_offset_left = input.int(-1, title=LBL_OFS_L, group=GRP_OFFSET, tooltip=TT_OFS)
i_offset_right = input.int(0, title=LBL_OFS_R, group=GRP_OFFSET, tooltip=TT_OFS)
// ボックス枠
i_show_frame = input.bool(true, title=LBL_FRAME, group=GRP_BOX_FRAME, inline="frame")
i_col_frame = input.color(color.black, title="", group=GRP_BOX_FRAME, inline="frame")
i_wid_frame = input.int(2, title="", minval=1, maxval=5, group=GRP_BOX_FRAME, inline="frame")
i_sty_frame = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_BOX_FRAME, inline="frame")
// ボックス背景
i_show_bg = input.bool(false, title=LBL_BG, group=GRP_BOX_BG, inline="bg")
i_col_bg = input.color(color.new(color.teal, 90), title="", group=GRP_BOX_BG, inline="bg")
// ミッドライン
i_show_mid = input.bool(true, title=LBL_MID, group=GRP_MID, inline="mid")
i_col_mid = input.color(color.black, title="", group=GRP_MID, inline="mid")
i_wid_mid = input.int(2, title="", minval=1, maxval=5, group=GRP_MID, inline="mid")
i_sty_mid = input.string(OPT_STY_DT, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_MID, inline="mid")
// 分析ライン
i_show_open = input.bool(false, title=LBL_OPEN, group=GRP_ANL, inline="l1")
i_col_open = input.color(color.yellow, title="", group=GRP_ANL, inline="l1")
i_wid_open = input.int(2, title="", minval=1, maxval=5, group=GRP_ANL, inline="l1")
i_sty_open = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_ANL, inline="l1")
i_show_close = input.bool(false, title=LBL_CLOSE, group=GRP_ANL, inline="l2")
i_col_close = input.color(color.purple, title="", group=GRP_ANL, inline="l2")
i_wid_close = input.int(2, title="", minval=1, maxval=5, group=GRP_ANL, inline="l2")
i_sty_close = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_ANL, inline="l2")
i_show_wcl = input.bool(false, title=LBL_WCL, group=GRP_ANL, inline="l3")
i_col_wcl = input.color(color.red, title="", group=GRP_ANL, inline="l3")
i_wid_wcl = input.int(2, title="", minval=1, maxval=5, group=GRP_ANL, inline="l3")
i_sty_wcl = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_ANL, inline="l3")
i_show_piv = input.bool(false, title=LBL_PIVOT, group=GRP_ANL, inline="l4")
i_col_piv = input.color(color.blue, title="", group=GRP_ANL, inline="l4")
i_wid_piv = input.int(2, title="", minval=1, maxval=5, group=GRP_ANL, inline="l4")
i_sty_piv = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_ANL, inline="l4")
i_show_med = input.bool(false, title=LBL_MEDIAN, group=GRP_ANL, inline="l5")
i_col_med = input.color(color.green, title="", group=GRP_ANL, inline="l5")
i_wid_med = input.int(2, title="", minval=1, maxval=5, group=GRP_ANL, inline="l5")
i_sty_med = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_ANL, inline="l5")
i_show_twap = input.bool(false, title=LBL_TWAP, group=GRP_ANL, inline="l6")
i_col_twap = input.color(color.orange, title="", group=GRP_ANL, inline="l6")
i_wid_twap = input.int(2, title="", minval=1, maxval=5, group=GRP_ANL, inline="l6")
i_sty_twap = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_ANL, inline="l6")
// 背景塗りつぶし
i_fill_open = input.bool(false, title=LBL_OPEN, group=GRP_ZONE, inline="z1")
c_fill_open = input.color(color.new(color.yellow, 90), title="", group=GRP_ZONE, inline="z1")
i_fill_close = input.bool(false, title=LBL_CLOSE, group=GRP_ZONE, inline="z1")
c_fill_close = input.color(color.new(color.purple, 90), title="", group=GRP_ZONE, inline="z1")
i_fill_wcl = input.bool(false, title=LBL_WCL, group=GRP_ZONE, inline="z2")
c_fill_wcl = input.color(color.new(color.red, 90), title="", group=GRP_ZONE, inline="z2")
i_fill_piv = input.bool(false, title=LBL_PIVOT, group=GRP_ZONE, inline="z2")
c_fill_piv = input.color(color.new(color.blue, 90), title="", group=GRP_ZONE, inline="z2")
i_fill_med = input.bool(false, title=LBL_MEDIAN, group=GRP_ZONE, inline="z3")
c_fill_med = input.color(color.new(color.green, 90), title="", group=GRP_ZONE, inline="z3")
i_fill_twap = input.bool(false, title=LBL_TWAP, group=GRP_ZONE, inline="z4")
c_fill_twap = input.color(color.new(color.orange, 90), title="", group=GRP_ZONE, inline="z4")
// ==============================================================================
// 【03】 全コード共通仕様(時間・インフラ処理)
// ==============================================================================
// UIで選択された定数をPine内部のシステム識別子に変換
string req_tf = switch i_tf_str
OPT_TF_D => "1D"
OPT_TF_W => "1W"
OPT_TF_1M => "1M"
OPT_TF_3M => "3M"
OPT_TF_12M => "12M"
// 時間計算用の定数 (Current版のオフセット概算に使用)
const int MS_PER_SEC = 1000
// ==============================================================================
// 【04】 各カテゴリ共通仕様 (描画インフラと判定ロジック)
// ==============================================================================
bool is_new_period = timeframe.change(req_tf) or barstate.isfirst
f_get_style(sty_str) =>
sty_str == OPT_STY_S ? line.style_solid : sty_str == OPT_STY_D ? line.style_dashed : line.style_dotted
// ------------------------------------------------------------------------------
// オブジェクトの事前生成 (Current版専用インフラ)
// チャート上に1セットだけ図形を作り、毎ティック座標を更新するための準備
// ------------------------------------------------------------------------------
var box b_main = box.new(na, na, na, na, xloc=xloc.bar_time, border_width=i_wid_frame, border_style=f_get_style(i_sty_frame), border_color=i_show_frame ? i_col_frame : na, bgcolor=i_show_bg ? i_col_bg : na)
var line l_mid = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_mid, style=f_get_style(i_sty_mid), color=i_show_mid ? i_col_mid : na)
var line l_open = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_open, style=f_get_style(i_sty_open), color=i_show_open ? i_col_open : na)
var line l_close = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_close, style=f_get_style(i_sty_close), color=i_show_close ? i_col_close : na)
var line l_wcl = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_wcl, style=f_get_style(i_sty_wcl), color=i_show_wcl ? i_col_wcl : na)
var line l_piv = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_piv, style=f_get_style(i_sty_piv), color=i_show_piv ? i_col_piv : na)
var line l_med = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_med, style=f_get_style(i_sty_med), color=i_show_med ? i_col_med : na)
var line l_twap = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_twap, style=f_get_style(i_sty_twap), color=i_show_twap ? i_col_twap : na)
if barstate.isfirst
if i_fill_open
linefill.new(l_mid, l_open, c_fill_open)
if i_fill_close
linefill.new(l_mid, l_close, c_fill_close)
if i_fill_wcl
linefill.new(l_mid, l_wcl, c_fill_wcl)
if i_fill_piv
linefill.new(l_mid, l_piv, c_fill_piv)
if i_fill_med
linefill.new(l_mid, l_med, c_fill_med)
if i_fill_twap
linefill.new(l_mid, l_twap, c_fill_twap)
// ==============================================================================
// 【05】 このコード固有の計算仕様 (Specific Indicator Logic)
// ==============================================================================
var float temp_o = na
var float temp_h = na
var float temp_l = na
var float prev_o = na
var float prev_h = na
var float prev_l = na
var float prev_c = na
var int start_t = na
var int end_t = na
// 描画エンジンへ引き渡すためのフラグと変数
bool do_draw = false
int draw_start = na
int draw_end = na
float val_mid = na
float val_wcl = na
float val_piv = na
float val_med = na
float val_twap = na
if is_new_period
// ① 期間が切り替わった瞬間、今まで蓄積していたデータを「前期間の確定値」として昇格させる
prev_o := temp_o
prev_h := temp_h
prev_l := temp_l
prev_c := close[1]
// ② 新しい期間の高値・安値記録をスタート
temp_o := open
temp_h := high
temp_l := low
// ③ X軸(横幅)を今期間の開始時刻から未来の終了時刻に設定
start_t := time
int tc = time_close(req_tf)
end_t := not na(tc) ? tc : time + timeframe.in_seconds(req_tf) * MS_PER_SEC
else
// 期間中は裏で次の期間のための高値・安値を蓄積 (Y座標の高さには一切影響させません)
temp_h := math.max(temp_h, high)
temp_l := math.min(temp_l, low)
if not na(prev_o) and not na(start_t) and not na(end_t)
do_draw := true
int bar_ms = timeframe.in_seconds(timeframe.period) * MS_PER_SEC
draw_start := start_t + (i_offset_left * bar_ms)
draw_end := end_t + (i_offset_right * bar_ms)
val_mid := (prev_h + prev_l) / 2.0
val_wcl := (prev_h + prev_l + prev_c * 2.0) / 4.0
val_piv := (prev_h + prev_l + prev_c) / 3.0
val_med := (prev_o + prev_c) / 2.0
val_twap := (prev_o + prev_h + prev_l + prev_c) / 4.0
// ==============================================================================
// 【06】 描画と出力 (Rendering & Outputs)
// ==============================================================================
// 1. チャートへの視覚的出力(オブジェクト座標の更新)
if do_draw
if i_show_frame or i_show_bg
box.set_lefttop(b_main, draw_start, prev_h)
box.set_rightbottom(b_main, draw_end, prev_l)
bool need_mid = i_show_mid or i_fill_open or i_fill_close or i_fill_wcl or i_fill_piv or i_fill_med or i_fill_twap
if need_mid
line.set_xy1(l_mid, draw_start, val_mid)
line.set_xy2(l_mid, draw_end, val_mid)
if i_show_open or i_fill_open
line.set_xy1(l_open, draw_start, prev_o)
line.set_xy2(l_open, draw_end, prev_o)
if i_show_close or i_fill_close
line.set_xy1(l_close, draw_start, prev_c)
line.set_xy2(l_close, draw_end, prev_c)
if i_show_wcl or i_fill_wcl
line.set_xy1(l_wcl, draw_start, val_wcl)
line.set_xy2(l_wcl, draw_end, val_wcl)
if i_show_piv or i_fill_piv
line.set_xy1(l_piv, draw_start, val_piv)
line.set_xy2(l_piv, draw_end, val_piv)
if i_show_med or i_fill_med
line.set_xy1(l_med, draw_start, val_med)
line.set_xy2(l_med, draw_end, val_med)
if i_show_twap or i_fill_twap
line.set_xy1(l_twap, draw_start, val_twap)
line.set_xy2(l_twap, draw_end, val_twap)
// 2. データウィンドウへの出力 (辞書定数を参照)
// ※【05】で純粋な計算として算出済みの数値をそのまま出力します
plot(prev_h, title=LBL_DATA_H, color=i_col_frame, display=display.data_window, editable=false)
plot(prev_l, title=LBL_DATA_L, color=i_col_frame, display=display.data_window, editable=false)
plot(val_mid, title=LBL_MID, color=i_col_mid, display=display.data_window, editable=false)
plot(prev_o, title=LBL_OPEN, color=i_col_open, display=display.data_window, editable=false)
plot(prev_c, title=LBL_CLOSE, color=i_col_close, display=display.data_window, editable=false)
plot(val_wcl, title=LBL_WCL, color=i_col_wcl, display=display.data_window, editable=false)
plot(val_piv, title=LBL_PIVOT, color=i_col_piv, display=display.data_window, editable=false)
plot(val_med, title=LBL_MEDIAN, color=i_col_med, display=display.data_window, editable=false)
plot(val_twap, title=LBL_TWAP, color=i_col_twap, display=display.data_window, editable=false)
* 設定好喜歡的顏色配置後,請在設定分頁中點擊「儲存為預設值」。
* 若未按照「新增 → 指標 → 貼上」的順序操作,可能無法正確顯示。
