Pine Scriptのコードでエラーメッセージに、
「series int」や「simple int」という、
見慣れない言葉を見たことはありませんか。
MQLにはこの概念自体が存在しないため、
最初に読むと身構えてしまいます。
既刊のinput.int()等の記事では、
パラメーター定義の書き方を解説しました。
この記事では、series型とsimple型という、
値の「確定するタイミング」を表す型修飾子を、
MQLの変数・input変数と対比しながら解説します。
・series型/simple型の基本
・値が確定するタイミングの違い
・simple型が必要になる理由(v6のoffset制限等)
・MQLのinput変数・通常変数との対応
series型とsimple型の基本とMQLの対応
型修飾子には、以下の4段階があります。
Pine Scriptの型修飾子の階層
・const: コンパイル時に固定
・input: ユーザー入力で固定(実行中は不変)
・simple: 実行開始時の1回だけ確定
・series: バーごとに変わる(最も柔軟)
MQLには型修飾子という概念自体がない
MQLの変数は、通常の変数もinput変数も、
同じ「値」として扱われ、
Pine Scriptのような段階分けはありません。
最大の違い: 値がいつ確定するか
ここが、MQLユーザーが最初に戸惑うポイントです。
series型は毎バーで変わる値
close(終値)やhigh(高値)は、
典型的なseries型の値です。
新しいバーが来るたびに、値が変わります。
MQLの変数はtickごとに毎回自由に書き換えられる
MQLでは、通常の変数もinput変数も、
OnTick()の中でいつでも代入できます。
どの変数がいつ確定するかという制約は、
言語レベルでは存在しません。
simple型が必要になる理由(v6のoffset制限を例に)
ここが、この記事で最も伝えたいポイントです。
plot()のoffset引数がv6でsimple型に制限された
・Pine Script v6で、plot()のoffset引数が、
・simple int以下しか受け付けなくなった
・バーごとに変わる値をオフセット量にできない
MQLでも「一度だけ設定して使う」設計がある
既刊parameter.mdのinput変数も、
EAの実行開始時に1回だけ値が決まり、
稼働中は変更できない点が似ています。
実際に動くサンプルコード: simple型が必要な場面
series型の値を無理にsimple型の引数へ渡すと、
どんなエラーになるかを確認します。
//@version=6
indicator("Series vs Simple Type Sample", overlay = true)
// NGパターン(コメントアウト): 毎バーで変わるseries int値をlengthに渡すとエラーになる
// wrongLength = bar_index % 10 + 5
// wrongMa = ta.sma(close, wrongLength)
// OKパターン: input.int()はsimple int(実行開始時に1回だけ確定)を返す
okLength = input.int(14, title = "期間", minval = 1)
okMa = ta.sma(close, okLength)
plot(okMa, title = "MA(simple intで動く)", color = color.blue)
コメントアウトした2行を実際に有効化すると、
「series int」を「simple int」が要求される場所に渡したという、
コンパイルエラーが出ます。
TradingViewでの貼り付け・実行手順
実際にTradingViewで動かすまでの手順です。
- TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
- 新規スクリプトを作成し、上のコードを貼り付ける
- 「保存」してから「チャートに追加」をクリックする
- コメントアウトした2行の先頭の//を外して保存し、エラー表示を確認する
- 再度//を付けて元に戻し、エラーが消えることを確認する
よくあるエラーと注意点
実装でつまずきやすいポイントをまとめます。
エラー文の読み方
・「cannot call … series int … simple int」
・引数名(length/offset等)を手がかりに探す
・原因は大抵、計算結果をそのまま渡していること
varで保持した値も代入し直すとseries型になる
既刊var/varipの記事で解説したvarキーワードも、
後から値を代入し直すと、
series型として扱われる点に注意してください。
よくある質問
series型/simple型について、よく検索される疑問に回答します。
・下位の修飾子は上位が必要な場所でも使える
・逆(series→simple)は不可、ここで詰まりやすい
・input.int()等はsimple型を確実に作れる手段
simple型の値をseries型が必要な場所に渡せますか?
できます。
階層は下位(simple)が上位(series)の代わりに使える、
一方通行の関係です。
MQL5のinput変数もsimple型と同じ考え方ですか?
概念は近いです。
実行開始時に1回確定し、稼働中は変わらない点が共通しています。
ただしMQL5にはPine Scriptのような型修飾子システム自体はなく、
コンパイラがこの区別を言語レベルで強制することもありません。
なぜPine Scriptだけこんな仕組みがあるのですか?
TradingViewのサーバー上で、
全ユーザーのスクリプトを安全かつ高速に再計算する設計のため、
「いつ値が決まるか」を事前に把握する必要があるからです。
【Pine Script入門】series型とsimple型の違いをMQLユーザー向けに解説してみた(input変数・パラメーターとの比較):まとめ
series型とsimple型は、
MQLには存在しない「値がいつ確定するか」を表す型修飾子です。
MQLのinput変数は、
実行開始時に1回確定するという点でsimple型に近い考え方ですが、
MQL自体には型修飾子システムがなく、
コンパイラが強制することもありません。
v6でplot()のoffset等がsimple型に制限された変更点も、
合わせて押さえておくとエラーに慌てずに済みます。
コメント