1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIエージェントで Pine Script を作ってみた

1
Last updated at Posted at 2026-05-20

AIエージェントで Pine Script を作ってみた

はじめに

前回の記事「AIエージェントを用いた開発(バッチ処理編)」では、AIエージェント向けに開発ルールを工程ごとに分割して運用する話を書きました。
今回は、そのルール(v6 / batch)を使って、実際に Pine Script を1本作ってみた結果を載せます。

題材はシンプルに、TradingView のチャート上に EMA を3本表示するインジケーター です。
作成物は sample/smaple.pine_v1.0/ および .document/ に置いてあるものを、そのまま全文掲載します。

Markdown 形式の作成物(要件定義・設計書・確認書)は、コードブロックではなく そのまま記述 しているため、プレビューで表や見出しとして表示されます。JSON と Pine Script はコードブロックで掲載します。

ルール本体のリポジトリはこちらです。

成果物一覧

手順 ファイル名 内容
1 smaple.pine_v1.0_1_request.md 要件定義書
2 smaple.pine_v1.0_2_base.md 基本設計書
3 smaple.pine_v1.0_3_base_confirm.md 基本設計書確認
4 smaple.pine_v1.0_4_detail.md 詳細設計書
4 smaple.pine_v1.0_4_detail.json 詳細設計JSON
5 smaple.pine_v1.0_5_detail.json 実装用JSON(確定版)
6 smaple.pine_v1.0.pine Pine Script コード
7 smaple.pine_v1.0_7_code_confirm.md コード確認
8 .document/仕様_差分_v1.0.md 仕様(差分)
8 .document/仕様_全体_v1.0.md 仕様(全体)
9 .document/仕様確認_v1.0.md 仕様確認

手順1: 要件定義書


smaple.pine v1.0 要件定義書

1. 目的・背景

[ADD] TradingView のチャート上に EMA を3本表示する Pine Script を作成します。

[ADD] 複数期間の EMA を同時に表示することで、短期・中期・長期のトレンドを視覚的に確認できるようにします。

2. 対象範囲

[ADD] 対象ファイルは smaple.pine とします。

[ADD] Pine Script として、チャート上に3本の EMA ラインを表示する処理を対象とします。

[ADD] EMA の期間、色、線幅をユーザーが設定できる入力項目を対象とします。

3. 対象外

[ADD] 売買シグナル、アラート条件、バックテスト用 strategy 処理は対象外とします。

[ADD] EMA 以外の移動平均線、マルチタイムフレーム取得、外部データ取得は対象外とします。

4. 入力要件

種別 内容 初期値
[ADD] 価格ソース EMA 計算に使用する価格 close
[ADD] EMA1期間 1本目の EMA 期間 20
[ADD] EMA2期間 2本目の EMA 期間 50
[ADD] EMA3期間 3本目の EMA 期間 200
[ADD] EMA1色 1本目の表示色 任意
[ADD] EMA2色 2本目の表示色 任意
[ADD] EMA3色 3本目の表示色 任意
[ADD] 線幅 EMA ラインの太さ 2

5. 出力要件

種別 内容
[ADD] チャート表示 EMA を3本、価格チャート上に重ねて表示します。
[ADD] ログ Pine Script の仕様上、実行ログ出力は対象外とします。
[ADD] エラー出力 コンパイルエラーが発生しないコードを作成します。

6. 実行要件

[ADD] TradingView の Pine Script エディタでコンパイルできることを前提とします。

[ADD] インジケーターとしてチャートへ追加したとき、価格チャート上に EMA が3本表示されることを完了条件とします。

[ADD] 再実行時も同じ入力値に対して同じ EMA が表示されることを前提とします。

7. 制約条件

[ADD] Pine Script を使用します。

[ADD] コード工程では .rules_v6/dev/rules_dev_other.md の Pine 追加ルールを参照します。

[ADD] ファイル名はユーザー指定どおり smaple.pine とします。

[ADD] 開発手順は v6 の batch ルールに沿って進めます。

8. 受入条件

  • [ADD] Pine Script エディタでコンパイルエラーが発生しないこと。
  • [ADD] チャート上に EMA が3本表示されること。
  • [ADD] EMA の期間をユーザーが変更できること。
  • [ADD] EMA の色をユーザーが変更できること。
  • [ADD] EMA の線幅をユーザーが変更できること。
  • [ADD] 売買シグナルやアラートなど、対象外機能が含まれていないこと。

9. 未決事項

[ADD] EMA の初期色は基本設計工程で決定します。

[ADD] Pine Script のバージョンは基本設計工程で決定します。


手順2: 基本設計書


smaple.pine v1.0 基本設計書

仕様継承テーブル

