既刊のiHighest・iLowestの記事では、

戻り値が価格そのものではなく、「インデックス(シフト)」である仕様に、

戸惑いやすいポイントを解説しました。

この記事では、Pine Scriptのta.highest/ta.lowestが、

同じ探索をどう書けるか、戻り値の違いも含めて対比します。

この記事で分かること
・ta.highest/ta.lowestのシグネチャと戻り値
・既刊iHighest/iLowestとの戻り値の違い(インデックス vs 価格そのもの)
・引数を省略した場合のデフォルトの対象シリーズ
・Pine Scriptで動くサンプルコード

既刊iHighest/iLowestのおさらい

まず、MQL4側の仕様を振り返ります。

iHighest/iLowestの引数

int iHighest(
   string symbol,
   int    timeframe,
   int    type,
   int    count,
   int    start
);

`count`本の範囲を`type`(MODE_HIGH等)で検索する関数でした。

戻り値は価格ではなく「インデックス」

既刊記事で解説した通り、iHighest/iLowestの戻り値は、

条件に合う足が何本前にあるかを示す「インデックス」です。

補足
・実際の価格を得るには、戻り値をiHigh()/iLow()にもう一度渡す必要がある
・「価格が直接返ってくる」と誤解しやすい、MQL4のつまずきポイント
・2段階の手順を踏む設計になっている

2段階の手順になる理由

MQL4はこの形式で、どの足が条件に合ったかという「位置」の情報と、

その位置の「価格」の情報を、別々の関数に分けています。

ta.highest/ta.lowestのシグネチャ

Pine Script側の2つの関数を確認します。

ta.highestの2つのオーバーロード

ta.highest(length) → series float
ta.highest(source, length) → series float

`source`を省略した場合は、`high`シリーズが対象になります。

ta.lowestの2つのオーバーロード

ta.lowest(length) → series float
ta.lowest(source, length) → series float

`source`を省略した場合は、`low`シリーズが対象になります。

最大の違い: 戻り値が価格そのもの

MQL4ユーザーが驚くポイント
・ta.highest/ta.lowestは、インデックスではなく価格そのものを返す
・iHighest()のような2段階の手順が不要
・「何本前か」を知りたい場合は別の考え方が必要になる

既刊MQLとPine Scriptの書き方の比較

同じ「直近20本の最高値」を、実際のコードで比較します。

MQL4版: 2段階の手順

int shift = iHighest(_Symbol, 0, MODE_HIGH, 20, 0);
double highestPrice = iHigh(_Symbol, 0, shift);

インデックスを取得し、そのインデックスで価格を取得します。

Pine Script版: 1行で価格が取れる

highestPrice = ta.highest(20)

`high`シリーズの直近20本から、最高値を1行で取得します。

「何本前か」を知りたい場合

ta.highest自体には「何本前か」を返す引数はないため、

必要な場合は、ta.highestbars/ta.lowestbarsという、

別の関数を使います。

実際に動くPine Scriptのサンプルコード

直近N本の高値・安値を水平線で表示するサンプルです。

//@version=6
indicator("Highest Lowest Sample", overlay = true)

lookback = input.int(20, title = "遡る本数")

highestPrice = ta.highest(lookback)
lowestPrice  = ta.lowest(lookback)

plot(highestPrice, title = "Highest", color = color.red, style = plot.style_stepline)
plot(lowestPrice, title = "Lowest", color = color.blue, style = plot.style_stepline)

既刊MQL4版のiHighest/iLowest+iHigh/iLowの2段階の手順を、

ta.highest/ta.lowestが1行に圧縮しています。

TradingViewでの貼り付け・実行手順

実際にTradingViewで動かすまでの手順です。

  1. TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
  2. 新規スクリプトを作成し、上のコードを貼り付ける
  3. 「保存」してから「チャートに追加」をクリックする
  4. 赤(直近高値)・青(直近安値)の階段状の線が表示されることを確認する
  5. 入力パネルでlookbackの値を変え、線の位置がどう変わるか確認する

よくあるエラーと注意点

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

lengthにseries int型の変数を渡す

注意
・lengthはsimple int/input int/const intのみ受け付ける
・バーごとに変わるseries int型の変数は渡せない
・計算の途中で動的に変える値はlengthに使えない

現在のバーを含むかどうか

ta.highest/ta.lowestは、計算対象の本数に、

現在のバー自身を含みます。

既刊iHighestの`start=0`(最新の確定していない足を含む)と同じ考え方です。

名前空間ta.を忘れる

Pine Scriptのテクニカル関数は、

必ず`ta.`という名前空間付きで呼び出す必要があります。

よくある質問

ta.highest/ta.lowestについて、よく検索される疑問に回答します。

実践アドバイス
・closeシリーズの最高値を知りたい場合は、
ta.highest(close, 20)と書く
・既刊のスイング高値・安値ブレイクアウトEAの考え方もそのまま応用できる
・何本前かを知りたい場合はta.highestbars/ta.lowestbarsを使う

既刊iHighest/iLowestのcount/startと同じ指定はできますか?

countに近いものはlengthで指定できますが、

startのように検索を始める位置をずらす引数はありません。

ずらした位置から検索したい場合は、

[]演算子で過去のシリーズ自体をずらしてから渡す必要があります。

MODE_CLOSEのような終値ベースの検索はできますか?

できます。

既刊iHighestのtype=MODE_CLOSEに相当する処理は、

ta.highest(close, length)のように、

sourceにcloseを渡すだけです。

何本前に最高値がついたかを知りたい場合はどうしますか?

ta.highestbars(length)を使います。

この関数は、最高値がついたバーが何本前かを、

負の数(0または負の整数)で返します。

既刊iHighestの戻り値(インデックス)に近い情報が必要な場合は、

ta.highestの代わりにこちらを使ってください。

【Pine Script入門】ta.highest/ta.lowestの使い方をMQLユーザー向けに解説してみた(iHighest/iLowestとの比較):まとめ

Pine Scriptのta.highest/ta.lowestは、

既刊iHighest/iLowestとは違い、インデックスではなく価格そのものを、

1回の呼び出しで直接返します。

既刊MQL4版の2段階の手順(インデックス取得→価格取得)が、

Pine Scriptでは1行に圧縮される一方、

「何本前か」を知りたい場合はta.highestbars等の別関数が必要になります。

関連記事