FX Trading Journal
トップ / FX検証ツール
2026.05.19

TradingView無料プランの「インジ2個制限」を自作1本で突破する話(Pine Script v6コード付き)

TradingView無料Basicプランはインジケーターが2つまで。1時間足チャートに日足ローソクを重ねるPine Script v6コードを共有しつつ、自作インジ1本にまとめて枠を節約する考え方を、初心者向けに丁寧に解説します。

S3up
2026.05.19 / 12分
免責事項

この記事はPine Scriptの学習・情報提供を目的としており、特定の売買やインジケーターの利用を推奨するものではありません。コードはご自身の責任で動作確認のうえお使いください。FX取引にはリスクが伴い、損失が発生する可能性があります。投資判断はご自身の責任でお願いします。

「TradingViewの無料プランだと、インジケーターが2つまでしか同時に出せない」——この壁にぶつかって、移動平均と何かを諦めて選んでいませんか。あれもこれも入れたいのに、3つ目を足そうとした瞬間に「アップグレードしてください」と言われる、あの気持ちはよく分かるんですよ。

結論から先にお伝えします。自作インジケーター1本に機能を詰め込めば、無料プランのままでも実質的な枠を増やせます。今回はその発想と一緒に、私が1時間足のチャートで毎日使っているPine Script v6のコードを丸ごと公開します。1時間足の画面に「半透明の日足ローソク」が重なって見える、というシンプルなインジです。

この記事を読み終わったら、あなたは(1)「インジ2個制限」を自作1本でかわす考え方を持ち、(2)そのコードを自分のTradingViewに貼り付けて、1時間足チャートで動作確認できる状態になります。Pine Scriptを触ったことがない人でも、上から順番に読んでいけば「ここで何をしているか」が分かるように書いていきますね。

この記事でわかること

(1) 無料プランの「インジ2個制限」をどう回避するか — 2026年5月時点の各プラン枠数と、自作インジ1本に詰めるという発想を整理します。

(2) Pine Script v6コードの中身を行単位で解説 — 1時間足チャートに日足ローソクを重ねる仕組みを、専門用語を噛み砕きながら順番に追います。

(3) チャートに貼って動かすまでの手順とつまずきポイント — Pineエディタの開き方、保存、よくあるエラーの原因まで一通りカバーします。


無料プランの「インジ2個まで」って、実際どこで困るの?

「2つしか出せない」と聞くと、なんとなく不便そうだなとは思いますが、実際に何が困るのか、最初に整理しておきましょう。困りどころが具体的に分かると、解決策の意味も腑に落ちますからね。

たとえば1時間足でトレードしていて、移動平均(21)と移動平均(75)を両方表示したい、と思ったとします。これでもう枠は2つ埋まります。ここに「日足の高値・安値ライン」を足したい、と思った瞬間に詰むんですよ。「水平線は手動で引けばいいか…」と妥協する、あれです。

2026年5月時点で、TradingViewの料金プランごとのインジケーター枠は次のようになっています。

プランチャート1枚あたりのインジ枠
Basic(無料)2 個
Essential5 個
Plus10 個
Premium25 個
Ultimate50 個

※TradingView公式pricingページで確認した、2026年5月時点の数字です。TradingViewのバーリプレイは便利ですが、本格的な検証には専用ツールの方が向く場面もあります。FTO・FT6・TradingViewの違いはバックテストツール比較記事で整理しています。

無料の2個で本当に困るのは、移動平均だけじゃなく「日足の節目を1時間足にも出したい」「ボリンジャーバンドと一緒にRCIも見たい」みたいに、違う性格の情報を同じチャートで重ねたいときです。ここを自作1本でかわす、というのが今回の話の出発点なんですよ。


解決の発想は「インジ1本に複数機能を詰める」こと

結論はシンプルです。1つの自作インジケーターの中で、複数の表示をまとめて描いてしまえば、TradingView側からは「インジ1個」としてしか数えられません。これだけで枠1つ分の余裕が生まれます。

お弁当箱をイメージしてください。仕切りが2つしかないお弁当箱に、ご飯・おかず・サラダ・デザートを入れたかったら、おかずを大きな1つの仕切りにまとめて詰め込みますよね。インジ枠もこれと同じ発想です。「日足ローソク+節目ライン+セッション帯」を1本のスクリプトに詰めれば、お弁当箱の仕切りは1つしか使いません。

