既刊の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`シリーズが対象になります。
最大の違い: 戻り値が価格そのもの
・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で動かすまでの手順です。
- TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
- 新規スクリプトを作成し、上のコードを貼り付ける
- 「保存」してから「チャートに追加」をクリックする
- 赤(直近高値)・青(直近安値)の階段状の線が表示されることを確認する
- 入力パネルで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等の別関数が必要になります。
コメント