仕様ID 状態 変更内容 ソース元
S001 新規 Pine Script インジケーター定義を追加 v1.0_request
S002 新規 入力設定を追加 v1.0_request
S003 新規 EMA 計算処理を追加 v1.0_request
S004 新規 EMA 表示処理を追加 v1.0_request

1. 処理概要

[ADD] TradingView のチャート上に EMA を3本表示する Pine Script インジケーターを作成します。

[ADD] EMA の価格ソース、3本分の期間、色、線幅を入力設定として持たせます。

[ADD] 売買シグナル、アラート、バックテスト処理は実装しません。

2. 処理フロー

ID 内容
[ADD] S001 Pine Script v6 のインジケーターとして overlay=true で宣言します。
[ADD] S002 価格ソース、EMA1/EMA2/EMA3 の期間、色、線幅を入力として受け取ります。
[ADD] S003 入力された価格ソースと期間から、3本の EMA を算出します。
[ADD] S004 算出した EMA をチャート上へ3本のラインとして表示します。

3. 入力形式

項目 型 初期値 説明
[ADD] sourceInput series float close EMA 計算に使用する価格ソース
[ADD] ema1LengthInput int 20 EMA1 の期間
[ADD] ema2LengthInput int 50 EMA2 の期間
[ADD] ema3LengthInput int 200 EMA3 の期間
[ADD] ema1ColorInput color color.teal EMA1 の表示色
[ADD] ema2ColorInput color color.orange EMA2 の表示色
[ADD] ema3ColorInput color color.purple EMA3 の表示色
[ADD] lineWidthInput int 2 EMA ラインの太さ

4. 出力形式

項目 型 説明
[ADD] ema1Value series float EMA1 の表示値
[ADD] ema2Value series float EMA2 の表示値
[ADD] ema3Value series float EMA3 の表示値
[ADD] plot chart line チャート上に表示される EMA ライン

5. 設定

項目 値
[ADD] Pine Script version 6
[ADD] indicator title Sample 3 EMA
[ADD] overlay true
[ADD] max input length 1以上

6. 特記事項

[ADD] pine/.rules/pine_checklist.md はローカルに存在しないため、コード確認工程で未配置として記録します。

[ADD] TradingView エディタでの実コンパイルはローカル環境では実施できないため、静的確認と公式ドキュメント照合を実施します。

コンパイル・ダイジェスト

タグ 件数 内容(要約)
[ADD] 27 EMA 3本表示用の入力、計算、表示、制約を追加
[MOD] 0 なし
[DEL] 0 なし
[KEEP] 0 初版のためなし

手順3: 基本設計書確認


smaple.pine v1.0 基本設計書確認

確認対象

  • 対象ファイル: smaple.pine_v1.0_2_base.md
  • 参照ルール: .rules_v6/dev/batch/rules_batch_2_base.md, .rules_v6/dev/batch/rules_batch_3_base_confirm.md

1. 形式・構造チェック

  • ファイル命名は {filename}_v{n}.{m}_2_base.md の形式です。
  • 処理フローに S001 から S004 のユニークIDがあります。
  • 全項目に [ADD] タグがあります。
  • [ADD] は緑色装飾を併用しています。

2. 内容・論理チェック

  • 初版のため前バージョンからの継承対象はありません。
  • ユーザー依頼の「チャート上に EMA を3本表示」を反映しています。
  • 入力形式と出力形式は処理フローと整合しています。
  • 売買シグナル、アラート、バックテストは対象外として矛盾なく扱っています。

3. コンパイル・ダイジェスト確認

  • 集計表に [ADD], [MOD], [DEL], [KEEP] の件数があります。
  • 要約は今回の追加内容を表しています。

確認結果

項目 判定 備考
形式 OK 命名、ID、タグを確認
内容 OK 要件定義と対応
未確認 なし 基本設計工程としての未確認なし

基本設計完了。


手順4: 詳細設計書


smaple.pine v1.0 詳細設計書

S001 インジケーター定義

1. 処理概要

[ADD] [S001] Pine Script v6 のインジケーターとして、価格チャート上に重ねて表示するための宣言を行います。

2. メイン関数

[ADD] [F101] refreshEmaSeries は、EMA 算出の主処理を統括します。

3. 引数

ID 名称 型 説明
[ADD] [I101] sourceInput series float EMA 計算に使用する価格ソース
[ADD] [I102] ema1LengthInput int EMA1 の期間
[ADD] [I103] ema2LengthInput int EMA2 の期間
[ADD] [I104] ema3LengthInput int EMA3 の期間

4. 戻り値

ID 名称 型 説明
[ADD] [O101] ema1Value series float EMA1 の値
[ADD] [O102] ema2Value series float EMA2 の値
[ADD] [O103] ema3Value series float EMA3 の値

5. メイン変数

ID 名称 型 説明
[ADD] [V101] sourceInput series float 入力価格ソース