左側はインジ枠2つに既製インジAとBが収まり追加機能が入らない様子、右側は1枠を自作インジ1本にまとめ日足ローソク・節目ライン・セッション帯を詰め込んだ様子を対比した、無料プラン2枠制限を突破する概念図

そのために使う言語が Pine Script です。TradingView独自のスクリプト言語で、最新のバージョンはv6。公式ブログによると、v6は2024年12月10日にリリースされました。v5から構文がいくつか変わっているので、ネット上に転がっている古いサンプルがそのまま動かないこともあるんですよ。今回のコードは最初からv6で書いているので、そのあたりは気にしなくて大丈夫です。


今回作るインジ、画面上では何が起きるの?

コードを見る前に、完成形を想像しておきましょう。これ、料理でいう「完成写真」を先に見るのと同じで、ゴールが見えていると途中の手順が頭に入りやすいんですよ。

今回作るインジを1時間足チャートに追加すると、画面上では次のことが起きます。

1時間足チャートの上に半透明の日足ローソク約20本が等間隔で重なって表示され、左上のインジ名と歯車アイコンが右側の設定パネルにつながっている完成イメージのUIモックアップ

要するに「1時間足を見ながら、いま日足単位でどこにいるか」を同じ画面で把握できるようになる、ということです。日足の節目で反発しやすい癖を1時間足で利用したいとき、いちいち時間足を切り替えなくて済みます。


なぜ公式の plotcandle() ではなく box.new() で描くのか

Pine Scriptには、ローソク足を描くための公式関数として plotcandle() が用意されています。「だったらそれを使えばいいのでは?」と思うのが自然ですよね。今回あえて使わなかった理由を、先に説明しておきます。

これは画用紙と色鉛筆の関係に似ています。plotcandle() は「ローソク足の絵」をまるごと一発で描ける便利な型紙です。一方 box.new()line.new() は、四角と線を1つずつ自分で置いていく方式。手間は増えますが、実体の色・枠線の色・ヒゲの色・透過度・表示本数を、それぞれ独立に細かく制御できるのが強みなんですよ。

左に plotcandle() 方式で描いたシンプルな日足ローソク、右に box.new() と line.new() を組み合わせて実体・枠線・ヒゲ・透過度を独立に色付けできる日足ローソクを並べた描画方式の比較図

今回やりたいのは「1時間足のローソクの邪魔をしないように、薄く重ねる」こと。透過度を強めにかけたり、過去20本だけに絞ったり、という細かい調整がしたかったので、boxlineを使う方式を採用しました。公式の plotcandle() 方式と比べてどちらが優れている、という話ではなくて、目的に合うほうを選んだ、というだけです。

なお、box(四角)とline(線)にはチャート1枚あたりの上限があって、Pine Script v6では最大500個まで使えます。今回のコードは max_boxes_count = 200max_lines_count = 400 と指定しているので、上限の範囲内に収まっています。


Pine Script v6 のコード全体を見てみよう

では、コードの全文を一気に出します。長く見えますが、構造はシンプルなので、このあと上から順番に分解していきますね。まずは「こんなものか」と眺めるだけで大丈夫です。

//@version=6
indicator("Daily Candles on 1H Only", overlay = true, max_boxes_count = 200, max_lines_count = 400)

showDays = input.int(20, "表示する日足本数", minval = 1, maxval = 100)

bullColor = input.color(color.new(color.lime, 88), "陽線色")
bearColor = input.color(color.new(color.red, 88), "陰線色")
bullBorder = input.color(color.new(color.lime, 45), "陽線枠色")
bearBorder = input.color(color.new(color.red, 45), "陰線枠色")
bullWick = input.color(color.new(color.lime, 45), "陽線ヒゲ色")
bearWick = input.color(color.new(color.red, 45), "陰線ヒゲ色")

isOneHour = timeframe.isminutes and timeframe.multiplier == 60

var float dOpen = na
var float dHigh = na
var float dLow = na
var float dClose = na
var int dayStartBar = na

var box currentBody = na
var line currentUpperWick = na
var line currentLowerWick = na

