海外のFX手法でよく使われるインジケーター、Zero Lag MA Trend Levels Chart Prime(ゼロラグMA)。
TradingViewでも利用者が多い人気のインジなのですが、アラートが使いにくくて「チャートに張り付いてないといけない」状態になるのが悩ましいところでした。
このページでは、Zero Lag MAの考え方をもとに作ったオリジナルインジ「ZL Trend Indicator [ZLT]」を配布しています。
アラートが使いやすくなっているので、チャートから離れていても通知を受け取れます。誰でも無料で使っていただけます。
Zero Lag MA Trend Levels Chart Primeとは?

TradingViewで探して導入するとこんな感じになります。
ざっくり説明すると、大きな動きが起きてオーダーブロックが発生。そのオーダーブロックに一度入るけど、ヒゲで押し返されたときにサインが出るインジケーターです。
オーダーブロック発生で◆マーク、BUYかSELLで▲▼マークが出ます。
オーダーブロックって狙っていてもそのまま貫通して「オイッ!!!」ってなることありますが、リバウンドを確認してからサインが出るので合理的な作りになっています。

なぜ独自インジを作ったか
元のZero Lag MA Trend Levels Chart Primeはとても優秀なインジですが、アラート設定がかなり使いにくいという問題がありました。
以前は元のコードに手を加えたバージョンを配布していましたが、他の方のコードをベースにして再配布するのは著作権面でグレーなので、今回ゼロから書き直したものを新たに作りました。
コンセプトは同じで、使い勝手はむしろ良くなっています。
ZL Trend Indicator [ZLT]