6. 処理フロー

  • [ADD] [L101] //@version=6 と indicator(..., overlay=true) を宣言します。 (S001)

7. 特記事項

[ADD] Pine Script の仕様上、インジケーター宣言はグローバルスコープに配置します。

S002 入力設定

1. 処理概要

[ADD] [S002] EMA 表示に必要な価格ソース、期間、色、線幅を入力として受け取ります。

2. メイン関数

[ADD] [F101] refreshEmaSeries が入力値を受け取って EMA 算出に使用します。

3. 引数

ID 名称 型 説明
[ADD] [I105] ema1ColorInput color EMA1 の表示色
[ADD] [I106] ema2ColorInput color EMA2 の表示色
[ADD] [I107] ema3ColorInput color EMA3 の表示色
[ADD] [I108] lineWidthInput int EMA ラインの太さ

4. 戻り値

ID 名称 型 説明
[ADD] [O104] inputSettings inputs TradingView 設定画面で編集可能な入力群

5. メイン変数

ID 名称 型 説明
[ADD] [V102] ema1LengthInput int EMA1 期間
[ADD] [V103] ema2LengthInput int EMA2 期間
[ADD] [V104] ema3LengthInput int EMA3 期間
[ADD] [V105] ema1ColorInput color EMA1 色
[ADD] [V106] ema2ColorInput color EMA2 色
[ADD] [V107] ema3ColorInput color EMA3 色
[ADD] [V108] lineWidthInput int 線幅

6. 処理フロー

  • [ADD] [L102] input.source, input.int, input.color で設定項目を定義します。 (S002)

7. 特記事項

[ADD] 期間と線幅は minval=1 を指定し、異常値入力を抑制します。

S003 EMA 計算

1. 処理概要

[ADD] [S003] 入力された価格ソースと期間から3本の EMA を計算します。

2. メイン関数

[ADD] [F101] refreshEmaSeries が3本分の EMA を返却します。

3. 引数

ID 名称 型 説明
[ADD] [I101] sourceInput series float EMA 計算に使用する価格ソース
[ADD] [I102] ema1LengthInput int EMA1 の期間
[ADD] [I103] ema2LengthInput int EMA2 の期間
[ADD] [I104] ema3LengthInput int EMA3 の期間

4. 戻り値

ID 名称 型 説明
[ADD] [O101] ema1Value series float EMA1 の値
[ADD] [O102] ema2Value series float EMA2 の値
[ADD] [O103] ema3Value series float EMA3 の値

5. メイン変数

ID 名称 型 説明
[ADD] [V109] ema1Value series float EMA1 計算結果
[ADD] [V110] ema2Value series float EMA2 計算結果
[ADD] [V111] ema3Value series float EMA3 計算結果

6. 処理フロー

  • [ADD] [L103] [T101] selectEmaValue を3回呼び出し、EMA1/EMA2/EMA3 を計算します。 (S003)

7. 特記事項

[ADD] [T101] selectEmaValue は ta.ema のラッパー関数です。

S004 EMA 表示

1. 処理概要

[ADD] [S004] 計算した EMA を3本のラインとしてチャート上に表示します。

2. メイン関数

[ADD] [F101] refreshEmaSeries の戻り値を plot に渡します。

3. 引数

ID 名称 型 説明
[ADD] [I105] ema1ColorInput color EMA1 の表示色
[ADD] [I106] ema2ColorInput color EMA2 の表示色
[ADD] [I107] ema3ColorInput color EMA3 の表示色
[ADD] [I108] lineWidthInput int EMA ラインの太さ

4. 戻り値

ID 名称 型 説明
[ADD] [O105] plotEma1 plot EMA1 ライン
[ADD] [O106] plotEma2 plot EMA2 ライン
[ADD] [O107] plotEma3 plot EMA3 ライン

5. メイン変数

ID 名称 型 説明
[ADD] [V109] ema1Value series float EMA1 表示値
[ADD] [V110] ema2Value series float EMA2 表示値
[ADD] [V111] ema3Value series float EMA3 表示値

6. 処理フロー

  • [ADD] [L104] plot を3回呼び出し、EMA1/EMA2/EMA3 を表示します。 (S004)

7. 特記事項

[ADD] plot は Pine Script の制約に従い、グローバルスコープで呼び出します。

補助関数

[ADD] [T101] selectEmaValue は、指定された価格ソースと期間から EMA を1本計算します。

コンパイル・ダイジェスト

タグ 件数 内容(要約)
[ADD] 54 S/L/F/T/I/O/V の全項目を新規追加
[MOD] 0 なし
[DEL] 0 なし
[KEEP] 0 初版のためなし

手順4: 詳細設計JSON