var array<box> bodies = array.new<box>()
var array<line> upperWicks = array.new<line>()
var array<line> lowerWicks = array.new<line>()

if isOneHour
    isNewDay = timeframe.change("D")

    if isNewDay or na(dOpen)
        dOpen := open
        dHigh := high
        dLow := low
        dClose := close
        dayStartBar := bar_index

        isBull = dClose >= dOpen

        currentBody := box.new(
             left = dayStartBar,
             top = math.max(dOpen, dClose),
             right = bar_index,
             bottom = math.min(dOpen, dClose),
             border_color = isBull ? bullBorder : bearBorder,
             bgcolor = isBull ? bullColor : bearColor
        )

        currentUpperWick := line.new(
             x1 = bar_index,
             y1 = dHigh,
             x2 = bar_index,
             y2 = math.max(dOpen, dClose),
             color = isBull ? bullWick : bearWick,
             width = 1
        )

        currentLowerWick := line.new(
             x1 = bar_index,
             y1 = math.min(dOpen, dClose),
             x2 = bar_index,
             y2 = dLow,
             color = isBull ? bullWick : bearWick,
             width = 1
        )

        array.push(bodies, currentBody)
        array.push(upperWicks, currentUpperWick)
        array.push(lowerWicks, currentLowerWick)

        if array.size(bodies) > showDays
            box.delete(array.shift(bodies))
            line.delete(array.shift(upperWicks))
            line.delete(array.shift(lowerWicks))
    else
        dHigh := math.max(dHigh, high)
        dLow := math.min(dLow, low)
        dClose := close

    bodyTop = math.max(dOpen, dClose)
    bodyBottom = math.min(dOpen, dClose)
    isBull = dClose >= dOpen
    wickNow = isBull ? bullWick : bearWick
    midBar = math.round((dayStartBar + bar_index) / 2)

    box.set_left(currentBody, dayStartBar)
    box.set_right(currentBody, bar_index)
    box.set_top(currentBody, bodyTop)
    box.set_bottom(currentBody, bodyBottom)
    box.set_bgcolor(currentBody, isBull ? bullColor : bearColor)
    box.set_border_color(currentBody, isBull ? bullBorder : bearBorder)

    line.set_x1(currentUpperWick, midBar)
    line.set_x2(currentUpperWick, midBar)
    line.set_y1(currentUpperWick, dHigh)
    line.set_y2(currentUpperWick, bodyTop)
    line.set_color(currentUpperWick, wickNow)

    line.set_x1(currentLowerWick, midBar)
    line.set_x2(currentLowerWick, midBar)
    line.set_y1(currentLowerWick, bodyBottom)
    line.set_y2(currentLowerWick, dLow)
    line.set_color(currentLowerWick, wickNow)

これだけです。行数は多めに見えますが、やっていることは「新しい日の最初のバーで日足ローソクを作って、その日のうちはずっと同じローソクのサイズを更新し続ける」だけ。次の章で、ブロックごとに分けて読み解いていきましょう。


コードを上から順に読み解く(ブロック別解説)

ここからは、コードを上から順番に見ていきます。1ブロックずつ「何をしているか」「なぜそう書くのか」を噛み砕いて説明していきますね。プログラミングが初めての人でも、雰囲気で読めるように書いていきます。

細部に入る前に、全体の流れを5ステップで掴んでおきましょう。下の図のように、このコードは「基本設定 → 日足OHLCを取得 → 新しい日を検出 → ローソクを描画 → 古い足を削除」という順番でぐるっと一周します。1時間足のバーが進むたびに、この流れがもう一周回ると思ってください。

Pine Script v6 で日足ローソクを描く処理を5ステップに分けたフロー図。基本設定、日足OHLCを取得、新しい日を検出、ローソクを描画、古い足を削除の順に番号付きカードが並び、下段に1時間足限定動作・input調整可・古い描画削除の3つのポイントが添えられている

1行目「@version=6」って何の宣言?

最初の //@version=6 は、「このコードはPine Scriptのv6の文法で書いてあるよ」という宣言です。レシピで「これは2025年版の最新レシピですよ」と最初に書いてあるのと同じ感覚ですね。

