既刊parameter.mdの記事では、MQL4の「input変数」
と「extern変数」という、2種類のパラメーター宣言方法を解説しました。
この記事では、Pine Scriptが同じ役割をどう実現しているか、
MQL4との違いを対比しながら解説します。
・既刊input変数/extern変数のおさらい
・input.int()等、型ごとの入力関数の書式
・型ごとに関数が分かれている理由
・minval/maxval/stepがUIレベルの制限になる設計思想
- 既刊input変数/extern変数とPine Scriptのinput.*関数のおさらい
- なぜMQLは1つのキーワードで済み、Pine Scriptは型ごとに関数が分かれているのか
- input.int/input.float/input.bool/input.sourceの引数比較
- minval/maxval/stepがinput.int/input.floatだけに存在する理由
- 実際に動くPine Scriptのサンプルコード
- TradingViewでの貼り付け・実行手順
- よくあるエラーと注意点
- よくある質問
- 【Pine Script入門】input.int/input.float/input.boolの使い方をMQLユーザー向けに解説してみた(input変数・extern変数との比較):まとめ
既刊input変数/extern変数とPine Scriptのinput.*関数のおさらい
まず、MQL4側とPine Script側、それぞれの前提を振り返ります。
MQL4のinput変数の書式(おさらい)
#property strict input int FastPeriod = 9; //短期移動平均の期間
input修飾子を型の前に付けるだけで、
利用者がプロパティウィンドウから値を変更できる外部パラメーターになります。
Pine Scriptのinput.*関数の書式
fastPeriod = input.int(9, title = "短期移動平均の期間")
Pine Scriptでは、キーワードではなく、
input.int()という関数を呼び出す形で同じ役割を実現します。
名前空間input.が型ごとに分かれている理由
int・float・bool・sourceという、
値の型ごとに別の関数が用意されているのがPine Script側の設計です。
なぜMQLは1つのキーワードで済み、Pine Scriptは型ごとに関数が分かれているのか
同じ「外部パラメーター」という目的でも、言語としての実現方法が異なります。
MQL4: inputはキーワード、型は変数宣言側が持つ
MQL4のinputは修飾子なので、
int・double・boolのどの型にもそのまま付けられます。
Pine Script: 関数名そのものが型の情報を持つ
・PineScriptの古いバージョンにはinput()という共通関数があった
・型を表すtype引数を別に渡す書き方だった
・現在のバージョンでは型ごとの専用関数に置き換わっている
関数名自体が「この入力は整数です」
「この入力は小数です」と宣言しているため、型の指定を引数で別途渡す必要がありません。
エラーの出方の違い
MQL4で型を間違えると、コンパイル時の型不一致エラーとして検出されます。
Pine Scriptでinput.int()に小数を渡そうとすると、
関数自体が受け付ける型を限定しているため、同様にエラーになります。
input.int/input.float/input.bool/input.sourceの引数比較
4つの関数の書式を、実際の引数で比較します。
| 関数 | 主な引数 | 用途 |
|---|---|---|
| input.int() | defval, title, minval, maxval, step | 期間・本数など整数値 |
| input.float() | defval, title, minval, maxval, step | 倍率・パーセントなど小数値 |
| input.bool() | defval, title | チェックボックス(表示/非表示の切替等) |
| input.source() | defval, title | close/open/hl2等、計算対象の価格ソース |
input.int(): 整数値の入力
length = input.int(14, title = "期間", minval = 1)
RSIやSMAの期間など、整数で指定したい値に使います。
input.float(): 小数値の入力
atrMultiplier = input.float(1.5, title = "ATR倍率", minval = 0.1, step = 0.1)
ATRの倍率やパーセントなど、小数で指定したい値に使います。
input.bool()とinput.source(): チェックボックスと価格ソース
showMa = input.bool(true, title = "移動平均線を表示する") src = input.source(close, title = "計算に使う価格")
input.bool()はtrue/falseのチェックボックス、
input.source()は使う価格の種類(close/open/hl2等)を、
利用者が選べるようにする入力です。
minval/maxval/stepがinput.int/input.floatだけに存在する理由
4つの関数のうち、範囲を制限する引数は数値系の2つだけにあります。
MQL4のinput変数には範囲チェックがない
・MQL4のinput変数は、マイナス値や極端な値もそのまま受け付ける
・範囲チェックは自分でコード内に書く必要がある
・書き忘れると、異常な値のまま計算が走ってしまう
Pine Scriptはmin/maxをUIレベルで制限する
minval/maxval/stepを指定すると、
設定画面の入力欄自体がその範囲でしか値を受け付けなくなります。
ユーザーが変な値を入れて壊れるのを防ぐ設計思想
チェックボックスや価格ソースの選択には「範囲」という概念自体が無いため、
input.bool()とinput.source()には、
minval/maxvalが存在しません。
実際に動くPine Scriptのサンプルコード
4種類のinput.*関数を1本のインジケーターにまとめたサンプルです。
//@version=6
indicator("Input Sample", overlay = true)
length = input.int(14, title = "期間", minval = 1, maxval = 200)
mult = input.float(1.5, title = "倍率", minval = 0.1, step = 0.1)
showMa = input.bool(true, title = "移動平均線を表示する")
src = input.source(close, title = "計算に使う価格")
ma = ta.sma(src, length) * mult
plot(showMa ? ma : na, title = "調整後MA", color = color.blue)
4つの入力値を組み合わせて、
表示のオン/オフも含めた1本の調整後移動平均線を描くサンプルです。
TradingViewでの貼り付け・実行手順
実際にTradingViewで動かすまでの手順です。
- TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
- 新規スクリプトを作成し、上のコードを貼り付ける
- 「保存」してから「チャートに追加」をクリックする
- インジケーターの設定アイコンを開き、期間・倍率・表示有無・価格ソースの4項目が入力欄に並んでいることを確認する
- 期間の欄に201など上限を超える値を入れてみて、自動的に補正されることを確認する
よくあるエラーと注意点
実装でつまずきやすいポイントをまとめます。
titleを省略すると変数名がそのまま表示される
titleを省略しても動作はしますが、
設定画面にはコード上の変数名がそのまま表示されるため、
利用者にとって分かりにくい画面になります。
古いバージョンのinput()関数と混同する
ネット上の古いサンプルコードには、
type引数を渡す共通のinput()関数が使われている場合があります。
現在の書き方に合わせて、型ごとの専用関数に置き換える必要があります。
inlineパラメータで複数の入力を1行にまとめる
・inline引数に同じ文字列を指定すると、複数のinput.*が設定画面の同じ行に並ぶ
・期間と倍率のように関連する入力をまとめて見せたい場合に使う
・MQL4にはこの「見た目だけを揃える」専用の引数は存在しない
よくある質問
input.*関数の使い方について、
よく検索される疑問に回答します。
・範囲が決まっている値には必ずminval/maxvalを指定する
・設定画面に表示したい名前は必ずtitleで明示する
・既刊input変数の考え方は、型ごとのinput.*関数にそのまま置き換えて移植できる
MQL4のextern変数のように、実行中に値を変更できる入力はありますか?
Pine Scriptのinput.*で宣言した値も、
チャートの設定画面からいつでも変更できます。
ただし、extern変数のようにコードの実行中(ティックの最中)に、
プログラム側から値を書き換えることはできません。
input.string()やinput.color()もありますか?
あります。
文字列の選択肢を作るinput.string()、
色を選べるinput.color()など、
型ごとに同じ考え方の専用関数が用意されています。
input.source()で選べる価格の種類は決まっていますか?
close/open/high/low/hl2/hlc3/ohlc4など、
あらかじめ用意されている組み込みの価格シリーズに加えて、
他のインジケーターの出力値を選べる場合もあります。
【Pine Script入門】input.int/input.float/input.boolの使い方をMQLユーザー向けに解説してみた(input変数・extern変数との比較):まとめ
Pine Scriptのinput.*という4つの関数は、
MQL4のinput変数・extern変数と同じ「利用者が設定画面から値を変える」
という目的を、型ごとに専用の関数へ分けることで実現しています。
minval/maxval/stepという範囲チェックがUIレベルに組み込まれている点は、
MQL4のinput変数には無い、Pine Script側の安全設計です。
コメント