Pine Scriptの取引時間とタイムゾーン設計|夏時間のずれを防ぐ
チャート右下を「東京」に変えても、Pineのhourやtime()が同じ東京時間へ切り替わるわけではありません。Pineはチャート表示タイムゾーンを参照できず、時間関数は既定で銘柄の取引所タイムゾーンを使います。固定UTCオフセットを使えば夏時間で1時間ずれることもあります。本記事は市場が何時に開くかを推奨する記事ではなく、Pineがバーをどの時計でセッション内外へ分類したかを再現する実装監査です。
この記事が役立つ方: セッションストラテジーの取引時刻がずれる人/夏時間前後で結果が変わる人/時間帯別CSVを正しく作りたいPine開発者
まず押さえる重要ポイント
- チャートタイムゾーンは表示設定、取引所タイムゾーンは銘柄属性、明示タイムゾーンはPine関数の計算前提として別々に記録する。
time()はバー開始が取引時間帯内なら時刻、外ならnaを返し、time_close()はバー確定側を判定する。input.session()の時刻だけでなく、曜日、日またぎ、バー境界、時間足との整列を確認する。- 地域の現地時刻へ合わせる場合、固定UTCオフセットよりIANA識別子を使うと夏時間や地域ルール変更へ自動追随できる。
- 時間帯分析へ渡すCSVにはエントリー/決済時刻、使用タイムゾーン、セッション文字列、曜日定義を添える。
同じバーでも表示時刻と判定時刻は別
- 01チャートタイムゾーン
画面ラベルの表示設定
Pineから参照不可 - 02取引所タイムゾーン
銘柄の取引所現地時間
syminfo.timezone/既定値 - 03明示指定したIANAタイムゾーン
ストラテジーが定義したセッション時計
time(…, timezone)
夏時間America/New_Yorkは時期によりUTC−5 / UTC−4。固定UTC−4は通年のNY時間ではありません。
結論:取引時間帯には必ず「誰の時計か」を付ける
「09:30–16:00」とだけ書いた取引時間帯仕様は不完全です。少なくともタイムゾーン、曜日、バー開始と終了のどちらを判定するか、期間が日をまたぐか、対象時間足を添えます。Pineでタイムゾーンを省略したtime()/time_close()は、既定でsyminfo.timezoneに対応する取引所時間を使います。
| 時計 | 決めるもの | Pineからの扱い | 典型的な誤読 |
|---|---|---|---|
| チャートタイムゾーン | 軸・ログなどの見た目 | スクリプトから参照できない | 画面変更でストラテジー判定も変わると思う |
| 取引所タイムゾーン | 銘柄の暦変数と既定時間 | syminfo.timezoneで取得 | 自分のPCやJSTが既定だと思う |
| 明示指定タイムゾーン | 時刻/セッション判定の現地時計 | タイムゾーン引数で指定 | 固定UTCオフセットを地域名と同一視する |
スクリーンショットにはチャートタイムゾーン、設定記録には計算タイムゾーンを残します。
time・time_close・hour・syminfo.timezoneを用途で選ぶ
| 要素 | 返すもの | 取引時間帯監査での用途 | 注意 |
|---|---|---|---|
| time | バー開始のUNIXタイムスタンプ | 開始がセッション内か判定 | タイムスタンプ自体は絶対時刻だが、セッション引数の解釈にはタイムゾーンを使う |
| time_close | バー確定のUNIXタイムスタンプ | 終了側の境界を判定 | 価格ベースの非時間足ではnaになり得る |
| hour()/dayofweek() | 指定タイムゾーンの暦値 | ログ・曜日条件・境界表示 | 変数hour/dayofweekは取引所時間 |
| syminfo.timezone | 取引所のIANA文字列 | 既定時計の表示と記録 | チャートタイムゾーンではない |
| timenow | スクリプト実行時の現在時刻 | 実行ログなど | 各履歴バーの時刻ではない |
UNIXタイムスタンプは絶対時刻です。タイムゾーンは、その時刻を作る暦入力や表示値の解釈に使われます。
not na(time(timeframe.period, session, timezone))は、現在バーの開始時刻が指定セッション内にあるかを調べる定番です。バー確定もセッション内であることを要求するならtime_close()を別に確認します。1時間バーが15:30に開始し16:30に終了する場合、09:30–16:00のセッションでは開始だけ内側という状態があり得ます。
時刻・曜日・日またぎ・バー整列を一つずつ読む
時刻ベースのセッション文字列は、基本的にHHmm-HHmm:daysです。曜日は1=Sundayから7=Saturdayの数字集合で、たとえば平日だけなら23456です。時刻区間をカンマで複数指定することもできます。input.session()は入力値で時刻を選びやすくしますが、曜日は別入力値として結合する設計が明確です。
| 例 | 意味 | 境界上の確認 |
|---|---|---|
| 0930-1600:23456 | 指定タイムゾーンの平日09:30–16:00 | 対象時間足のバーが09:30に存在するか |
| 1700-1700:23456 | 17:00から翌17:00の日またぎ表現 | 取引日の所属と日跨ぎ |
| 0900-1130,1230-1500:23456 | 昼休みを除く二つの区間 | 11:30/12:30境界バー |
| 0000-0000:1234567 | 24時間・全曜日 | 銘柄データ自体の休止は別 |
取引所が定義するセッションと、時刻ベースのセッション文字列は別の概念です。
セッション終端が時間足のバー境界と合わないと、Pineの時間関数はその指定時間足用に内部バーを作って判定することがあります。見た目のチャートバーとの不一致を避けるには、開始・終了時刻を対象時間足のバー境界へそろえるか、開始/終了両側の判定を可視化して確認します。
地域時間には固定UTCからの時差ではなくIANAを使う
UTC-4は通年でUTCより4時間遅い固定オフセットです。America/New_Yorkは地域の時間ルールを表し、夏時間中はUTC−4、標準時間中はUTC−5へ自動調整します。両者は一年の一部で一致しても、同じ意味ではありません。
| 指定 | 夏時間追随 | 向く用途 | リスク |
|---|---|---|---|
| UTC/GMTオフセット | しない | 常にUTC基準で固定した研究窓 | 地域セッションが季節に1時間ずれる |
| IANA識別子 | する | ニューヨーク、ロンドンなどの現地時計 | 識別子の綴りと対象地域を確認 |
| syminfo.timezone | 取引所定義へ追随 | 銘柄ごとの取引所時間 | 別市場へ切替時に時計も変わる |
IANAは過去・将来の地域ルール変更にも対応するため、地域の現地セッションには公式が推奨する形式です。
- 夏時間切替前週を選ぶ
同じ曜日・時刻のバー判定を記録します。
- 切替週を選ぶ
固定UTCとIANAの差が出るバーを色分けします。
- 切替後週を選ぶ
セッションの開始/終了と最初のエントリーを再確認します。
- 別取引所銘柄へ切り替える
syminfo.timezoneと明示タイムゾーンのどちらを意図したか確認します。
| 確認点 | 通常週 | 切替週 | 合格条件 |
|---|---|---|---|
| 取引時間帯開始前 | 現地・UTC・対象 | 同じ三項目 | 現地開始前は除外 |
| セッション開始 | 最初の対象バー | 最初の対象バー | IANAで同じ現地時刻 |
| セッション終了前 | 最後の開始時点でセッション内のバー | 同じ相対位置 | 整列差を説明できる |
| セッション終端 | 開始/終了時点の所属 | 開始/終了時点の所属 | 同じ端点規則 |
| 固定UTC対照 | IANAとの差 | 一時間ずれるバー | 検出試験が反応する |
価格や戻り値の比較ではなく、一つの現地取引時間帯定義が季節の時計変更を越えて同じ分類を作るかを試験します。
同じ曜日、現地時刻、チャート時間足を通常週と切替週で一対にします。UNIXタイムスタンプ、取引所表示、IANA表示、固定UTC表示、time()/time_close()の結果を保存します。IANA版だけが現地時刻を維持し、固定オフセット版が1時間ずれる検証例を対照として残すことで、試験が夏時間誤差を実際に検出できると証明します。
セッション文字列とIANAタイムゾーンを入力値へ明示する
次の教育用ストラテジーは、時刻、曜日、タイムゾーンを別入力値にし、バー開始が取引時間帯内のときだけエントリーを許可します。取引時間帯終了を検出したら保有中の建玉を終了します。移動平均交差は動作確認用であり、取引時間帯や銘柄の推奨ではありません。
//@version=6
strategy("IANA session filter audit", overlay = true,
initial_capital = 100000, margin_long = 100, margin_short = 100)
string hoursInput = input.session("0930-1600", "Session hours")
string daysInput = input.string("23456", "Session days",
options = ["23456", "1234567"])
string timezoneInput = input.string("America/New_York", "Session time zone",
options = ["America/New_York", "Europe/London", "Asia/Tokyo", "Etc/UTC"])
string sessionString = hoursInput + ":" + daysInput
bool opensInSession = not na(time(timeframe.period, sessionString, timezoneInput))
bool sessionEnded = not opensInSession and opensInSession[1]
float fast = ta.ema(close, 20)
float slow = ta.ema(close, 50)
bool longSignal = ta.crossover(fast, slow)
if opensInSession and longSignal and strategy.position_size == 0
strategy.entry("Long", strategy.long)
if sessionEnded and strategy.position_size != 0
strategy.close_all(comment = "Session end")
bgcolor(opensInSession ? color.new(color.teal, 88) : na)
plot(fast, "Fast", color.aqua)
plot(slow, "Slow", color.orange)セッション終端がチャート時間足に整列するか、日またぎや価格ベースのチャートで同じ挙動になるかを個別に確認してください。
監査版では、str.format_time()でバー時刻を取引所、Etc/UTC、選択IANAの三つへ整形して表やlogへ出すと、表示と判定の混同を見つけやすくなります。公開版では重い描画を必要最小限にし、入力値と説明へタイムゾーンを明記します。
この例のsessionEndedは、最初のセッション外バーをスクリプトが評価した時点でtrueになります。そのバーの終了計算でstrategy.close_all()が成行注文を生成し、標準的な模擬約定では実際の約定は次に利用可能なティックです。したがって「16:00に退出」と書かず、セッション終端、セッション外バーの開始/終了、注文作成、約定の四時刻を別列へ保存します。process_orders_on_closeを使う比較も別版であり、実ブローカーのセッション終端約定を保証しません。
バー開始とバー確定の取引時間帯所属を別々に試算する
ミニ計算機は24時間の単純な時計上で、取引時間帯開始・終了、バー開始、バー長を受け取り、開始端点と終了端点が区間内かを別々に返します。二端点の所属だけから、どの境界を何回通過したかまでは判定しません。タイムゾーン変換や夏時間そのものは計算せず、変換後の同一現地時計にそろえた値を入れる前提です。日またぎ区間にも対応する概念モデルです。
継続時間 = (終了時刻 − 開始時刻 + 24) mod 24開始位置 = (バー開始 − 開始時刻 + 24) mod 24開始時点でセッション内 = 開始位置 < 継続時間バー確定時刻 = (バー開始 + バーの長さ(分)÷ 60) mod 24開始時刻=終了時刻を24時間セッションとして扱う設計を明記します。終端を含むかはストラテジー仕様に合わせて統一してください。- 開始バーの開始が取引時間帯開始と一致するか
- 終了直前バーの終了が取引時間帯終端を越えないか
- 夏時間切替前後で同じ現地時刻のバーを選べるか
- 日またぎのエントリーと決済が同じ暦上の曜日へ誤分類されないか
- 低流動性や休場で期待した境界バーが欠けていないか
セッション境界確認表を時刻付き出力へ添える
- 時計を固定
セッション文字列、曜日、IANAタイムゾーン、チャート時間足を保存します。
- 境界を可視化
セッションの開始/終了、開始時点/終了時点のセッション内判定を確認します。
- 夏時間三期間を試験
切替前・切替週・切替後で最初と最後の対象バーを照合します。
- 取引一覧を出力
エントリー/決済時刻とタイムゾーンメモをCSV/XLSXへ添えます。
- 条件付きで分析
時刻粒度があるファイルだけを取引時間帯・曜日・時間帯分析へ使います。
境界判定はスクリーンショットだけで終えず、セッション境界確認表へ残します。通常日と夏時間切替週について、開始直前、開始一致、終了直前、終了一致のバーを選び、IANAタイムゾーン、セッション文字列、曜日、開始/終了時刻、time()/time_close()の結果を一行ずつ保存します。
確認表と取引CSVは同じバージョンIDで結び、チャートタイムゾーンは表示用、取引所タイムゾーンは既定の計算時計、明示指定したIANAタイムゾーンはストラテジーが選んだ時計として別列にします。四つの確認が期待どおりでない版はセッション別の成績比較へ進めません。
| 段階 | 必須時刻 | 確認する失敗境界 |
|---|---|---|
| バー分類 | バー開始・バー確定・タイムゾーン | 開始時点と終了時点のセッション内判定の混同 |
| セッション遷移 | 最後のセッション内バー・最初のセッション外バー | 欠損バーで検出が遅れる |
| 注文生成 | strategy.close_allを実行した計算時刻 | 終端時刻と同一視する |
| 模擬約定 | 取引一覧の決済時刻・価格 | 次ティックまで建玉が残る |
| 比較条件 | process_orders_on_close・時間足・セッション文字列 | 複数変更を一実行へ混ぜる |
分類が正しくても退出約定がセッション内とは限りません。バーのセッション内外判定と注文処理の流れを別々に合格させます。
再現手順は通常週、日またぎ、夏時間切替週の三組です。各組で最後のセッション内バーと最初のセッション外バーを固定し、開始/終了時点の内外判定、sessionEnded、終了注文の生成、実際の約定を順に記録します。次に時間足だけを変え、境界バーが欠ける場合や終端へ整列しない場合でも説明が維持されるか確認します。分類だけ合うが約定が遅れる実行を削除せず、退出設計の失敗として保存します。
バー開始/終了の区間判定
同一の現地時計へ変換済みの時刻を使い、バーの開始端点と終了端点が取引時間帯内かを別々に確認します。境界通過回数の判定ではありません。
継続時間=(b−a+24)%24(0なら24)。openOffset=(c−a+24)%24、終了=(c+d/60)%24、closeOffset=(終了−a+24)%24。各端点はオフセット<継続時間で判定します。境界通過、注文生成、約定、タイムゾーン変換、夏時間、休場、非時間足は判定しません。
よくある質問
チャートのタイムゾーンを変えるとPineのセッション判定も変わりますか?
通常は変わりません。チャートタイムゾーンは表示設定で、Pine Scriptから参照できません。タイムゾーン未指定の時間関数は取引所タイムゾーンを既定に使います。
UTC-4とAmerica/New_Yorkは同じですか?
一年を通じて同じではありません。UTC-4は固定オフセットですが、America/New_Yorkは夏時間に応じてUTC-4とUTC-5を切り替えます。
time()がセッション内でもバー確定は外になることがありますか?
あります。time()はバー開始側を判定します。長い時間足や境界がバーへ整列しない場合はtime_close()も確認し、開始時点でセッション内か、バー全体がセッション内かを区別してください。
2200-0200のセッションが二つの暦日にまたがるのはなぜですか?
指定タイムゾーンの22:00に始まり、午前0時を越えて翌02:00に終わる日またぎ区間だからです。チャートの日付ラベルだけで分類せず、セッション開始側の日付、曜日指定、必要ならtime_tradingdayも記録して意図した取引日にそろえます。
夏時間切替日に現地時刻が1時間飛んだり重なったように見える時はどう確認しますか?
IANAタイムゾーンで切替前後のバーを選び、UTC時刻、現地表示、バー開始/終了、セッション内外判定を同じ確認表へ並べます。現地ラベルの不連続だけで欠損バーや重複約定と判断しないでください。
根拠資料と確認先
- TradingView Pine Script — Time取引所/チャートのタイムゾーン、IANA、DST、time()/time_close()の公式解説。
- TradingView Pine Script — Sessionsセッション文字列、曜日、名前付きセッション、時刻ベース判定の公式仕様。
- TradingView Pine Script — Times, dates and sessions FAQセッション検出、時刻処理、境界に関する公式FAQ。
- TradingView Pine Script — Strategies FAQストラテジーの日付・時間範囲フィルターの公式例。
編集・発行: SG Group · 編集方針: TradingView公式ヘルプとPine Script公式文書を優先し、金融市場・商品に関する説明は取引所、監督当局、一次資料で補完しています。機能、データ、料金、接続条件は変わるため、実際の利用前に公式画面とリンク先の最新情報を確認してください。
重要事項: 本記事はTradingViewの画面、チャート、アラート、スクリーナー、ペーパートレード、Pine Script等の一般的な学習情報です。投資助言、売買シグナル、特定商品・データ提供者・ブローカーの推奨、将来価格や利益の保証ではありません。機能、料金、データ、取引所区分、通知、注文連携、Pine Scriptの仕様はプラン・地域・接続先・時点で異なり変更されることがあります。実際の資金を使う前に、TradingView公式資料、データ提供元、接続先事業者の最新条件を確認し、架空データまたはペーパートレードで手順を検証してください。