{
  "version": "1.0",
  "name": "smaple.pine",
  "summary": "TradingView のチャート上に EMA を3本表示する Pine Script インジケーターの詳細設計。",
  "steps": [
    {"id": "S001", "type": "ADD", "name": "indicatorDeclaration", "description": "Pine Script v6 のインジケーターとして overlay=true で宣言する。"},
    {"id": "S002", "type": "ADD", "name": "inputSettings", "description": "価格ソース、期間、色、線幅を入力として定義する。"},
    {"id": "S003", "type": "ADD", "name": "emaCalculation", "description": "3本の EMA を計算する。"},
    {"id": "S004", "type": "ADD", "name": "emaPlot", "description": "3本の EMA をチャート上に表示する。"}
  ],
  "features": [
    {"id": "L101", "sourceStepId": "S001", "type": "ADD", "summary": "Pine Script v6 とインジケーター宣言を行う。", "targetFunction": "global"},
    {"id": "L102", "sourceStepId": "S002", "type": "ADD", "summary": "入力設定を定義する。", "targetFunction": "global"},
    {"id": "L103", "sourceStepId": "S003", "type": "ADD", "summary": "selectEmaValue を使用して3本の EMA を計算する。", "targetFunction": "refreshEmaSeries"},
    {"id": "L104", "sourceStepId": "S004", "type": "ADD", "summary": "plot で3本の EMA を表示する。", "targetFunction": "global"}
  ],
  "functions": [
    {"id": "F101", "type": "ADD", "name": "refreshEmaSeries", "description": "3本分の EMA 算出を統括する主関数。", "arguments": ["I101", "I102", "I103", "I104"], "returns": ["O101", "O102", "O103"], "usedBy": ["L103"]},
    {"id": "T101", "type": "ADD", "name": "selectEmaValue", "description": "指定された価格ソースと期間から EMA を1本計算する補助関数。", "arguments": ["I101", "I102"], "returns": ["O101"], "usedBy": ["L103"]}
  ],
  "inputs": [
    {"id": "I101", "type": "ADD", "name": "sourceInput", "dataType": "series float", "description": "EMA 計算に使用する価格ソース。", "usedBy": ["F101", "T101"]},
    {"id": "I102", "type": "ADD", "name": "ema1LengthInput", "dataType": "int", "description": "EMA1 の期間。", "usedBy": ["F101", "T101"]},
    {"id": "I103", "type": "ADD", "name": "ema2LengthInput", "dataType": "int", "description": "EMA2 の期間。", "usedBy": ["F101"]},
    {"id": "I104", "type": "ADD", "name": "ema3LengthInput", "dataType": "int", "description": "EMA3 の期間。", "usedBy": ["F101"]},
    {"id": "I105", "type": "ADD", "name": "ema1ColorInput", "dataType": "color", "description": "EMA1 の表示色。", "usedBy": ["L104"]},
    {"id": "I106", "type": "ADD", "name": "ema2ColorInput", "dataType": "color", "description": "EMA2 の表示色。", "usedBy": ["L104"]},
    {"id": "I107", "type": "ADD", "name": "ema3ColorInput", "dataType": "color", "description": "EMA3 の表示色。", "usedBy": ["L104"]},
    {"id": "I108", "type": "ADD", "name": "lineWidthInput", "dataType": "int", "description": "EMA ラインの太さ。", "usedBy": ["L104"]}
  ],
  "outputs": [
    {"id": "O101", "type": "ADD", "name": "ema1Value", "dataType": "series float", "description": "EMA1 の値。", "usedBy": ["L103", "L104"]},
    {"id": "O102", "type": "ADD", "name": "ema2Value", "dataType": "series float", "description": "EMA2 の値。", "usedBy": ["L103", "L104"]},
    {"id": "O103", "type": "ADD", "name": "ema3Value", "dataType": "series float", "description": "EMA3 の値。", "usedBy": ["L103", "L104"]},
    {"id": "O104", "type": "ADD", "name": "inputSettings", "dataType": "inputs", "description": "TradingView 設定画面で編集可能な入力群。", "usedBy": ["L102"]},
    {"id": "O105", "type": "ADD", "name": "plotEma1", "dataType": "plot", "description": "EMA1 ライン。", "usedBy": ["L104"]},
    {"id": "O106", "type": "ADD", "name": "plotEma2", "dataType": "plot", "description": "EMA2 ライン。", "usedBy": ["L104"]},
    {"id": "O107", "type": "ADD", "name": "plotEma3", "dataType": "plot", "description": "EMA3 ライン。", "usedBy": ["L104"]}
  ],
  "variables": [
    {"id": "V101", "type": "ADD", "name": "sourceInput", "dataType": "series float", "description": "入力価格ソース。"},
    {"id": "V102", "type": "ADD", "name": "ema1LengthInput", "dataType": "int", "description": "EMA1 期間。"},
    {"id": "V103", "type": "ADD", "name": "ema2LengthInput", "dataType": "int", "description": "EMA2 期間。"},
    {"id": "V104", "type": "ADD", "name": "ema3LengthInput", "dataType": "int", "description": "EMA3 期間。"},
    {"id": "V105", "type": "ADD", "name": "ema1ColorInput", "dataType": "color", "description": "EMA1 色。"},
    {"id": "V106", "type": "ADD", "name": "ema2ColorInput", "dataType": "color", "description": "EMA2 色。"},
    {"id": "V107", "type": "ADD", "name": "ema3ColorInput", "dataType": "color", "description": "EMA3 色。"},
    {"id": "V108", "type": "ADD", "name": "lineWidthInput", "dataType": "int", "description": "線幅。"},
    {"id": "V109", "type": "ADD", "name": "ema1Value", "dataType": "series float", "description": "EMA1 計算結果。"},
    {"id": "V110", "type": "ADD", "name": "ema2Value", "dataType": "series float", "description": "EMA2 計算結果。"},
    {"id": "V111", "type": "ADD", "name": "ema3Value", "dataType": "series float", "description": "EMA3 計算結果。"}
  ],
  "constraints": [
    "Pine Script v6 を使用する。",
    "plot はグローバルスコープで呼び出す。",
    "期間と線幅は minval=1 とする。",
    "売買シグナル、アラート、strategy 処理は対象外とする。"
  ],
  "invariants": [
    "初版のため KEEP 対象なし。"
  ],
  "deleted_items": {
    "features": [],
    "functions": [],
    "inputs": [],
    "outputs": [],
    "variables": []
  }
}

