Pine Scriptの取引時間・タイムゾーン設定|夏時間対策 | SG Group
本文へ移動
TradingView解説 · 最終内容確認 英語で読む
Pineストラテジー設計 · TV19

Pine Scriptの取引時間とタイムゾーン設計|夏時間のずれを防ぐ

チャート右下を「東京」に変えても、Pineのhourやtime()が同じ東京時間へ切り替わるわけではありません。Pineはチャート表示タイムゾーンを参照できず、時間関数は既定で銘柄の取引所タイムゾーンを使います。固定UTCオフセットを使えば夏時間で1時間ずれることもあります。本記事は市場が何時に開くかを推奨する記事ではなく、Pineがバーをどの時計でセッション内外へ分類したかを再現する実装監査です。

この記事が役立つ方: セッションストラテジーの取引時刻がずれる人/夏時間前後で結果が変わる人/時間帯別CSVを正しく作りたいPine開発者

まず押さえる重要ポイント

三つの時計、一つの時刻

同じバーでも表示時刻と判定時刻は別

UNIXタイムスタンプ
  1. 01
    チャートタイムゾーン

    画面ラベルの表示設定

    Pineから参照不可
  2. 02
    取引所タイムゾーン

    銘柄の取引所現地時間

    syminfo.timezone/既定値
  3. 03
    明示指定したIANAタイムゾーン

    ストラテジーが定義したセッション時計

    time(…, timezone)

夏時間America/New_Yorkは時期によりUTC−5 / UTC−4。固定UTC−4は通年のNY時間ではありません。

UNIXタイムスタンプは一つです。時計表示と暦値の計算タイムゾーンが異なると、同じバーに別のhour・曜日が付くことがあります。
01 · 時刻判定の要点

結論:取引時間帯には必ず「誰の時計か」を付ける

「09:30–16:00」とだけ書いた取引時間帯仕様は不完全です。少なくともタイムゾーン、曜日、バー開始と終了のどちらを判定するか、期間が日をまたぐか、対象時間足を添えます。Pineでタイムゾーンを省略したtime()time_close()は、既定でsyminfo.timezoneに対応する取引所時間を使います。

三つの時計の責任範囲
時計決めるものPineからの扱い典型的な誤読
チャートタイムゾーン軸・ログなどの見た目スクリプトから参照できない画面変更でストラテジー判定も変わると思う
取引所タイムゾーン銘柄の暦変数と既定時間syminfo.timezoneで取得自分のPCやJSTが既定だと思う
明示指定タイムゾーン時刻/セッション判定の現地時計タイムゾーン引数で指定固定UTCオフセットを地域名と同一視する

スクリーンショットにはチャートタイムゾーン、設定記録には計算タイムゾーンを残します。

02 · Pineの時刻関数

time・time_close・hour・syminfo.timezoneを用途で選ぶ

Pineの時間要素
要素返すもの取引時間帯監査での用途注意
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のセッションでは開始だけ内側という状態があり得ます。

03 · 取引時間帯の指定方法

時刻・曜日・日またぎ・バー整列を一つずつ読む

時刻ベースのセッション文字列は、基本的にHHmm-HHmm:daysです。曜日は1=Sundayから7=Saturdayの数字集合で、たとえば平日だけなら23456です。時刻区間をカンマで複数指定することもできます。input.session()は入力値で時刻を選びやすくしますが、曜日は別入力値として結合する設計が明確です。

セッション文字列の読み方
意味境界上の確認
0930-1600:23456指定タイムゾーンの平日09:30–16:00対象時間足のバーが09:30に存在するか
1700-1700:2345617:00から翌17:00の日またぎ表現取引日の所属と日跨ぎ
0900-1130,1230-1500:23456昼休みを除く二つの区間11:30/12:30境界バー
0000-0000:123456724時間・全曜日銘柄データ自体の休止は別

取引所が定義するセッションと、時刻ベースのセッション文字列は別の概念です。

セッション終端が時間足のバー境界と合わないと、Pineの時間関数はその指定時間足用に内部バーを作って判定することがあります。見た目のチャートバーとの不一致を避けるには、開始・終了時刻を対象時間足のバー境界へそろえるか、開始/終了両側の判定を可視化して確認します。

