更新情報
ストラテジーSTEPを刷新しました(📘 新構成は無料公開・旧版購入者様特典あり)
これまで有料で展開していた
ストラテジー
実装解説を、より分かりやすく、より実践的に全面リニューアル しています。
新シリーズは、基礎から応用までを体系的に学べるよう【全5ステップ・完全無料】 で順次公開中です。
📢 旧シリーズをご購入いただいた方へ
これまで多くのフィードバックをお寄せいただき、誠にありがとうございます。
旧版をご購入いただいた皆様には、環境構築代行に関する優待特典 をご用意しております。
特典の受け取り方法や代行内容の詳細は、下記の案内ページをご確認ください。
👉 (KFO) 環境構築代行・優待特典のご案内
📊 利確と損切りはどう決めればいい?
ゴールデンクロス
で綺麗に入れて
「伸びたのに、逆行して結局
損切り
」
「入り方は合っている気がするのに、結果が噛み合わない」
そういった経験がある方も多いはずです。
エントリー
ばかり考えて、出口を「なんとなく」で決めていると、こうしたズレが起きやすくなります。
こんな方には、
ATR
(平均真幅)を使った出口設計を試してみるのがおすすめです。
💡 この STEP シリーズでは、
バックテスト
や検証の詳細には踏み込まず、Pine スクリプトによる
ストラテジー
実装の理解 にフォーカスしています。 本記事は学習目的の内容であり、利益や
勝率
を保証するものではありません 。検証や改善の進め方については、以下の記事を参考にしてください。
👉 TradingView で学ぶバックテスト入門|売買ルールの検証と最適化ガイド
👥 この記事は誰向け?
ゴールデンクロス
などの
エントリー
手法は作れたが、出口設計に自信がない人
デッドクロス
以外の利確・
損切り
ルールを検討してみたい人
相場の値動きに合わせて柔軟に手仕舞いしたい初心者
TradingView
で
ストラテジー
を作り始めたばかりの人
エントリー
後の「どう終わるか」を整理したい人
📖 この記事でわかること
ATR
(Average True Range)の基本的な考え方
なぜ
ATR
が出口設計と相性がいいのか
シグナル型出口(
デッドクロス
)との違い
ATR
を使ったシンプルな利確・
損切り
ルール例
出口ルール設計で注意すべき落とし穴
ATRとは何か?
ATR
は、値動き幅をもとにして、相場の
ボラティリティ
を表現するための指標です。
📌 「
ATR
= ボラそのもの」ではなく。「
ATR
= 値動き幅から算出した指標」
ポイントは、
上がるか下がるかは示さない
「どれくらい動きやすいか」だけを表す
という点です。
なぜ出口設計でATRが使われるのか
エントリー
方向を決める指標 ではなく、
出口や
ポジション
管理を補助する指標 として使われることが多くなります。
💡
ボラティリティ
フィルターとして、
エントリー
条件の一部に使われるケースもあります
📌 ATRのメリット
今の相場がどれくらい動きやすいか に応じて、
利確・
損切り
幅を調整する
という考え方が可能になります。
ATRを使ったシンプルな出口ルール例 考え方はとてもシンプルです。
損切り
:
エントリー
価格 ±
ATR
× n
利確 :
エントリー
価格 ±
ATR
× m
💡「n」「m」は調整用の倍率です。
Pineスクリプト例(ATR取得) atrValue = ta.atr(14)
💡 このように、Pineでは 簡単に
ATR
を取得する ことが可能です。
デッドクロスとATRは対立しない 例えば、
デッドクロス
:大きな流れの終了判断
ATR
:想定外の値動きへの保険
というように、 役割を分けて併用する設計 もよく使われます。
💡 出口ルールは1つだけである必要はありません。
ATR出口ロジック // --------------------
// ATRベース出口
// --------------------
if strategy.position_size > 0 // ポジション保有中のみ 実行
entryPrice = strategy.position_avg_price // エントリー価格 (正確には平均の約定価格)
stopPrice = entryPrice - atrValue * 1.5 // エントリー価格 - ATR × 1.5倍で 損切り(ストップ)
limitPrice = entryPrice + atrValue * 2.0 // エントリー価格 + ATR × 2倍で 利確(リミット)
strategy.exit(
"ATR Exit",
from_entry="Long",
stop=stopPrice,
limit=limitPrice
)
この部分では、
ポジション
を持っている間だけ有効になる「自動の利確・
損切り
ルール」 を設定しています。
「stop=
逆指値
損切り
」「limit=
逆指値
利確」と思うとわかりやすいと思います。
📌 今回は一歩進めて「ドテン」を採用してみる ここまでは、
ゴールデンクロス
で
エントリー
デッドクロス
で手仕舞いという、シンプルな構成で考えてきました。
今回はこの流れを少し発展させて、
デッドクロス
が出たら決済するだけでなく、そのまま反対方向(
ショート
)に入る「ドテン」構成
にしてみましょう。
ゴールデンクロス
→ LONG
デッドクロス
→ SHORT(同時にLONGは終了)
という形です。
このようにすると、
トレンド
転換を「終了」ではなく「次のチャンス」として扱える
上下どちらの動きも戦略に取り込める
という特徴を持った
ストラテジー
になります。
もちろん、ドテンが常に正解というわけではありません が、シグナルの使い方を広げる例として、「出口」と「次の
エントリー
」をつなげる設計の一例です。
// --------------------
// エントリー(ドテン)
// --------------------
if goldenCross and volumeOK
strategy.entry("Long", strategy.long)
if deathCross and volumeOK
strategy.entry("Short", strategy.short)
ここで起きていること(要点)
strategy.entry(“Short”, strategy.short)
→ LONG保有中なら自動でクローズ → 即SHORT
ATR
出口は
LONG:下がったら
損切り
/ 上がったら利確
SHORT:上がったら
損切り
/ 下がったら利確
デッドクロス
は
「決済」ではなく「次の方向への
エントリー
シグナル」 になる
📌 デイトレでは「当日クローズ」も出口ルールに入れる ここまで見てきたように、出口ルールには
デッドクロス
:流れの終了判断
ATR
:想定外の値動きへの保険
といった役割分担があります。
デイトレ
前提の場合、ここにもう一つ、当日中に必ず手仕舞う という 時間ベースの出口 を加えることがあります。
なぜ当日クローズを入れるのか
翌日の
ギャップ
リスクを避けたい
引け
後のニュースに振り回されたくない
といった理由から、
ポジション
を持ち越さない設計が有効なケースも多いです。
制度変更対応 2024年11月5日(火)から東京証券取引所の株式取引時間が30分延長されています。
これらを加味した
バックテスト
を行うには少し工夫が必要です。
string tz = "Asia/Tokyo" // 日本時間
// 制度変更日(2024-11-05 00:00)
int changeDate = timestamp(tz, 2024, 11, 5, 0, 0)
// 現在バーが制度変更前か後か
bool isBeforeChange = time < changeDate
Pine Scriptの計算タイミング
Pine Script
は基本的に「バーが確定した瞬間(終値が決まった時)」にしか計算を行いません。
つまり
5分足
チャート
で動かしている場合:
→ 15:20:00に計算
30分足
チャート
で動かしている場合:
→ 15:30:00に計算
こういった挙動を加味した実装が必要になります。
// --------------------
// 当日クローズ(デイトレ用)
// --------------------
string tz = "Asia/Tokyo" // 日本時間
// 制度変更日(2024-11-05 00:00)
int changeDate = timestamp(tz, 2024, 11, 5, 0, 0)
// 現在バーが制度変更前か後か
bool isBeforeChange = time < changeDate
// 時刻条件
bool isAfter1450 = hour(time, tz) > 14 or (hour(time, tz) == 14 and minute(time, tz) >= 50)
bool isAfter1520 = hour(time, tz) > 15 or (hour(time, tz) == 15 and minute(time, tz) >= 20)
// 制度に応じた引け判定
bool isDayClose =
(isBeforeChange and isAfter1450) or
(not isBeforeChange and isAfter1520)
// バー確定 + ポジションあり → 決済
if isDayClose and barstate.isconfirmed and strategy.position_size != 0
strategy.close_all(comment="制度対応・引け決済", immediately=true)
barstate.isconfirmed の意味:
「バーが動いている最中に何度も通知が飛ばないように、しっかり確定してから1回だけ実行してね」という指示です。
immediately=true の意味:
通常、
ストラテジー
の注文は「条件を満たした次のバーの始値」で執行されますが、これを true にすることで、条件を満たしたバーの終値(確定したその瞬間) で決済しようとします。
引け
間際の
デイトレ
では必須の設定です。
⚠️ デイトレでの当日クローズに関する注意点(時間足依存) ここで紹介した当日クローズ処理は、
バックテスト
上では意図どおりに動作します。
ただし、
Pine Script
の仕様上、
時間足
によって挙動に差が出る点 には注意が必要です。
5分足などの短い
時間足
では
→
引け
付近(15:20 や 15:25)のバーで評価されるため、
ほぼ想定どおりのタイミングで決済されます。
15分足・30分足などの
時間足
では
→ 条件は「バーが確定したタイミング」でしか評価されないため、
引け
後(15:30 など)にまとめて決済判定が行われます。
その結果、
バックテスト
上は「当日
引け
決済」に見えていても
リアルタイム通知では
翌営業日の寄り付きで手仕舞い指示が飛ぶ
という挙動になる可能性があります。
📌 これはロジックの誤りではなく、
Pine Script
が「バー確定ベース」で動作する仕様による制限です。
✅️ 通知を利用した
自動売買
運用では別途クローズ処理を設けるのがより安全です。
✅ まとめ|出口設計は調整の余地を広げる
ATR
を使うことで、
相場の値動きを考慮した出口設計 が可能になります。
エントリー
手法が同じでも、
どのような出口ルールを組み合わせるか によって、戦略の性格は大きく変わります。
さらに
ATR
・
デッドクロス
・当日クローズは
それぞれ別の役割を持つ出口ルールです。
まずはシンプルな形で導入し、 出口にも設計の選択肢がある という感覚を掴むことが大切です。
GC + 出来高 + ATR出口ストラテジー //@version=6
strategy(
"GC + 出来高 + ATR出口",
overlay=true,
initial_capital=1000000,
default_qty_value=100
)
// --------------------
// 移動平均
// --------------------
sma5 = ta.sma(close, 5)
sma25 = ta.sma(close, 25)
// --------------------
// 出来高フィルター
// --------------------
volMA = ta.sma(volume, 20)
volumeOK = volume > volMA
// --------------------
// ATR設定
// --------------------
atrValue = ta.atr(14)
// --------------------
// 条件判定
// --------------------
goldenCross = ta.crossover(sma5, sma25)
deathCross = ta.crossunder(sma5, sma25)
// --------------------
// 描画
// --------------------
plot(sma5, color=color.blue)
plot(sma25, color=color.red)
// --------------------
// エントリー(ドテン)
// --------------------
if goldenCross and volumeOK
strategy.entry("Long", strategy.long)
if deathCross and volumeOK
strategy.entry("Short", strategy.short)
// --------------------
// ATRベース出口(LONG)
// --------------------
if strategy.position_size > 0
entryPrice = strategy.position_avg_price
stopPrice = entryPrice - atrValue * 1.5
limitPrice = entryPrice + atrValue * 2.0
strategy.exit(
"ATR Exit Long",
from_entry="Long",
stop=stopPrice,
limit=limitPrice
)
// --------------------
// ATRベース出口(SHORT)
// --------------------
if strategy.position_size < 0
entryPrice = strategy.position_avg_price
stopPrice = entryPrice + atrValue * 1.5
limitPrice = entryPrice - atrValue * 2.0
strategy.exit(
"ATR Exit Short",
from_entry="Short",
stop=stopPrice,
limit=limitPrice
)
// --------------------
// 引け前 全決済(制度変更対応)
// --------------------
string tz = "Asia/Tokyo" // 日本時間
// 制度変更日(2024-11-05 00:00)
int changeDate = timestamp(tz, 2024, 11, 5, 0, 0)
// 現在バーが制度変更前か後か
bool isBeforeChange = time < changeDate
// 時刻条件
bool isAfter1450 = hour(time, tz) > 14 or (hour(time, tz) == 14 and minute(time, tz) >= 50)
bool isAfter1520 = hour(time, tz) > 15 or (hour(time, tz) == 15 and minute(time, tz) >= 20)
// 制度に応じた引け判定
bool isDayClose =
(isBeforeChange and isAfter1450) or
(not isBeforeChange and isAfter1520)
// バー確定 + ポジションあり → 決済
if isDayClose and barstate.isconfirmed and strategy.position_size != 0
strategy.close_all(comment="制度対応・引け決済", immediately=true)
💡 次のステップ ここまでで
ストラテジー
を設計し・検証し・改良するための土台 は完成しました。
次回はこの
ストラテジー
をさらに一段引き上げ、
input を使った 実践向けの調整設計
バックテスト
結果を踏まえた 戦略の磨き込み
そして
自動売買
へつなげるための考え方と構成
といった、「作れる」から「使える」へ進むステップを解説していきます。
👉️ Pine Scriptで作るオリジナルストラテジーまとめ | バックテスト&自動売買へのステップ