これがないと、TradingView側は古いバージョンとして解釈しようとして、エラーになります。バージョン番号を変えるだけで動くわけではなくて、文法もバージョンごとに違うので、コピペするときは必ず1行目ごと持ってきてください

indicator(...) の3つの引数の意味

2行目の indicator("Daily Candles on 1H Only", overlay = true, max_boxes_count = 200, max_lines_count = 400) は、このスクリプトの「自己紹介」みたいなものです。

input欄で「色」と「本数」を変えられる仕組み

次のブロックは、設定画面で値を変えられるようにする部分です。input.int() は数字を入力する欄、input.color() は色を選ぶ欄ですね。

showDays = input.int(20, "表示する日足本数", minval = 1, maxval = 100) の中身を分解すると、「初期値は20、ラベルは『表示する日足本数』、1〜100の範囲で変えられる」という意味になります。チャート上でインジの歯車アイコンを開くと、ここで指定した項目が並んで見えるわけですね。

color.new(color.lime, 88) の「88」は透過度です。0が完全に不透明で、100が完全に透明。88はかなり薄めの色ですね。1時間足のローソクの邪魔をしないように、実体は88、枠線とヒゲは少し濃い45にしてあります。お好みで数字をいじってみてください。

「今、1時間足か?」を判定する1行

isOneHour = timeframe.isminutes and timeframe.multiplier == 60 は、このコードの「安全装置」です。チャートが1時間足のときだけ true、それ以外のときは false になります。

分解すると、timeframe.isminutes は「分足系の時間足ですか?」というチェック、timeframe.multiplier == 60 は「その倍率が60ですか?」というチェックです。両方とも true のとき、つまり「60分足=1時間足」のときだけ全体が true になる、というわけですね。

このフラグは後ろの大きな if isOneHour で使います。1時間足以外のチャートでは、それ以降の処理が一切実行されないので、誤って4時間足や日足に切り替えても、変な絵が出続けることはありません。これが先ほど触れた安全装置の正体です。

var で前のバーの値を引き継ぐ理由

次に出てくる var float dOpen = na といった行は、Pine Scriptの変数の宣言です。var がポイントで、「この変数の値は、次のバーに進んでも引き継ぎますよ」という意味になります。

Pine Scriptはちょっと特殊な言語で、デフォルトでは1本のバーが進むたびに変数が初期化されてしまうんです。でも今回は「日の始めに作った日足ローソクを、その日が終わるまで更新し続けたい」ので、値を持ち越せないと困りますよね。だから var を付けて「これは記憶しておいてね」と指定するんです。

dOpen / dHigh / dLow / dClose がその日の始値・高値・安値・終値、dayStartBar がその日が始まったバーの位置です。currentBody(実体の四角)、currentUpperWick(上ヒゲの線)、currentLowerWick(下ヒゲの線)も同じ理屈で、その日のうちは同じものを使い回します。

「新しい日になった瞬間」を捕まえる

isNewDay = timeframe.change("D") は、「いまのバーが新しい日の1本目ですか?」というチェックです。1日が変わった最初のバーだけ true、それ以外は false になります。

イメージとしては、カレンダーをめくる瞬間ですね。1時間足チャート上で、日付が昨日から今日に切り替わった瞬間に、ここが true になります。"D" は「日足」を指す書き方で、v6 の timeframe.change() でもそのまま動きます。

※ちなみに、Pine Script v5までは「日足」を表す書き方が違っていたり、bool型の扱いが緩かったりしたんですが、v6で文法が整理されました。ネットの古いサンプルをコピーしてきて動かないときは、このあたりが原因のことが多いです。

新しい日になった瞬間、または起動直後でまだ何も値が入っていないとき(na(dOpen) が true のとき)、その日の始値・高値・安値・終値を「いまの1時間足の値」で初期化します。同時に、その日用の新しい実体(box)と上下ヒゲ(line)を作って、配列に追加します。

日中の更新ロジック(高値・安値・終値の追っかけ)

新しい日ではないとき、つまり同じ日の途中のバーでは、else ブロックに入ります。やっているのはシンプルで、「高値は更新されたら更新、安値も更新されたら更新、終値はいまの足の終値で上書き」ですね。

