【Pine Script】 コーディング規約
Pineプログラマーの皆さん、こんにちわぁ。
ここに自分用のアウトプットとしてPine Scriptの規約を記載します。
読みやすいスクリプトの作成を心がけましょう。
チームで作る場合は、参考にしてね。今のところ無料です。💸
※Pine Scritpは、TradingView社が提供するインジケーターやストラテジー(トレードロジック)を作成するためのプログラミング言語です。
※これが正解というものではありません。
※「こんなん当然だよ」とか「知っている」とか言う人は、時間の無駄なので読まなくて結構です。
2024/12/26 第1版 完
命名規則
変数名
スネークケースまたは キャメルケースを使用。
意味のある名前を付け、略語は避ける。
fastLength = 12
slowLength = 26
関数名
キャメルケースを使用。
動作を表す動詞から始める。
calculateEMA(src, length) =>
ta.ema(src, length)
定数
大文字のスネークケースを使用。
const float MAX_PRICE = 100.0
const int LOOKBACK_PERIOD = 14
ライセンス
ユーザマニュアルには以下と記載されています
Mozilla ライセンスがなんなのかとか、ハウスルールって何とかは自分で調べてみましょう。これ、すごく大切だけど案外軽視されるところ。
超意訳すると常識持ってやれよってことです。人のスクリプトをパクって商売し…何でもないです。🤗
バージョン宣言
Pine Script のバージョンを定義。
コードに記載しない場合は、v1 が使用されるが可能な限り最新のバージョンを定義しましょう。古いバージョンはバグややれることが少ないです。
2022/08付けてでは、version 5が最新なので以下のように記載。
//@version=5
スクリプトタイプの明示
indicator や strategy を使用してスクリプトの種類を明示する。
indicator("My Indicator", overlay=true)
インポートステートメント
プログラミング言語のJavaとかC言語(こっちは<include>がインポートと同じ)知っている人はすぐわかる。別ファイルに記載のスクリプトを取り込むよ~ってこと。そしたらそのスクリプトに定義したメソッドが使えるよ~ってこと。いろんなスクリプトで共有して利用できるね~。(言い方がうざい)
ただ無料プラン利用者(私のこと)は、インポートするライブラリ(共通関数)は作成できない仕様。。😑
なので、1つのスクリプトファイルに処理を全部書き込まないといけへん。
import <username>/<libraryName>/<libraryVersion> [as <alias>]
<username>/<libraryName>/<libraryVersion> パスはライブラリを一意に識別します。
<libraryVersion> は明示的に指定する必要があります。ライブラリを使用するスクリプトの信頼性を確保するために、最新バージョンのライブラリを自動的に使用することはできません。ライブラリの作成者がライブラリの更新を公開するたびに、ライブラリのバージョン番号が増加します。最新バージョンのライブラリを使用する場合は、 import ステートメントで <libraryVersion> 値を更新する必要があります。
as <alias>はオプションです。ライブラリの関数を参照する名前空間が定義されます。以下の例のようにエイリアスを使用してライブラリをインポートすると、そのライブラリの関数として参照されます。
<function_name>()。エイリアスが定義されていない場合は、ライブラリの名前が名前空間になります。
ここでは”function_name”(任意)がライブラリ名
インデントとフォーマット
インデント
スペース4つまたはタブ1つを使用して階層を示す。改行と空白
演算子の前後にスペースを入れる。
セミコロンの後は改行しない。
emaFast = ta.ema(close, fastLength)
emaSlow = ta.ema(close, slowLength)
行の長さ
一行あたり80〜120文字以内に収める。
長くなる場合は適切に改行する。
コメント
単一行コメント
// を使用し、コードの上または横に記述。
// 短期EMAの計算
emaFast = ta.ema(close, fastLength)
ブロックコメント
/*
* このインジケーターは
* 短期と長期のEMAを表示します。
*/
ドキュメンテーションコメント
関数の説明やパラメータを明示する。
/**
* EMAを計算する関数
* @param src データソース
* @param length 期間
* @return 計算されたEMA
*/
calculateEMA(src, length) =>
ta.ema(src, length)
コード構造と整理
コードを論理的なブロックに分け、各セクションに見出しコメントを付けます。
//@version=5
indicator("インジケーター名", overlay=true)
//========= 定数定義 =========//
const int MAX_PERIOD = 100
//========= 入力の定義 =========//
length = input.int(14, minval=1, title="RSIの期間")
//========= 関数定義 =========//
getMovingAverage(source, length) =>
ta.sma(source, length)
//========= メイン処理 =========//
ma = getMovingAverage(close, length)
//========= プロット =========//
plot(ma, title="移動平均線", color=color.blue)
ベストプラクティス
エラーハンドリング
Null値、データ不整合(ゼロ除算、範囲外値へのアクセス)の処理:na()、nz()、runtime()でNull値を適切に処理します。
if na(close)
close[1] // NAの場合の代替値
if (length <= 0)
runtime.error("期間は1以上必要です")
パフォーマンス最適化
計算の最適化:重複する計算は変数に保存し、再利用します。
float rsiValue = ta.rsi(close, 14)
plot(rsiValue)
関数モジュール化
コードの再利用: 同じロジックを複数箇所で使用する場合は、関数を活用します。
calculate_ma(source, length) =>
ta.sma(source, length)
以上