PR

【TradingView】 自動水平レイ描画インジケーター AutoRay+TrendNavi【Pineスクリプト配布】

TradingViewでチャート分析をしていると、水平線や水平レイを何本も手で引く作業が地味に面倒…。

高値・安値に合わせて引いたつもりでも微妙にずれたり、突破されたラインを消し忘れてチャートが煩雑になったりして、気づけば分析そのものより「線の管理」に時間を取られてしまうこともあります。

特に、複数時間足を見ながらトレンドを判断していると、どのラインが今も有効なのかを整理し続けるのは大変ですよね。

そんなストレスを減らして、できるだけチャート分析そのものに集中したい人に向いているのが、本記事で紹介する TradingView インジケーター 「AutoRay+TrendNavi」 です。

このインジケーターは、スイング高値・安値を自動検出し、まだブレイクされていない有効な水平レイだけを自動ライン表示してくれます。さらに、複数時間足の状態をまとめて見られるトレンドナビも搭載しています。

自分がチャート分析を行うのに、自動で水平線を引いてくれたら便利だなと思って開発したものですが、誰か必要な人がいるかもと思って公開することにしますた。スクリプトをコピペするだけで実装できますのでぜひ活用してください。

目次

AutoRay+TrendNavi とは

AutoRay+TrendNavi は、TradingView 上で動くPineScriptv6のインジケーターです。
価格の転換点をもとに、未ブレイクの高値・安値レベルを水平レイとして自動描画します。

手動でラインを引く代わりに、

  • 重要な高値・安値を自動で拾う
  • すでに破られたラインは残し続けない
  • 複数の時間足をまとめて確認できる

という動きをしてくれるため、環境認識がかなりラクになります。

ベーシックな分析方法でいくと、自分で引くのはトレンドラインとチャネルラインの斜め線だけ手動です。(人によって斜め線の引き方が違うと思うのでインジケーターに搭載しませんでした。)

このインジケーターの特徴

1. 水平レイを自動ライン表示

高値・安値のピボットを検出し、まだ有効なポイントだけを右方向へ水平レイとして表示します。
不要になったラインが溜まりにくいので、チャートが散らかりにくいのが大きなメリットです。

また高値、安値に正確に引いてくれるので手動による「ズレ」がありません。

2. マルチタイムフレーム対応

以下の 7 つの時間足に対応しています。

  • M1
  • M5
  • M15
  • M30
  • H1
  • H4
  • D1

たとえば M15 チャートでは、M15 以上の時間足のラインを確認できます。下位足のノイズを減らしつつ、上位足の重要ラインを見やすく整理できます。

また各時間足毎にレイの色や線種類なども変更できるようにしています。

3. ブレイク済みラインを自動除外

ラインを引いたあとに価格が上抜け・下抜けして役目を終えたレベルは、内部ロジック上で自動的に除外されます。
「もう意味のない水平レイが残りっぱなし」という状態を防ぎやすいです。

4. 上位足ラインの重複を抑制

MTFで表示するので同じ価格にレイが重なることがよくありますが、何本も出て視認性が悪くなることを抑えるように、上位足のレイだけを表示するようにしています。
そのため、オートライン系インジケーターでありがちな“線だらけ問題”が起きにくくなっています。

5. H4・D1 の重要ラインを強調表示

H4 と D1 の最新レイは、条件に応じて以下のように強調表示されます。

  • D1:オレンジ
  • H4:黄色

上位足のトレンド転換になりうる重要なラインがわかりやすいようにしています。

短期足で見ていても、上位足の重要ラインを意識しやすい設計です。

6. トレンドナビ付き

各時間足ごとに、zigzagベースで現在のトレンド方向を↑ と ↓ で方向感を表示します。

複数時間足のトレンドをざっくり一覧で把握したいときに便利です。

トレンドがよくわからんという人には便利な機能です。


導入方法(コピペするだけ!)