たとえば9時の1時間足で高値が105円、10時の1時間足で105.3円まで伸びたら、その日の日足の高値も105.3円に更新します。math.max(dHigh, high) がそれをやっている部分です。これを24時間ぶん繰り返すことで、1日が終わるころには「24本の1時間足を1本の日足にまとめた」状態が完成するわけですね。

実体(box)とヒゲ(line)の描き分け

下半分の box.set_left(...)line.set_x1(...) がたくさん並んでいるブロックは、「いま見ている日足ローソクの形を、最新の値に合わせて引き直す」処理です。

実体(box)は「始値と終値のうち高いほうが上辺、低いほうが下辺」になります。bodyTop = math.max(dOpen, dClose)bodyBottom = math.min(dOpen, dClose) で計算していますね。陽線(始値より終値が高い)なら緑、陰線(始値より終値が低い)なら赤、と色を切り替えています。isBull ? bullColor : bearColor という書き方は「もし isBull が true なら bullColor、そうでなければ bearColor」という意味です。

上ヒゲ(line)は、「実体の上辺から、その日の高値まで」を1本の縦線で描きます。下ヒゲは「実体の下辺から、その日の安値まで」ですね。ヒゲのx座標を midBar(実体の左右の真ん中)にしているのは、見た目を本物のローソク足に近づけるためです。

古いローソクを消して画面をきれいに保つ

最後に、配列に溜まったローソクの本数が showDays を超えたら、一番古いやつを削除します。これをやらないと、box と line がどんどん増えていって、いずれ上限の500個に達して動かなくなってしまうんですよ。

if array.size(bodies) > showDays
    box.delete(array.shift(bodies))
    line.delete(array.shift(upperWicks))
    line.delete(array.shift(lowerWicks))

array.shift() は「配列の先頭から1つ取り出す」操作で、それを box.delete()line.delete() でチャートから消す、という流れです。お皿洗いで、たまったお皿を古い順に洗っていくイメージですね。これで、表示本数を20に設定していれば、常に最新20本だけがチャートに残ります。


チャートに貼って動かすまでの3ステップ

コードの中身が分かったところで、実際にチャートに乗せるまでの手順を整理します。3ステップで終わるので、構えなくて大丈夫ですよ。

  1. Pineエディタを開く:TradingViewのチャート画面を開いて、下のほうにある「Pineエディタ」タブをクリックします。空のテンプレートが出てきたら、中身をすべて消してください。
  2. コードを貼り付けて保存:先ほどのコード全文をコピーして、Pineエディタに貼り付けます。エディタ上部の「保存」を押して、好きな名前(たとえば「日足オーバーレイ」など)を付けてください。
  3. チャートに追加して1時間足に切り替え:保存したら、すぐ隣の「チャートに追加」を押します。チャートの時間足を1時間足(60m)に切り替えると、半透明の日足ローソクが重なって表示されるはずです。

もし表示する本数や色を変えたくなったら、チャート左上に出てくるインジ名の隣にある歯車アイコンをクリックすれば、設定画面が開きます。input で書いた項目がそのまま並んでいるので、好きにいじってみてくださいね。

インジケーターをただ増やすのではなく「何を残して何を捨てるか」の発想は、FXにインジケーターはいらないという話のほうにも書いているので、合わせて読むと考え方が立体的になりますよ。


うまく動かないときのチェックポイント

「貼ったのに何も表示されない」「エラーが出る」というときに、最初に確認してほしい3つのポイントをまとめておきます。


このコードを使う上での注意点と、向かない人

便利なインジではあるんですが、すべての人に役に立つわけではありません。先に「向かない人」をはっきりさせておきます。

このインジが向いているのは、1時間足を主戦場にしているスイング寄り〜デイトレ寄りの人です。日足の節目を1時間足で確認しながらエントリーしたい、という使い方ですね。逆に、1分足や5分足でスキャルピングをしている人、そもそも日足以上を主戦場にしている人にとっては、日足の情報をわざわざ重ねる意味があまりありません。シンプルに日足チャートを別タブで開いておくほうが速いです。

あと、ここは大事なところなので念のためお伝えしておくと、このインジを入れたから勝率が上がる、というものではありません。「日足の節目が見えやすくなる」という補助ツールであって、投資成果を保証するものではないんですよ。エントリー判断は、あくまであなた自身の手法とリスク管理に従って行ってください。

