見出し画像

Global Session MA(日足版)

アジア時間帯・EU時間帯・US時間帯それぞれの値動きだけの移動平均インジケーターです。日足のみで動作するバージョンです。他に1時間足のみで動作するバージョンがあります。


免責事項

このインジケーターは、すべてご自身の責任でご利用ください。本インジケーターの使用によるいかなる損失や損害について、当方は一切の責任を負いかねます。

また、本インジケーターの動作の正常性や正確性については一切保証いたしません。予期せぬ動作やエラーが発生する可能性があるため、ご理解の上でご利用いただきますようお願いいたします。

設定方法はこちら

インジケータの目的と仕様

アジア時間帯・EU時間帯・US時間帯のどの時間帯が強いのか?という比較のためのインジケータです。
JSTの9:00-17:00 をAPAC
JSTの16:00-1:00 をEU
JSTの22:00-7:00 をUS(サマータイム自動対応)
として各時間帯の上昇幅、下落幅の移動平均です。
移動平均はSMA7をデフォルトにしていますが、EMAに変更可能、移動平均の期間も変更可能です。

ビットコインについて表示したサンプルは以下のようになります。
ビットコイン以外でも動きます。

ビットコインサンプル

コード

//@version=5
indicator("Global Session MA", overlay=false)

// オプション:各市場の表示/非表示を選択
show_APAC = input(true, title="Show APAC")
show_EU = input(true, title="Show EU")
show_US = input(true, title="Show US")

// オプション:移動平均の種類を選択(SMAまたはEMA)
ma_type = input.string("SMA", title="Moving Average Type", options=["SMA", "EMA"])

// オプション:移動平均の期間を指定
ma_period = input.int(7, title="Moving Average Period", minval=1)

// 現在の時刻を取得(JSTをUTC+9として指定)
current_hour = hour(time, "UTC+9")

// 現在の日付を取得
current_date = dayofmonth(timenow)
current_month = month(timenow)
current_year = year(timenow)
current_hour2 = hour(timenow, "UTC+9")

// バーの日付を取得
bar_date = dayofmonth(time)
bar_month = month(time)
bar_year = year(time)

// 日付のみを比較
is_today = (current_date == bar_date) and (current_month == bar_month) and (current_year == bar_year)

// APACセッション(9:00 - 16:00 JST)の始値と終値を動的に取得
apac_open_index = current_hour2 >= 9 ? current_hour2 - 9 : 24 + (current_hour2 - 9)
apac_open_index := apac_open_index < 0 ? 24 + apac_open_index : apac_open_index  // := を使用して再代入

apac_close_index = current_hour2 >= 16 ? current_hour2 - 16 : 24 + (current_hour2 - 16)
apac_close_index := apac_close_index < 0 ? 24 + apac_close_index : apac_close_index  // := を使用して再代入

APAC_S = is_today ? request.security(syminfo.tickerid, "60", open[apac_open_index], lookahead=barmerge.lookahead_off) : request.security(syminfo.tickerid, "60", open[23], lookahead=barmerge.lookahead_off)
APAC_E = is_today ? request.security(syminfo.tickerid, "60", close[apac_close_index], lookahead=barmerge.lookahead_off) : request.security(syminfo.tickerid, "60", close[16], lookahead=barmerge.lookahead_off)

// EUセッション(16:00 - 翌1:00 JST)の始値と終値を動的に取得
eu_open_index = current_hour2 >= 16 ? current_hour2 - 16 : 24 + (current_hour2 - 16)
eu_open_index := eu_open_index < 0 ? 24 + eu_open_index : eu_open_index  // := を使用して再代入

eu_close_index = current_hour2 >= 1 ? current_hour2 - 1 : 24 + (current_hour2 - 1)
eu_close_index := eu_close_index < 0 ? 24 + eu_close_index : eu_close_index  // := を使用して再代入

EU_S = is_today ? request.security(syminfo.tickerid, "60", open[eu_open_index], lookahead=barmerge.lookahead_off) : request.security(syminfo.tickerid, "60", open[16], lookahead=barmerge.lookahead_off)
EU_E = is_today ? request.security(syminfo.tickerid, "60", close[eu_close_index], lookahead=barmerge.lookahead_off) : request.security(syminfo.tickerid, "60", close[8], lookahead=barmerge.lookahead_off)

