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型に制限された

MQLユーザーが驚くポイント
・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で動かすまでの手順です。

  1. TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
  2. 新規スクリプトを作成し、上のコードを貼り付ける
  3. 「保存」してから「チャートに追加」をクリックする
  4. コメントアウトした2行の先頭の//を外して保存し、エラー表示を確認する
  5. 再度//を付けて元に戻し、エラーが消えることを確認する

よくあるエラーと注意点

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

エラー文の読み方

注意
・「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型に制限された変更点も、

合わせて押さえておくとエラーに慌てずに済みます。

関連記事