TradingView への導入手順はシンプルです。

  1. TradingView を開く
  2. 画面下部の「Pineエディタ」を開く
  3. AutoRay+TrendNavi のコードを貼り付ける
  4. 保存して、スクリプト名を付ける
  5. 「チャートに追加」をクリックする

これでチャート上に自動ラインとトレンドナビが表示されます。

//@version=6
indicator("AutoRay+TrendNavi", overlay = true, max_lines_count = 500, max_labels_count = 50)

depth = input.int(12, "Depth(深さ)", minval = 2)
deviationTicks = input.int(5, "Deviation(乖離)", minval = 1)
snapTicks = input.int(10, "スナップ許容値", minval = 1)
backstep = input.int(3, "Backstep(戻り)", minval = 1)
scanBars = input.int(300, "スキャン本数", minval = 50, maxval = 2000)
showM1 = input.bool(true, "M1 を表示")
showM5 = input.bool(true, "M5 を表示")
showM15 = input.bool(true, "M15 を表示")
showM30 = input.bool(true, "M30 を表示")
showH1 = input.bool(true, "H1 を表示")
showH4 = input.bool(true, "H4 を表示")
showD1 = input.bool(true, "D1 を表示")
showTrendTable = input.bool(true, "トレンドナビを表示")
trendNavVertical = input.string("上", "トレンドナビの上下位置", options = ["上", "下"])
trendNavHorizontal = input.string("右", "トレンドナビの左右位置", options = ["左", "中央", "右"])

m1Color = input.color(color.white, "M1 の色")
m1LineStyleInput = input.string("点線", "M1 の線種類", options = ["実線", "点線", "破線"])
m5Color = input.color(color.white, "M5 の色")
m5LineStyleInput = input.string("点線", "M5 の線種類", options = ["実線", "点線", "破線"])
m15Color = input.color(color.rgb(30, 144, 255), "M15 の色")
m15LineStyleInput = input.string("点線", "M15 の線種類", options = ["実線", "点線", "破線"])
m30Color = input.color(color.rgb(30, 144, 255), "M30 の色")
m30LineStyleInput = input.string("点線", "M30 の線種類", options = ["実線", "点線", "破線"])
h1Color = input.color(color.rgb(30, 144, 255), "H1 の色")
h1LineStyleInput = input.string("点線", "H1 の線種類", options = ["実線", "点線", "破線"])
h4Color = input.color(color.rgb(30, 144, 255), "H4 の色")
h4LineStyleInput = input.string("実線", "H4 の線種類", options = ["実線", "点線", "破線"])
d1Color = input.color(color.red, "D1 の色")
d1LineStyleInput = input.string("実線", "D1 の線種類", options = ["実線", "点線", "破線"])

var string TF_M1 = "1"
var string TF_M5 = "5"
var string TF_M15 = "15"
var string TF_M30 = "30"
var string TF_H1 = "60"
var string TF_H4 = "240"
var string TF_D1 = "D"

var int TREND_UNKNOWN = -1
var int TREND_DOWN = 0
var int TREND_UP = 1

var array<int> lastUpBreaks = array.new_int(7, 0)
var array<int> lastDownBreaks = array.new_int(7, 0)
var array<int> trendStates = array.new_int(7, TREND_UNKNOWN)
var array<int> tfCurrentTimes = array.new_int(7, 0)

var array<float> m1Prices = array.new_float()
var array<int> m1Times = array.new_int()
var array<bool> m1IsHigh = array.new_bool()
var array<line> m1Lines = array.new_line()

var array<float> m5Prices = array.new_float()
var array<int> m5Times = array.new_int()
var array<bool> m5IsHigh = array.new_bool()
var array<line> m5Lines = array.new_line()

var array<float> m15Prices = array.new_float()
var array<int> m15Times = array.new_int()
var array<bool> m15IsHigh = array.new_bool()
var array<line> m15Lines = array.new_line()

var array<float> m30Prices = array.new_float()
var array<int> m30Times = array.new_int()
var array<bool> m30IsHigh = array.new_bool()
var array<line> m30Lines = array.new_line()

