Simulation Model
シミュレーションエンジンの前提条件・制約・仕様を以下に定義します。バックテスト結果の解釈に必要な情報です。
ヒストリカルデータ形式»
エンジンはOHLCバー単位で動作します。ティックデータには対応しません。
| Column Index | Field | Usage |
|---|---|---|
| 0 | Time | タイムスタンプ(ms) |
| 1 | Open | (現バージョンでは未使用) |
| 2 | Close | エントリー約定価格・エグジット約定価格・未実現PnL評価 |
| 3 | High | Buy側TP到達判定・Sell側SL到達判定・Trailing Stop更新 |
| 4 | Low | Buy側SL到達判定・Sell側TP到達判定・Trailing Stop更新 |
注文約定モデル»
すべての約定は当該バーの Close価格 で行われます。TP/SLの到達判定にはHigh/Lowを使用しますが、約定価格はTP/SLの指値水準ではなくClose価格です。
| 操作 | 約定価格 | 備考 |
|---|---|---|
| Market Order (新規) | Close ± commission_spread |
Buy: Close − spreadSell: Close + spread |
| Limit / Stop Order (トリガー) | Close ± commission_spread |
High/Lowで発動条件を判定、約定はClose |
| TP/SL Hit (決済) | Close |
TP/SL水準ではなくClose価格で決済 |
| Strategy Close / Force Close | Close |
戦略による決済・強制ロスカット |
バー内処理順序»
各バーにおいて、以下の順序で処理が実行されます。すべての操作はバー単位でアトミックです。
- 新しいバーのOHLCデータをロード
- Trailing Stopの更新(High/Lowに基づくSL水準の引上げ)
- 未実現PnLの再計算(Closeベース)
- Pending Orders(Limit/Stop)の発動判定と約定
- TP/SL到達チェックとポジション決済
- 証拠金比率チェックとTicket受付可否の更新
- 証拠金比率が閾値を超過した場合、全ポジションを強制決済
ポジション管理»
本システムでは、各注文を独立した Ticket(取引チケット)として管理します。Ticketは証券・FX取引における約定伝票(Deal Ticket)に相当し、1回の注文に対して1つのTicketが発行されます。同一方向に複数回注文した場合でもネッティングは行われず、それぞれ別のTicketとしてPnL・保有期間等が個別に追跡されます。
注文タイプ»
| 注文タイプ | 内容 |
|---|---|
| Market Order | 成行注文。現在のバーのClose価格で即時約定 |
| Limit Order | 指値注文。指定価格に到達した時点でClose価格で約定(Buy: 現在値以下で買い、Sell: 現在値以上で売り) |
| Stop Order | 逆指値注文。指定価格を超えた時点でClose価格で約定(Buy: 現在値以上で買い、Sell: 現在値以下で売り) |
| Trailing Stop | トレーリングストップ。価格が有利方向に動くとSL水準を自動的に引き上げる(Buy: Highに追従、Sell: Lowに追従)。SL水準は有利方向にのみ更新され、逆行時は維持される |
すべての注文タイプに対して、Take Profit(利確指値)・Stop Loss(損切逆指値)・Trailing Stopを任意に付与できます。
Ticket管理»
| 仕様 | 内容 |
|---|---|
| Ticket単位管理 | 各注文は独立したTicketとして生成・管理。同一方向の複数注文はネッティングされず、個別にPnL・TP/SL・保有期間を追跡 |
| 決済方法 | Ticket IDを指定して個別に決済。TP/SL自動決済・戦略による手動決済・強制決済に対応 |
| 部分決済 | 対応。Ticketの一部をreduce_ratio(0.0〜1.0)で指定して決済可能 |
| 両建て(ヘッジ) | ロングとショートのTicketを同時に保有可能。ただし証拠金計算はネッティングを行わず、全Ticketの証拠金を単純合算する(後述) |
証拠金・レバレッジ»
| 項目 | 計算式 / 仕様 |
|---|---|
| Required Margin | Σ (units × entryPrice / leverage) for all open tickets |
| Equity | Assets + Σ unrealizedPnLBuy: (Close − entryPrice) × unitsSell: (entryPrice − Close) × units |
| Margin Ratio | RequiredMargin / Equity |
コストモデル»
| 項目 | 仕様 |
|---|---|
| Commission / Spread | エントリー時に絶対価格差として1回適用。 Buy: entryPrice = Close − spread、Sell: entryPrice = Close + spread |
| エグジット時コスト | なし(Close価格で決済、追加コストなし) |
| スリッページモデル | 明示的なスリッページモデルは未実装。 TP/SL判定にHigh/Lowを使用しClose価格で約定する構造により、暗黙的にスリッページ相当の乖離が発生します |
制約・前提»
| 項目 | 内容 |
|---|---|
| 決定論的実行 | エンジン内部に乱数生成はなく、同一入力に対して完全に再現可能な結果を返します |
| 数値精度 | WASMエンジン(C++)はfloat32で演算。フロントエンドのExit Analysis判定は Math.fround() で精度を合わせています |
| ティックデータ | 非対応。すべての処理はOHLCバー単位で完結します |
| マルチアセット | 非対応。1回のシミュレーションは単一資産に対して実行されます |