「今、一番買われている通貨はどれか?一番売られている通貨はどれか?」
裁量トレードにおいて、個別通貨ペア(USD/JPYなど)のチャートだけを見てエントリーするのは、森を見ずに木を見ているのと同じです。真のエッジ(優位性)は、市場全体の資金フロー(通貨の強弱)を把握した先に存在します。
この JFX Currency Index Master v6.6 Final は、私が日々のトレードで実際に使用している、主要8通貨(USD, JPY, EUR, GBP, AUD, NZD, CHF, CAD)の強弱を可視化する完全オリジナルのインジケーターです。
インジケーターの特徴
- JFXの高品質データに特化 JFXが配信する全28通貨ペアのデータをフルに活用し、幾何平均を用いて各通貨の「真のインデックス(相対強度)」を正確に算出します。
- プロ仕様のリセットロジック(Rolling & 毎日朝6時) 通貨強弱は「いつを起点(ゼロ)とするか」が命です。このスクリプトは、単なる固定時間枠ではなく「現在時刻(timenow)から指定時間(4時間〜3ヶ月)を遡った時点」を動的に起点とするローリング機能や、東京市場の開始前(朝6時)を起点とするリセット機能を搭載しています。
- 洗練されたUI リアルタイムで8通貨のラインとラベルが描画され、一目で「最強通貨」と「最弱通貨」のペアを見つけ出すことができます。
TradingViewへの追加方法
以下のPine Scriptコードをコピーし、TradingViewの画面下部にある「Pineエディタ」に貼り付けて「チャートに追加」をクリックしてください。
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © momonge
//@version=6
indicator("JFX Currency Index Master v6.6 Final", overlay=false, precision=2)
// --- パラメーター ---
mode = input.string("24時間(rolling)", "リセット基準", options=["毎日朝6時", "4時間(rolling)", "8時間(rolling)", "24時間(rolling)", "1週間(rolling)", "1ヶ月(rolling)", "3ヶ月(rolling)"])
// --- データ取得関数 ---
get_val(t) => request.security("JFX:" + t, timeframe.period, close)
// --- 各通貨指数の算出(JFXの全28ペアをフル活用) ---
u_id = math.pow((get_val("USDJPY") * get_val("USDCHF") * get_val("USDCAD")) / (get_val("EURUSD") * get_val("GBPUSD") * get_val("AUDUSD") * get_val("NZDUSD")), 1/7)
j_id = 1 / math.pow(get_val("USDJPY") * get_val("EURJPY") * get_val("GBPJPY") * get_val("AUDJPY") * get_val("NZDJPY") * get_val("CHFJPY") * get_val("CADJPY"), 1/7)
e_id = math.pow(get_val("EURUSD") * get_val("EURJPY") * get_val("EURGBP") * get_val("EURAUD") * get_val("EURNZD") * get_val("EURCHF") * get_val("EURCAD"), 1/7)
g_id = math.pow(get_val("GBPUSD") * get_val("GBPJPY") * get_val("GBPAUD") * get_val("GBPNZD") * get_val("GBPCHF") * get_val("GBPCAD") / get_val("EURGBP"), 1/7)
a_id = math.pow(get_val("AUDUSD") * get_val("AUDJPY") * get_val("AUDNZD") * get_val("AUDCHF") * get_val("AUDCAD") / (get_val("EURAUD") * get_val("GBPAUD")), 1/7)
n_id = math.pow(get_val("NZDUSD") * get_val("NZDJPY") * get_val("NZDCHF") * get_val("NZDCAD") / (get_val("EURNZD") * get_val("GBPNZD") * get_val("AUDNZD")), 1/7)
s_id = math.pow(get_val("CHFJPY") / (get_val("USDCHF") * get_val("EURCHF") * get_val("GBPCHF") * get_val("AUDCHF") * get_val("NZDCHF") * get_val("CADCHF")), 1/7)
c_id = math.pow((get_val("CADJPY") * get_val("CADCHF")) / (get_val("USDCAD") * get_val("EURCAD") * get_val("GBPCAD") * get_val("AUDCAD") * get_val("NZDCAD")), 1/7)
// --- 起点価格の保持変数 ---
var float u_b = na, var float j_b = na, var float e_b = na, var float g_b = na
var float a_b = na, var float n_b = na, var float s_b = na, var float c_b = na
// =========================================================
// 真のゼロリセット判定ロジック(timenowを活用したプロ仕様)
// =========================================================
if mode == "毎日朝6時"
// 朝6時モードは、毎日6時に何度でも0リセットを繰り返す
t_tokyo = time(timeframe.period, "0600-0605", "Asia/Tokyo")
is_6am = not na(t_tokyo) and na(t_tokyo[1])
if is_6am or barstate.isfirst
u_b := u_id, j_b := j_id, e_b := e_id, g_b := g_id
a_b := a_id, n_b := n_id, s_b := s_id, c_b := c_id
else
// ローリングモード:「現在のリアルタイム時刻(timenow)」から指定時間を逆算
float lookback_ms = switch mode
"4時間(rolling)" => 4 * 60 * 60 * 1000
"8時間(rolling)" => 8 * 60 * 60 * 1000
"24時間(rolling)" => 24 * 60 * 60 * 1000
"1週間(rolling)" => 7 * 24 * 60 * 60 * 1000
"1ヶ月(rolling)" => 30 * 24 * 60 * 60 * 1000
"3ヶ月(rolling)" => 90 * 24 * 60 * 60 * 1000
=> 0
// 今の時間から遡った「絶対的な起点時刻」
target_time = timenow - lookback_ms
// 過去のチャートの中から、起点時刻を「初めて」迎えたローソク足を検知して一度だけ0にロックする
if time >= target_time and na(u_b)
u_b := u_id, j_b := j_id, e_b := e_id, g_b := g_id
a_b := a_id, n_b := n_id, s_b := s_id, c_b := c_id
// --- 強弱計算 (変化率 %) ---
// 基準値(base_val)がまだ無い(起点より前の時間)場合は na を返し、チャートに描画させない
calc_pct(val, base_val) => na(base_val) ? na : (val - base_val) / base_val * 100
U = calc_pct(u_id, u_b), J = calc_pct(j_id, j_b), E = calc_pct(e_id, e_b), G = calc_pct(g_id, g_b)
A = calc_pct(a_id, a_b), N = calc_pct(n_id, n_b), S = calc_pct(s_id, s_b), C = calc_pct(c_id, c_b)
// --- 描画 ---
plot(U, title="USD", color=color.white, linewidth=2)
plot(J, title="JPY", color=color.red, linewidth=2)
plot(E, title="EUR", color=color.blue, linewidth=2)
plot(G, title="GBP", color=color.orange, linewidth=2)
plot(A, title="AUD", color=color.green, linewidth=2)
plot(N, title="NZD", color=color.lime, linewidth=2)
plot(S, title="CHF", color=color.purple, linewidth=2)
plot(C, title="CAD", color=color.maroon, linewidth=2)
hline(0, "基準線", color=color.new(color.gray, 50), linestyle=hline.style_dotted, linewidth=2)
// --- ラベル描画 ---
if barstate.islast
var label lb_u = label.new(na, na, "USD", color=#ffffff00, textcolor=color.white, style=label.style_label_left, size=size.small)
var label lb_j = label.new(na, na, "JPY", color=#ffffff00, textcolor=color.red, style=label.style_label_left, size=size.small)
var label lb_e = label.new(na, na, "EUR", color=#ffffff00, textcolor=color.blue, style=label.style_label_left, size=size.small)
var label lb_g = label.new(na, na, "GBP", color=#ffffff00, textcolor=color.orange, style=label.style_label_left, size=size.small)
var label lb_a = label.new(na, na, "AUD", color=#ffffff00, textcolor=color.green, style=label.style_label_left, size=size.small)
var label lb_n = label.new(na, na, "NZD", color=#ffffff00, textcolor=color.lime, style=label.style_label_left, size=size.small)
var label lb_s = label.new(na, na, "CHF", color=#ffffff00, textcolor=color.purple, style=label.style_label_left, size=size.small)
var label lb_c = label.new(na, na, "CAD", color=#ffffff00, textcolor=color.maroon, style=label.style_label_left, size=size.small)
label.set_xy(lb_u, bar_index, U), label.set_xy(lb_j, bar_index, J), label.set_xy(lb_e, bar_index, E), label.set_xy(lb_g, bar_index, G)
label.set_xy(lb_a, bar_index, A), label.set_xy(lb_n, bar_index, N), label.set_xy(lb_s, bar_index, S), label.set_xy(lb_c, bar_index, C)