var array<float> h1Prices = array.new_float()
var array<int> h1Times = array.new_int()
var array<bool> h1IsHigh = array.new_bool()
var array<line> h1Lines = array.new_line()

var array<float> h4Prices = array.new_float()
var array<int> h4Times = array.new_int()
var array<bool> h4IsHigh = array.new_bool()
var array<line> h4Lines = array.new_line()

var array<float> d1Prices = array.new_float()
var array<int> d1Times = array.new_int()
var array<bool> d1IsHigh = array.new_bool()
var array<line> d1Lines = array.new_line()

var table trendTable = table.new(position.top_right, 7, 1, border_width = 1)

eps = math.max(syminfo.mintick * 0.1, 0.0000001)
deviation = deviationTicks * syminfo.mintick
snapTolerance = math.max(snapTicks * syminfo.mintick, eps)
currentTfSec = timeframe.in_seconds(timeframe.period)

max_bars_back(time, 5000)
max_bars_back(high, 5000)
max_bars_back(low, 5000)

tfSeconds(string tf) =>
    timeframe.in_seconds(tf)

shouldDisplayTf(string tf, bool enabled) =>
    tfSec = tfSeconds(tf)
    enabled and not na(tfSec) and not na(currentTfSec) and currentTfSec <= tfSec

trendMark(int trendState) =>
    trendState == TREND_UP ? "↑" : trendState == TREND_DOWN ? "↓" : "-"

tfLabel(int index) =>
    index == 0 ? "M1" : index == 1 ? "M5" : index == 2 ? "M15" : index == 3 ? "M30" : index == 4 ? "H1" : index == 5 ? "H4" : "D1"

tfCodeAt(int index) =>
    index == 0 ? TF_M1 : index == 1 ? TF_M5 : index == 2 ? TF_M15 : index == 3 ? TF_M30 : index == 4 ? TF_H1 : index == 5 ? TF_H4 : TF_D1

tfColorAt(int index) =>
    index == 0 ? m1Color : index == 1 ? m5Color : index == 2 ? m15Color : index == 3 ? m30Color : index == 4 ? h1Color : index == 5 ? h4Color : d1Color

tfIndexFromCode(string tf) =>
    tf == TF_M1 ? 0 : tf == TF_M5 ? 1 : tf == TF_M15 ? 2 : tf == TF_M30 ? 3 : tf == TF_H1 ? 4 : tf == TF_H4 ? 5 : tf == TF_D1 ? 6 : -1

trendBgColor(int trendState) =>
    trendState == TREND_UP ? color.rgb(77, 31, 38) : trendState == TREND_DOWN ? color.rgb(24, 43, 74) : color.rgb(45, 45, 45)

trendTextColor(int trendState) =>
    trendState == TREND_UP ? color.rgb(255, 120, 120) : trendState == TREND_DOWN ? color.rgb(110, 170, 255) : color.rgb(200, 200, 200)

lineStyleFromInput(string styleText) =>
    if styleText == "実線"
        line.style_solid
    else if styleText == "点線"
        line.style_dotted
    else
        line.style_dashed

trendNavPosition() =>
    if trendNavVertical == "上"
        if trendNavHorizontal == "左"
            position.top_left
        else if trendNavHorizontal == "中央"
            position.top_center
        else
            position.top_right
    else
        if trendNavHorizontal == "左"
            position.bottom_left
        else if trendNavHorizontal == "中央"
            position.bottom_center
        else
            position.bottom_right

lineStyleForTf(string tf) =>
    if tf == TF_M1
        lineStyleFromInput(m1LineStyleInput)
    else if tf == TF_M5
        lineStyleFromInput(m5LineStyleInput)
    else if tf == TF_M15
        lineStyleFromInput(m15LineStyleInput)
    else if tf == TF_M30
        lineStyleFromInput(m30LineStyleInput)
    else if tf == TF_H1
        lineStyleFromInput(h1LineStyleInput)
    else if tf == TF_H4
        lineStyleFromInput(h4LineStyleInput)
    else
        lineStyleFromInput(d1LineStyleInput)

