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.mdsample/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/ にあります。