このサイトの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で動かすまでの手順です。

  1. TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
  2. 新規スクリプトを作成し、上のコードを貼り付ける
  3. 「保存」してから「チャートに追加」をクリックする
  4. 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の既刊クロス判定記事群と同じで、

リペイント対策(確定済みバーでの判定)という注意点も共通しています。

関連記事