手順5: 実装用JSON(確定版)

{
  "version": "1.0",
  "summary": "TradingView のチャート上に EMA を3本表示する Pine Script インジケーターを新規作成する。",
  "features": [
    {"id": "L101", "sourceStepId": "S001", "type": "ADD", "summary": "Pine Script v6 とインジケーター宣言を行う。", "targetFunction": "global"},
    {"id": "L102", "sourceStepId": "S002", "type": "ADD", "summary": "入力設定を定義する。", "targetFunction": "global"},
    {"id": "L103", "sourceStepId": "S003", "type": "ADD", "summary": "selectEmaValue を使用して3本の EMA を計算する。", "targetFunction": "refreshEmaSeries"},
    {"id": "L104", "sourceStepId": "S004", "type": "ADD", "summary": "plot で3本の EMA を表示する。", "targetFunction": "global"}
  ],
  "functions": [
    {"id": "F101", "type": "ADD", "name": "refreshEmaSeries", "description": "3本分の EMA 算出を統括する主関数。"},
    {"id": "T101", "type": "ADD", "name": "selectEmaValue", "description": "指定された価格ソースと期間から EMA を1本計算する補助関数。"}
  ],
  "inputs": [
    {"id": "I101", "type": "ADD", "name": "sourceInput", "dataType": "series float", "description": "EMA 計算に使用する価格ソース。"},
    {"id": "I102", "type": "ADD", "name": "ema1LengthInput", "dataType": "int", "description": "EMA1 の期間。"},
    {"id": "I103", "type": "ADD", "name": "ema2LengthInput", "dataType": "int", "description": "EMA2 の期間。"},
    {"id": "I104", "type": "ADD", "name": "ema3LengthInput", "dataType": "int", "description": "EMA3 の期間。"},
    {"id": "I105", "type": "ADD", "name": "ema1ColorInput", "dataType": "color", "description": "EMA1 の表示色。"},
    {"id": "I106", "type": "ADD", "name": "ema2ColorInput", "dataType": "color", "description": "EMA2 の表示色。"},
    {"id": "I107", "type": "ADD", "name": "ema3ColorInput", "dataType": "color", "description": "EMA3 の表示色。"},
    {"id": "I108", "type": "ADD", "name": "lineWidthInput", "dataType": "int", "description": "EMA ラインの太さ。"}
  ],
  "outputs": [
    {"id": "O101", "type": "ADD", "name": "ema1Value", "dataType": "series float", "description": "EMA1 の値。"},
    {"id": "O102", "type": "ADD", "name": "ema2Value", "dataType": "series float", "description": "EMA2 の値。"},
    {"id": "O103", "type": "ADD", "name": "ema3Value", "dataType": "series float", "description": "EMA3 の値。"},
    {"id": "O104", "type": "ADD", "name": "inputSettings", "dataType": "inputs", "description": "TradingView 設定画面で編集可能な入力群。"},
    {"id": "O105", "type": "ADD", "name": "plotEma1", "dataType": "plot", "description": "EMA1 ライン。"},
    {"id": "O106", "type": "ADD", "name": "plotEma2", "dataType": "plot", "description": "EMA2 ライン。"},
    {"id": "O107", "type": "ADD", "name": "plotEma3", "dataType": "plot", "description": "EMA3 ライン。"}
  ],
  "variables": [
    {"id": "V101", "type": "ADD", "name": "sourceInput", "dataType": "series float", "description": "入力価格ソース。"},
    {"id": "V102", "type": "ADD", "name": "ema1LengthInput", "dataType": "int", "description": "EMA1 期間。"},
    {"id": "V103", "type": "ADD", "name": "ema2LengthInput", "dataType": "int", "description": "EMA2 期間。"},
    {"id": "V104", "type": "ADD", "name": "ema3LengthInput", "dataType": "int", "description": "EMA3 期間。"},
    {"id": "V105", "type": "ADD", "name": "ema1ColorInput", "dataType": "color", "description": "EMA1 色。"},
    {"id": "V106", "type": "ADD", "name": "ema2ColorInput", "dataType": "color", "description": "EMA2 色。"},
    {"id": "V107", "type": "ADD", "name": "ema3ColorInput", "dataType": "color", "description": "EMA3 色。"},
    {"id": "V108", "type": "ADD", "name": "lineWidthInput", "dataType": "int", "description": "線幅。"},
    {"id": "V109", "type": "ADD", "name": "ema1Value", "dataType": "series float", "description": "EMA1 計算結果。"},
    {"id": "V110", "type": "ADD", "name": "ema2Value", "dataType": "series float", "description": "EMA2 計算結果。"},
    {"id": "V111", "type": "ADD", "name": "ema3Value", "dataType": "series float", "description": "EMA3 計算結果。"}
  ],
  "deleted_items": {
    "features": [],
    "functions": [],
    "inputs": [],
    "outputs": [],
    "variables": []
  },
  "constraints": [
    "Pine Script v6 を使用する。",
    "plot はグローバルスコープで呼び出す。",
    "期間と線幅は minval=1 とする。",
    "売買シグナル、アラート、strategy 処理は対象外とする。",
    "TradingView エディタでの実コンパイルはローカル環境では実施できない。"
  ],
  "invariants": [
    "初版のため KEEP 対象なし。"
  ]
}

