XAU/USD のポジションサイズ計算ツールを作るとき、計算そのものは1行で終わります。工数の大半は数式ではなく、入力の側——ストップの単位、ブローカーごとに違うピップの定義、そして出力が妥当かどうかの検算にあります。
ここでは式、実装例、そして「気づかないまま10倍ずれる」入力の落とし穴をまとめます。
式
ロット数 = リスク額 ÷(ストップまでの距離(ピップ)× 標準ロットあたりのピップ価値)
入力は3つ、演算は1回だけです。
| 入力 | 例 | 出どころ |
|---|---|---|
| リスク額 | 100ドル | 1トレードごとの許容リスク |
| ストップ幅 | 20ピップ | チャートで計測 |
| ピップ価値(標準ロット) | 10ドル | ブローカーの契約仕様(0.10ドル/pip 基準) |
| 出力 | 0.50ロット | 上式 |
実装例
// XAU/USD のロット数
function lotSize(riskUsd, stopPips, pipValuePerStandardLotUsd) {
if (riskUsd <= 0 || stopPips <= 0 || pipValuePerStandardLotUsd <= 0) {
throw new Error('All inputs must be positive');
}
return riskUsd / (stopPips * pipValuePerStandardLotUsd);
}
// 基準ケース:0.10ドル/pip のスケール
lotSize(100, 20, 10); // => 0.5(ロット)
テストで必ず確認したい往復検算はこちらです。
function riskAtStop(lots, stopPips, pipValuePerStandardLotUsd) {
return lots * stopPips * pipValuePerStandardLotUsd;
}
riskAtStop(0.5, 20, 10); // => 100(元のリスク額と一致)
出力をストップ幅とピップ価値で掛け戻して、リスク額に戻らないなら、バグは割り算ではなく単位の扱いにあります。
壊れるのは入力の層
ピップの定義。 多くのブローカーは1ピップを0.10ドルの値動きと定義し、標準ロット(100オンス)で1ピップ=10ドルになります。一方、1ピップを0.01ドルとする業者では同じロットが1ピップ=1ドルです。式は同じでも出力は10倍変わります。定義はハードコードせず、UI の明示的な入力として持たせてください。
ストップの単位。 ストップ幅はピップ価値と同じ定義のピップで測る必要があります。ドル建てで測ったストップをピップ前提の式に流すと、静かな単位不一致になります。「計算ツールがとんでもないロット数を返す」という不具合報告の典型がこれです。
妥当性の境界。 同じ20ピップのストップでも、勘で1.00ロットなら約200ドルのリスク、0.10ロットなら約20ドルです。人間が持たない桁の出力が出たときは、その数字を出すのではなく入力を疑う設計にします。
出力の丸め。 ブローカーごとに最小ロット単位があり、割り算の生値は拒否されたり黙って調整されたりします。最小単位に丸めたうえで、丸めた後の実際のリスクを再計算して表示すること。ここを飛ばす実装が多いのですが、飛ばすと「表示は100ドルのリスク」と実際のエクスポージャがずれ、たいていは利用者の意図より大きいリスク側にずれます。
負の入力。 リスク0、ストップ0、ピップ価値0は、Infinity や NaN、あるいは異常に大きなロット数を生みます。割り算の前に検証し、意味のあるエラーを返してください。ゼロ入力で Infinity を返すツールは、いずれ別の誤った入力で信頼されます。
全体をたどる
- リスク:100ドル
- ストップ:20ピップ
- ピップ価値:標準ロットあたり10ドル
-
lotSize(100, 20, 10)→ 0.5 - 往復検算:0.5 × 20 × 10ドル = 100ドル(リスク額が保存される)
計算はこれで全部です。ピップ定義の切り替えを入力として持たせるかどうかが、式そのものより効いてきます。切り替えを入力にしておけば、残りの実装は自然に決まります。
本記事は教育目的であり、投資助言ではありません。入力値は必ずご利用のブローカーの契約仕様で確認してください。