04 · 地域名方式と夏時間

地域時間には固定UTCからの時差ではなくIANAを使う

UTC-4は通年でUTCより4時間遅い固定オフセットです。America/New_Yorkは地域の時間ルールを表し、夏時間中はUTC−4、標準時間中はUTC−5へ自動調整します。両者は一年の一部で一致しても、同じ意味ではありません。

固定UTCオフセットとIANAの比較
指定夏時間追随向く用途リスク
UTC/GMTオフセットしない常にUTC基準で固定した研究窓地域セッションが季節に1時間ずれる
IANA識別子するニューヨーク、ロンドンなどの現地時計識別子の綴りと対象地域を確認
syminfo.timezone取引所定義へ追随銘柄ごとの取引所時間別市場へ切替時に時計も変わる

IANAは過去・将来の地域ルール変更にも対応するため、地域の現地セッションには公式が推奨する形式です。

  1. 夏時間切替前週を選ぶ

    同じ曜日・時刻のバー判定を記録します。

  2. 切替週を選ぶ

    固定UTCとIANAの差が出るバーを色分けします。

  3. 切替後週を選ぶ

    セッションの開始/終了と最初のエントリーを再確認します。

  4. 別取引所銘柄へ切り替える

    syminfo.timezoneと明示タイムゾーンのどちらを意図したか確認します。

通常週/夏時間切替週の比較確認
確認点通常週切替週合格条件
取引時間帯開始前現地・UTC・対象同じ三項目現地開始前は除外
セッション開始最初の対象バー最初の対象バーIANAで同じ現地時刻
セッション終了前最後の開始時点でセッション内のバー同じ相対位置整列差を説明できる
セッション終端開始/終了時点の所属開始/終了時点の所属同じ端点規則
固定UTC対照IANAとの差一時間ずれるバー検出試験が反応する

価格や戻り値の比較ではなく、一つの現地取引時間帯定義が季節の時計変更を越えて同じ分類を作るかを試験します。

同じ曜日、現地時刻、チャート時間足を通常週と切替週で一対にします。UNIXタイムスタンプ、取引所表示、IANA表示、固定UTC表示、time()time_close()の結果を保存します。IANA版だけが現地時刻を維持し、固定オフセット版が1時間ずれる検証例を対照として残すことで、試験が夏時間誤差を実際に検出できると証明します。

05 · 取引時間帯の判定

セッション文字列とIANAタイムゾーンを入力値へ明示する

次の教育用ストラテジーは、時刻、曜日、タイムゾーンを別入力値にし、バー開始が取引時間帯内のときだけエントリーを許可します。取引時間帯終了を検出したら保有中の建玉を終了します。移動平均交差は動作確認用であり、取引時間帯や銘柄の推奨ではありません。

Pine Script v6:夏時間対応のセッション判定pine
//@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を使う比較も別版であり、実ブローカーのセッション終端約定を保証しません。

06 · 境界時刻の検証

バー開始とバー確定の取引時間帯所属を別々に試算する

ミニ計算機は24時間の単純な時計上で、取引時間帯開始・終了、バー開始、バー長を受け取り、開始端点と終了端点が区間内かを別々に返します。二端点の所属だけから、どの境界を何回通過したかまでは判定しません。タイムゾーン変換や夏時間そのものは計算せず、変換後の同一現地時計にそろえた値を入れる前提です。日またぎ区間にも対応する概念モデルです。

循環する24時間の区間判定継続時間 = (終了時刻 − 開始時刻 + 24) mod 24開始位置 = (バー開始 − 開始時刻 + 24) mod 24開始時点でセッション内 = 開始位置 < 継続時間バー確定時刻 = (バー開始 + バーの長さ(分)÷ 60) mod 24開始時刻=終了時刻を24時間セッションとして扱う設計を明記します。終端を含むかはストラテジー仕様に合わせて統一してください。
07 · 境界確認表