今回作ったのが「ZL Trend Indicator [ZLT]」です。
Zero Lag MAの核心にある「EMAのラグをclose-EMAの差分で補正する」という計算をベースに、クロス発生時のATRでゾーン(上下2本のライン)を自動設定します。
価格がそのゾーンに一度入って押し返されたタイミングでトライアングルシグナルが出る、という元のインジと同じ考え方で動きます。
Tradingviewでも ZL Trend Indicator という名前で無料公開しています。
設定項目
Zero Lag MA
- ZLMA Length:15(MAの期間。短くすると反応が速くなります)
Trend Zone
- Zone ATR Period:200(ゾーンの幅を決めるATRの期間)
Colors
- + / −:上昇・下降トレンドの色を変更できます
コード
//@version=6
// ================================================================
// ZL Trend Indicator [ZLT]
// 完全オリジナル実装
// ① Zero Lag MA (ZLMA):EMAラグをclose-EMAの差分で補正した独自MA
// ② Trend Zone:クロス時にATRベースの上下2ラインでゾーンを表示
// ③ Retest Signal:ゾーンへのリテスト後の押し返しでトライアングル表示
// ================================================================
indicator("ZL Trend Indicator", shorttitle="ZLT", overlay=true, max_lines_count=500)
// ── パラメータ ───────────────────────────────────────────────────
var g_ma = "Zero Lag MA"
var g_lv = "Trend Zone"
length = input.int(15, title="ZLMA Length", minval=2, group=g_ma)
atrLevel = input.int(200, title="Zone ATR Period", minval=10, group=g_lv)
colUp = input.color(color.rgb(48, 212, 83), "+", group="Colors", inline="c")
colDn = input.color(color.rgb(64, 67, 241), "-", group="Colors", inline="c")
// ── Zero Lag MA計算 ─────────────────────────────────────────────
ema1 = ta.ema(close, length)
corr = close + (close - ema1)
zlma = ta.ema(corr, length)
// ── クロス判定 ──────────────────────────────────────────────────
crossUp = ta.crossover (zlma, ema1)
crossDown = ta.crossunder(zlma, ema1)
isBull = zlma > ema1
isBear = zlma < ema1
// ── Trend Zone(クロス時のATRで上下2ラインを固定保存) ───────────
atrL = ta.atr(atrLevel)
var float zoneTop = na
var float zoneBot = na
var bool touchedZone = false
var bool inBull = false
if crossUp
zoneTop := zlma
zoneBot := zlma - atrL
touchedZone := false
inBull := true
if crossDown
zoneTop := zlma + atrL
zoneBot := zlma
touchedZone := false
inBull := false
// ── リテスト検出 ─────────────────────────────────────────────────
if not na(zoneTop) and not touchedZone
if inBull and low <= zoneTop and low >= zoneBot
touchedZone := true
if not inBull and high >= zoneBot and high <= zoneTop
touchedZone := true
// ── シグナル(リテスト後にゾーン外へ押し返された最初の1バー) ────
buySignal_raw = inBull and touchedZone and close > zoneTop
sellSignal_raw = not inBull and touchedZone and close < zoneBot
buySignal = buySignal_raw and not buySignal_raw[1]
sellSignal = sellSignal_raw and not sellSignal_raw[1]
// ── 表示 ─────────────────────────────────────────────────────────
// ZLMAとEMAのライン
zlmaCol = zlma > zlma[3] ? colUp : zlma < zlma[3] ? colDn : color.gray
emaCol = ema1 < zlma ? colUp : colDn
p1 = plot(zlma, title="ZLMA", color=zlmaCol, linewidth=2)
p2 = plot(ema1, title="EMA", color=emaCol, linewidth=1)
fill(p1, p2, color=color.new(color.gray, 85))
// ゾーン上下2ライン
zoneCol = inBull ? colUp : colDn
plot(zoneTop, title="Zone Top", color=color.new(zoneCol, 40), linewidth=1, style=plot.style_line)
plot(zoneBot, title="Zone Bot", color=color.new(zoneCol, 40), linewidth=1, style=plot.style_line)
// ダイヤモンド(クロスシグナル)
plotshape(crossUp ? zlma : na, "", shape.diamond, location.absolute, color=colUp, size=size.tiny)
plotshape(crossDown ? zlma : na, "", shape.diamond, location.absolute, color=colDn, size=size.tiny)
// トライアングル(リテスト確認シグナル)
plotshape(buySignal, title="BUY", style=shape.triangleup, location=location.belowbar, color=colUp, size=size.small)
plotshape(sellSignal, title="SELL", style=shape.triangledown, location=location.abovebar, color=colDn, size=size.small)
// ── アラート ─────────────────────────────────────────────────────
alertcondition((buySignal or sellSignal) and barstate.isconfirmed, title="Triangle Signal ▲▼", message="{{ticker}}, {{interval}}: Triangle Signal")
alertcondition((crossUp or crossDown) and barstate.isconfirmed, title="Diamond Signal ◆", message="{{ticker}}, {{interval}}: ZLMA Cross")
alertcondition(buySignal and barstate.isconfirmed, title="BUY Signal ▲", message="{{ticker}}, {{interval}}: BUY")
alertcondition(sellSignal and barstate.isconfirmed, title="SELL Signal ▼", message="{{ticker}}, {{interval}}: SELL")
アラートについて
アラート条件は4種類あります。
- 「Triangle Signal ▲▼」:BUY・SELL両方まとめて1枠で拾えます
- 「Diamond Signal ◆」:ZLMAとEMAがクロスした時
- 「BUY Signal ▲」:BUYシグナル単独
- 「SELL Signal ▼」:SELLシグナル単独
アラートを節約したい場合はTriangle Signal ▲▼だけ設定すればBUY・SELL両方の通知が来ます。
アラートの設定は「バーの終値時」にしておくのが確実です。
使い方について
値動きをわかりやすく可視化してくれるので、使い方のパターンはいくつか考えられます。
例えばトライアングルサインを基準に損切りを直近安値(SELLなら直近高値)に設定して、利確ラインを1:1.5にするシンプルな使い方。
他にも200EMAより上にある時はBUYサインだけに従うというフィルターをかけると、トレンド方向に絞れてシンプルになります。
インジ自体はとても機能的なので、自分を制御できるような他のインジとの組み合わせやルール作り次第で活用の幅が広がると思います。
使う時間足や通貨ペアによっても結果が変わるので、必ずご自身で確認してから使用してください。
あと、MT4やMT5など他のツールでチャートを見ている方はぜひ一度TradingViewを見てみてください。



コメント
はじめまして
これって何分足がいいですかね?
気づかず遅くなりました。扱う通貨によって合う時間足は変わると思います。
普段使う通貨、自分に合った時間足に付けて目視で確認してみるとイイかと思いますよ。