手順6: Pine Script コード

//@version=6
// 更新日時: 2026/05/19
// 処理概要: [S001]-[S004] TradingView のチャート上に EMA を3本表示する。
// 前回バージョンとの違い:
// - [ADD]: EMA 3本表示インジケーターを新規追加
// - [MOD]: なし
// - [DEL]: なし
// [L101] Pine Script v6 とインジケーター宣言
indicator("Sample 3 EMA", shorttitle="3 EMA", overlay=true)

// [L102] 入力設定を定義
// [O104] TradingView 設定画面で編集可能な入力群
// [I101] [V101] EMA 計算に使用する価格ソース
sourceInput = input.source(close, "Source")

// [I102] [V102] EMA1 の期間
ema1LengthInput = input.int(20, "EMA 1 Length", minval=1)
// [I103] [V103] EMA2 の期間
ema2LengthInput = input.int(50, "EMA 2 Length", minval=1)
// [I104] [V104] EMA3 の期間
ema3LengthInput = input.int(200, "EMA 3 Length", minval=1)

// [I105] [V105] EMA1 の表示色
ema1ColorInput = input.color(color.teal, "EMA 1 Color")
// [I106] [V106] EMA2 の表示色
ema2ColorInput = input.color(color.orange, "EMA 2 Color")
// [I107] [V107] EMA3 の表示色
ema3ColorInput = input.color(color.purple, "EMA 3 Color")
// [I108] [V108] EMA ラインの太さ
lineWidthInput = input.int(2, "Line Width", minval=1)

// [T101] 指定された価格ソースと期間から EMA を1本計算する補助関数
selectEmaValue(sourceValue, lengthValue) =>
    ta.ema(sourceValue, lengthValue)

// [F101] 3本分の EMA 算出を統括する主関数
refreshEmaSeries(sourceValue, ema1LengthValue, ema2LengthValue, ema3LengthValue) =>
    // [L103] selectEmaValue を使用して3本の EMA を計算
    // [O101] [V109] EMA1 の値
    ema1ValueLocal = selectEmaValue(sourceValue, ema1LengthValue)
    // [O102] [V110] EMA2 の値
    ema2ValueLocal = selectEmaValue(sourceValue, ema2LengthValue)
    // [O103] [V111] EMA3 の値
    ema3ValueLocal = selectEmaValue(sourceValue, ema3LengthValue)
    [ema1ValueLocal, ema2ValueLocal, ema3ValueLocal]

// [O101] [O102] [O103] [V109] [V110] [V111] 3本分の EMA 値
[ema1Value, ema2Value, ema3Value] = refreshEmaSeries(sourceInput, ema1LengthInput, ema2LengthInput, ema3LengthInput)

