2026/04/20

1-2. NK-Fixed EMA

「足が閉じる何秒前にリアルタイム描画を開始するか、0秒から5分の間で調節できる」機能が付いたEMAです。その他あった方が良い機能も付けています。

[EMA]

EMAは、SMA(単純移動平均線)の弱点である「遅行性(反応のラグ)」を克服するために開発されたインジケーターです。過去のデータすべてを平等に扱うSMAとは異なり、「直近の価格データに最も大きな比重(重み)を置き、過去に遡るにつれてその比重を指数関数的に減衰させる」という計算を行います。


TradingViewでのEMA表示例
出典: TradingView



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

const string GRP_FIXED   = "▼ 描画制御 (Fixed Settings)"
const string LBL_SEC     = "リアルタイム描画開始 (足が閉じるX秒前)"
const string TT_SEC      = "0秒から300秒(5分)の間で調節。指定時間(例:10秒前)になるまで、現在の足への描画を非表示にします。\n0秒と入力した場合は非表示機能を無効化し、常にリアルタイムで描画します。"

const string GRP_EMA     = "▼ EMA設定 (EMA Settings)"
const string LBL_LEN     = "期間 (Length)"
const string LBL_SRC     = "ソース (Source)"
const string LBL_COLOR   = "ラインの色 (Color)"
const string LBL_WIDTH   = "ラインの太さ (Width)"

// 2. UI(ユーザー入力画面)の構築 & 3. トップダウン処理への適合
// ※Pine Script v6のコンパイルエラーを防ぐため、入力値の型(string/int等)は記述せず自動推論させます

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

i_len    = input.int(20, title=LBL_LEN, minval=1, group=GRP_EMA,  inline="EMA1")
i_src    = input.source(close, title=LBL_SRC, group=GRP_EMA, inline="EMA1")

i_color  = input.color(color.blue, title=LBL_COLOR, group=GRP_EMA, inline="EMA2")
i_width  = input.int(2, title=LBL_WIDTH, minval=1, maxval=5, group=GRP_EMA, inline="EMA2")


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

// ==============================================================================
// 【04】 各カテゴリ共通仕様 (NK-Fixed Core Logic)
// ==============================================================================
// 1. カテゴリ固有のインフラ構築(コア機能の定義)
// 「足が閉じる指定秒数前になるまでリアルタイム描画を非表示にする」というFixed固有の判定ロジック

bool is_draw_ready = true

// リアルタイム足であり、かつユーザーが0秒より大きい数値を設定している場合のみ処理
if barstate.isrealtime and i_sec > 0
    // 特殊チャート(練行足など)で time_close が na になる場合のエラークラッシュを回避
    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. インジケーター固有の純粋な数学的処理
// 現在のチャート(純正データ)のみを使用し、リペイント(架空の数値)を完全に排除した純粋な計算
float calc_val = ta.ema(i_src, i_len)

// 2. ロジックの完全な隔離と差し替えの容易性

// 3. 視覚的装飾の排除とデータの引き渡し
// 描画フラグ(is_draw_ready)に基づき、表示させないタイミングでは純粋なデータに「na(欠損値)」を代入して引き渡す
float final_val = is_draw_ready ? calc_val : na


// ==============================================================================
// 【06】 描画と出力 (Rendering & Outputs)
// ==============================================================================
// 1. チャートへの視覚的出力(プロットと装飾)
plot(final_val, title="NK-Fixed EMA", color=i_color, linewidth=i_width, style=plot.style_line)

// 2. ロジックとデザインの完全分離

// 3. アラート(通知)条件の統合
// ※投資助言を回避するため、方向性を指示する言葉(Buy/Sell等)は使わず、純粋な事実・状態のみを通知します
bool cross_over  = ta.crossover(close, calc_val) and is_draw_ready
bool cross_under = ta.crossunder(close, calc_val) and is_draw_ready

alertcondition(cross_over,  title="EMA Cross Over",  message="Price crossed over NK-Fixed EMA")
alertcondition(cross_under, title="EMA Cross Under", message="Price crossed under NK-Fixed EMA")

※好みの配色に設定後、パラメータータブの「デフォルトを保存」を押してください。
※新規作成→インジケーター→ペーストする の順序で行わないと正しく表示されないことがあります。