2026/04/20

1-4. NK-Fixed Multi MA

This is a Multi MA equipped with a feature that allows you to adjust when to start real-time drawing, anywhere from 0 seconds to 5 minutes before the candle closes. It also includes other useful features.


[Multi MA]

While a single moving average is a "line" over a specific period, a Multi MA plots multiple moving averages of varying periods (e.g., short-term, medium-term, and long-term) or different types (e.g., SMA and EMA) simultaneously, allowing you to capture them as a "surface." It is used to analyze aspects such as the "spacing" and "alignment" between the lines.


Example of Multi MA displayed on TradingView
Source: TradingView

[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-Fixed Multi MA", shorttitle="NK-Fixed Multi MA", 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設定と言語
// ==============================================================================
// 1. 言語辞書の定義(テキストの定数化)

const string GRP_FIXED   = "Fixed Settings"
const string LBL_SEC     = "Real-time Draw Start (X seconds before bar closes)"
const string TT_SEC      = "Adjust between 0 and 300 seconds (5 mins). Hides drawings on the current bar until the specified time (e.g., 10 secs before close) is reached.\nEntering 0 disables this feature and draws in real-time constantly."

const string GRP_MA      = "Multi MA Settings"
const string LBL_MA1     = "MA 1"
const string LBL_MA2     = "MA 2"
const string LBL_MA3     = "MA 3"
const string LBL_MA4     = "MA 4"
const string LBL_WIDTH   = "Width"

// 2. UI(ユーザー入力画面)の構築 & 3. トップダウン処理への適合

i_sec    = input.int(0, title=LBL_SEC, minval=0, maxval=300, group=GRP_FIXED, tooltip=TT_SEC)

// MA 1 (色指定: 10-2 に対応)
i_ma1_show = input.bool(true, title=LBL_MA1, group=GRP_MA, inline="MA1_A")
i_ma1_type = input.string("SMA", title="", options=["SMA", "EMA", "WMA"], group=GRP_MA, inline="MA1_A")
i_ma1_len  = input.int(20, title="", minval=1, group=GRP_MA, inline="MA1_A")
i_ma1_src  = input.source(close, title="", group=GRP_MA, inline="MA1_A")
i_ma1_col  = input.color(color.purple, title="", group=GRP_MA, inline="MA1_B")
i_ma1_wid  = input.int(2, title=LBL_WIDTH, minval=1, maxval=5, group=GRP_MA, inline="MA1_B")

// MA 2 (色指定: 2-2 に対応)
i_ma2_show = input.bool(true, title=LBL_MA2, group=GRP_MA, inline="MA2_A")
i_ma2_type = input.string("SMA", title="", options=["SMA", "EMA", "WMA"], group=GRP_MA, inline="MA2_A")
i_ma2_len  = input.int(50, title="", minval=1, group=GRP_MA, inline="MA2_A")
i_ma2_src  = input.source(close, title="", group=GRP_MA, inline="MA2_A")
i_ma2_col  = input.color(color.orange, title="", group=GRP_MA, inline="MA2_B")
i_ma2_wid  = input.int(2, title=LBL_WIDTH, minval=1, maxval=5, group=GRP_MA, inline="MA2_B")

// MA 3 (色指定: 4-7 に対応)
i_ma3_show = input.bool(true, title=LBL_MA3, group=GRP_MA, inline="MA3_A")
i_ma3_type = input.string("SMA", title="", options=["SMA", "EMA", "WMA"], group=GRP_MA, inline="MA3_A")
i_ma3_len  = input.int(100, title="", minval=1, group=GRP_MA, inline="MA3_A")
i_ma3_src  = input.source(close, title="", group=GRP_MA, inline="MA3_A")
i_ma3_col  = input.color(color.green, title="", group=GRP_MA, inline="MA3_B")
i_ma3_wid  = input.int(2, title=LBL_WIDTH, minval=1, maxval=5, group=GRP_MA, inline="MA3_B")

// MA 4 (色指定: 7-7 に対応)
i_ma4_show = input.bool(true, title=LBL_MA4, group=GRP_MA, inline="MA4_A")
i_ma4_type = input.string("SMA", title="", options=["SMA", "EMA", "WMA"], group=GRP_MA, inline="MA4_A")
i_ma4_len  = input.int(200, title="", minval=1, group=GRP_MA, inline="MA4_A")
i_ma4_src  = input.source(close, title="", group=GRP_MA, inline="MA4_A")
i_ma4_col  = input.color(color.blue, title="", group=GRP_MA, inline="MA4_B")
i_ma4_wid  = input.int(2, title=LBL_WIDTH, minval=1, maxval=5, group=GRP_MA, inline="MA4_B")


// ==============================================================================
// 【03】 全コード共通仕様(タイムゾーン・時間インフラ処理)
// ==============================================================================
// 1. 基本時間単位のシステム定義(定数化)
const int MS_PER_SEC  = 1000

// ==============================================================================
// 【04】 各カテゴリ共通仕様 (NK-Fixed Core Logic)
// ==============================================================================
// 1. カテゴリ固有のインフラ構築(コア機能の定義)
bool is_draw_ready = true

if barstate.isrealtime and i_sec > 0
    if not na(time_close)
        int time_left_ms = time_close - timenow
        int threshold_ms = i_sec * MS_PER_SEC
        
        if time_left_ms > threshold_ms
            is_draw_ready := false


// ==============================================================================
// 【05】 このコード固有の計算仕様 (Specific Indicator Logic)
// ==============================================================================
// 1. インジケーター固有の純粋な数学的処理
// 各MAのタイプ(SMA/EMA/WMA)に応じて計算を切り替える関数
f_calc_ma(type_str, src_val, len_val) =>
    float res = na
    switch type_str
        "SMA" => res := ta.sma(src_val, len_val)
        "EMA" => res := ta.ema(src_val, len_val)
        "WMA" => res := ta.wma(src_val, len_val)
    res

float calc_ma1 = f_calc_ma(i_ma1_type, i_ma1_src, i_ma1_len)
float calc_ma2 = f_calc_ma(i_ma2_type, i_ma2_src, i_ma2_len)
float calc_ma3 = f_calc_ma(i_ma3_type, i_ma3_src, i_ma3_len)
float calc_ma4 = f_calc_ma(i_ma4_type, i_ma4_src, i_ma4_len)

// 3. 視覚的装飾の排除とデータの引き渡し
// ユーザーの表示チェック(i_maX_show)と描画フラグ(is_draw_ready)の両方を満たす場合のみデータを渡す
float final_ma1 = (i_ma1_show and is_draw_ready) ? calc_ma1 : na
float final_ma2 = (i_ma2_show and is_draw_ready) ? calc_ma2 : na
float final_ma3 = (i_ma3_show and is_draw_ready) ? calc_ma3 : na
float final_ma4 = (i_ma4_show and is_draw_ready) ? calc_ma4 : na


// ==============================================================================
// 【06】 描画と出力 (Rendering & Outputs)
// ==============================================================================
// 1. チャートへの視覚的出力(プロットと装飾)
plot(final_ma1, title="MA 1", color=i_ma1_col, linewidth=i_ma1_wid, style=plot.style_line)
plot(final_ma2, title="MA 2", color=i_ma2_col, linewidth=i_ma2_wid, style=plot.style_line)
plot(final_ma3, title="MA 3", color=i_ma3_col, linewidth=i_ma3_wid, style=plot.style_line)
plot(final_ma4, title="MA 4", color=i_ma4_col, linewidth=i_ma4_wid, style=plot.style_line)

// 3. アラート(通知)条件の統合
// Multi MAならではの機能として、代表的な「MA 1とMA 2のクロス」を通知条件に設定
bool ma_cross_over  = ta.crossover(calc_ma1, calc_ma2) and is_draw_ready
bool ma_cross_under = ta.crossunder(calc_ma1, calc_ma2) and is_draw_ready

alertcondition(ma_cross_over,  title="MA1 Cross Over MA2",  message="NK-Fixed Multi MA: MA 1 crossed over MA 2")
alertcondition(ma_cross_under, title="MA1 Cross Under MA2", message="NK-Fixed Multi MA: MA 1 crossed under MA 2")

* 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.