この記事でわかること
- Pine Scriptのindicatorとstrategyで、できることがどう違うか
- 同じロジックを両方で書いたコードと、実機での表示
- strategy()の既定値と、約定・アラートの注意点
移動平均線のゴールデンクロスで売買したら、過去にどれくらい勝てたのか。これを確かめたいのに、チャートに三角の目印が出るだけで止まっているなら、書いているのはindicatorです。損益まで出すにはstrategyで書き直す必要があります。
そこで同じSMAクロスのロジックを、indicatorとstrategyの両方で書いてみました。どちらも無料アカウントのチャートに追加して、表示とできることの違いを確かめています。
📊 この記事はTradingViewユーザー向けです
TradingViewをまだ使っていない方は、まず無料アカウントを作成してみましょう。登録は30秒、クレジットカード不要です。
無料でTradingViewを始める →indicatorとstrategyの違い
Pine Scriptのスクリプトは、最初にindicator()かstrategy()(ライブラリならlibrary())のどれか1つを宣言します。宣言によって、できることが次のように変わります。
| 項目 | indicator | strategy |
|---|---|---|
| 主な用途 | 線や目印を表示する | 売買をシミュレーションする |
| 売買の命令 | なし | strategy.entry()などが使える |
| 結果の表示 | チャート上の線・目印 | チャート下のストラテジーレポート |
| アラート | alertcondition()とalert() |
alert()と注文約定のアラート |
| Pineスクリーナー | 使える | 使えない |
| 無料プランの枠 | 1個として数える | 1個として数える |
strategyでもplot()で線は描けます。strategyはindicatorの機能に、売買のシミュレーションを足したものと考えると分かりやすいです。
最後の行は、無料アカウントで確かめた結果です。チャートにMACD系のインジケーターとstrategyを入れた状態でRSIを足そうとすると、上限のメッセージが出ました。そこに並ぶ適用中の一覧には、strategyも入っていました。無料プランの数え方はTradingView無料プランでインジケーターを増やす方法にまとめています。
同じロジックを2通りで書く
20本と50本のSMAのクロスを例にします。短期が長期を上に抜けたら買い、下に抜けたら手仕舞いです。
indicator版
//@version=6
indicator("SMAクロス(indicator版)", overlay = true)
fastLen = input.int(20, "短期SMA", minval = 1)
slowLen = input.int(50, "長期SMA", minval = 1)
fast = ta.sma(close, fastLen)
slow = ta.sma(close, slowLen)
plot(fast, "短期SMA", color = color.orange)
plot(slow, "長期SMA", color = color.blue)
longSig = ta.crossover(fast, slow)
exitSig = ta.crossunder(fast, slow)
plotshape(longSig, "買い", shape.triangleup, location.belowbar, color.teal, size = size.small)
plotshape(exitSig, "手仕舞い", shape.triangledown, location.abovebar, color.red, size = size.small)
alertcondition(longSig, "ゴールデンクロス", "短期SMAが長期SMAを上抜け")
alertcondition(exitSig, "デッドクロス", "短期SMAが長期SMAを下抜け")

indicator版が出すのは「どこでクロスしたか」までです。alertcondition()を書いておくと、アラート作成の画面で「ゴールデンクロス」を条件に選べます。
strategy版
//@version=6
strategy("SMAクロス(strategy版)", overlay = true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.05)
fastLen = input.int(20, "短期SMA", minval = 1)
slowLen = input.int(50, "長期SMA", minval = 1)
fast = ta.sma(close, fastLen)
slow = ta.sma(close, slowLen)
plot(fast, "短期SMA", color = color.orange)
plot(slow, "長期SMA", color = color.blue)
longSig = ta.crossover(fast, slow)
exitSig = ta.crossunder(fast, slow)
if longSig
strategy.entry("Long", strategy.long)
if exitSig
strategy.close("Long")
主な変更は3か所です(目印とアラートの行は外しました)。1行目の宣言をstrategy()にして、資金・数量・手数料を指定しました。目印の代わりにstrategy.entry()で買い、strategy.close()で手仕舞います。

