見出し画像

【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

ライセンス

  • ユーザマニュアルには以下と記載されています

オープンソース スクリプトを TradingView で公開する場合 (スクリプトは非公開で公開することもできます)、オープンソース コードはデフォルトで Mozilla ライセンスによって保護されます。他の任意のライセンスを選択することもできます。
これらのスクリプトからのコードの再利用は 、著者のライセンスを優先するスクリプト公開に関するハウス ルールによって管理されます。

https://www.tradingview.com/pine-script-docs/welcome/

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”(任意)ライブラリ名

【お役立ち情報】
TradingView公式が提供しているライブラリはこちら。
誰でも使えるので自作のPine Scriptにimportして使用できます。
2024/12現在、versionは9が最新。
ちょいちょい追加機能、Bug fix等されているから最新のversion使いましょうね。🐤
※ここでのversionは、ライブラリのバージョンのこと。Pineそのもののバージョンじゃないからね。

ta by TradingView — Pine Script™ Editor

インデントとフォーマット

  • インデント
    スペース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)

以上


いいなと思ったら応援しよう!