// 夏時間判定のための関数(米国用)
is_summer_time = (timestamp(year, month, dayofmonth, hour, minute) >= timestamp(year, 3, (8 - dayofweek(timestamp(year, 3, 1)) % 7) + 1, 2, 0)) and
                 (timestamp(year, month, dayofmonth, hour, minute) < timestamp(year, 11, (1 - dayofweek(timestamp(year, 11, 1)) % 7) + 1, 2, 0))

// 米国セッション(22:00 - 翌7:00 JST)の始値と終値を動的に取得
us_open = is_summer_time ? 10 : 11  // 開始時間(EDTなら22時、ESTなら23時)
us_close = is_summer_time ? 2 : 3  // 終了時間(EDTなら翌7時、ESTなら翌8時)
us_open2 = is_summer_time ? 22 : 23
us_close2 = is_summer_time ? 7 : 8

us_open_index = current_hour2 >= us_open2 ? current_hour2 - us_open2 : 24 + (current_hour2 - us_open2)
us_open_index := us_open_index < 0 ? 24 + us_open_index : us_open_index  // := を使用して再代入

us_close_index = current_hour2 >= us_close2 ? current_hour2 - us_close2 : 24 + (current_hour2 - us_close2)
us_close_index := us_close_index < 0 ? 24 + us_close_index : us_close_index  // := を使用して再代入

US_S = is_today ? request.security(syminfo.tickerid, "60", open[us_open_index], lookahead=barmerge.lookahead_off) : request.security(syminfo.tickerid, "60", open[us_open], lookahead=barmerge.lookahead_off)
US_E = is_today ? request.security(syminfo.tickerid, "60", close[us_close_index], lookahead=barmerge.lookahead_off) : request.security(syminfo.tickerid, "60", close[us_close], lookahead=barmerge.lookahead_off)

if is_today
    // APACセッション(9:00 - 16:00 JST)
    if current_hour2 >= 9 and current_hour2 < 16
        APAC_E := close  // APACセッションが終了していない場合、データを無効にする

    // EUセッション(16:00 - 翌1:00 JST)
    if current_hour2 >= 16 and current_hour2 < 24 or (current_hour2 >= 0 and current_hour2 < 1)
        EU_E := close  // EUセッションが終了していない場合、データを無効にする
    else if current_hour2 >= 9 and current_hour2 < 16  // EUセッションの前
        EU_S := na
        EU_E := na

    // USセッション(22:00 - 翌7:00 JST)
    if current_hour2 >= us_open2 and current_hour2 < 24 or (current_hour2 >= 0 and current_hour2 < us_close2)
        US_E := close  // USセッションが終了していない場合、データを無効にする
    else if current_hour2 >= 9 and current_hour2 < us_open2  // USセッションの前
        US_S := na
        US_E := na

// 差分の計算
var float APAC_diff = na
var float EU_diff = na
var float US_diff = na

if show_APAC
    APAC_diff := na(APAC_E) or na(APAC_S) ? 0 : APAC_E - APAC_S

if show_EU
    EU_diff := na(EU_E) or na(EU_S) ? 0 : EU_E - EU_S

if show_US
    US_diff := na(US_E) or na(US_S) ? 0 : US_E - US_S

// 移動平均の計算
APAC_ma = ma_type == "SMA" ? ta.sma(APAC_diff, ma_period) : ta.ema(APAC_diff, ma_period)
EU_ma = ma_type == "SMA" ? ta.sma(EU_diff, ma_period) : ta.ema(EU_diff, ma_period)
US_ma = ma_type == "SMA" ? ta.sma(US_diff, ma_period) : ta.ema(US_diff, ma_period)

// 移動平均のプロット(日足のみプロット)
plot(timeframe.period == "D" and show_APAC ? APAC_ma : na, color=color.orange, title="APAC", linewidth=2)
plot(timeframe.period == "D" and show_EU ? EU_ma : na, color=color.purple, title="EU", linewidth=2)
plot(timeframe.period == "D" and show_US ? US_ma : na, color=color.blue, title="US", linewidth=2)


この記事が気に入ったらサポートをしてみませんか?