チャートに追加すると、下に「ストラテジーレポート」が開きます(以前の名前はストラテジーテスター)。日本語の画面では「主要統計」「パフォーマンス分析」「トレード分析」の順に結果が並びます。アップルの日足で出た主要統計は次のとおりです。
| 項目 | 結果 |
|---|---|
| 期間 | 1980年12月12日〜2026年11月6日 |
| 総損益 | +790,532.07ドル(+7,905.32%) |
| 最大ドローダウン | 179,377.40ドル(76.54%) |
| 勝率 | 42.71%(96回中41回) |
| プロフィットファクター | 2.206 |
初期資金1万ドル、毎回資産の100%を投入、手数料0.05%の設定です。総損益は大きく見えますが、途中で資産が76%減った時期があることも同時に分かります。過去の結果で、将来の成績を示すものではありません。
TradingViewで実際に試してみよう
この記事の内容はTradingViewで今すぐ実践できます。無料プランでも十分対応できます。
▶ TradingViewを無料で開くクレジットカード不要・いつでも解約OK
strategy()の既定値に注意
strategy版で資金や数量をわざわざ指定したのは、既定値のままだと結果が読みにくいからです。公式マニュアルにある主な既定値は次のとおりです。
| 引数 | 既定値 | 意味 |
|---|---|---|
initial_capital |
1,000,000 | 初期資金 |
default_qty_type / default_qty_value |
strategy.fixed / 1 |
毎回1単位だけ売買する |
commission_value |
0 | 手数料なし |
pyramiding |
1 | 同じ方向のポジションは1つまで |
process_orders_on_close |
false | 注文は次のバーで約定 |
既定値のままだと、100万の資金で1単位ずつ売買し、手数料もかかりません。損益率がほとんど動かず、手数料の分だけ結果が甘くなります。資金・数量・手数料の3つは宣言で指定しておくのがおすすめです。
約定は次のバーの始値
strategyは既定では、バーが確定した時点で計算します。そこで出した注文が約定するのは次のバーの始値です。日足なら、クロスした日の翌日の寄り付きで買う計算です。
process_orders_on_close = trueを宣言に足すと、同じバーの終値で約定させられます。ただし、終値を見てから同じ終値で売買するのは、現実にはほぼできません。成績を良く見せる方向に働くので、使うなら理由をはっきりさせてからにしてください。バーの途中と確定後で結果が変わる問題は、Pine Scriptのリペイント問題で扱っています。
アラートの違い
alertcondition()はindicator用の関数です。公式マニュアルによると、strategyに書いてもコンパイルエラーにはなりませんが、アラートは作れません。実際にstrategy版へ1行足してみても、エラーは出ずにチャートへ追加できました。気づかずに残しやすいので注意してください。
strategyでアラートを出すには、alert()関数を使うか、注文が約定したときのアラートを使います。Webhookで外部に通知する方法はPine ScriptのアラートをWebhookでDiscord通知する方法で解説しています。
どちらで書くか
売買のタイミングを目で確かめたいだけなら、indicatorで十分です。Pineスクリーナーで銘柄を絞り込みたい場合も、strategyは使えないのでindicatorで書きます。スクリーナー用の書き方はTradingView Pineスクリーナーの使い方を参照してください。
損益・勝率・ドローダウンを数字で見たいならstrategyです。indicatorで条件を作って確かめ、良さそうならstrategyに書き換える、という順番が手戻りが少ないと思います。strategyの設計はClaudeでTradingViewストラテジーを本格設計するで詳しく扱っています。
こんな場合はstrategyに向かない
strategyは1つのチャート(銘柄)を対象に検証します。複数の銘柄をまとめて持つポートフォリオの検証には向きません。また、無料プランでは、strategyも2個までのインジケーター枠に含まれます。
まとめ
- 宣言はindicator()かstrategy()のどちらか1つで、strategyだけが売買をシミュレーションできる
- strategyの結果はチャート下のストラテジーレポートに出る
- strategy()の既定値は初期資金100万・1単位・手数料0なので、宣言で指定しておく
- 注文は既定で次のバーの始値で約定する
- alertcondition()はstrategyでは使えないので、alert()か注文約定のアラートを使う
今回の検証は無料アカウントでもできました。チャートに読み込まれている範囲より長い期間で検証したい場合、Premium以上ならディープバックテストが使えます。公式ヘルプによると、最大200万本のバーまで遡れる機能です。プランの違いはTradingViewの有料プランはどれを選ぶ?で比べてください。Pine Scriptの基本から確認したい場合はPine Script入門ガイドがおすすめです。
📊 TradingViewプラン比較
| プラン | 月額 | 主な特徴 |
|---|---|---|
| Basic(無料) | $0 | 1タブに1チャート・広告あり・インジケーター2つ・価格アラート3件 |
| Essential | $12.95 | 広告なし・1タブに2チャート・インジケーター5つ・アラート20件 |
| Plus ⭐人気 | $29.95 | 1タブに4チャート・インジケーター10個・アラート100件 |
| Premium | $59.95 | 1タブに8チャート・インジケーター25個・アラート400件 |
| Ultimate | $199.95 | 1タブに16チャート・インジケーター50個・アラート1,000件 |
月額は月払い。年払いなら最大17%お得(2026年11月の料金ページより)
まずは無料プランで試して、必要なら有料プランへアップグレード
