このサイトのMQL記事群では、クロス判定(前のバーと今のバーを比較する処理)を、
毎回、自分の手でコードとして書いてきました。
この記事では、Pine Scriptの組込み関数である、
ta.crossover/ta.crossunderを使うと、同じ判定が、
どれだけシンプルに書けるかを解説します。
・ta.crossover/ta.crossunderのシグネチャと戻り値
・MQLの自前クロス判定コードとの違い
・Pine Scriptで動くサンプルコード
・リペイント(値が後から変わる現象)への注意点
MQLでクロス判定が自前実装になる理由
まず、MQLとPine Scriptの考え方の違いを確認します。
既刊記事群でのクロス判定の書き方
既刊のMACD・Stochastic・Bollinger Bands等、
このサイトのクロス判定系の記事は、どれも同じパターンで書かれています。
・前のバー(shift=1)の値を取得する
・2本前(shift=2)の値も取得する
・2つを比較して符号が変わった瞬間を判定する
MQLには、クロス判定そのものを行う組込み関数がないため、
毎回この手順を自分で書く必要があります。
Pine Scriptは組込み関数がある
Pine Scriptには、この一連の処理をまとめた、
ta.crossover/ta.crossunderという関数があります。
ta.crossover/ta.crossunderの使い方
2つの関数のシグネチャを確認します。
ta.crossoverのシグネチャ
ta.crossover(source1, source2) → series bool
source1が前のバーでsource2以下、
現在のバーでsource2を上回った瞬間にtrueを返します。
ta.crossunderのシグネチャ
ta.crossunder(source1, source2) → series bool
source1が前のバーでsource2以上、
現在のバーでsource2を下回った瞬間にtrueを返します。
判定条件の中身
・source1/source2には価格だけでなく、
指標の値も渡せる
・ta.crossover(macdLine, signalLine)のように、
2本の線のクロスにも使える
・自分で符号を比較するコードを書く必要がない
既刊MQLのクロス判定コードとの比較
実際のコードで、書き方の違いを比較します。
MQL4版のクロス判定コード
bool crossedUp = (prevValue <= 0 && curValue > 0); bool crossedDown = (prevValue >= 0 && curValue < 0);
前の値(`prevValue`)と現在の値(`curValue`)を、
自分で取得してから比較しています。
Pine Script版の同じロジック
crossedUp = ta.crossover(curValue, 0) crossedDown = ta.crossunder(curValue, 0)
前のバーの値を自分で取得する処理が関数の内部に隠れているため、
1行で同じ判定が書けます。
実際に動くPine Scriptのサンプルコード
MACDのクロスを矢印で表示するサンプルです。
//@version=6
indicator("MACD Cross Sample", overlay = false)
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)
crossUp = ta.crossover(macdLine, signalLine)
crossDown = ta.crossunder(macdLine, signalLine)
plot(macdLine, title = "MACD", color = color.orange)
plot(signalLine, title = "Signal", color = color.teal)
plotshape(crossUp, title = "Cross Up", location = location.bottom,
style = shape.triangleup, color = color.blue, size = size.small)
plotshape(crossDown, title = "Cross Down", location = location.top,
style = shape.triangledown, color = color.red, size = size.small)
既刊のMQL4版MACDクロス矢印インジケーターと、同じ見た目の矢印表示を、
ずっと少ないコード量で実現しています。
TradingViewでの貼り付け・実行手順
実際にTradingViewで動かすまでの手順です。
- TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
- 新規スクリプトを作成し、上のコードを貼り付ける
- 「保存」してから「チャートに追加」をクリックする
- MACDのクロスした位置に矢印が表示されることを確認する
よくあるエラーと注意点
実装でつまずきやすいポイントをまとめます。
リペイントの可能性
・形成中の最新バーでta.crossoverを使うと、
同じバー内で判定が変わることがある
・MQLで確定済みのshift=1を基準にする設計と同じく、
barstate.isconfirmedで確定後だけ判定するのが安全
・リアルタイム表示とシグナルの確定は分けて考える
複数シリーズを跨ぐ使い方
ta.crossover/ta.crossunderは、price同士だけでなく、
2本のインジケーターの線を比較する場合にも使えます。
よくある質問
ta.crossover/ta.crossunderについて、
よく検索される疑問に回答します。
MQLのクロス判定をそのまま移植できますか?
できます。
前のバーと現在のバーを比較するという考え方自体は同じで、
Pine Scriptでは比較の処理を関数が代わりに行う、という違いだけです。
0ラインとのクロスも判定できますか?
できます。
source2に固定値の0を渡せば、既刊iAO/iForce等のゼロラインクロス判定と、
同じ結果を1行で得られます。
ta.cross()という関数もありますか?
あります。
ta.cross(source1, source2)は、上下どちらの方向のクロスでも、
trueを返す関数です。
方向を区別したい場合はcrossover/crossunderを使います。
【Pine Script入門】ta.crossover/ta.crossunderでクロス判定を1行で書く方法をMQLユーザー向けに解説してみた:まとめ
Pine Scriptのta.crossover/ta.crossunderは、
MQLで毎回自前実装していたクロス判定を、1行で書けるようにした組込み関数です。
考え方自体はMQLの既刊クロス判定記事群と同じで、
リペイント対策(確定済みバーでの判定)という注意点も共通しています。
コメント