"NK-Box"にオプションとして使用するインジケーターです。"NK-Box"と全く同じ範囲にラインを描画することができます。
前期間の高値安値を基準としたフィボナッチ、4分割/8分割ラインを描画することができます。
フィボナッチについては前期間の高値安値の早い方を起点、遅い方を終点として計算しています。
前期間の高値安値を基準としたフィボナッチ、4分割/8分割ラインを描画することができます。
フィボナッチについては前期間の高値安値の早い方を起点、遅い方を終点として計算しています。
出典: TradingView
⇩上が"Hist"下が"Current"
[NOTICE & LICENSE]
・学習および情報提供のみを目的としており、投資助言ではありません。ツールを使用したことによる経済的損失について、一切の責任を負いません。
・Pine Script v6 で動作確認しています。将来のTradingView側の仕様変更に対するアップデート保証や、個別の導入サポート・改修依頼は一切受け付けません(現状有姿での提供)。
・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】 免責・ライセンス
// ==============================================================================
// インジケーターを無料で公開しています: https://www.nk-report.com/p/jp-0_0810719344.html
//
// 免責事項: 本スクリプトは学習および情報提供のみを目的としており、投資助言ではありません。
//
// 1. 本コードは2026年時点の Pine Script v6 で動作確認を行っています。
// 将来の仕様変更に伴う不具合等について、個別のサポートや改修は行いません。
// 2. 本スクリプトは一般的な計算ロジックに基づき、LLMを用いて独自に作成したものです。
// MITライセンスに則っています。
// ------------------------------------------------------------------------------
// 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 = "▼ 基本設定"
const string GRP_OFFSET = "▼ 描画位置の微調整 (オフセット)"
const string GRP_CALC = "▼ 計算ロジック設定"
const string GRP_FIBO_RET = "▼ Fibo: リトレースメント"
const string GRP_FIBO_EXT = "▼ Fibo: エクステンション"
const string GRP_GRID = "▼ Quarters: 等分割グリッド"
const string GRP_FIBO_CUS = "▼ カスタムレベル"
const string LBL_TF = "基準期間"
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 OPT_POS_L = "左"
const string OPT_POS_C = "中央"
const string OPT_POS_R = "右"
const string OPT_STY_S = "実線"
const string OPT_STY_D = "破線"
const string OPT_STY_DT = "点線"
const string OPT_GRID_NONE = "非表示"
const string OPT_GRID_Q4 = "4分割"
const string OPT_GRID_Q8 = "8分割"
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="ラベル配置位置", options=[OPT_POS_L, OPT_POS_C, OPT_POS_R], group=GRP_GENERAL)
i_offset_left = input.int(-1, title="左端のズレ調整 (バー数)", group=GRP_OFFSET)
i_offset_right = input.int(0, title="右端のズレ調整 (バー数)", group=GRP_OFFSET)
i_use_log = input.bool(true, title="対数(Log)スケールで計算 (※フィボナッチのみ適用)", group=GRP_CALC, tooltip="チャートを対数スケール(右下のlog)で表示している場合、チェックを入れると手動ツールと一致します。")
i_rev = input.bool(false, title="階層を反転 (Reverse)", group=GRP_CALC, tooltip="手動ツールと0.382や0.618の上下が逆になっている場合に使用してください。")
i_show_ret = input.bool(true, title="表示 (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="表示 (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="グリッド表示", options=[OPT_GRID_NONE, OPT_GRID_Q4, OPT_GRID_Q8], group=GRP_GRID)
i_col_q4 = input.color(color.aqua, title="4分割 カラー", 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="8分割 カラー", 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="カスタム 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="カスタム 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="カスタム 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】 免責・ライセンス
// ==============================================================================
// インジケーターを無料で公開しています: https://www.nk-report.com/p/jp-0_0810719344.html
//
// 免責事項: 本スクリプトは学習および情報提供のみを目的としており、投資助言ではありません。
//
// 1. 本コードは2026年時点の Pine Script v6 で動作確認を行っています。
// 将来の仕様変更に伴う不具合等について、個別のサポートや改修は行いません。
// 2. 本スクリプトは一般的な計算ロジックに基づき、LLMを用いて独自に作成したものです。
// MITライセンスに則っています。
// ------------------------------------------------------------------------------
// 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 = "▼ 基本設定"
const string GRP_OFFSET = "▼ 描画位置の微調整 (オフセット)"
const string GRP_CALC = "▼ 計算ロジック設定"
const string GRP_FIBO_RET = "▼ Fibo: リトレースメント"
const string GRP_FIBO_EXT = "▼ Fibo: エクステンション"
const string GRP_GRID = "▼ Quarters: 等分割グリッド"
const string GRP_FIBO_CUS = "▼ カスタムレベル"
const string LBL_TF = "基準期間"
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 OPT_POS_L = "左"
const string OPT_POS_C = "中央"
const string OPT_POS_R = "右"
const string OPT_STY_S = "実線"
const string OPT_STY_D = "破線"
const string OPT_STY_DT = "点線"
const string OPT_GRID_NONE = "非表示"
const string OPT_GRID_Q4 = "4分割"
const string OPT_GRID_Q8 = "8分割"
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="ラベル配置位置", options=[OPT_POS_L, OPT_POS_C, OPT_POS_R], group=GRP_GENERAL)
i_offset_left = input.int(-1, title="左端のズレ調整 (バー数換算)", group=GRP_OFFSET)
i_offset_right = input.int(0, title="右端のズレ調整 (バー数換算)", group=GRP_OFFSET)
i_use_log = input.bool(true, title="対数(Log)スケールで計算 (※フィボナッチのみ適用)", group=GRP_CALC, tooltip="チャートを対数スケール(右下のlog)で表示している場合、チェックを入れると手動ツールと一致します。")
i_rev = input.bool(false, title="階層を反転 (Reverse)", group=GRP_CALC, tooltip="手動ツールと0.382や0.618の上下が逆になっている場合に使用してください。")
i_show_ret = input.bool(true, title="表示 (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="表示 (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="グリッド表示", 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="4分割 カラー", 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="8分割 カラー", 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="カスタム 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="カスタム 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="カスタム 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)
※好みの配色に設定後、パラメータータブの「デフォルトを保存」を押してください。
※新規作成→インジケーター→ペーストする の順序で行わないと正しく表示されないことがあります。