// [L104] plot で3本の EMA を表示
// [O105] EMA1 ライン
plot(ema1Value, title="EMA 1", color=ema1ColorInput, linewidth=lineWidthInput)
// [O106] EMA2 ライン
plot(ema2Value, title="EMA 2", color=ema2ColorInput, linewidth=lineWidthInput)
// [O107] EMA3 ライン
plot(ema3Value, title="EMA 3", color=ema3ColorInput, linewidth=lineWidthInput)

手順7: コード確認


smaple.pine v1.0 コード確認

確認対象

  • コード: smaple.pine_v1.0.pine
  • 実装用JSON: smaple.pine_v1.0_5_detail.json
  • 参照ルール: .rules_v6/dev/batch/rules_batch_6_code.md, .rules_v6/dev/batch/rules_batch_7_code_confirm.md

プレ・フライト・チェック

ターゲットJSONのバージョン: 1.0

実装対象:

ID 種別 実装ファイル 実装箇所
L101 ADD smaple.pine_v1.0.pine indicator 宣言
L102 ADD smaple.pine_v1.0.pine 入力設定
L103 ADD smaple.pine_v1.0.pine refreshEmaSeries
L104 ADD smaple.pine_v1.0.pine plot
F101 ADD smaple.pine_v1.0.pine refreshEmaSeries
T101 ADD smaple.pine_v1.0.pine selectEmaValue
I101-I108 ADD smaple.pine_v1.0.pine 入力定義、関数引数
O101-O107 ADD smaple.pine_v1.0.pine EMA 値、plot
V101-V111 ADD smaple.pine_v1.0.pine 入力変数、EMA 値

1. トレーサビリティ・チェック

  • 実装用JSON内の [ADD] ID をコードコメントとして記述しています。
  • F101 と T101 は同一関数に併記していません。
  • コード内の関数定義には F101 または T101 を割り当てています。
  • 詳細設計にない売買シグナル、アラート、strategy 処理は追加していません。
  • 初版のため KEEP 保護対象はありません。

2. 品質・仕様チェック

  • JSON の機能、入力、出力、変数をコードへ反映しています。
  • 入力形式と出力形式は基本設計と整合しています。
  • 関数名、変数名はキャメルケースです。
  • PowerShell スクリプトではないため UTF-8 with BOM 要件の対象外です。

3. 動作検証

  • TradingView 公式ドキュメントで Pine Script v6 の indicator, input, plot, ta.ema の使用例を確認しました。
  • request.*() は使用していません。
  • 分岐内タプル代入は使用していません。
  • := による再代入は使用していません。
  • TradingView Pine Script エディタでの実コンパイルは未実施です。

Pine 追加ルール確認

項目 判定 備考
pine/.rules/pine_checklist.md 確認 保留 ローカルにファイルが存在しませんでした。
pine/.rules/pine_checklist_log.md 記録 保留 親フォルダとチェックリストが未配置のため作成していません。
:= 確認 OK 未使用
分岐内タプル代入 OK 未使用
request.*() 件数 OK 0件
external elements OK 外部要素なし

F/T割当確認レポート

検証項目 件数 判定 備考
named function 総数 2 OK selectEmaValue, refreshEmaSeries
[Fxxx] 割当 1 OK refreshEmaSeries
[Txxx] 割当 1 OK selectEmaValue
F/T両方併記 0 OK 問題なし
F/T未割当 0 OK 問題なし
ID重複 0 OK 問題なし

最終判定レポート

検証項目 判定 備考
設計IDの一致 (Traceability) OK JSON ID とコードコメントを照合
JSON仕様の網羅 (Coverage) OK 実装範囲を網羅
不変領域の維持 (Invariants) OK 初版のため KEEP 対象なし
動作確認 (Execution) 保留 TradingView エディタでの実コンパイルは未実施

総合判定: 保留

未確認事項

  • TradingView Pine Script エディタでのコンパイル確認。
  • pine/.rules/pine_checklist.md が未配置である点の扱い。

手順8: 仕様(差分)


仕様_差分_v1.0

1. 差分概要

[ADD] smaple.pine v1.0 として、TradingView チャート上に EMA を3本表示する Pine Script インジケーターを新規追加しました。

2. 追加仕様

項目 内容
[ADD] 表示対象 EMA 3本
[ADD] 実行環境 TradingView Pine Script v6
[ADD] 表示位置 価格チャート上
[ADD] 入力 価格ソース、EMA1/EMA2/EMA3 期間、各色、線幅
[ADD] 出力 EMA1/EMA2/EMA3 の plot ライン

3. 対象外仕様

[ADD] 売買シグナル、アラート、バックテスト用 strategy 処理、外部データ取得は対象外です。

4. 実装結果

[ADD] sample/smaple.pine_v1.0/smaple.pine_v1.0.pine に Pine Script を作成しました。

