エラー141とは
MT4のエラー141(メッセージ:Too many requests)は、トレーダー(またはEA)が短時間に過度な数の注文リクエストをサーバーに送信した場合に、ブローカーがリクエストを拒否する際に返されるエラーです。いわゆる「レート制限(Rate Limiting)」に該当します。
このエラーは、ブローカーのサーバーを過負荷から守るための保護メカニズムとして機能しています。
原因
- EAの高頻度注文送信:ティックごとに注文を送信するEAや、エラー時に即座にリトライを繰り返すEAが主な原因です。OnTick()内で毎回注文送信するような設計は、この問題を引き起こします。
- 複数EAの同時稼働:複数のEAが異なるチャートで同時に注文を送信すると、アカウント単位でのリクエスト上限に達しやすくなります。10個以上のEAを同時稼働させている場合は要注意です。
- リトライ処理のウェイト不足:注文エラー発生時にSleep()なしで即座にリトライを繰り返すEA設計。エラー→リトライ→エラー→リトライのループで大量のリクエストが発生します。
- 手動注文の連打:注文ボタンを短時間に何度もクリックした場合。通常の操作では発生しませんが、「注文が通らない」と焦って連打すると起こり得ます。
解決手順
注文送信の間隔を空ける
EA運用の場合、注文送信後に最低1〜2秒のSleep()を入れてください。また、前回の注文送信から一定時間(例:5秒)が経過していない場合は注文を送信しないようタイムスタンプ管理を実装することを推奨します。
リトライ処理にウェイトを追加する
注文エラー時のリトライ処理には、必ず2〜5秒以上のSleep()を含めてください。エクスポネンシャルバックオフ(1回目2秒、2回目4秒、3回目8秒と間隔を倍にする)を実装するとより安定します。
同時稼働EA数を見直す
1つのアカウントで稼働させるEA数が多い場合、注文頻度の高いEAを別のアカウントに分散させることでリクエスト数を分散できます。XMでは1つのメールアドレスで最大8口座まで開設できるため、EA用途ごとに口座を分けることが可能です。
不要な注文リクエストを削減する
SL/TPの変更を毎ティック行うのではなく、一定の価格変動幅(例:5pips以上の変化)があった場合のみ変更するよう設計を見直してください。これにより不必要なOrderModify()の呼び出しを大幅に削減できます。
EA開発者向け:適切なリクエスト間隔の設計指針
プロのEA開発者は、以下のような設計指針でリクエスト過多を防いでいます。
- タイムスタンプ管理:グローバル変数に前回の注文送信時刻を記録し、最低間隔(例:5秒)が経過していない場合は送信をスキップする。
- エクスポネンシャルバックオフ:リトライ時のウェイトを1回目2秒、2回目4秒、3回目8秒と指数関数的に増やす。これによりサーバー負荷の回復を待てる。
- バッチ処理:複数のOrderModify()が必要な場合、ティックごとに1注文ずつ処理する設計にする。一度のOnTick()で全注文を処理しようとしない。
エラー141を無視して大量リクエストを送り続けると、ブローカーがアカウントを一時的に凍結する可能性があります。特に、ウェイトなしのリトライループは即座に修正してください。
ブローカーごとのレート制限の傾向
レート制限(1分間あたりの最大注文数)はブローカーにより異なりますが、公式に明示しているブローカーは少ないのが現状です。一般的な傾向として、以下のようなリクエスト頻度が安全圏とされています。
| 操作種別 | 推奨最大頻度 | 備考 |
|---|---|---|
| 新規注文(OrderSend) | 1分間に10〜15回 | 超高頻度スキャルピングでは注意 |
| 注文変更(OrderModify) | 1分間に30〜60回 | トレイリングストップでの変更含む |
| 注文情報取得 | 制限なし(通常) | OrderSelect等のローカル操作 |
※上記は一般的な目安であり、実際の制限値はブローカーにより異なります。エラー141が発生し始めたら、上記の数値を上限として注文頻度を調整してください。
エラー141が出た場合のMT4ジャーナルログの読み方
エラー141の発生状況を確認するには、MT4の下部にある「エキスパート」タブを確認します。ログには「OrderSend error 141」や「too many requests」のメッセージが記録されます。このメッセージが短時間に集中している場合は、EAの設計にリクエスト過多の問題があることを示しています。
ログファイルはMT4の「ファイル」→「データフォルダを開く」→「MQL4」→「Logs」フォルダに保存されています。テキストエディタで開き、「141」で検索すれば発生箇所を特定できます。発生時刻と直前の操作を照合し、どのEAのどの処理がエラーを引き起こしているか特定してください。
エラー141を防ぐEAのコード設計テンプレート
以下はMQL4でエラー141を防ぐための基本的なコード設計パターンです。
datetime lastOrderTime = 0; int minInterval = 5; // 最低注文間隔(秒)
void OnTick() { if(TimeCurrent() - lastOrderTime < minInterval) return; // 間隔チェック /* 取引ロジック */ int ticket = OrderSend(...); if(ticket > 0) { lastOrderTime = TimeCurrent(); } else { int err = GetLastError(); if(err == 141) { minInterval *= 2; // バックオフ Print("Too many requests. Interval increased to ", minInterval, "s"); } } }
このパターンでは、注文間隔をグローバル変数で管理し、エラー141が発生した場合は間隔を自動的に倍増させるエクスポネンシャルバックオフを実装しています。
よくある質問
エラー141のまとめ
エラー141は「ブローカーが過負荷保護のためにリクエストを拒否した」状態です。エラーが発生した場合は、即座にリトライするのではなく、適切なウェイトを入れてから再送信してください。EA開発ではタイムスタンプ管理とエクスポネンシャルバックオフの実装が必須です。複数のEAを運用している場合は、EA別に口座を分散させることでアカウント単位のリクエスト数を抑制できます。
XMは全口座タイプでEA取引を許可しており、約定速度も高速です。さらに条件を満たすとVPSが無料で利用でき、EA運用の安定性が大幅に向上します。
XM公式サイトで口座開設(無料)※ XMは日本の金融庁に未登録の海外FX業者です。取引にはリスクが伴います。
FX(外国為替証拠金取引)は元本保証のない金融商品です。レバレッジにより、預けた証拠金以上の損失が発生する可能性があります。余剰資金の範囲で取引を行ってください。当サイトで紹介する海外FX業者は日本の金融庁に未登録であり、日本の投資者保護基金の対象外です。当サイトの情報は一般的な情報提供を目的としたものであり、特定の業者の利用を推奨するものでも、個別の売買助言でもありません。