This is an optional indicator for "NK-Box". It can draw lines in the exact same range as "NK-Box".
It can draw Fibonacci, as well as 4-division and 8-division lines based on the high and low of the previous period.
For the Fibonacci levels, the calculation uses whichever occurred first (the high or the low) in the previous period as the starting point, and the one that occurred later as the ending point.
⇩ "Hist" (Top), "Current" (Bottom)
It can draw Fibonacci, as well as 4-division and 8-division lines based on the high and low of the previous period.
For the Fibonacci levels, the calculation uses whichever occurred first (the high or the low) in the previous period as the starting point, and the one that occurred later as the ending point.
Source: TradingView
⇩ "Hist" (Top), "Current" (Bottom)
[NOTICE & LICENSE]
・For educational and informational purposes only; does not constitute investment advice. We assume no liability for any economic loss arising from the use of this tool.
・Tested on Pine Script v6. Provided "As-Is" with no guarantee of updates in response to future TradingView specification changes. We do not provide individual installation support or accept modification requests.
・Governed by the MIT License.
// 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_option3_Fibo & Quarters (History)", shorttitle="NK-opt3 F&Q (Hist)", overlay=true, max_lines_count=500, max_labels_count=500)
// ==============================================================================
// 【01】 免責・ライセンス
// ==============================================================================
//
// Indicator is published for free: https://www.nk-report.com/p/tradingview-code.html
//
// Disclaimer: This script is for educational and informational purposes only and does not constitute investment advice.
//
// 1. This code has been tested with Pine Script v6 as of 2026.
// We do not provide individual support or modifications for any issues caused by future specification changes.
// 2. This script was independently created using an LLM, based on general calculation logic.
// It is distributed under the 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設定と言語
// ==============================================================================
const string GRP_GENERAL = "▼ General Settings"
const string GRP_OFFSET = "▼ Position Adjustment (Offset)"
const string GRP_CALC = "▼ Calculation Logic Settings"
const string GRP_FIBO_RET = "▼ Fibo: Retracement"
const string GRP_FIBO_EXT = "▼ Fibo: Extension"
const string GRP_GRID = "▼ Quarters: Equal Division Grid"
const string GRP_FIBO_CUS = "▼ Custom Levels"
const string LBL_TF = "Base Timeframe"
const string OPT_TF_D = "1 Day"
const string OPT_TF_W = "1 Week"
const string OPT_TF_1M = "1 Month"
const string OPT_TF_3M = "3 Months"
const string OPT_TF_12M = "12 Months"
const string OPT_POS_L = "Left"
const string OPT_POS_C = "Center"
const string OPT_POS_R = "Right"
const string OPT_STY_S = "Solid"
const string OPT_STY_D = "Dashed"
const string OPT_STY_DT = "Dotted"
const string OPT_GRID_NONE = "None"
const string OPT_GRID_Q4 = "Quarters (4-part)"
const string OPT_GRID_Q8 = "Eighths (8-part)"
i_tf_str = input.string(OPT_TF_3M, title=LBL_TF, options=[OPT_TF_D, OPT_TF_W, OPT_TF_1M, OPT_TF_3M, OPT_TF_12M], group=GRP_GENERAL)
i_lbl_pos = input.string(OPT_POS_C, title="Label Position", options=[OPT_POS_L, OPT_POS_C, OPT_POS_R], group=GRP_GENERAL)
i_offset_left = input.int(-1, title="Left Offset (Bars)", group=GRP_OFFSET)
i_offset_right = input.int(0, title="Right Offset (Bars)", group=GRP_OFFSET)
i_use_log = input.bool(true, title="Calculate with Logarithmic Scale (* Fibo only)", group=GRP_CALC, tooltip="Check this if your chart is in log scale (log button at bottom right) to match the manual drawing tools.")
i_rev = input.bool(false, title="Reverse Levels", group=GRP_CALC, tooltip="Use this if the manual tool's 0.382 and 0.618 are flipped upside down.")
i_show_ret = input.bool(true, title="Show (0.382, 0.5, 0.618, 0.786)", group=GRP_FIBO_RET, inline="ret")
i_col_ret = input.color(color.blue, title="", group=GRP_FIBO_RET, inline="ret")
i_wid_ret = input.int(2, title="", minval=1, maxval=5, group=GRP_FIBO_RET, inline="ret")
i_sty_ret = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_FIBO_RET, inline="ret")
i_show_ext = input.bool(true, title="Show (1.272, 1.618, 2.272, 2.618)", group=GRP_FIBO_EXT, inline="ext")
i_col_ext = input.color(color.lime, title="", group=GRP_FIBO_EXT, inline="ext")
i_wid_ext = input.int(2, title="", minval=1, maxval=5, group=GRP_FIBO_EXT, inline="ext")
i_sty_ext = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_FIBO_EXT, inline="ext")
i_grid_mode = input.string(OPT_GRID_NONE, title="Show Grid", options=[OPT_GRID_NONE, OPT_GRID_Q4, OPT_GRID_Q8], group=GRP_GRID)
i_col_q4 = input.color(color.aqua, title="Quarters Color", group=GRP_GRID, inline="q4")
i_wid_q4 = input.int(2, title="", minval=1, maxval=5, group=GRP_GRID, inline="q4")
i_sty_q4 = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_GRID, inline="q4")
i_col_q8 = input.color(color.purple, title="Eighths Color", group=GRP_GRID, inline="q8")
i_wid_q8 = input.int(2, title="", minval=1, maxval=5, group=GRP_GRID, inline="q8")
i_sty_q8 = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_GRID, inline="q8")
i_show_c1 = input.bool(false, title="Show Custom 1", group=GRP_FIBO_CUS, inline="c1")
i_val_c1 = input.float(0.0, title="", step=0.001, group=GRP_FIBO_CUS, inline="c1")
i_col_c1 = input.color(color.orange, title="", group=GRP_FIBO_CUS, inline="c1")
i_wid_c1 = input.int(2, title="", minval=1, maxval=5, group=GRP_FIBO_CUS, inline="c1")
i_sty_c1 = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_FIBO_CUS, inline="c1")
i_show_c2 = input.bool(false, title="Show Custom 2", group=GRP_FIBO_CUS, inline="c2")
i_val_c2 = input.float(1.0, title="", step=0.001, group=GRP_FIBO_CUS, inline="c2")
i_col_c2 = input.color(color.orange, title="", group=GRP_FIBO_CUS, inline="c2")
i_wid_c2 = input.int(2, title="", minval=1, maxval=5, group=GRP_FIBO_CUS, inline="c2")
i_sty_c2 = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_FIBO_CUS, inline="c2")
i_show_c3 = input.bool(false, title="Show Custom 3", group=GRP_FIBO_CUS, inline="c3")
i_val_c3 = input.float(2.414, title="", step=0.001, group=GRP_FIBO_CUS, inline="c3")
i_col_c3 = input.color(color.orange, title="", group=GRP_FIBO_CUS, inline="c3")
i_wid_c3 = input.int(2, title="", minval=1, maxval=5, group=GRP_FIBO_CUS, inline="c3")
i_sty_c3 = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_FIBO_CUS, inline="c3")
// ==============================================================================
// 【03】 全コード共通仕様(時間・インフラ処理)
// ==============================================================================
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"
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 int curr_h_idx = na
var int curr_l_idx = na
var float prev_o = na
var float prev_h = na
var float prev_l = na
var float prev_c = na
var int prev_h_idx = na
var int prev_l_idx = na
var int start_bar = na
bool do_draw = false
int draw_start = na
int draw_end = na
float draw_h = na
float draw_l = na
bool draw_is_bull = false
if is_new_period
// スナップショット
if not na(prev_h) and not na(start_bar) and not na(prev_h_idx) and not na(prev_l_idx)
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_h := prev_h
draw_l := prev_l
draw_is_bull := prev_l_idx < prev_h_idx
if prev_h_idx == prev_l_idx
draw_is_bull := prev_c >= prev_o
prev_o := curr_o
prev_h := curr_h
prev_l := curr_l
prev_c := close[1]
prev_h_idx := curr_h_idx
prev_l_idx := curr_l_idx
curr_o := open
curr_h := high
curr_l := low
curr_h_idx := bar_index
curr_l_idx := bar_index
start_bar := bar_index
else
if na(curr_h) or high > curr_h
curr_h := high
curr_h_idx := bar_index
if na(curr_l) or low < curr_l
curr_l := low
curr_l_idx := bar_index
// ------------------------------------------------------------------------------
// 方向判定と高度な数学計算ロジック
// ------------------------------------------------------------------------------
f_calc_fibo(u_in, _h, _l, _is_bull) =>
bool bull = i_rev ? not _is_bull : _is_bull
float ratio = u_in <= 1.0 ? u_in : u_in - 1.0
float val = na
if i_use_log
float log_h = math.log(_h)
float log_l = math.log(_l)
float log_r = log_h - log_l
float log_v = na
if u_in <= 1.0
log_v := bull ? log_h - (log_r * ratio) : log_l + (log_r * ratio)
else
log_v := bull ? log_h + (log_r * ratio) : log_l - (log_r * ratio)
val := math.exp(log_v)
else
float range_v = _h - _l
if u_in <= 1.0
val := bull ? _h - (range_v * ratio) : _l + (range_v * ratio)
else
val := bull ? _h + (range_v * ratio) : _l - (range_v * ratio)
val
f_calc_grid(u, _h, _l) =>
_l + ((_h - _l) * u)
f_is_bull(_h_idx, _l_idx, _o, _c) =>
bool bull = _l_idx < _h_idx
if _h_idx == _l_idx
bull := _c >= _o
bull
// ------------------------------------------------------------------------------
// 描画関数 (グローバルスコープで定義してSyntax Errorを完全回避)
// ------------------------------------------------------------------------------
f_draw_fibo(_val, _txt, _col, _wid, _sty, _d_start, _d_end, _lbl_x) =>
if not na(_val)
line.new(_d_start, _val, _d_end, _val, color=_col, width=_wid, style=f_get_style(_sty))
label.new(_lbl_x, _val, text=_txt, color=color.new(color.white, 100), textcolor=_col, style=label.style_none, size=size.small)
f_draw_grid(_val, _col, _wid, _sty, _d_start, _d_end) =>
if not na(_val)
line.new(_d_start, _val, _d_end, _val, color=_col, width=_wid, style=f_get_style(_sty))
// ==============================================================================
// 【06】 描画と出力 (Rendering & Outputs)
// ==============================================================================
if do_draw
int lbl_x = i_lbl_pos == OPT_POS_L ? draw_start : i_lbl_pos == OPT_POS_C ? int(math.round((draw_start + draw_end) / 2)) : draw_end
if i_show_ret
f_draw_fibo(f_calc_fibo(0.382, draw_h, draw_l, draw_is_bull), "0.382", i_col_ret, i_wid_ret, i_sty_ret, draw_start, draw_end, lbl_x)
f_draw_fibo(f_calc_fibo(0.500, draw_h, draw_l, draw_is_bull), "0.500", i_col_ret, i_wid_ret, i_sty_ret, draw_start, draw_end, lbl_x)
f_draw_fibo(f_calc_fibo(0.618, draw_h, draw_l, draw_is_bull), "0.618", i_col_ret, i_wid_ret, i_sty_ret, draw_start, draw_end, lbl_x)
f_draw_fibo(f_calc_fibo(0.786, draw_h, draw_l, draw_is_bull), "0.786", i_col_ret, i_wid_ret, i_sty_ret, draw_start, draw_end, lbl_x)
if i_show_ext
f_draw_fibo(f_calc_fibo(1.272, draw_h, draw_l, draw_is_bull), "1.272", i_col_ext, i_wid_ext, i_sty_ext, draw_start, draw_end, lbl_x)
f_draw_fibo(f_calc_fibo(1.618, draw_h, draw_l, draw_is_bull), "1.618", i_col_ext, i_wid_ext, i_sty_ext, draw_start, draw_end, lbl_x)
f_draw_fibo(f_calc_fibo(2.272, draw_h, draw_l, draw_is_bull), "2.272", i_col_ext, i_wid_ext, i_sty_ext, draw_start, draw_end, lbl_x)
f_draw_fibo(f_calc_fibo(2.618, draw_h, draw_l, draw_is_bull), "2.618", i_col_ext, i_wid_ext, i_sty_ext, draw_start, draw_end, lbl_x)
bool is_q4 = i_grid_mode == OPT_GRID_Q4
bool is_q8 = i_grid_mode == OPT_GRID_Q8
if is_q8
f_draw_grid(f_calc_grid(0.125, draw_h, draw_l), i_col_q8, i_wid_q8, i_sty_q8, draw_start, draw_end)
if is_q4 or is_q8
f_draw_grid(f_calc_grid(0.250, draw_h, draw_l), is_q8 ? i_col_q8 : i_col_q4, is_q8 ? i_wid_q8 : i_wid_q4, is_q8 ? i_sty_q8 : i_sty_q4, draw_start, draw_end)
if is_q8
f_draw_grid(f_calc_grid(0.375, draw_h, draw_l), i_col_q8, i_wid_q8, i_sty_q8, draw_start, draw_end)
if is_q4 or is_q8
f_draw_grid(f_calc_grid(0.500, draw_h, draw_l), is_q8 ? i_col_q8 : i_col_q4, is_q8 ? i_wid_q8 : i_wid_q4, is_q8 ? i_sty_q8 : i_sty_q4, draw_start, draw_end)
if is_q8
f_draw_grid(f_calc_grid(0.625, draw_h, draw_l), i_col_q8, i_wid_q8, i_sty_q8, draw_start, draw_end)
if is_q4 or is_q8
f_draw_grid(f_calc_grid(0.750, draw_h, draw_l), is_q8 ? i_col_q8 : i_col_q4, is_q8 ? i_wid_q8 : i_wid_q4, is_q8 ? i_sty_q8 : i_sty_q4, draw_start, draw_end)
if is_q8
f_draw_grid(f_calc_grid(0.875, draw_h, draw_l), i_col_q8, i_wid_q8, i_sty_q8, draw_start, draw_end)
if i_show_c1
f_draw_fibo(f_calc_fibo(i_val_c1, draw_h, draw_l, draw_is_bull), str.tostring(i_val_c1), i_col_c1, i_wid_c1, i_sty_c1, draw_start, draw_end, lbl_x)
if i_show_c2
f_draw_fibo(f_calc_fibo(i_val_c2, draw_h, draw_l, draw_is_bull), str.tostring(i_val_c2), i_col_c2, i_wid_c2, i_sty_c2, draw_start, draw_end, lbl_x)
if i_show_c3
f_draw_fibo(f_calc_fibo(i_val_c3, draw_h, draw_l, draw_is_bull), str.tostring(i_val_c3), i_col_c3, i_wid_c3, i_sty_c3, draw_start, draw_end, lbl_x)
// データウィンドウ出力 (客観的事実のみを静かに出力)
bool out_bull = f_is_bull(prev_h_idx, prev_l_idx, prev_o, prev_c)
bool is_data_q4 = i_grid_mode == OPT_GRID_Q4
bool is_data_q8 = i_grid_mode == OPT_GRID_Q8
plot(f_calc_fibo(0.382, prev_h, prev_l, out_bull), title="Fibo 0.382", color=i_col_ret, display=display.data_window, editable=false)
plot(f_calc_fibo(0.500, prev_h, prev_l, out_bull), title="Fibo 0.500", color=i_col_ret, display=display.data_window, editable=false)
plot(f_calc_fibo(0.618, prev_h, prev_l, out_bull), title="Fibo 0.618", color=i_col_ret, display=display.data_window, editable=false)
plot(f_calc_fibo(0.786, prev_h, prev_l, out_bull), title="Fibo 0.786", color=i_col_ret, display=display.data_window, editable=false)
plot(f_calc_fibo(1.272, prev_h, prev_l, out_bull), title="Fibo 1.272", color=i_col_ext, display=display.data_window, editable=false)
plot(f_calc_fibo(1.618, prev_h, prev_l, out_bull), title="Fibo 1.618", color=i_col_ext, display=display.data_window, editable=false)
plot(f_calc_fibo(2.272, prev_h, prev_l, out_bull), title="Fibo 2.272", color=i_col_ext, display=display.data_window, editable=false)
plot(f_calc_fibo(2.618, prev_h, prev_l, out_bull), title="Fibo 2.618", color=i_col_ext, display=display.data_window, editable=false)
plot(is_data_q8 ? f_calc_grid(0.125, prev_h, prev_l) : na, title="Qtr 0.125", color=i_col_q8, display=display.data_window, editable=false)
plot(is_data_q4 or is_data_q8 ? f_calc_grid(0.250, prev_h, prev_l) : na, title="Qtr 0.250", color=is_data_q8 ? i_col_q8 : i_col_q4, display=display.data_window, editable=false)
plot(is_data_q8 ? f_calc_grid(0.375, prev_h, prev_l) : na, title="Qtr 0.375", color=i_col_q8, display=display.data_window, editable=false)
plot(is_data_q4 or is_data_q8 ? f_calc_grid(0.500, prev_h, prev_l) : na, title="Qtr 0.500", color=is_data_q8 ? i_col_q8 : i_col_q4, display=display.data_window, editable=false)
plot(is_data_q8 ? f_calc_grid(0.625, prev_h, prev_l) : na, title="Qtr 0.625", color=i_col_q8, display=display.data_window, editable=false)
plot(is_data_q4 or is_data_q8 ? f_calc_grid(0.750, prev_h, prev_l) : na, title="Qtr 0.750", color=is_data_q8 ? i_col_q8 : i_col_q4, display=display.data_window, editable=false)
plot(is_data_q8 ? f_calc_grid(0.875, prev_h, prev_l) : na, title="Qtr 0.875", color=i_col_q8, display=display.data_window, editable=false)
plot(f_calc_fibo(i_val_c1, prev_h, prev_l, out_bull), title="Custom 1", color=i_col_c1, display=display.data_window, editable=false)
plot(f_calc_fibo(i_val_c2, prev_h, prev_l, out_bull), title="Custom 2", color=i_col_c2, display=display.data_window, editable=false)
plot(f_calc_fibo(i_val_c3, prev_h, prev_l, out_bull), title="Custom 3", color=i_col_c3, 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_option3_Fibo & Quarters (Current)", shorttitle="NK-opt3 F&Q (Curr)", overlay=true)
// ==============================================================================
// 【01】 免責・ライセンス
// ==============================================================================
//
// Indicator is published for free: https://www.nk-report.com/p/tradingview-code.html
//
// Disclaimer: This script is for educational and informational purposes only and does not constitute investment advice.
//
// 1. This code has been tested with Pine Script v6 as of 2026.
// We do not provide individual support or modifications for any issues caused by future specification changes.
// 2. This script was independently created using an LLM, based on general calculation logic.
// It is distributed under the 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設定と言語
// ==============================================================================
const string GRP_GENERAL = "▼ General Settings"
const string GRP_OFFSET = "▼ Position Adjustment (Offset)"
const string GRP_CALC = "▼ Calculation Logic Settings"
const string GRP_FIBO_RET = "▼ Fibo: Retracement"
const string GRP_FIBO_EXT = "▼ Fibo: Extension"
const string GRP_GRID = "▼ Quarters: Equal Division Grid"
const string GRP_FIBO_CUS = "▼ Custom Levels"
const string LBL_TF = "Base Timeframe"
const string OPT_TF_D = "1 Day"
const string OPT_TF_W = "1 Week"
const string OPT_TF_1M = "1 Month"
const string OPT_TF_3M = "3 Months"
const string OPT_TF_12M = "12 Months"
const string OPT_POS_L = "Left"
const string OPT_POS_C = "Center"
const string OPT_POS_R = "Right"
const string OPT_STY_S = "Solid"
const string OPT_STY_D = "Dashed"
const string OPT_STY_DT = "Dotted"
const string OPT_GRID_NONE = "None"
const string OPT_GRID_Q4 = "Quarters (4-part)"
const string OPT_GRID_Q8 = "Eighths (8-part)"
i_tf_str = input.string(OPT_TF_3M, title=LBL_TF, options=[OPT_TF_D, OPT_TF_W, OPT_TF_1M, OPT_TF_3M, OPT_TF_12M], group=GRP_GENERAL)
i_lbl_pos = input.string(OPT_POS_C, title="Label Position", options=[OPT_POS_L, OPT_POS_C, OPT_POS_R], group=GRP_GENERAL)
i_offset_left = input.int(-1, title="Left Offset (in Bars)", group=GRP_OFFSET)
i_offset_right = input.int(0, title="Right Offset (in Bars)", group=GRP_OFFSET)
i_use_log = input.bool(true, title="Calculate with Logarithmic Scale (* Fibo only)", group=GRP_CALC, tooltip="Check this if your chart is in log scale (log button at bottom right) to match the manual drawing tools.")
i_rev = input.bool(false, title="Reverse Levels", group=GRP_CALC, tooltip="Use this if the manual tool's 0.382 and 0.618 are flipped upside down.")
i_show_ret = input.bool(true, title="Show (0.382, 0.5, 0.618, 0.786)", group=GRP_FIBO_RET, inline="ret")
i_col_ret = input.color(color.blue, title="", group=GRP_FIBO_RET, inline="ret")
i_wid_ret = input.int(2, title="", minval=1, maxval=5, group=GRP_FIBO_RET, inline="ret")
i_sty_ret = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_FIBO_RET, inline="ret")
i_show_ext = input.bool(true, title="Show (1.272, 1.618, 2.272, 2.618)", group=GRP_FIBO_EXT, inline="ext")
i_col_ext = input.color(color.lime, title="", group=GRP_FIBO_EXT, inline="ext")
i_wid_ext = input.int(2, title="", minval=1, maxval=5, group=GRP_FIBO_EXT, inline="ext")
i_sty_ext = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_FIBO_EXT, inline="ext")
i_grid_mode = input.string(OPT_GRID_NONE, title="Show Grid", options=[OPT_GRID_NONE, OPT_GRID_Q4, OPT_GRID_Q8], group=GRP_GRID)
bool is_q4 = i_grid_mode == OPT_GRID_Q4
bool is_q8 = i_grid_mode == OPT_GRID_Q8
i_col_q4 = input.color(color.aqua, title="Quarters Color", group=GRP_GRID, inline="q4")
i_wid_q4 = input.int(2, title="", minval=1, maxval=5, group=GRP_GRID, inline="q4")
i_sty_q4 = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_GRID, inline="q4")
i_col_q8 = input.color(color.purple, title="Eighths Color", group=GRP_GRID, inline="q8")
i_wid_q8 = input.int(2, title="", minval=1, maxval=5, group=GRP_GRID, inline="q8")
i_sty_q8 = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_GRID, inline="q8")
i_show_c1 = input.bool(false, title="Show Custom 1", group=GRP_FIBO_CUS, inline="c1")
i_val_c1 = input.float(0.0, title="", step=0.001, group=GRP_FIBO_CUS, inline="c1")
i_col_c1 = input.color(color.orange, title="", group=GRP_FIBO_CUS, inline="c1")
i_wid_c1 = input.int(2, title="", minval=1, maxval=5, group=GRP_FIBO_CUS, inline="c1")
i_sty_c1 = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_FIBO_CUS, inline="c1")
i_show_c2 = input.bool(false, title="Show Custom 2", group=GRP_FIBO_CUS, inline="c2")
i_val_c2 = input.float(1.0, title="", step=0.001, group=GRP_FIBO_CUS, inline="c2")
i_col_c2 = input.color(color.orange, title="", group=GRP_FIBO_CUS, inline="c2")
i_wid_c2 = input.int(2, title="", minval=1, maxval=5, group=GRP_FIBO_CUS, inline="c2")
i_sty_c2 = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_FIBO_CUS, inline="c2")
i_show_c3 = input.bool(false, title="Show Custom 3", group=GRP_FIBO_CUS, inline="c3")
i_val_c3 = input.float(2.414, title="", step=0.001, group=GRP_FIBO_CUS, inline="c3")
i_col_c3 = input.color(color.orange, title="", group=GRP_FIBO_CUS, inline="c3")
i_wid_c3 = input.int(2, title="", minval=1, maxval=5, group=GRP_FIBO_CUS, inline="c3")
i_sty_c3 = input.string(OPT_STY_S, title="", options=[OPT_STY_S, OPT_STY_D, OPT_STY_DT], group=GRP_FIBO_CUS, inline="c3")
// ==============================================================================
// 【03】 全コード共通仕様(時間・インフラ処理)
// ==============================================================================
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"
const int MS_PER_SEC = 1000
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
// ------------------------------------------------------------------------------
// オブジェクトの事前生成 (独立変数を宣言し、ズレを完全排除)
// ※Pine Scriptの構文に基づき、異なる型のvar宣言は改行して行います
// ------------------------------------------------------------------------------
// Fibo用: 線とラベルのセット
var line l_r1 = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_ret, style=f_get_style(i_sty_ret), color=i_show_ret ? i_col_ret : na)
var label lbl_r1 = label.new(na, na, xloc=xloc.bar_time, text="0.382", color=color.new(color.white, 100), textcolor=i_show_ret ? i_col_ret : na, style=label.style_none, size=size.small)
var line l_r2 = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_ret, style=f_get_style(i_sty_ret), color=i_show_ret ? i_col_ret : na)
var label lbl_r2 = label.new(na, na, xloc=xloc.bar_time, text="0.500", color=color.new(color.white, 100), textcolor=i_show_ret ? i_col_ret : na, style=label.style_none, size=size.small)
var line l_r3 = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_ret, style=f_get_style(i_sty_ret), color=i_show_ret ? i_col_ret : na)
var label lbl_r3 = label.new(na, na, xloc=xloc.bar_time, text="0.618", color=color.new(color.white, 100), textcolor=i_show_ret ? i_col_ret : na, style=label.style_none, size=size.small)
var line l_r4 = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_ret, style=f_get_style(i_sty_ret), color=i_show_ret ? i_col_ret : na)
var label lbl_r4 = label.new(na, na, xloc=xloc.bar_time, text="0.786", color=color.new(color.white, 100), textcolor=i_show_ret ? i_col_ret : na, style=label.style_none, size=size.small)
var line l_e1 = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_ext, style=f_get_style(i_sty_ext), color=i_show_ext ? i_col_ext : na)
var label lbl_e1 = label.new(na, na, xloc=xloc.bar_time, text="1.272", color=color.new(color.white, 100), textcolor=i_show_ext ? i_col_ext : na, style=label.style_none, size=size.small)
var line l_e2 = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_ext, style=f_get_style(i_sty_ext), color=i_show_ext ? i_col_ext : na)
var label lbl_e2 = label.new(na, na, xloc=xloc.bar_time, text="1.618", color=color.new(color.white, 100), textcolor=i_show_ext ? i_col_ext : na, style=label.style_none, size=size.small)
var line l_e3 = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_ext, style=f_get_style(i_sty_ext), color=i_show_ext ? i_col_ext : na)
var label lbl_e3 = label.new(na, na, xloc=xloc.bar_time, text="2.272", color=color.new(color.white, 100), textcolor=i_show_ext ? i_col_ext : na, style=label.style_none, size=size.small)
var line l_e4 = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_ext, style=f_get_style(i_sty_ext), color=i_show_ext ? i_col_ext : na)
var label lbl_e4 = label.new(na, na, xloc=xloc.bar_time, text="2.618", color=color.new(color.white, 100), textcolor=i_show_ext ? i_col_ext : na, style=label.style_none, size=size.small)
// Quarters用: 線のみ
var line l_q1 = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_q8, style=f_get_style(i_sty_q8), color=is_q8 ? i_col_q8 : na)
var line l_q2 = line.new(na, na, na, na, xloc=xloc.bar_time, width=is_q8 ? i_wid_q8 : i_wid_q4, style=is_q8 ? f_get_style(i_sty_q8) : f_get_style(i_sty_q4), color=is_q8 ? i_col_q8 : is_q4 ? i_col_q4 : na)
var line l_q3 = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_q8, style=f_get_style(i_sty_q8), color=is_q8 ? i_col_q8 : na)
var line l_q4 = line.new(na, na, na, na, xloc=xloc.bar_time, width=is_q8 ? i_wid_q8 : i_wid_q4, style=is_q8 ? f_get_style(i_sty_q8) : f_get_style(i_sty_q4), color=is_q8 ? i_col_q8 : is_q4 ? i_col_q4 : na)
var line l_q5 = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_q8, style=f_get_style(i_sty_q8), color=is_q8 ? i_col_q8 : na)
var line l_q6 = line.new(na, na, na, na, xloc=xloc.bar_time, width=is_q8 ? i_wid_q8 : i_wid_q4, style=is_q8 ? f_get_style(i_sty_q8) : f_get_style(i_sty_q4), color=is_q8 ? i_col_q8 : is_q4 ? i_col_q4 : na)
var line l_q7 = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_q8, style=f_get_style(i_sty_q8), color=is_q8 ? i_col_q8 : na)
var line l_c1 = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_c1, style=f_get_style(i_sty_c1), color=i_show_c1 ? i_col_c1 : na)
var label lbl_c1 = label.new(na, na, xloc=xloc.bar_time, text=str.tostring(i_val_c1), color=color.new(color.white, 100), textcolor=i_show_c1 ? i_col_c1 : na, style=label.style_none, size=size.small)
var line l_c2 = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_c2, style=f_get_style(i_sty_c2), color=i_show_c2 ? i_col_c2 : na)
var label lbl_c2 = label.new(na, na, xloc=xloc.bar_time, text=str.tostring(i_val_c2), color=color.new(color.white, 100), textcolor=i_show_c2 ? i_col_c2 : na, style=label.style_none, size=size.small)
var line l_c3 = line.new(na, na, na, na, xloc=xloc.bar_time, width=i_wid_c3, style=f_get_style(i_sty_c3), color=i_show_c3 ? i_col_c3 : na)
var label lbl_c3 = label.new(na, na, xloc=xloc.bar_time, text=str.tostring(i_val_c3), color=color.new(color.white, 100), textcolor=i_show_c3 ? i_col_c3 : na, style=label.style_none, size=size.small)
// ==============================================================================
// 【05】 このコード固有の計算仕様 (Specific Indicator Logic)
// ==============================================================================
var float temp_o = na
var float temp_h = na
var float temp_l = na
var int temp_h_t = na
var int temp_l_t = na
var float prev_o = na
var float prev_h = na
var float prev_l = na
var float prev_c = na
var int prev_h_t = na
var int prev_l_t = na
var int start_t = na
var int end_t = na
if is_new_period
prev_o := temp_o
prev_h := temp_h
prev_l := temp_l
prev_c := close[1]
prev_h_t := temp_h_t
prev_l_t := temp_l_t
temp_o := open
temp_h := high
temp_l := low
temp_h_t := time
temp_l_t := time
start_t := time
int tc = time_close(req_tf)
int fallback_t = time + timeframe.in_seconds(req_tf) * MS_PER_SEC
// ※安全装置強化:time_close()とtimeframe.in_seconds()の両方がnaになる特殊休場日への対策
end_t := not na(tc) ? tc : not na(fallback_t) ? fallback_t : time + (86400 * MS_PER_SEC)
else
if na(temp_h) or high > temp_h
temp_h := high
temp_h_t := time
if na(temp_l) or low < temp_l
temp_l := low
temp_l_t := time
f_calc_fibo(u_in, _h, _l, _is_bull, _use_log, _rev) =>
bool bull = _rev ? not _is_bull : _is_bull
float ratio = u_in <= 1.0 ? u_in : u_in - 1.0
float val = na
if _use_log
float log_h = math.log(_h)
float log_l = math.log(_l)
float log_r = log_h - log_l
float log_v = na
if u_in <= 1.0
log_v := bull ? log_h - (log_r * ratio) : log_l + (log_r * ratio)
else
log_v := bull ? log_h + (log_r * ratio) : log_l - (log_r * ratio)
val := math.exp(log_v)
else
float range_v = _h - _l
if u_in <= 1.0
val := bull ? _h - (range_v * ratio) : _l + (range_v * ratio)
else
val := bull ? _h + (range_v * ratio) : _l - (range_v * ratio)
val
f_calc_grid(u, _h, _l) =>
_l + ((_h - _l) * u)
f_is_bull(_h_t, _l_t, _o, _c) =>
bool bull = _l_t < _h_t
if _h_t == _l_t
bull := _c >= _o
bull
// ------------------------------------------------------------------------------
// 描画関数 (グローバルスコープで定義してSyntax Errorを完全回避)
// ------------------------------------------------------------------------------
f_upd_fibo(_show, _val, _line, _lbl, _d_start, _d_end, _lbl_t) =>
if _show and not na(_val)
line.set_xy1(_line, _d_start, _val)
line.set_xy2(_line, _d_end, _val)
label.set_xy(_lbl, _lbl_t, _val)
else
line.set_xy1(_line, na, na)
line.set_xy2(_line, na, na)
label.set_xy(_lbl, na, na)
f_upd_grid(_show, _val, _line, _d_start, _d_end) =>
if _show and not na(_val)
line.set_xy1(_line, _d_start, _val)
line.set_xy2(_line, _d_end, _val)
else
line.set_xy1(_line, na, na)
line.set_xy2(_line, na, na)
// ==============================================================================
// 【06】 描画と出力 (Rendering & Outputs)
// ==============================================================================
bool do_draw = false
int draw_start = na
int draw_end = na
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)
if do_draw
bool is_bull = f_is_bull(prev_h_t, prev_l_t, prev_o, prev_c)
int lbl_t = i_lbl_pos == OPT_POS_L ? draw_start : i_lbl_pos == OPT_POS_C ? int(math.round((draw_start + draw_end) / 2)) : draw_end
// Fibo
f_upd_fibo(i_show_ret, f_calc_fibo(0.382, prev_h, prev_l, is_bull, i_use_log, i_rev), l_r1, lbl_r1, draw_start, draw_end, lbl_t)
f_upd_fibo(i_show_ret, f_calc_fibo(0.500, prev_h, prev_l, is_bull, i_use_log, i_rev), l_r2, lbl_r2, draw_start, draw_end, lbl_t)
f_upd_fibo(i_show_ret, f_calc_fibo(0.618, prev_h, prev_l, is_bull, i_use_log, i_rev), l_r3, lbl_r3, draw_start, draw_end, lbl_t)
f_upd_fibo(i_show_ret, f_calc_fibo(0.786, prev_h, prev_l, is_bull, i_use_log, i_rev), l_r4, lbl_r4, draw_start, draw_end, lbl_t)
f_upd_fibo(i_show_ext, f_calc_fibo(1.272, prev_h, prev_l, is_bull, i_use_log, i_rev), l_e1, lbl_e1, draw_start, draw_end, lbl_t)
f_upd_fibo(i_show_ext, f_calc_fibo(1.618, prev_h, prev_l, is_bull, i_use_log, i_rev), l_e2, lbl_e2, draw_start, draw_end, lbl_t)
f_upd_fibo(i_show_ext, f_calc_fibo(2.272, prev_h, prev_l, is_bull, i_use_log, i_rev), l_e3, lbl_e3, draw_start, draw_end, lbl_t)
f_upd_fibo(i_show_ext, f_calc_fibo(2.618, prev_h, prev_l, is_bull, i_use_log, i_rev), l_e4, lbl_e4, draw_start, draw_end, lbl_t)
// Quarters
f_upd_grid(is_q8, f_calc_grid(0.125, prev_h, prev_l), l_q1, draw_start, draw_end)
f_upd_grid(is_q4 or is_q8, f_calc_grid(0.250, prev_h, prev_l), l_q2, draw_start, draw_end)
f_upd_grid(is_q8, f_calc_grid(0.375, prev_h, prev_l), l_q3, draw_start, draw_end)
f_upd_grid(is_q4 or is_q8, f_calc_grid(0.500, prev_h, prev_l), l_q4, draw_start, draw_end)
f_upd_grid(is_q8, f_calc_grid(0.625, prev_h, prev_l), l_q5, draw_start, draw_end)
f_upd_grid(is_q4 or is_q8, f_calc_grid(0.750, prev_h, prev_l), l_q6, draw_start, draw_end)
f_upd_grid(is_q8, f_calc_grid(0.875, prev_h, prev_l), l_q7, draw_start, draw_end)
// Custom
f_upd_fibo(i_show_c1, f_calc_fibo(i_val_c1, prev_h, prev_l, is_bull, i_use_log, i_rev), l_c1, lbl_c1, draw_start, draw_end, lbl_t)
f_upd_fibo(i_show_c2, f_calc_fibo(i_val_c2, prev_h, prev_l, is_bull, i_use_log, i_rev), l_c2, lbl_c2, draw_start, draw_end, lbl_t)
f_upd_fibo(i_show_c3, f_calc_fibo(i_val_c3, prev_h, prev_l, is_bull, i_use_log, i_rev), l_c3, lbl_c3, draw_start, draw_end, lbl_t)
// データウィンドウ出力 (客観的事実のみを静かに出力)
bool out_bull = f_is_bull(prev_h_t, prev_l_t, prev_o, prev_c)
plot(f_calc_fibo(0.382, prev_h, prev_l, out_bull, i_use_log, i_rev), title="Fibo 0.382", color=i_col_ret, display=display.data_window, editable=false)
plot(f_calc_fibo(0.500, prev_h, prev_l, out_bull, i_use_log, i_rev), title="Fibo 0.500", color=i_col_ret, display=display.data_window, editable=false)
plot(f_calc_fibo(0.618, prev_h, prev_l, out_bull, i_use_log, i_rev), title="Fibo 0.618", color=i_col_ret, display=display.data_window, editable=false)
plot(f_calc_fibo(0.786, prev_h, prev_l, out_bull, i_use_log, i_rev), title="Fibo 0.786", color=i_col_ret, display=display.data_window, editable=false)
plot(f_calc_fibo(1.272, prev_h, prev_l, out_bull, i_use_log, i_rev), title="Fibo 1.272", color=i_col_ext, display=display.data_window, editable=false)
plot(f_calc_fibo(1.618, prev_h, prev_l, out_bull, i_use_log, i_rev), title="Fibo 1.618", color=i_col_ext, display=display.data_window, editable=false)
plot(f_calc_fibo(2.272, prev_h, prev_l, out_bull, i_use_log, i_rev), title="Fibo 2.272", color=i_col_ext, display=display.data_window, editable=false)
plot(f_calc_fibo(2.618, prev_h, prev_l, out_bull, i_use_log, i_rev), title="Fibo 2.618", color=i_col_ext, display=display.data_window, editable=false)
plot(is_q8 ? f_calc_grid(0.125, prev_h, prev_l) : na, title="Qtr 0.125", color=i_col_q8, display=display.data_window, editable=false)
plot(is_q4 or is_q8 ? f_calc_grid(0.250, prev_h, prev_l) : na, title="Qtr 0.250", color=is_q8 ? i_col_q8 : i_col_q4, display=display.data_window, editable=false)
plot(is_q8 ? f_calc_grid(0.375, prev_h, prev_l) : na, title="Qtr 0.375", color=i_col_q8, display=display.data_window, editable=false)
plot(is_q4 or is_q8 ? f_calc_grid(0.500, prev_h, prev_l) : na, title="Qtr 0.500", color=is_q8 ? i_col_q8 : i_col_q4, display=display.data_window, editable=false)
plot(is_q8 ? f_calc_grid(0.625, prev_h, prev_l) : na, title="Qtr 0.625", color=i_col_q8, display=display.data_window, editable=false)
plot(is_q4 or is_q8 ? f_calc_grid(0.750, prev_h, prev_l) : na, title="Qtr 0.750", color=is_q8 ? i_col_q8 : i_col_q4, display=display.data_window, editable=false)
plot(is_q8 ? f_calc_grid(0.875, prev_h, prev_l) : na, title="Qtr 0.875", color=i_col_q8, display=display.data_window, editable=false)
plot(f_calc_fibo(i_val_c1, prev_h, prev_l, out_bull, i_use_log, i_rev), title="Custom 1", color=i_col_c1, display=display.data_window, editable=false)
plot(f_calc_fibo(i_val_c2, prev_h, prev_l, out_bull, i_use_log, i_rev), title="Custom 2", color=i_col_c2, display=display.data_window, editable=false)
plot(f_calc_fibo(i_val_c3, prev_h, prev_l, out_bull, i_use_log, i_rev), title="Custom 3", color=i_col_c3, display=display.data_window, editable=false)
* After setting your preferred colors, please click "Save as default" in the settings tab.
* The indicator may not display correctly unless you follow the steps: Create New -> Indicator -> Paste.
