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日の上限が保証すべきなのは、まさにそれだけです。


