更新情報
ストラテジーSTEPを刷新しました(📘 新構成は無料公開・旧版購入者様特典あり)
これまで有料で展開していた
ストラテジー
実装解説を、より分かりやすく、より実践的に全面リニューアルしています。
新シリーズは、基礎から応用までを体系的に学べるよう【全5ステップ・完全無料】で順次公開中です。
📢 旧シリーズをご購入いただいた方へ
これまで多くのフィードバックをお寄せいただき、誠にありがとうございます。
旧版をご購入いただいた皆様には、環境構築代行に関する優待特典をご用意しております。
特典の受け取り方法や代行内容の詳細は、下記の案内ページをご確認ください。
👉 (KFO) 環境構築代行・優待特典のご案内
📊 Pine スクリプトで学ぶオリジナルストラテジー作成+バックテスト+自動売買連携
これまでのステップで、実践的な
ストラテジー
を実装しました。
ただし、実際の相場に合わせて使うには、より細かいチューニングや検証が必要です。
そこで今回は、次のステップとして 「input を使った調整 →
バックテスト
→ オリジナル戦略化 」 という流れを紹介します。
そして、さらに発展したステップとして、
作成した
ストラテジー
をもとに
自動売買
の運用 へとステップアップする方法もご紹介します。
💡 この STEP シリーズでは、
バックテスト
や検証の詳細には踏み込まず、Pine スクリプトによる
ストラテジー
実装の理解にフォーカスしています。
本記事は学習目的の内容であり、利益や
勝率
を保証するものではありません。検証や改善の進め方については、以下の記事を参考にしてください。
👉 TradingView で学ぶバックテスト入門|売買ルールの検証と最適化ガイド
👥 この記事は誰向け?
-
TradingView
でカスタム
ストラテジー
を実装してみたい人
- さらに パラメータ調整・検証・自動化 に挑戦したい人
📖 この記事でわかること
-
Pine Script
の input 機能を使った
ストラテジー
調整方法
- オリジナル
ストラテジー
作成のヒント(指標や条件の差し替え)
-
バックテスト
結果の見方・概要(
勝率
、
PF
、最大
ドローダウン
)
- さらに発展させた
自動売買
へのステップアップ・概要
input を使ったパラメータ変更
前回まではコードに固定値を書いていましたが、input を使えばパラメータを自由に変更できます。
このようにすることで、「
ストラテジー
テスター」タブから数値を調整しながらテストできます。
input を使えば、移動平均や
ATR
の期間・倍率といった基本的な数値だけでなく、
ストラテジー
の挙動そのものを ON / OFF で切り替える ような設計も可能になります。
-
ATR
倍率が 0 の場合は、利確・
損切り
を行わない
-
ATR
を使った出口を一時的に無効化し、ドテンや時間決済のみで運用する、といった切り替えが可能
-
引け
決済(EOD Close)の ON / OFF
-
デイトレ
専用で必ず
引け
前に手仕舞う
- もしくは、
引け
決済を使わずに
ポジション
を持ち越す
-
引け
決済の時刻を input で指定
- 制度変更や市場ルールに合わせて、コードを書き換えずに決済時刻だけを調整できる
たとえば、次のような調整を input で行えるようにすると、相場環境や運用スタイルに応じて、より柔軟に
ストラテジー
を使い分けられます。
// --------------------
// パラメータ設定(input)
// --------------------
// 移動平均
smaShortLen = input.int(5, "短期SMA期間")
smaLongLen = input.int(25, "長期SMA期間")
// 出来高
volMaLen = input.int(20, "出来高平均期間")
// ATR(0 の場合は無効)
atrLen = input.int(14, "ATR期間")
atrStopMult = input.float(1.5, "ATR損切り倍率(0で無効)", step=0.1)
atrLimitMult = input.float(2.0, "ATR利確倍率(0で無効)", step=0.1)
// 引け決済
useEODClose = input.bool(true, "引け決済を有効にする")
// 引け決済時刻(制度変更後用)
eodHour = input.int(15, "引け決済 時", minval=0, maxval=23)
eodMinute = input.int(20, "引け決済 分", minval=0, maxval=59)
int は 1・2・3 のような整数、
float は 1.5・2.0 のような小数点を含む数値を指定できます。
初期値は、何も変更しなかった場合に使われるデフォルト値です。
パラメータを変えたら必ず
バックテスト
で検証します。
TradingView の UI でパラメータを変更する方法
🔹 操作手順
- 画面下部の「
ストラテジー
テスター」タブを開く
-
ストラテジー
名右の矢印をクリック、メニュから「設定」をクリック
- 各パラメータ(移動平均期間、閾値、出口幅など)を確認
- スライダーや数値入力欄で自由に値を変更
- 設定を変更すると、リアルタイムで
チャート
や
ストラテジー
テスターに反映されます
相場環境に応じて 最適な設定 を探す第一歩になります。
ストラテジーテスターでバックテスト結果を確認
TradingView
の
ストラテジー
テスターでは以下の数値を確認できます。
-
勝率
-
PF
(プロフィットファクター)=総利益 ÷ 総損失
- 最大
ドローダウン
(資金の落ち込み幅)
👉 数字を確認することで、「
勝率
は低いけど
PF
は高い=損小利大タイプ」といった 戦略の個性 が見えてきます。
💡
バックテスト
は奥が深く、ここだけで説明するには十分なスペースがないため、簡易な概要のみ に触れています。
より詳しく学びたい方は、バックテストのシリーズ記事も参照してください。
オリジナルストラテジーの完成!
ここまでで、
ストラテジー
実装の基本は完了です 🎉
コード全文(GCドテン + 出来高エントリーフィルター + ATR出口)
strategy.entry / strategy.exit の ID は、
自動売買
連携(Kabutech Flex Order)にそのまま注文識別子として使われます
👉️ KFO(Kabutech Flex Order)についてはこちら
//@version=6
// ※ strategy.entry / strategy.exit の ID は、自動売買連携時KFO(Kabutech Flex Order)にそのまま注文識別子として使われます
// https://kabutech.jp/lab/outsourcing/system-setup/
strategy(
"GCドテン + 出来高フィルター + 柔軟ATR出口 + 引け決済",
overlay=true,
initial_capital=1000000,
default_qty_value=100
)
// ====================
// パラメータ設定
// ====================
// 移動平均
smaShortLen = input.int(5, "短期SMA期間")
smaLongLen = input.int(25, "長期SMA期間")
// 出来高
volMaLen = input.int(20, "出来高平均期間")
// ATR(0 の場合は無効)
atrLen = input.int(14, "ATR期間")
atrStopMult = input.float(1.5, "ATR損切り倍率(0で無効)", step=0.1)
atrLimitMult = input.float(2.0, "ATR利確倍率(0で無効)", step=0.1)
// 引け決済
useEODClose = input.bool(true, "引け決済を有効にする")
// 引け決済時刻(制度変更後用)
eodHour = input.int(15, "引け決済 時", minval=0, maxval=23)
eodMinute = input.int(20, "引け決済 分", minval=0, maxval=59)
// ====================
// 指標計算
// ====================
// 移動平均
smaShort = ta.sma(close, smaShortLen)
smaLong = ta.sma(close, smaLongLen)
// 出来高
volMA = ta.sma(volume, volMaLen)
volumeOK = volume > volMA
// ATR
atrValue = ta.atr(atrLen)
// ====================
// エントリー条件
// ====================
goldenCross = ta.crossover(smaShort, smaLong)
deathCross = ta.crossunder(smaShort, smaLong)
// ====================
// 描画
// ====================
plot(smaShort, color=color.blue)
plot(smaLong, color=color.red)
// ====================
// エントリー(ドテン)
// ====================
if goldenCross and volumeOK
strategy.entry("Long", strategy.long)
if deathCross and volumeOK
strategy.entry("Short", strategy.short)
// ====================
// ATRベース出口(LONG)
// atr倍率が 0 の場合は何もしない
// ====================
if strategy.position_size > 0 and (atrStopMult > 0 or atrLimitMult > 0)
entryPrice = strategy.position_avg_price
stopPrice = atrStopMult > 0 ? entryPrice - atrValue * atrStopMult : na
limitPrice = atrLimitMult > 0 ? entryPrice + atrValue * atrLimitMult : na
strategy.exit(
"ATR Exit Long",
from_entry="Long",
stop=stopPrice,
limit=limitPrice
)
// ====================
// ATRベース出口(SHORT)
// atr倍率が 0 の場合は何もしない
// ====================
if strategy.position_size < 0 and (atrStopMult > 0 or atrLimitMult > 0)
entryPrice = strategy.position_avg_price
stopPrice = atrStopMult > 0 ? entryPrice + atrValue * atrStopMult : na
limitPrice = atrLimitMult > 0 ? entryPrice - atrValue * atrLimitMult : na
strategy.exit(
"ATR Exit Short",
from_entry="Short",
stop=stopPrice,
limit=limitPrice
)
// ====================
// 引け前 全決済
// 表示時間足によっては意図通り動作しない可能性があるので注意
// ====================
string tz = "Asia/Tokyo"
// 制度変更日(2024-11-05)
int changeDate = timestamp(tz, 2024, 11, 5, 0, 0)
// 制度変更前後判定
bool isBeforeChange = time < changeDate
// 制度変更前(より厳密に指定したい場合はinputに変更などを検討)
bool isAfter1450 = hour(time, tz) > 14 or (hour(time, tz) == 14 and minute(time, tz) >= 50)
// 制度変更後(input指定)
bool isAfterInputTime = hour(time, tz) > eodHour or (hour(time, tz) == eodHour and minute(time, tz) >= eodMinute)
// 制度に応じた引け判定
bool isDayClose =
(isBeforeChange and isAfter1450) or
(not isBeforeChange and isAfterInputTime)
// 引け決済
if useEODClose and isDayClose and barstate.isconfirmed and strategy.position_size != 0
strategy.close_all(
comment="引け決済",
immediately=true
)
オリジナルストラテジー作りのヒント
ここからは あなた自身が好みの手法を選んで実装していく面白い部分 です。
組み方は自由ですが、さらにオリジナル化する考え方を紹介します。
💡 ただし、ここから先は少しだけレベルが上がります。
今はすべてを理解できなくても問題ありません。
ベース指標を変える
ストラテジー
の軸となる指標を変更することで、全体の性格を大きく変えられます。
例えば、今回の
SMA
の代わりに
MACD
や
ボリンジャーバンド
を使えば、
トレンド
追従型や反転型など別のタイプの戦略が作れます。
指標ごとの特性を理解して組み合わせることで、オリジナリティの高い戦略を構築できます。
// MACD を使ったクロスエントリー
[macdLine, signalLine, _] = ta.macd(close, 12, 26, 9)
longCond = ta.crossover(macdLine, signalLine)
shortCond = ta.crossunder(macdLine, signalLine)
// ボリンジャーバンド
length = 20 // 移動平均の期間
mult = 2.0 // 標準偏差の倍率
basis = ta.sma(close, length)
dev = mult * ta.stdev(close, length)
upper = basis + dev
lower = basis - dev
エントリー方向を変える
単純ですが、同じ条件でも
エントリー
方向を逆にするだけで結果は大きく変わります。
どちらを選ぶかでトレードの性質は全く異なります。
同じインジケータでも「順張り型」か「逆張り型」かで戦略を切り替えるだけで、
勝率
や
リスクリワード
のバランスに大きな差が出るのです。
👉
ストラテジー
を作るときは「方向を逆にしたらどうなるか?」を検証してみるのも、有効な改善アプローチです。
フィルターを変える
エントリー
条件に加えるフィルターを変えると、無駄な
エントリー
を減らしたり、
勝率
を上げたりできます。
今回の例では
出来高
を使用しましたが、これを
DMI
や
RSI
に変更すると、
トレンド
や勢いの判断基準を変えられます。
複数のフィルターを組み合わせることで、より安定した戦略にすることも可能です。
// DMI フィルター
[diPlus, diMinus, adxVal] = ta.dmi(14, 14)
longCond = diPlus > diMinus
shortCond = diMinus > diPlus
// RSI フィルター
rsiVal = ta.rsi(close, 14)
longCond = rsiVal > 50
shortCond = rsiVal < 50
利確・損切りを変える
利確や
損切り
の設定方法を変更することで、
リスク管理
の性格を調整できます。
固定幅の利確・
損切り
ではなく、トレーリングストップ対応で追従型にすると、市場の動きに応じた柔軟な決済が可能になります。
これにより、急な値動きでも無駄な損失を抑え、利益を伸ばせる可能性が高まります。
トレーリングストップ対応で追従型:
// トレーリングストップ
trailPoints = 20 // トレーリング幅(呼び値単位)
trailOffset = 20 // トレーリング利確(呼び値単位)
stopLoss = 20 // 損切り幅(呼び値単位)
strategy.exit("Long Exit", from_entry="Long", trail_points=trailPoints, trail_offset=trailOffset, loss=stopLoss)
strategy.exit("Short Exit", from_entry="Short", trail_points=trailPoints, trail_offset=trailOffset, loss=stopLoss)
時間帯で手法を変える
相場の時間帯によって値動きの特徴が異なるため、時間帯ごとに手法を変えることで精度を向上させることができます。
寄り付き直後
- 値動きが大きく、
トレンド
が出やすい
- 短期の順張りやバンドウォーク狙いに向く
ザラ場中盤〜後半
- 相場が落ち着きやすく、
レンジ
が多くなる
-
スキャルピング
や逆張りを組み合わせると効率的
時間帯判定:9:00〜10:00(寄り付き)
// 寄り付きの時間帯判定
inSession = (hour > 9 or (hour == 9 and minute >= 0)) and (hour < 10 or (hour == 10 and minute <= 0))
// 例:条件に組み込む
longCond = inSession
※ 時間判定は、
チャート
のタイムゾーン設定に依存します。実運用では取引所時間に合わせて調整してください。
マルチタイムフレームを利用する
複数の時間軸を組み合わせることで、戦略の精度を向上させられます。
例えば、
日足
で
トレンド
方向を確認しつつ5 分足で
エントリー
することで、短期の
ノイズ
に惑わされず、長期方向に沿ったトレードが可能になります。
上位足の
トレンド
に沿った戦略は、特に順張り系の
ストラテジー
で有効です。
上位足のトレンドを確認してから短期足でエントリー:
// 日足の移動平均を参照
dailyMA = request.security(syminfo.tickerid, "D", ta.sma(close, 50))
// 5分足でエントリー
longCond = ta.crossover(ta.sma(close, 10), ta.sma(close, 20)) and close > dailyMA
shortCond = ta.crossunder(ta.sma(close, 10), ta.sma(close, 20)) and close < dailyMA
※ 上位足データは、確定足ベースで参照されます。
バックテスト
では未来の値を見ているわけではありません。
ファンダメンタルズ(財務指標)を利用する
テクニカル
指標だけでなく、企業の
PER
や
ROE
といった財務指標を条件に組み込むことで、
「業績の裏付けがある銘柄だけを取引する」戦略を作れます。
これにより、
チャート
形状は良いが中身が弱い銘柄を事前に除外でき、
ダマシや短命な上昇を避けやすくなります。
特に、中長期寄りの順張り戦略と相性が良い考え方です。
財務指標でエントリー銘柄をスクリーニング:
// 売上高成長率(前年同期比)
revenueGrowth = request.financial(
syminfo.tickerid,
"REVENUE_ONE_YEAR_GROWTH",
"FY"
)
// PER(株価収益率)
eps_ttm = request.financial(syminfo.tickerid, "EARNINGS_PER_SHARE", "TTM")
per = na(eps_ttm) ? na : close / eps_ttm // 現在のPER (TTMベース)
// ROE(自己資本利益率)
roe = request.financial(
syminfo.tickerid,
"RETURN_ON_EQUITY",
"FY"
)
// 財務条件
fundamentalOK = not na(revenueGrowth) and not na(roe) and revenueGrowth > 0 and roe > 10
※ 財務データは、銘柄や市場によって取得できない場合があります。その場合は na となり、条件は成立しません。
※
PER
は簡易的な計算例です。実務では決算タイミングのズレに注意してください。
条件を組み合わせればカスタムストラテジーが作成できます
ストラテジー
は、ざっくり言えば次の2つの条件の組み合わせです。
- どの条件で入るか(
エントリー
)
- どの条件で出るか(エグジット)
これらの条件(
因子
)を自由に入れ替えたり組み合わせたりすることで、自分だけのオリジナル
ストラテジー
を作ることができます。
因子(ファクター)とは何か?
ストラテジー
の中で使う
「判断材料になる条件」 のことを、
因子
(ファクター) と呼びます。
例えば、
- 移動平均の向き
-
RSI
が一定以上かどうか
- 上位足が上昇
トレンド
か
- 特定の時間帯かどうか
- 財務指標が一定の基準を満たしているか
といったものは、すべて
因子
です。
多因子戦略の注意点
これらの複数の
因子
を組み合わせる戦略を、多
因子
戦略と呼びます。
多
因子
戦略は、一見すると非常に精度が高そうに見えますが、なんでもかんでも条件を追加すれば良いわけではありません。
-
因子
を増やしすぎる
- パラメーターを細かく調整しすぎる
-
バックテスト
の見た目の成績だけを追いかける
こうした設計をしてしまうと、過去の
チャート
にだけ完璧に合う戦略になりやすくなります。
その結果、
-
過剰最適化
(カーブフィッティング)
-
過学習
(オーバーフィッティング)
といった状態に陥るリスクが高まります。
| 項目 |
過学習 |
過剰最適化 |
| 問題の場所 |
考え方(仮説) |
数値(パラメータ) |
| ありがち行動 |
条件を足しまくる |
数値を微調整しまくる |
| 初心者あるある |
「当てにいく」 |
「一番良い数字探し」 |
| 壊れ方 |
別相場で即死 |
少し変えると崩壊 |
因子
は「増やすもの」ではなく「意味を説明できるもの」だけを使う
シンプルでも、相場の構造や仮説に沿った
因子
で構成された
ストラテジー
の方が、長期的には安定しやすくなります。
カスタムストラテジーで通知を活用する
TradingView
では、作成した
ストラテジー
に対して 通知(
アラート
) を設定できます。
通知を受け取ることで、条件が成立したタイミングをリアルタイムで知ることができ、手動で売買判断を行う
システムトレード
が可能です。
🔹 操作手順
- 画面上部の「
アラート
」をクリック
- 「条件」をクリック、作成した
ストラテジー
を選択
- 作成
ストラテジー
で売買が成立したときに通知が表示されます
通知の設定例:
- 通知方法:ポップアップ / メール / モバイルプッシュ
- 内容:銘柄名・価格・戦略名などをメッセージに表示
💡 通知を活用すると、常に
チャート
を監視する必要がなくなり、効率的に取引チャンスを把握できます。
ストラテジー × 自動売買の力
通知をさらに発展させると
自動売買
が可能です。
TradingView
では直接発注はできませんが、
Webhook
通知を利用して外部の
自動売買
システムや
API
に接続することで、条件が成立した瞬間に自動で注文を出すことができます。
ポイント:
-
Webhook
URL に通知を送信
- 受信側で注文処理や
ロット
管理を自動化
- トレーリングストップや利確・
損切り
も組み合わせて運用可能
通知 →
自動売買
を組み合わせることで、感情に左右されず、設定した戦略通りの取引が実現できます。
これにより、あなたが作成した
ストラテジー
が自動で運用を行ってくれる環境 が整います。
自動売買
の具体的な方法や設定例は
👉️ 自動売買シリーズ記事で詳しく解説しています。
コード化はあくまで手段であり、目的ではありません。
ここまでで、
ストラテジー
をコードとして形にすることはできました。
しかし、コードが書けたからといって、すぐに安定して勝てるわけではありません。
バックテストでは見えにくい代表的なリスク
例えば、どれほど優秀な
ストラテジー
が完成したとしても、資金管理 ひとつ間違えば一発退場もあり得るのがトレードの世界です。
実際のトレードには、
バックテスト
では見えにくい 多くの落とし穴 が存在します
- 資金管理
-
スリッページ
- 流動性リスク
-
マーケットインパクト
-
過剰最適化
・
過学習
私たちは「手法(
ストラテジー
)」そのものに目が行きがちですが、本当に重要なのは、手法を含めた 「戦略そのものをデザインすること」 です。
ストラテジーではなく「戦略」を設計する
- どの市場で使うのか
- どの時間軸で運用するのか
- どの程度のリスクを許容するのか
- 想定外が起きたとき、どう振る舞うのか
これらすべてを含めて、戦略(
ストラテジー
+運用設計) です。
道具に振り回されるのではなく、道具を使いこなし、自分だけの「答え」を見つけ出してください。
👉️ 負けない為の理論的な戦略設計と最適化ガイド|TradingView活用
✅ おわりに|ストラテジー実装まとめ
-
ストラテジー
の基本ロジックを作成
- オリジナル要素の追加
- ベース指標の変更、フィルターの追加、利確・
損切り
の改善、マルチタイムフレームの活用
- パラメータを調整しながら
バックテスト
-
勝率
、
PF
、最大
ドローダウン
などを確認
- 数値をもとに戦略の特徴や改善点を把握
- 通知機能を追加
- 条件成立時に
アラート
を受け取ることで、手動でも安全に運用可能
🎯 ここまででできること
- 自分の手法を
ストラテジー
として形にできる
-
バックテスト
で性能を数値化して把握できる
- 通知を使って手動または部分的自動での運用も可能
ここまでの流れで、
ストラテジー
としての基盤は完成です。