lineStyleForCurrentChart() =>
    if currentTfSec == tfSeconds(TF_M1)
        lineStyleForTf(TF_M1)
    else if currentTfSec == tfSeconds(TF_M5)
        lineStyleForTf(TF_M5)
    else if currentTfSec == tfSeconds(TF_M15)
        lineStyleForTf(TF_M15)
    else if currentTfSec == tfSeconds(TF_M30)
        lineStyleForTf(TF_M30)
    else if currentTfSec == tfSeconds(TF_H1)
        lineStyleForTf(TF_H1)
    else if currentTfSec == tfSeconds(TF_H4)
        lineStyleForTf(TF_H4)
    else if currentTfSec == tfSeconds(TF_D1)
        lineStyleForTf(TF_D1)
    else
        line.style_solid

lineWidthForTf(string tf) =>
    1

lineColorForTf(string tf) =>
    tf == TF_M1 ? m1Color : tf == TF_M5 ? m5Color : tf == TF_M15 ? m15Color : tf == TF_M30 ? m30Color : tf == TF_H1 ? h1Color : tf == TF_H4 ? h4Color : d1Color

highlightColorForTf(string tf) =>
    tf == TF_H4 ? color.yellow : color.orange

containsLevel(array<int> timesArr, array<float> pricesArr, array<bool> kindsArr, int pivotTime, float pivotPrice, bool isHigh) =>
    bool found = false
    if array.size(timesArr) > 0
        for i = 0 to array.size(timesArr) - 1
            sameTime = array.get(timesArr, i) == pivotTime
            sameKind = array.get(kindsArr, i) == isHigh
            samePrice = math.abs(array.get(pricesArr, i) - pivotPrice) <= eps
            if sameTime and sameKind and samePrice
                found := true
                break
    found

composeTrendState(int index) =>
    upTime = array.get(lastUpBreaks, index)
    downTime = array.get(lastDownBreaks, index)
    upTime == 0 and downTime == 0 ? TREND_UNKNOWN : upTime >= downTime ? TREND_UP : TREND_DOWN

trimLevels(array<float> pricesArr, array<int> timesArr, array<bool> kindsArr, int maxLevels) =>
    while array.size(pricesArr) > maxLevels
        array.shift(pricesArr)
        array.shift(timesArr)
        array.shift(kindsArr)

pruneOldLevels(array<float> pricesArr, array<int> timesArr, array<bool> kindsArr, int cutoffTime) =>
    if array.size(timesArr) > 0
        for i = array.size(timesArr) - 1 to 0
            if array.get(timesArr, i) < cutoffTime
                array.remove(pricesArr, i)
                array.remove(timesArr, i)
                array.remove(kindsArr, i)

snapAnchorToChartTime(int sourceTfSec, int pivotTime, float price, bool isHigh) =>
    int snappedTime = pivotTime
    if not na(currentTfSec) and currentTfSec > 0 and currentTfSec < sourceTfSec
        sourceTfMs = sourceTfSec * 1000
        barsPerSourceBar = int(math.ceil(sourceTfSec * 1.0 / currentTfSec))
        rawLookbackBars = scanBars * barsPerSourceBar + barsPerSourceBar + backstep + 10
        lookbackCount = math.min(bar_index + 1, math.min(rawLookbackBars, 5000))
        float bestDiff = na
        if lookbackCount > 0
            for shift = 0 to lookbackCount - 1
                barTime = time[shift]
                if not na(barTime) and barTime >= pivotTime and barTime < pivotTime + sourceTfMs
                    candidatePrice = isHigh ? high[shift] : low[shift]
                    diff = math.abs(candidatePrice - price)
                    if na(bestDiff) or diff < bestDiff
                        bestDiff := diff
                        snappedTime := barTime
    snappedTime

