エキスパートアドバイザーの1日の損失上限:プロップファームが求める4つの判断

10 10月 2026, 10:24
Bohdan Klok
0
3

1日の損失上限は、コード1行のように聞こえます。「今日の損失がX%を超えたら止める」。実際には4つの判断があり、そのどれもが上限の発動タイミングを変えます。プロップファームはこれを避けて通れないものにしました。1日の上限を一度でも超えれば、その月の残りでストラテジーが何をしたかに関係なく口座は失われます。ここでは、上限が通常どう数えられるか、単純な実装がどこで失敗するか、そして私のエキスパートアドバイザーで使っているコードを紹介します。

1. 「今日」とは何か

パソコンではなく、取引サーバーの1日です。TimeCurrent() は MetaTrader がどこでも表示している時計です。プロップファームは自社サーバーの、または固定のタイムゾーンの午前0時に上限をリセットします。自分のファームがどちらかを確認してください。サーバーの午前0時でない場合は、リセット時刻をずらす必要があります。サーバー日の始まりは単純にこうです。

datetime now = TimeCurrent();
datetime day = now - now % 86400;       // 00:00 server time

2. 何に対する損失か

1日の始まりの残高に対する損失です。多くのプロップファームは、その時点の残高と有効証拠金のうち高い方を基準にします。つまり、より厳しい方を選ぶのが安全です。含み益300を持ったまま夜を越えれば、その利益も基準に含まれ、それを失うことは損失として数えられます。

double base = MathMax(AccountInfoDouble(ACCOUNT_BALANCE), AccountInfoDouble(ACCOUNT_EQUITY));

3. 損失をどう測るか

決済済みの取引ではなく、有効証拠金で測ります。決済済み取引だけを見る上限では、保有中のポジションが上限を大きく超えてしまいます。プロップファームの監視は含み損を見ていますが、あなたのコードは見ていません。そのため、チェックはティックごとに行います。

if(AccountInfoDouble(ACCOUNT_EQUITY) <= base * (1.0 - limitPercent / 100.0))
   stopped = true;      // close the positions, open nothing until the next day

そして口座全体に対して行います。エキスパートアドバイザーごとの上限は自分のリスク管理には十分ですが、プロップファームはすべてのポジションを合計して数えます。プログラムのコピーが複数のチャートで動いている場合、どれも同じ口座の有効証拠金を見て、それぞれが自分のポジションを決済します。

4. 再起動で何が残るか

単純な実装が必ず間違えるのがここです。基準は変数に保存されています。14:00にターミナルが再起動します(アップデート、VPSの再起動、パラメーターの変更)。プログラムは最初から始まり、午前中の損失のあとの現在の残高を「1日の始まり」とみなし、もう一度まるごと上限を許してしまいます。1日の状態はプログラムの外に保存しなければなりません。ターミナルのグローバル変数はまさにそのためのものです。

string key = StringFormat("DL_%I64d_%I64u_%s_", AccountInfoInteger(ACCOUNT_LOGIN), magic, _Symbol);
if(GlobalVariableCheck(key + "day") && (datetime)GlobalVariableGet(key + "day") == day)
  {
   base    = GlobalVariableGet(key + "base");       // the real start of the day
   stopped = GlobalVariableGet(key + "stop") != 0.0;
  }
else
  {
   GlobalVariableSet(key + "day", (double)day);      // a new day: remember it
   GlobalVariableSet(key + "base", base);
   GlobalVariableSet(key + "stop", 0.0);
  }

ターミナルはグローバル変数を最後のアクセスから4週間保持し、ディスクに書き込みます。そのため再起動、再コンパイル、パラメーター変更を経ても残ります。

大事な細部

  • 決済して止める:上限が発動したら、このプログラムのポジションを決済し、翌日まで新しいシグナルをすべて拒否します。ジャーナルだけでなく、ユーザーが見る場所(チャートのパネルの1行、アラート、プッシュ通知)で知らせてください。
  • 決済は失敗することがあります。市場が閉まっている、価格が動いた、サーバーが混雑している。再試行しますが、ティックごとではありません。取引セッションが開いている間、1秒に1回で十分です。
  • ストラテジーテスターでは、グローバル変数はテストエージェントのもので、テストが途中で再起動することはありません。そこではメモリ上の状態で十分です。
  • パーセントはプロップファームの上限より低く設定してください。1トレードあたりリスク1%なら、1日の上限3%はストップ3回分です。ファームの上限が5%なら自分の上限は4%に。価格はストップを飛び越えることがあるからです。

製品では

バージョン1.09から Indicator Signal Trader Kb にはまさにこれがあります。パラメーターの「Daily loss limit」で、デフォルトはオフ。サーバー日の始まりの残高と有効証拠金の高い方を基準に口座全体で数え、再起動をまたいで保持され、発動するとパネルに赤い行が表示されます。ストラテジーテスターで上限0.5%、1トレードあたりリスク1%で GBPUSD の2022〜2026年を走らせると372回発動し、同じ日にそのあと開かれたポジションは1つもありませんでした。1日の上限が保証すべきなのは、まさにそれだけです。