本文へスキップ

なぜ作ったか PineForge

OCAグループで決済した421件の取引。違いはゼロ。

−2000200
2025年7月2025年10月2026年1月2026年4月
USDT

タップやドラッグで各点の値を確認できます。

USDT建ての累積損益、ETHUSDT 15m、公開コーパスd75b4fa。両方の取引一覧

グラフのデータを表で見る
各月最後の取引時点の累積損益(USDT)
取引決済時刻(UTC)TradingViewPineForge
332025-04-30 14:30129.88129.88
572025-05-31 08:45258.48258.48
882025-06-30 11:15188.84188.84
1122025-07-31 23:3029.9729.97
1442025-08-30 03:15140.67140.67
1752025-09-28 13:1585.9585.95
2082025-10-30 20:45−14.07−14.07
2492025-11-29 18:30−128.25−128.25
2712025-12-29 14:45162.43162.43
3122026-01-31 23:15205.72205.72
3532026-02-28 08:15172.19172.19
3852026-03-31 12:00368.20368.20
4212026-04-29 21:45305.73305.73
計測方法

oca-exit-bracket-internal-cancel-01は、OCAグループで決済する戦略です。太い線がTradingViewの取引記録、その中を通る細い線がPineForgeの取引記録です。両方の記録で421件の取引が同じ時刻に決済され、累積損益もセント単位まで一致しています。

当初は、厳密なパリティに達していませんでした。現在、公開コーパスには312本の戦略があり、311本が優秀、1本は異常として宣言されています。また、mainブランチのエンジンによる2026‑11‑03時点のベースラインでは、9銘柄での7,989件のバックテストの100.00%が、TradingViewが出力した取引一覧との照合で「優秀」または「良好」と判定されています。この差を埋めたのは、コード生成を書き足すことではありません。食い違いを1件ずつ追い続けたことです。

出典:pineforge-engineのscripts/check_corpus_parity.sh(コミット35db01c8、86行目)、pineforge-corpusのコミットd75b4fa

出典:非公開の検証記録、基準 pineforge-parity-baseline-20261103-release-tag-3d8717c4(sha256 3d8717c4…73ad、母集団 cf857209…b062)、出所別のスクリプト数:pineforge-engine README.md(d1d18867)、取引数:pineforge-release facts.json。

そうした労力の大半は、「決済(exit)」「約定(fill)」「トレール(trail)」といった言葉のTradingView固有の定義に合わせることに費やしました。PineのドキュメントはAPIを説明していますが、注文処理の厳密なセマンティクスは、取引一覧をバーごとに差分比較して初めて見えてきます。私たちはそれを行い、自分たちの結果とリファレンスが食い違う理由を問い続け、差異を1つずつ解消してきました。

公開コーパスで唯一残る例外であるanomaly-equity-mirror-strategy-equity-01は、異常として宣言されているため、コーパスのパリティチェックでは失敗ではなく異常として報告されます。コーパスの注記には、当初の診断が記録されています。サイズがちょうど資産の1倍という条件で、TradingViewの証拠金チェックが、資産を上回るエントリーの一部を受け入れ、下回るエントリーの一部を拒否していたというものです。この診断は見直し中です。2026‑11‑03時点のパリティ検証ベースラインで、このプローブが「優秀」と判定されたためです。

なぜオフラインの再現性が必要か

Pine戦略の多くはTradingView上で生まれる。それは当然で、チャートを見ながら即座に試せ、コミュニティも大きく、シェアも簡単だ。ただ、TradingViewにはオフラインランタイムが存在しない。エンジンのバージョンをピン留めできず、CIでバックテストを走らせられず、別のマシンでトレードリストをビット単位で再現することもできない。

チャートのアイデアを眺めるだけなら、それで十分だ。しかし本物の資金を背負う戦略を構築するなら、そのすべてが重要になる。「ブラウザで数値が見えた」と「監査証跡がある」の間にある溝を、Pine言語を手放さずに埋めることが、私たちの出発点だった。

なぜPyneCoreにコントリビュートしなかったか

PyneCoreは最も野心的なオープンソースのPineScriptエンジンで、私たち自身もセカンドオピニオンとして使っています。それでもPineForgeが独自のエンジンである理由は2つあります。

実行モデル
PyneCoreは、PyneSysコンパイラがPythonに変換したPineを実行します。PineForgeはPineをC++にトランスパイルし、.soにコンパイルします。速度も、パリティのトレードオフも、配布のあり方も異なります。どちらが間違っているわけでもありませんが、両方を書き直さない限り、一方をもう一方に後付けすることはできません。
配布
コンパイル済みの.soなら、販売者はソースを公開せずに戦略を配布できるかもしれません。これがマーケットプレイスの構想で、計画段階にあり、まだ構築されていません。PyneCoreとは別のプロダクトです。

PyneCoreはセカンドソースとして活用しています。エンジンリポジトリのベンチマーク(mainブランチのエンジン)では、同じ201本の戦略でPineForgeとPyneCoreをTradingViewと照合して評価しています。2つのエンジンの結果が食い違えば、その差分から調べるべき箇所がわかります。

出典:pineforge-engineのbenchmarks/results/summary.mdとindicator_comparison.md(コミット6b45f510)

なぜBacktraderを拡張しなかったか

BacktraderはPythonアルゴトレーディングの定番で、堅牢で愛されているツールだ。ただ、この用途には形が合わない。Python標準のバックテストフレームワークであり、カスタム戦略クラスをサポートするが、Pineは異なる言語で異なるセマンティクスを持つ。request.security()のルックアヘッド、バー内の注文処理、oca_nameによる決済グループは、Pythonをいくら書いても再現できない。

そして繰り返しになるが、Backtraderの戦略はPythonソースであり、Pythonソースとして配布される。コンパイル済みバイナリのマーケットプレイスには、デプロイ可能なアーティファクトを生成するトランスパイルステップが必要であり、Backtraderはそのインターフェースを持っていない。

今後の予定

計画中

最適化
選んだ目的関数に対して、戦略の入力パラメータをホスト型で探索します。
Studio
バックテスト、最適化、比較ができるブラウザ上のワークスペースで、現在ローカルで実行できるのと同じエンジンで動きます。ウェイトリストの登録者に最初にお知らせします。
マーケットプレイス
販売者は独自のライセンス制限を付けてコンパイル済みの戦略を公開し、購入者はソースを見ることなく自分のデータで実行します。

エンジン