processTf(int index, string tf, array<float> pricesArr, array<int> timesArr, array<bool> kindsArr) =>
    tfSec = tfSeconds(tf)
    tfMs = tfSec * 1000
    [tfHigh, tfLow, tfTime, pivotHigh, pivotLow, pivotHighTime, pivotLowTime] = request.security(
         syminfo.tickerid,
         tf,
         [
             high,
             low,
             time,
             ta.pivothigh(high, depth, backstep),
             ta.pivotlow(low, depth, backstep),
             not na(ta.pivothigh(high, depth, backstep)) ? time[backstep] : na,
             not na(ta.pivotlow(low, depth, backstep)) ? time[backstep] : na
         ],
         lookahead = barmerge.lookahead_off
     )
    cutoffTime = tfTime - tfMs * scanBars
    array.set(tfCurrentTimes, index, tfTime)

    pruneOldLevels(pricesArr, timesArr, kindsArr, cutoffTime)

    if not na(pivotHigh) and not na(pivotHighTime)
        enoughDistance = bar_index > backstep
        withinScanWindow = int(pivotHighTime) >= cutoffTime
        if enoughDistance and withinScanWindow and not containsLevel(timesArr, pricesArr, kindsArr, int(pivotHighTime), pivotHigh, true)
            array.push(pricesArr, pivotHigh)
            array.push(timesArr, int(pivotHighTime))
            array.push(kindsArr, true)

    if not na(pivotLow) and not na(pivotLowTime)
        enoughDistance = bar_index > backstep
        withinScanWindow = int(pivotLowTime) >= cutoffTime
        if enoughDistance and withinScanWindow and not containsLevel(timesArr, pricesArr, kindsArr, int(pivotLowTime), pivotLow, false)
            array.push(pricesArr, pivotLow)
            array.push(timesArr, int(pivotLowTime))
            array.push(kindsArr, false)

    if array.size(pricesArr) > 0
        for i = array.size(pricesArr) - 1 to 0
            levelPrice = array.get(pricesArr, i)
            levelTime = array.get(timesArr, i)
            levelIsHigh = array.get(kindsArr, i)
            brokenUp = levelIsHigh and tfHigh > levelPrice + deviation and tfTime > levelTime
            brokenDown = not levelIsHigh and tfLow < levelPrice - deviation and tfTime > levelTime
            if brokenUp
                prev = array.get(lastUpBreaks, index)
                array.set(lastUpBreaks, index, math.max(prev, tfTime))
                array.remove(pricesArr, i)
                array.remove(timesArr, i)
                array.remove(kindsArr, i)
            else if brokenDown
                prev = array.get(lastDownBreaks, index)
                array.set(lastDownBreaks, index, math.max(prev, tfTime))
                array.remove(pricesArr, i)
                array.remove(timesArr, i)
                array.remove(kindsArr, i)

    array.set(trendStates, index, composeTrendState(index))

clearLines(array<line> linesArr) =>
    if array.size(linesArr) > 0
        for i = 0 to array.size(linesArr) - 1
            line.delete(array.get(linesArr, i))
    array.clear(linesArr)

isCoveredByHigher(array<int> drawnTimes, array<float> drawnPrices, array<int> drawnTfSecs, int tfSec, int anchorTime, float price) =>
    bool covered = false
    if array.size(drawnTimes) > 0
        for i = 0 to array.size(drawnTimes) - 1
            higherTf = array.get(drawnTfSecs, i) > tfSec
            samePrice = math.abs(array.get(drawnPrices, i) - price) <= snapTolerance
            if higherTf and samePrice
                covered := true
                break
    covered