[ADD] TradingView 公式ドキュメントに基づき、//@version=6, indicator, input.source, input.int, input.color, ta.ema, plot を使用しています。

5. 未確認事項

[ADD] TradingView Pine Script エディタでの実コンパイルは未実施です。

[ADD] Pine 追加ルールが参照を要求する pine/.rules/pine_checklist.md はローカルに存在しませんでした。


手順8: 仕様(全体)


仕様_全体_v1.0

1. 概要

smaple.pine は、TradingView の価格チャート上に EMA を3本表示する Pine Script インジケーターです。

2. 目的

短期・中期・長期の EMA を同一チャート上に表示し、トレンドの方向や価格との位置関係を視覚的に確認できるようにします。

3. 対象範囲

項目 内容
対象ファイル smaple.pine
実装ファイル sample/smaple.pine_v1.0/smaple.pine_v1.0.pine
実行環境 TradingView Pine Script v6
表示対象 EMA 3本

4. 機能仕様

機能 内容
インジケーター表示 overlay=true により価格チャート上へ表示します。
EMA1表示 初期期間20の EMA を表示します。
EMA2表示 初期期間50の EMA を表示します。
EMA3表示 初期期間200の EMA を表示します。
入力変更 価格ソース、期間、色、線幅をユーザーが変更できます。

5. 入力仕様

入力 型 初期値 説明
Source series float close EMA 計算に使用する価格ソース
EMA 1 Length int 20 EMA1 の期間
EMA 2 Length int 50 EMA2 の期間
EMA 3 Length int 200 EMA3 の期間
EMA 1 Color color color.teal EMA1 の色
EMA 2 Color color color.orange EMA2 の色
EMA 3 Color color color.purple EMA3 の色
Line Width int 2 EMA ラインの太さ

6. 出力仕様

出力 内容
EMA 1 EMA1 のラインをチャートへ表示します。
EMA 2 EMA2 のラインをチャートへ表示します。
EMA 3 EMA3 のラインをチャートへ表示します。

7. 対象外

売買シグナル、アラート条件、バックテスト用 strategy 処理、マルチタイムフレーム取得、外部データ取得は対象外です。

8. エラー処理・制約

期間と線幅は minval=1 とし、0以下の値を入力できないようにします。

TradingView Pine Script エディタでの実コンパイルはローカル環境では未実施です。

9. 運用・確認方法

TradingView の Pine Script エディタにコードを貼り付け、コンパイル後にチャートへ追加して EMA が3本表示されることを確認します。

10. 既知の注意点

pine/.rules/pine_checklist.md はローカルに存在しなかったため、Pine 追加ルールのチェックリスト参照とログ記録は保留です。


手順9: 仕様確認


仕様確認_v1.0

確認対象

  • .document/仕様_差分_v1.0.md
  • .document/仕様_全体_v1.0.md
  • sample/smaple.pine_v1.0/smaple.pine_v1.0_7_code_confirm.md

1. ファイル確認

  • .document/仕様_差分_v1.0.md が存在します。
  • .document/仕様_全体_v1.0.md が存在します。
  • 仕様書はコードファイル別フォルダではなく、プロジェクト直下 .document にあります。
  • v1.0 のため前バージョンの全体仕様は存在しません。

2. 差分仕様チェック

  • v1.0 の新規追加仕様として差分を記述しています。
  • 追加仕様と対象外仕様を区別しています。
  • 手順1〜7で決定・実装した変更点を含めています。
  • TradingView エディタでの実コンパイル未実施を明記しています。

3. 全体仕様チェック

  • 全体仕様は差分要約ではなく、目的、範囲、機能、入力、出力、制約、確認方法を含みます。
  • v1.0 のため前バージョン全文コピーは対象外です。
  • 差分仕様と全体仕様に矛盾はありません。

4. 章構成比較

v1.0 の初版のため、前バージョンとの章構成比較は対象外です。

5. 内容継承チェック

v1.0 の初版のため、前バージョンからの継承対象はありません。

6. 実装結果との照合

  • コード確認結果を仕様に反映しています。
  • 実装済み内容を未実装とは記述していません。
  • 未実施の TradingView エディタ確認を未実施として明記しています。

7. 最終判定

項目 判定 備考
差分仕様 OK v1.0 新規追加として妥当
全体仕様 OK 初版の全体仕様として必要項目あり
実装結果との対応 OK 未実施事項も明記
残課題 保留 TradingView 実コンパイル、Pine チェックリスト未配置

総合判定: 保留


おわりに

要件定義から仕様確認まで、工程ごとにファイルが分かれて出力されました。
題材は EMA 3本表示と小さめですが、設計ID(S001、L101、F101 など)がコードコメントまで引き継がれている点が、この運用の特徴です。

サンプル一式はリポジトリの sample/smaple.pine_v1.0/ にあり、仕様書は .document/ にあります。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?