「そもそも自分はインジを増やすべきか、減らすべきか」で迷っている人は、インジケーターをやめた後に何を残すかの話を先に読んでみるといいです。今回のインジは「機能を1本にまとめる」という発想なので、減らす方向の考え方とも矛盾しません。


機能を足したくなったときの拡張アイデア

このコードに慣れてくると、「ついでにあれも描きたい」と欲が出てきます。せっかくの自作インジ1本なので、どんどん足していけばいいんですよ。いくつかアイデアを置いておきますね。

気をつけたいのは、Pine Script v6の box / line の上限が1インジあたり最大500個、という点。機能を足すほど描画オブジェクトが増えるので、max_boxes_countmax_lines_count の数字も合わせて増やしておきましょう。それでも500を超えると動かないので、本当に必要な機能だけを厳選するのがコツです。


FAQ

Q. 1時間足以外でも表示できるようにできますか?

できます。コードの isOneHour = timeframe.isminutes and timeframe.multiplier == 60 の部分を書き換えれば、たとえば「15分足と1時間足の両方で表示」みたいな指定もできます。ただし、5分足のように足の数が多すぎる時間足にすると、描画オブジェクトが上限を超えやすくなるので、その場合は showDays を小さくする必要が出てきます。

Q. v5のサンプルコードと混ぜても大丈夫?

そのまま混ぜると動かないケースが多いです。v5とv6では文法がいくつか変わっていて、特に bool型の暗黙の変換が廃止されたり、透過度の transp 引数が削除されたりしています。古いサンプルから「ロジックの考え方」を学ぶのは全然OKですが、コードをそのまま貼り付けるのではなく、v6の書き方に翻訳しながら取り込んでください。

Q. 表示が重くなりませんか?

デフォルトの20本表示なら、ほとんど気になりません。100本まで増やしても、最近のPCなら問題ないはずです。もしカクつくと感じたら、showDays を小さくするか、ブラウザのほかのタブを閉じてみてください。

Q. コピペすれば必ず動きますか?

記事執筆時点の環境では動作確認していますが、TradingView側の仕様変更などで動かなくなる可能性は常にあります。コピーするときは、1行目の //@version=6 から最後の行まで漏れなく持ってきてください。途中の行が抜けるとエラーになります。

Q. このインジを入れれば勝率は上がりますか?

残念ながら、インジケーター単体で勝率が上がることはありません。これはあくまで「日足の情報を1時間足の画面でも見える化する」補助ツールです。エントリーロジック、損切りルール、資金管理のほうが、勝ち負けへの影響はずっと大きいです。移動平均線の使い方と組み合わせて、自分の手法のなかでどう活かすかを考えてみてくださいね。


まとめ

長くなったので、要点をぎゅっとまとめます。

まずはコピペして、自分のチャートに貼ってみてください。動いた瞬間、「あ、これなら自分でも作れるかも」という感覚が掴めると思います。そこから先は、あなたのトレードに必要な機能を1本ずつ足していけばいいんですよ。

関連記事

カテゴリを見る
2026.05.23/15分

FXバックテストとは?裁量トレーダーが「自分にも必要か」を判断する入門ガイド

「バックテストはEAをやる人の話で、裁量の自分には関係ない」と思っていませんか。実は裁量トレーダーこそ、メンタル安定とドローダウン把握のためにバックテストが効きます。なぜ必要で何ができるかを、ゼロから解説します。

2026.05.23/13分

ForexTester Online(FTO)の不具合と修正状況 2026年5月版|どこまで直って、どこから未確定か

「FTOってバグが多いって本当?」を、煽りも擁護もせずに2026年5月時点の一次情報で確かめる記事です。直近2回のリリースで何が直り、Featurebaseに何が残っているのかを順番に見ていきます。

2026.05.22/14分

ForexTester Onlineで「上位足→中間足→下位足」のMTF環境認識を体に染み込ませる練習手順

「日足→4H→1Hを毎回開いてはいるけれど、どの足を信じればいいかブレる」を抜け出す練習手順です。FTOの機能を3段階のどこで使うか、操作レベルで噛み砕きます。