drawTf(string tf, bool enabled, array<float> pricesArr, array<int> timesArr, array<bool> kindsArr, array<line> linesArr, array<int> drawnTimes, array<float> drawnPrices, array<int> drawnTfSecs, array<bool> drawnKinds, array<line> drawnLines) =>
    clearLines(linesArr)
    if not shouldDisplayTf(tf, enabled)
        0
    else
        tfSec = tfSeconds(tf)
        baseColor = lineColorForTf(tf)
        style = lineStyleForTf(tf)
        width = lineWidthForTf(tf)
        latestTime = 0
        latestPrice = 0.0
        latestIndex = -1

        if array.size(pricesArr) > 0
            for i = 0 to array.size(pricesArr) - 1
                levelPrice = array.get(pricesArr, i)
                levelTime = array.get(timesArr, i)
                levelIsHigh = array.get(kindsArr, i)
                anchorTime = snapAnchorToChartTime(tfSec, levelTime, levelPrice, levelIsHigh)
                if anchorTime > latestTime
                    latestTime := anchorTime
                    latestPrice := levelPrice
                    latestIndex := i

        sameAsChartTf = currentTfSec == tfSec
        skipNormalForLatest = (tf == TF_H4 or tf == TF_D1) and latestIndex >= 0 and not sameAsChartTf

        if array.size(pricesArr) > 0
            for i = 0 to array.size(pricesArr) - 1
                levelPrice = array.get(pricesArr, i)
                levelTime = array.get(timesArr, i)
                levelIsHigh = array.get(kindsArr, i)
                anchorTime = snapAnchorToChartTime(tfSec, levelTime, levelPrice, levelIsHigh)
                isLatestHighlightedLevel = skipNormalForLatest and i == latestIndex
                if isLatestHighlightedLevel
                    continue
                if not isCoveredByHigher(drawnTimes, drawnPrices, drawnTfSecs, tfSec, anchorTime, levelPrice)
                    newLine = line.new(anchorTime, levelPrice, time, levelPrice, xloc = xloc.bar_time, extend = extend.right, color = baseColor, style = style, width = width)
                    array.push(linesArr, newLine)
                    array.push(drawnTimes, anchorTime)
                    array.push(drawnPrices, levelPrice)
                    array.push(drawnTfSecs, tfSec)
                    array.push(drawnKinds, levelIsHigh)
                    array.push(drawnLines, newLine)

        if (tf == TF_H4 or tf == TF_D1) and latestTime > 0 and not sameAsChartTf
            highlightLine = line.new(latestTime, latestPrice, time, latestPrice, xloc = xloc.bar_time, extend = extend.right, color = highlightColorForTf(tf), style = lineStyleForCurrentChart(), width = width)
            array.push(linesArr, highlightLine)
            array.push(drawnTimes, latestTime)
            array.push(drawnPrices, latestPrice)
            array.push(drawnTfSecs, tfSec)
            array.push(drawnKinds, true)
            array.push(drawnLines, highlightLine)

        0

processTf(0, TF_M1, m1Prices, m1Times, m1IsHigh)
processTf(1, TF_M5, m5Prices, m5Times, m5IsHigh)
processTf(2, TF_M15, m15Prices, m15Times, m15IsHigh)
processTf(3, TF_M30, m30Prices, m30Times, m30IsHigh)
processTf(4, TF_H1, h1Prices, h1Times, h1IsHigh)
processTf(5, TF_H4, h4Prices, h4Times, h4IsHigh)
processTf(6, TF_D1, d1Prices, d1Times, d1IsHigh)

