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 別名`

の形式で、

公開済みのライブラリをバージョン番号ごとに指定して取り込みます。

MQLユーザーが驚くポイント
・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でライブラリを試すまでの手順です。

  1. TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
  2. ライブラリ側のコードを貼り付けて保存する
  3. 画面上部の「公開」ボタンからライブラリとして公開する(公開後、ユーザー名/ライブラリ名/バージョンが確定する)
  4. 別のスクリプトでimport文のユーザー名部分を自分のものに書き換える
  5. 「チャートに追加」をクリックし、推奨ロットが表示されることを確認する

よくあるエラーと注意点

実装でつまずきやすいポイントをまとめます。

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とは対照的です。

複数のスクリプトで同じ計算ロジックを使う場面になったら、

ライブラリ化を検討する価値があります。

関連記事