TradingViewの注文はどう約定する?Broker EmulatorとBar Magnifierの仕組み
Strategy Testerの取引は、実際のbrokerへ送られた注文履歴ではありません。TradingViewのBroker Emulatorが利用可能なchart data、注文種類、生成時刻、gap、intrabar前提から模擬約定を作ります。Bar Magnifierは下位時間足dataを使ってbar内の順序を細かくしますが、tick履歴、板、queue、部分約定、latencyを完全再現する機能ではありません。本稿では、利益指標ではなく「なぜこのbar・この価格でfillされたのか」を一件ずつ説明できる監査方法を扱います。
この記事が役立つ方: Strategy Testerでstopやlimitの約定barが想定と違う人、同一barでentryとexitが起きる条件を理解したい人、Bar Magnifierの有無を比較したいPine戦略利用者
まず押さえる重要ポイント
- Broker Emulatorは実brokerの履歴ではなく、chart dataからstrategy orderのfillを模擬する。
- 標準履歴barではOHLCと既定のintrabar経路仮定が使われ、bar間gapには別のfill規則がある。
- market、limit、stop、stop-limitは注文生成条件とfill条件が違うため、markerだけで判断しない。
- Bar Magnifierは利用可能な下位時間足で精度を上げるが、全期間のintrabar coverageや実市場約定を保証しない。
- 説明可能なfill記録には、注文生成、activation、利用可能なpathまたは下位足coverage、fill時刻の四点が必要である。
同じOHLCでも、価格の通過順序がfillを変える
Strategy markerは、Broker Emulatorが作った模擬fillの記録
TradingView strategyはorder commandを作り、Broker Emulatorが次に利用可能なtickまたは価格条件でfillを模擬します。 codeが条件barで注文を生成した時刻と、markerが表示されるfill時刻は同じとは限りません。market order、price-based order、process-on-close等で境界が変わるため、List of Tradesとchart markerだけでなく、order typeと作成barも照合します。
この仕組みは、過去のbarへ機械的に同じruleを適用するためのsimulationです。brokerのorder book、実際のspread、通信遅延、rejection、partial fill、価格改善を自動で復元しません。したがって「Strategy Testerで104に約定した」ことは、「同じ日時の実口座でも必ず104で約定した」という証拠ではありません。
OHLCだけの履歴barではintrabar経路を仮定する
OHLCはbar内で到達した四点を示しますが、すべてのtick順序を保存していません。Broker Emulatorはopenがhighとlowのどちらに近いか等の規則から、open→high→low→closeまたはopen→low→high→closeという経路を仮定します。entryとexitの両水準が同じbarのrange内にある場合、この順序が結果を変えます。
| 論点 | 質問 | 誤読 | 保存する証拠 |
|---|---|---|---|
| Range | 注文価格はhigh-low内か | range内なら必ずfill | O/H/L/Cとorder price |
| Path | どちらを先に通る仮定か | 実tick順序と同じ | 想定sequence |
| Gap | 前closeと現openの間か | 指定価格でfill | previous close・open |
| Same bar | entry後にexit水準へ届くか | high/lowだけで断定 | order creation/fill順 |
価格がrangeへ触れたことと、十分な流動性で注文全量が約定したことは同義ではありません。
Fill explanation = order type + creation time + activation price + available path + fill ruleCoverage ratio = Bar Magnifierで下位足を確認できたsample ÷ 監査sample式は説明可能性の監査で、実市場との誤差推定ではありません。失敗境界は四種類に分けます。注文が作られる前に同じ価格へ触れていても、その接触は約定証拠になりません。前bar終値と次bar始値の間を飛び越えたgapでは、指定価格を順番に通過したと仮定できません。同一barの高値と安値にentryとexitが両方含まれても、entry後にexitへ到達した順序が必要です。limit注文では価格条件に加え、現在のverification設定と注文が有効だった期間を確認します。
market・limit・stop・stop-limitの役割を分ける
market orderは価格を指定せず次の利用可能な機会でfillを求めます。limit orderは指定価格以上に不利にならない条件、stop orderはstop到達後にmarket型の注文をactivateする考え方、stop-limitはstop activation後にlimit条件を持ちます。同じ「線へ触れた」表示でも、注文種類によって必要なeventが違います。
| 種類 | 生成後に必要なこと | 主な監査点 |
|---|---|---|
| Market | 次の利用可能なtick | 生成barとfill bar、slippage仮定 |
| Limit | limit条件を満たす価格 | touch/trade-through、gap、未約定仮定 |
| Stop | stopでactivate後にfill | triggerとfillを分離 |
| Stop-limit | stop activation+limit条件 | activateしても未約定の可能性 |
正確な現在仕様はTradingView公式StrategiesとBroker Emulator資料を確認してください。
chart barのcloseで条件を評価してmarket orderを作る標準的なstrategyでは、markerが次barのopen側に現れることがあります。これを「signalが遅れた」とだけ表現すると原因が不明です。条件確定時刻、order creation、next available tickという三段階で説明します。
下位時間足で経路を細かくしても、coverageを確認する
Bar Magnifierを有効にすると、Broker Emulatorは利用可能な下位時間足dataを参照し、chart barのOHLCだけに基づく既定経路より細かなintrabar情報でfillを模擬します。同じchart bar内でentry後にexit水準へ到達した順序を確認できれば、既定仮定では起きなかったsame-bar exitが生じる場合があります。
ただし下位足dataの取得上限があり、長いhistoryの初期部分ではcoverageがないことがあります。plan、symbol、chart timeframe、available lower timeframeも影響します。Bar Magnifier ONという一項目だけを保存せず、どの期間に適用されたか、比較sampleの何件がcoverage内かを確認します。
| 記録項目 | 残す証拠 | 不足時の扱い |
|---|---|---|
| 対象範囲 | 最初と最後の対象chart bar、trade ID | coveredと未確認を分離する |
| 下位時間足 | 実際に参照されたintervalと銘柄識別子 | 推測したtick列へ置換しない |
| 注文時系列 | 生成・activation・fillのbarと時刻 | 順序不明のtradeを保留する |
| 比較version | Magnifier OFF/ON以外が同一の設定表 | 同時変更したrunを比較から外す |
| 欠損と上限 | 下位足が取得できない期間と件数 | coverage率の分母へ残す |
coverage内でも実市場約定の証明にはなりません。ここで証明するのは、どの模擬fillがどの粒度のchart dataに基づいたかです。
注文種類とBar Magnifier設定をsourceへ残す
下のPine v6 sampleは、確定barの架空crossからbuy stopを生成し、position成立後にstopとlimitのexitを置きます。`use_bar_magnifier = true`を明示しますが、機能availabilityと適用coverageは実環境で確認が必要です。EMA期間、10 ticks、20 ticksは教育用で、推奨entry・stop・targetではありません。
//@version=6
strategy(
"Intrabar fill audit demo",
overlay = true,
use_bar_magnifier = true,
calc_on_order_fills = false,
process_orders_on_close = false
)
float basis = ta.ema(close, 20)
bool setup = ta.crossover(close, basis) and barstate.isconfirmed
if setup
float entryStop = high + syminfo.mintick
strategy.entry("L", strategy.long, stop = entryStop)
if strategy.position_size > 0
float protectiveStop = strategy.position_avg_price - 10 * syminfo.mintick
float target = strategy.position_avg_price + 20 * syminfo.mintick
strategy.exit("L-X", "L", stop = protectiveStop, limit = target)
plot(basis, "EMA", color.orange)同じsourceをMagnifier OFF/ONで比較する場合も、他のpropertiesとchart contextをTV11のfingerprintで固定してください。
source codeだけで実際のfillを説明できるとは限りません。List of Tradesからentry/exit barとpriceを取り、chart O/H/L/C、下位足coverage、order creation logと突き合わせます。`calc_on_order_fills`や`process_orders_on_close`を変更する比較は、TV15のexecution auditと組にしてください。
驚いたfillから順に一件ずつ反証する
| 確認対象 | 保存する証拠 | 反証質問 |
|---|---|---|
| 対象trade | ID・entry/exit時刻・価格・方向・数量 | どの一件を説明しようとしているか |
| 注文生成 | condition・bar・order type | 注文はfillより前に存在したか |
| 価格経路 | previous close・O/H/L/C・gap・想定sequence | その順序で水準へ到達できたか |
| Magnifier | 下位足coverage・ON/OFF差 | 既定path依存のfillではないか |
| 未解決 | 不足data・未確認仕様・市場非再現flag | 推測を事実として埋めていないか |
空欄を推測で埋めず、説明不能も監査結果として残します。
まず高利益tradeではなく、同一barでentry/exit、gap fill、limit touch、長期history初期など仮定へ敏感なtradeを抽出します。変更後に成績が悪化しても削除せず、どのfill assumptionへ依存していたかをversion差として保存します。
再現手順では、対象tradeを含む期間を固定し、最初に既定経路版、次にBar Magnifier版を同じsource hashとPropertiesで実行します。両方から同じ形式の取引一覧を出力し、trade IDがずれた地点から一件ずつ照合します。さらに別の日に同じchart contextを開き直し、coverage開始位置、注文時刻、fill価格が同じ説明で再構成できるか確認します。成績が良い方を先に採用せず、説明不能件数と未covered件数を合否条件へ使います。
約定前提を監査してから結果dataをLabへ渡す
驚いた約定ごとの反証ログとBar Magnifierのcoverage記録がそろったら、対応する約定一覧(CSVまたはXLSX)をBacktest & Robustness Labの比較画面へ投入します。そこでequity curve、DD、取引分布をMagnifier OFF/ONや保守的fillの各versionで照合できます。前提を保った比較を継続保存したい段階が、有料のversion比較へ移る自然な時点です。
無料インジケーターはsignal条件の観察に使えますが、indicatorはstrategy orderやStrategy Testerの取引dataを自動生成しません。注文ruleを別途strategyとして定義し、fill監査を終えてからLabへ進みます。Bar Replay、Paper Trading、Broker Emulatorも互いの代用品ではありません。
fill sampleの下位足coverageと仮定依存を数える
監査したfill数、Bar Magnifier coverage内のfill、same-bar entry/exit、gap crossingを入力します。実市場誤差ではなく、追加確認が必要なsampleを整理します。
coverage率=min(B,A)÷A、既定path対象=max(A−B,0)、sensitive case=C+D。caseは重複し得るため一意trade数とは限らず、実市場との一致率でもありません。
よくある質問
Broker Emulatorは実際のbroker約定を再現しますか?
完全には再現しません。chart dataとsimulation規則でfillを作り、実際の板、queue、latency、partial fill、rejection等は自動復元しません。
Bar MagnifierをONにすれば正確なtick backtestになりますか?
なりません。利用可能な下位時間足dataでintrabar処理を細かくしますが、tick履歴やmarket microstructureの完全な再現ではなく、coverage上限もあります。
limit価格へbarが触れたら必ず約定しますか?
単純に断定できません。現在のlimit fill設定、gap、order生成時刻、下位足経路を確認し、実市場では流動性も別に考えます。
なぜmarket orderのmarkerがsignal barの次barに出ますか?
bar closeで条件を評価して注文を生成する標準的なstrategyでは、最も早いfill機会が次の利用可能tick、通常は次bar openになるためです。process-on-close等の設定を変えた場合は別契約として記録します。
根拠資料と確認先
- TradingView | Broker emulator模擬約定と関連設定の公式概要
- TradingView Pine Script | StrategiesBroker Emulator、order types、Bar Magnifierの公式manual
- TradingView | What is Bar Magnifier backtesting mode下位時間足、same-bar fill、coverage上限の公式説明
- TradingView Pine Script | Declaration statementsuse_bar_magnifierとstrategy計算・fill引数の公式reference
- TradingView Pine Script FAQ | Strategiesorder timing、Bar Magnifier、strategy testingの公式FAQ
編集・発行: SG Group · 編集方針: TradingView公式ヘルプとPine Script公式文書を優先し、金融市場・商品に関する説明は取引所、監督当局、一次資料で補完しています。機能、データ、料金、接続条件は変わるため、実際の利用前に公式画面とリンク先の最新情報を確認してください。
重要事項: 本記事はTradingViewの画面、チャート、アラート、スクリーナー、ペーパートレード、Pine Script等の一般的な学習情報です。投資助言、売買シグナル、特定商品・データ提供者・ブローカーの推奨、将来価格や利益の保証ではありません。機能、料金、データ、取引所区分、通知、注文連携、Pine Scriptの仕様はプラン・地域・接続先・時点で異なり変更されることがあります。実際の資金を使う前に、TradingView公式資料、データ提供元、接続先事業者の最新条件を確認し、架空データまたはペーパートレードで手順を検証してください。