if barstate.islast
    table.set_position(trendTable, trendNavPosition())
    trendNavNeedsLift = trendNavVertical == "下" and trendNavHorizontal == "左"
    trendNavRow = 0
    drawnTimes = array.new_int()
    drawnPrices = array.new_float()
    drawnTfSecs = array.new_int()
    drawnKinds = array.new_bool()
    drawnLines = array.new_line()

    drawTf(TF_D1, showD1, d1Prices, d1Times, d1IsHigh, d1Lines, drawnTimes, drawnPrices, drawnTfSecs, drawnKinds, drawnLines)
    drawTf(TF_H4, showH4, h4Prices, h4Times, h4IsHigh, h4Lines, drawnTimes, drawnPrices, drawnTfSecs, drawnKinds, drawnLines)
    drawTf(TF_H1, showH1, h1Prices, h1Times, h1IsHigh, h1Lines, drawnTimes, drawnPrices, drawnTfSecs, drawnKinds, drawnLines)
    drawTf(TF_M30, showM30, m30Prices, m30Times, m30IsHigh, m30Lines, drawnTimes, drawnPrices, drawnTfSecs, drawnKinds, drawnLines)
    drawTf(TF_M15, showM15, m15Prices, m15Times, m15IsHigh, m15Lines, drawnTimes, drawnPrices, drawnTfSecs, drawnKinds, drawnLines)
    drawTf(TF_M5, showM5, m5Prices, m5Times, m5IsHigh, m5Lines, drawnTimes, drawnPrices, drawnTfSecs, drawnKinds, drawnLines)
    drawTf(TF_M1, showM1, m1Prices, m1Times, m1IsHigh, m1Lines, drawnTimes, drawnPrices, drawnTfSecs, drawnKinds, drawnLines)

    if showTrendTable
        visibleCol = 0
        for i = 0 to 6
            tfCode = tfCodeAt(i)
            trendState = array.get(trendStates, i)
            if shouldDisplayTf(tfCode, true) and visibleCol <= 6
                table.cell(
                     trendTable,
                     visibleCol,
                     trendNavRow,
                     tfLabel(i) + " " + trendMark(trendState),
                     text_color = trendTextColor(trendState),
                     bgcolor = trendBgColor(trendState),
                     text_size = size.small
                 )
                visibleCol += 1
        if visibleCol <= 6
            for col = visibleCol to 6
                table.cell(trendTable, col, trendNavRow, "", text_color = color.white, bgcolor = color.new(color.black, 100))
    else
        table.clear(trendTable, 0, 0, 6, 0)

使い方と仕様

このインジケーターの見方はとてもシンプルです。

基本の見方

チャート上に表示される水平レイは、まだ有効と判断されている高値・安値ラインです。
レジスタンス候補、サポート候補として使えます。

表示される時間足

現在のチャート時間足より下の時間足は基本的に表示せず、現在足以上の時間足ラインを表示します。
たとえば H1 チャートなら、H1・H4・D1 を中心に確認できます。

トレンドナビの意味

トレンドナビは各時間足の方向感を一覧表示します。

  • ↑ は直近で上方向優勢
  • ↓ は直近で下方向優勢
  • – は判定材料不足

水平レイとあわせて見ることで、
「上位足は上、でも短期足は戻している」
といった状況も把握しやすくなります。

オートレイだけ使いたいという場合は、非表示も可能です。

主な調整項目

設定では主に以下を調整できます。

  • Depth:Zigzagのパラメータ
  • Deviation:Zigzagのパラメータ
  • Backstep:Zigzagのパラメータ
  • scanBars:時間足ごとに捜査するバーの本数
  • 各時間足の表示 ON/OFF
  • 各時間足の色
  • 各時間足の線種
  • トレンドナビの表示位置

最初はデフォルトのまま使って、必要に応じて見やすく調整するのがおすすめです。

こんな人に向いています

この TradingView インジケーターは、特に次のような人と相性がいいです。

  • 手動でオートライン代わりに水平線を何本も引いている人
  • 自動ラインでチャートを整理したい人
  • 水平レイを使ったトレンド分析を効率化したい人
  • 上位足の重要ラインを見落としたくない人
  • ライン管理の手間を減らして分析に集中したい人

まとめ

AutoRay+TrendNavi は、TradingView 上で水平レイを自動ライン表示し、有効なラインだけを整理して見せてくれるインジケーターです。
手動で線を引く煩わしさ、微妙なズレ、消し忘れによる煩雑さを減らしながら、トレンドや重要価格帯の把握をサポートしてくれます。

「ラインを引く作業」ではなく、「ラインをどう読むか」に集中したい人にはかなり使いやすいはずです。
TradingView で水平線ベースの分析をしているなら、一度試してみる価値のあるインジケーターです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次