Pine Scriptのコードの先頭に、
`import`という行を見かけたことはありませんか。
「MQLの#includeと同じようなものだろう」と、
思ったことはありませんか。
実は、仕組みそのものがまったく違います。
既刊mqh-include-organize-mql4.mdでは、
MQLの#includeで関数を.mqhファイルに切り出す方法を解説しました。
この記事では、Pine Scriptのlibrary()・export・importを、
この既刊記事と対比しながら解説します。
・library()・export・importの基本的な書式
・MQLの#includeとの決定的な違い
・コピー&貼り付け vs 公開スクリプトの取り込み
・exportを付けないと使えない理由
・リスク%ロット計算ロジックをライブラリ化する実装例
library()・export・importの基本とMQLの対応
まず、それぞれの基本的な書式を確認します。
Pine Scriptのlibrary()・export・importの書式
// ライブラリ側のスクリプト
//@version=6
library("RiskHelpers")
export riskLotSize(float balance, float riskPercent, float slPoints, float pointValue) =>
riskAmount = balance * riskPercent / 100
lot = riskAmount / (slPoints * pointValue)
lot
library()でこのスクリプト自体がライブラリであることを宣言し、
exportを付けた関数だけが外部から利用可能になります。
MQLでは#includeで.mqhファイルをそのまま展開する
#include <RiskHelpers.mqh> double lot = RiskLotSize(AccountBalance(), 2.0, 300, MarketInfo(Symbol(), MODE_TICKVALUE));
既刊mqh-include-organize-mql4.mdのとおり、
MQLの#includeは、指定したファイルの中身を、
コンパイル時にその場へそのまま貼り付けるだけの仕組みです。
最大の違い: コピー&貼り付け vs 公開スクリプトの取り込み
ここが、MQLユーザーが最初に戸惑うポイントです。
MQLの#includeはローカルファイルの文字どおりの展開
・.mqhファイルはMetaEditorのIncludeフォルダ等に物理的に置く必要がある
・#includeはプリプロセッサ命令で、実行時ではなくコンパイル前に展開される
・バージョン管理の仕組みは言語側になく、ファイルを直接上書きして更新する
Pine Scriptのimportは一度公開されたスクリプトを参照する
Pine Scriptのライブラリは、
TradingView上で一度「公開」する必要があります。
import文は、
`import ユーザー名/ライブラリ名/バージョン番号 as 別名`
の形式で、
公開済みのライブラリをバージョン番号ごとに指定して取り込みます。
・importが指すのは自分のPC内のファイルではない
・TradingView上に公開済みのスクリプトを指す
・バージョン番号を変えずに取り込めば
・ライブラリ側を更新しても、呼び出し側は古い版を使い続けられる
・MQLの#includeには、このようなバージョン固定の仕組みが存在しない
もう一つの違い: exportを付けないと外部から使えない
ここが、この記事で最も伝えたいポイントです。
Pine Scriptはexportで公開範囲を制御する
exportを付けていない関数・型・変数は、
ライブラリの内部だけで使える非公開の扱いになります。
公開したい関数・UDT・enum・定数だけに、
明示的にexportを付ける設計です。
MQLの#includeには公開範囲という概念がない
既刊mqh-include-organize-mql4.mdのとおり、
MQLの#includeは、ファイルの中身を丸ごと展開するため、
その.mqhファイル内の関数・変数はすべて呼び出し側から見える状態になります。
意図せず名前が衝突しない限り、
公開・非公開を分ける仕組み自体がありません。
実際に動くサンプルコード: リスク%ロット計算のライブラリ化
既刊lot-size-by-risk-percent-mt4.mdのロット計算ロジックを、
Pine Scriptのライブラリとして切り出す例です。
// 1. ライブラリ側(公開して初めて動く。ユーザー名・ライブラリ名は公開時に確定する)
//@version=6
library("RiskHelpers")
export riskLotSize(float balance, float riskPercent, float slPoints, float pointValue) =>
riskAmount = balance * riskPercent / 100
lot = riskAmount / (slPoints * pointValue)
lot
// 2. 利用側(ライブラリ公開後、ユーザー名が確定してから書く行)
//@version=6
indicator("Risk Lot Sample", overlay = true)
import YourUserName/RiskHelpers/1 as risk
lot = risk.riskLotSize(10000, 2, 300, 100)
plot(lot, title = "推奨ロット(確認用)")
既刊の記事、
risk-percent-lot-calculator-indicator-mt4.md、
と同じ考え方の計算を、
MQLでは.mqhファイルへの切り出しで、
Pine Scriptではライブラリの公開・importで実現する形です。
TradingViewでの貼り付け・公開手順
実際にTradingViewでライブラリを試すまでの手順です。
- TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
- ライブラリ側のコードを貼り付けて保存する
- 画面上部の「公開」ボタンからライブラリとして公開する(公開後、ユーザー名/ライブラリ名/バージョンが確定する)
- 別のスクリプトでimport文のユーザー名部分を自分のものに書き換える
- 「チャートに追加」をクリックし、推奨ロットが表示されることを確認する
よくあるエラーと注意点
実装でつまずきやすいポイントをまとめます。
exportを付け忘れて外部から呼べない
・exportを付けていない関数はimport側から見えない
・エクスポートする関数は引数の型を明示的に書く必要がある
・library()のtitle引数はASCII文字・数字・アンダースコアのみ
・スペースやハイフンは使えない
MQLは.mqhファイルの配置場所を間違えるとコンパイルエラーになる
既刊mqh-include-organize-mql4.mdのとおり、
山括弧(<>)で囲む書き方はIncludeフォルダ基準、
ダブルクォート(“”)で囲む書き方はソースファイルと同じフォルダ基準で検索されるため、
配置場所を間違えるとファイルが見つからずコンパイルエラーになります。
よくある質問
library()・export・importについて、よく疑問に挙がる点に回答します。
・個人用の下書きだけならlibrary化せず1本のスクリプトで書いて構わない
・複数のインジケーター・戦略で同じ計算を使う場合にライブラリ化を検討する
・バージョン番号を指定したimportなら、ライブラリ更新の影響を受けずに済む
ライブラリを公開せずに使うことはできますか?
Pine Scriptの仕組み上、
importで取り込むにはライブラリを一度公開する必要があります。
公開範囲は「本人のみ」も選べるため、
一般公開はしたくない場合はその設定を使います。
MQL4とMQL5で#includeの書き方は違いますか?
既刊mqh-include-organize-mql4.mdのとおり、
#include自体の構文・検索パスの仕組みはMQL4とMQL5で共通です。
書き方を変える必要はありません。
ライブラリ内でexportしていない関数は何のために書くのですか?
ライブラリ内部だけで使う下請けの処理をまとめるためです。
exportした関数から呼び出す補助関数を非公開にしておくことで、
外部に見せる窓口をexportした関数だけに絞れます。
【Pine Script入門】library()・export・importをMQLユーザー向けに解説してみた(#includeとの比較):まとめ
Pine Scriptのlibrary()・export・importは、
MQLの#includeと同じ「コードを再利用する仕組み」ですが、
#includeがローカルファイルをそのまま貼り付けるのに対し、
importは一度公開されたスクリプトをバージョン指定で取り込むという、
まったく別の共有モデルです。
exportを付けた関数だけが外部から見える設計も、
公開・非公開の概念がないMQLの#includeとは対照的です。
複数のスクリプトで同じ計算ロジックを使う場面になったら、
ライブラリ化を検討する価値があります。
コメント