セッション境界確認表を時刻付き出力へ添える

  1. 時計を固定

    セッション文字列、曜日、IANAタイムゾーン、チャート時間足を保存します。

  2. 境界を可視化

    セッションの開始/終了、開始時点/終了時点のセッション内判定を確認します。

  3. 夏時間三期間を試験

    切替前・切替週・切替後で最初と最後の対象バーを照合します。

  4. 取引一覧を出力

    エントリー/決済時刻とタイムゾーンメモをCSV/XLSXへ添えます。

  5. 条件付きで分析

    時刻粒度があるファイルだけを取引時間帯・曜日・時間帯分析へ使います。

境界判定はスクリーンショットだけで終えず、セッション境界確認表へ残します。通常日と夏時間切替週について、開始直前、開始一致、終了直前、終了一致のバーを選び、IANAタイムゾーン、セッション文字列、曜日、開始/終了時刻、time()time_close()の結果を一行ずつ保存します。

確認表と取引CSVは同じバージョンIDで結び、チャートタイムゾーンは表示用、取引所タイムゾーンは既定の計算時計、明示指定したIANAタイムゾーンはストラテジーが選んだ時計として別列にします。四つの確認が期待どおりでない版はセッション別の成績比較へ進めません。

取引時間帯分類・注文・約定証拠台帳
段階必須時刻確認する失敗境界
バー分類バー開始・バー確定・タイムゾーン開始時点と終了時点のセッション内判定の混同
セッション遷移最後のセッション内バー・最初のセッション外バー欠損バーで検出が遅れる
注文生成strategy.close_allを実行した計算時刻終端時刻と同一視する
模擬約定取引一覧の決済時刻・価格次ティックまで建玉が残る
比較条件process_orders_on_close・時間足・セッション文字列複数変更を一実行へ混ぜる

分類が正しくても退出約定がセッション内とは限りません。バーのセッション内外判定と注文処理の流れを別々に合格させます。

再現手順は通常週、日またぎ、夏時間切替週の三組です。各組で最後のセッション内バーと最初のセッション外バーを固定し、開始/終了時点の内外判定、sessionEnded、終了注文の生成、実際の約定を順に記録します。次に時間足だけを変え、境界バーが欠ける場合や終端へ整列しない場合でも説明が維持されるか確認します。分類だけ合うが約定が遅れる実行を削除せず、退出設計の失敗として保存します。

取引時間帯の境界チェック

バー開始/終了の区間判定

同一の現地時計へ変換済みの時刻を使い、バーの開始端点と終了端点が取引時間帯内かを別々に確認します。境界通過回数の判定ではありません。

取引時間帯の長さ時間
開始が区間内(1=yes)
終了が区間内(1=yes)

継続時間=(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時刻、現地表示、バー開始/終了、セッション内外判定を同じ確認表へ並べます。現地ラベルの不連続だけで欠損バーや重複約定と判断しないでください。

根拠資料と確認先

  1. TradingView Pine Script — Time取引所/チャートのタイムゾーン、IANA、DST、time()/time_close()の公式解説。
  2. TradingView Pine Script — Sessionsセッション文字列、曜日、名前付きセッション、時刻ベース判定の公式仕様。
  3. TradingView Pine Script — Times, dates and sessions FAQセッション検出、時刻処理、境界に関する公式FAQ。
  4. TradingView Pine Script — Strategies FAQストラテジーの日付・時間範囲フィルターの公式例。

編集・発行: SG Group · 編集方針: TradingView公式ヘルプとPine Script公式文書を優先し、金融市場・商品に関する説明は取引所、監督当局、一次資料で補完しています。機能、データ、料金、接続条件は変わるため、実際の利用前に公式画面とリンク先の最新情報を確認してください。

重要事項: 本記事はTradingViewの画面、チャート、アラート、スクリーナー、ペーパートレード、Pine Script等の一般的な学習情報です。投資助言、売買シグナル、特定商品・データ提供者・ブローカーの推奨、将来価格や利益の保証ではありません。機能、料金、データ、取引所区分、通知、注文連携、Pine Scriptの仕様はプラン・地域・接続先・時点で異なり変更されることがあります。実際の資金を使う前に、TradingView公式資料、データ提供元、接続先事業者の最新条件を確認し、架空データまたはペーパートレードで手順を検証してください。