fxview-parquet-consumer について
Parquet 形式で保存された FXView MT5 のティックデータを読み取り、クエリするためのスキルです。検証済みのスキーマとファイル配置を示し、データアダプター、DuckDB クエリ、Python または Rust のパイプラインを扱う開発者向けです。
主な機能
- 01ティック列の型と意味を説明
- 02Parquet のディレクトリと命名規則を記載
- 03DuckDB クエリ例を掲載
- 04flags ビットマスクと過去の符号化変更を解説
- 05分割ファイルと一般的な問題を説明
活用シーン
- 01DuckDB で特定日のティックを検索
- 02売買価格スプレッドの統計を計算
- 03ティックデータを Python または Rust のパイプラインに統合
- 04ファイル配置や flags の解釈を調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ terrylica/ cc-skills --skill fxview-parquet-consumerインストール後、Claude Code で/fxview-parquet-consumerを入力して読み込まれたか確認します。
詳細
FXView Tick Parquet コンシューマー
MT5 ティック収集システムが生成した Parquet ファイルから FXView のティックデータを読み取ります。
自己進化型スキル:このスキルは使用を通じて改善されます。指示が誤っている場合、パラメーターにずれが生じた場合、または回避策が必要だった場合は、先延ばしにせず、すぐにこのファイルを修正してください。実際に再現可能な問題がある場合にのみ更新してください。
このスキルを使用する場面
次の場合にこのスキルを使用してください。
- FXView のティック Parquet ファイルを読み取る、またはクエリする場合
- FXView のティックデータ用のアダプターやパイプラインを構築する場合
- ティックデータに対する DuckDB クエリを作成する場合
- ティックデータを Python または Rust のパイプラインに統合する場合
- ティックデータのスキーマやファイルレイアウトを確認する場合
正式な情報源
https://github.com/terrylica/mql5/blob/05f7c82/docs/tick_research/SCHEMA_VERIFIED.md
このスキルでは検証済みのスキーマを要約しています。検証の詳細、フラグの分布、行グループの内部構造については、元のドキュメントを参照してください。
スキーマ
6 つの列はすべて NULL 不可です。EURUSD ファイルと XAUUSD ファイルのスキーマは同一です。
| 列 | Arrow 型 | DuckDB 型 | NULL 許容 | 備考 |
|---|---|---|---|---|
| time_msc | Int64 | BIGINT | NO | Unix エポックのミリ秒 |
| bid | Float64 | DOUBLE | NO | Bid 価格 |
| ask | Float64 | DOUBLE | NO | Ask 価格 |
| last | Float64 | DOUBLE | NO | FXView の FX では常に 0.0 — 無視してください |
| volume | Int64 | BIGINT | NO | FXView の FX では常に 0 — 無視してください |
| flags | UInt8 | UTINYINT | NO | MqlTick フラグのビットマスク(履歴全体で 6 種類。リテラル値との照合はせず、マスクビットを使用してください) |
Parquet フッターのメタデータ
各ファイルのフッターに埋め込まれているキーと値のペアです。
| キー | 値の例 | 用途 |
|---|---|---|
| symbol | EURUSD | シンボル名のみ(FXVIEW_ プレフィックスなし) |
| digits | 5 (EURUSD) / 2 (XAUUSD) | 価格の小数桁数 |
| broker | FXView | ブローカー名 |
| created_at | 2026-03-24T10:32:35.101090+00:00 | ファイル作成時刻(RFC3339 UTC) |
ファイルレイアウト
ディレクトリパターン: {base_path}/FXVIEW_{SYMBOL}/{YYYY}/{SYMBOL}_{YYYYMMDD}.parquet
例: ~/.cache/opendeviationbar/ticks/FXVIEW_EURUSD/2026/EURUSD_20260323.parquet
重要な非対称性: ディレクトリには FXVIEW_ プレフィックス(ブローカーを含む)が付きますが、ファイル名とメタデータにはシンボル名のみが使われます。混同しないでください。
クラッシュリカバリーファイル: {SYMBOL}_{YYYYMMDD}_1.parquet、_2.parquet など。EA が再起動し、当日分の既存ファイルを検出した際に作成されます。すべてのセグメントはフッターを含む、有効で完全な Parquet ファイルです。
XAUUSD との違い
| プロパティ | EURUSD | XAUUSD |
|---|---|---|
| digits | 5 | 2 |
| 価格スケール | ~1.15 | ~4400 |
| 1 日あたりのティック数 | ~416K | ~929K |
| last/volume | 常に 0 | 常に 0 |
| フラグの分布 | 53% bid+ask、24% bid、23% ask | 98% bid+ask、bid/ask が各 ~1% |
XAUUSD のティック密度は EURUSD の約 2.2 倍です。
DuckDB での使用例
1 日分を読み取る
SELECT * FROM read_parquet('~/.cache/opendeviationbar/ticks/FXVIEW_EURUSD/2026/EURUSD_20260323.parquet');
シンボルの全ファイルを読み取る(glob)
SELECT * FROM read_parquet('~/.cache/opendeviationbar/ticks/FXVIEW_EURUSD/**/*.parquet');
タイムスタンプを人間が読める形式に変換する
SELECT make_timestamp(time_msc * 1000) AS ts, bid, ask, ask - bid AS spread
FROM read_parquet('~/.cache/opendeviationbar/ticks/FXVIEW_EURUSD/2026/EURUSD_20260323.parquet');
スプレッド統計
SELECT avg(ask - bid) AS avg_spread, max(ask - bid) AS max_spread
FROM read_parquet('~/.cache/opendeviationbar/ticks/FXVIEW_EURUSD/2026/EURUSD_20260323.parquet');
フラグの分布
SELECT flags, count(*) AS cnt, round(count(*) * 100.0 / sum(count(*)) OVER (), 2) AS pct
FROM read_parquet('...')
GROUP BY flags
ORDER BY cnt DESC;
アンチパターン
- FXView の外国為替では
last列やvolume列を使用しないでください(常にゼロです) - ファイル名に
FXVIEW_プレフィックスが付くと想定しないでください。付くのはディレクトリ名だけです - Rust の本番コードで価格に f64 を使用しないでください(digits メタデータを使った i64 固定小数点を使用してください)
- time_msc が秒単位だと想定しないでください。ミリ秒単位です
- マシン固有のパスをハードコードしないでください。パターン
{base_path}/FXVIEW_{SYMBOL}/{YYYY}/{SYMBOL}_{YYYYMMDD}.parquetを使用してください
Parquet の内部仕様
- 圧縮: ZSTD レベル 3
- time_msc のエンコーディング: DELTA_BINARY_PACKED(単調増加するタイムスタンプに最適。ディクショナリエンコーディングは無効)
- flags のエンコーディング: ディクショナリエンコーディング(カーディナリティが低く、全履歴で異なる値は 6 種類、通常の日では 3 種類)
- bid、ask、last、volume: デフォルト(PLAIN + ZSTD)
- 行グループ: 各約 65,536 行(最後のグループには残りの行が入ります)
- ファイルサイズ: EURUSD の 1 日あたり約 416K ティックで約 1.35 MB
Flags ビットマスクのリファレンス
ドキュメント化されたビットをマスクし、リテラル値で照合しないでください。 bid の更新には flags & 2 <> 0、ask の更新には flags & 4 <> 0 を使用してください。以下のどちらのエンコーディングでも、また両方の履歴上の切り替わりにおいても、これが正しい方法です。WHERE flags = 130 または flags IN (130, 134) を使うと、2026-04-23 から 2026-08-13 までの期間の bid ティックがすべて ゼロ件 になります。
全データレイクの調査結果(2018-04 から 2026-08、全シンボル、2026-08-29 に測定。issue #155)。全履歴を通じて、この列には 6 種類の値が入ります。
| イベント | ビット 7 形式(標準) | ビットなし形式 |
|---|---|---|
| bid 更新 | 130 (=128|2) | 2 |
| ask 更新 | 132 (=128|4)、2018-06-15 までのみ | 4 |
| bid+ask 更新 | 134 (=128|6) | 6 |
- 2018-06-15 までは、毎日の値の種類は正確に
[130, 132, 134]です。2018-06-17 以降は[4, 130, 134]となり、132は再び現れません。 - ビットなし形式の
2と6は 2021-07-01 に初めて現れ、その後短い期間に繰り返し出現し、2026-04-23 から 2026-08-13 までは継続しています。値の種類が[2, 4, 6]となる日(例:2021-07-02)は、データの欠損やファイルの破損を意味するものではありません。ビットなし形式ですべてのティックが存在しています。 - ビット 7(128)はドキュメント化されていません。 MQL5 の
MqlTickリファレンス には、ティックフラグが 6 種類(TICK_FLAG_BID、TICK_FLAG_ASK、TICK_FLAG_LAST、TICK_FLAG_VOLUME、TICK_FLAG_BUY、TICK_FLAG_SELL)と定義されており、128 に該当するものはありません。このブローカーは大半のティックでビット 7 を設定しますが、その意味は明らかになっていません。「最初のティックを示すマーカー」と呼ばないでください(TICK_FLAG_FIRSTは存在しません)。
トラブルシューティング
| 問題 | 原因 | 解決策 |
|---|---|---|
| ファイルが見つからない | base path またはシンボルが間違っている | FXVIEW_ プレフィックスを含むディレクトリパターンを確認してください |
| last/volume がすべてゼロ | FXView の外国為替では正常 | 外国為替ペアではこれらの列を無視してください |
| タイムスタンプがおかしい | 秒単位を使用していて、ミリ秒単位ではない | time_msc はミリ秒単位です。マイクロ秒にするには 1000 を掛けてください |
| スキーマが一致しない | ブローカーまたはバージョンが異なる | SCHEMA_VERIFIED.md のパーマリンクと照合してください |
| 同じ日のファイルが複数ある | クラッシュリカバリ用の分割ファイル | _N 付きのファイルはすべて有効です。結合してください |
実行後の振り返り
このスキルの実行後、終了する前に次の点を確認してください。
- コマンドは成功しましたか? — 成功していない場合は、失敗の原因となった手順またはエラーテーブルを修正します。
- パラメーターや出力に変更はありましたか? — 基盤となるツールのインターフェースに変更があった場合は、使用例とパラメーターテーブルを更新して一致させます。
- 回避策が必要でしたか? — 別のフラグや追加手順など、その場で工夫する必要があった場合は、次回の実行で同じ回避策が不要になるよう、この SKILL.md を更新します。
問題が実際に発生し、再現可能な場合にのみ更新してください。推測で更新しないでください。