MQL5長時間稼働・安定化完全ガイド|メモリ・ハンドル・ログ・オブジェクト管理の基本
MQL5でEAやインジケーターを長時間動かす場合、最初は問題なく動いていても、時間の経過とともにチャートが重くなる、パネルが反応しにくくなる、ログが増えすぎる、Objectが残る、再セット後に表示が混ざる、といった問題が出ることがあります。
これらは、単純なコンパイルエラーとは違い、短時間の起動確認だけでは見つけにくい問題です。OnTickに重い処理を置きすぎている、indicator handleを毎回作っている、不要なログを出し続けている、Objectを毎tick再作成している、OnDeinitで重いcleanupを行っている、外部連携の失敗処理が本体処理と混ざっている、といった設計上の原因が関係する場合があります。
この記事では、MQL5のEA・インジケーターを長時間稼働させる時に確認したい、メモリ、indicator handle、IndicatorRelease、ログ抑制、Object管理、OnTimer分離、VPS運用、フリーズ・ブラックアウト時の確認項目を整理します。売買判断、推奨銘柄、推奨ロット、運用成績に関する助言は扱いません。技術的な安定化と問い合わせ前整理に限定します。
この記事で扱う範囲
本記事では、MQL5 EA・インジケーターを長時間動かす時の安定化に関係する実務項目を扱います。対象は、EA、インジケーター、パネルEA、外部連携EA、通知機能付きツール、複数銘柄・複数時間足を扱うツールです。
主に扱う内容
| 対象 | この記事での扱い | 確認ポイント |
|---|---|---|
| OnTick負荷 | tickごとの重い処理を避ける | 取得回数、ログ量、Object更新 |
| OnTimer分離 | 定期処理をtick処理から分ける | 外部制御、通知、UIメンテナンス |
| indicator handle | handle作成と解放を整理する | 作成場所、再利用、IndicatorRelease |
| ログ抑制 | 同じログを出し続けない | 状態変化時、summary、debug切替 |
| Object管理 | チャートObjectの増加や残存を整理する | prefix、差分更新、startup audit |
| OnDeinit | 終了時の処理を軽くする | timer停止、handle解放、広範囲削除回避 |
| VPS運用 | 長時間稼働時の確認 | ログ、スクリーンショット、再起動履歴 |
| 問い合わせ前整理 | 再現情報を集める | EA名、バージョン、set、ログ、発生時刻 |
この記事で扱わないこと
本記事では、売買ロジックの良し悪し、運用成績の評価、具体的なパラメータ調整、特定環境への誘導は扱いません。MQL5プログラムを長時間動かすための構造、ログ、表示、終了処理、確認手順に絞ります。
MT5 EAやインジが重くなる主な原因
EAやインジケーターが重くなる原因は、1つとは限りません。短時間では目立たなくても、長時間稼働や複数チャート運用、VPS環境、バックテスト、外部連携、Object表示を組み合わせると、負荷が蓄積して見える場合があります。
重くなる原因表
| 原因 | 起きやすい症状 | 確認すること | 整理方針 |
|---|---|---|---|
| OnTickに処理を詰め込みすぎ | tickが多い時に重くなる | OnTick内の処理量 | OnTimerや新バー時処理へ分ける |
| indicator handleを毎回作成 | 徐々に重くなる、再初期化が多い | iMA、iATR等の呼び出し位置 | OnInitで作成し再利用する |
| CopyBufferやCopyRatesが多すぎる | 複数銘柄・複数時間足で重い | 取得対象、取得本数、更新頻度 | 必要最小限にする |
| ログが多すぎる | Expertsログが読みにくい、テスターが重い | Printの頻度、同一ログの反復 | 状態変化時とsummaryへ分ける |
| Objectを毎tick再作成 | ちらつき、表示遅延、パネル不安定 | ObjectCreate / ObjectDeleteの頻度 | 差分更新にする |
| OnDeinitで重いcleanup | 削除時・時間足変更時に不安定 | 全Object走査、大量削除 | 軽量終了処理にする |
| 外部連携を同期的に詰め込む | 通信失敗時に本体処理が重い | WebRequestや通知処理の位置 | OnTimerやqueueへ分ける |
| 複数チャートで同じ処理を重複 | VPS全体が重くなる | 設置数、同時稼働数 | 役割ごとに設置範囲を整理する |
短時間確認だけでは分からない問題
起動直後は軽く見えても、数時間後や翌日に重くなる場合があります。長時間稼働では、ログ量、Object数、handle作成回数、外部連携の失敗回数、通知queue、再描画回数などが影響します。
そのため、長時間稼働確認では、単に「起動したか」だけではなく、時間経過後のExpertsログ、Journalログ、チャート表示、Object残存、CPU使用率、VPSの応答、MT5の操作感も確認します。
OnTickに重い処理を置かない理由
OnTick は、EAが新しいtickを受け取るたびに呼ばれます。tickが多い銘柄や時間帯では短時間に何度も呼ばれるため、ここに重い処理を置くと、処理が追いつきにくくなります。
OnTickに置くべき処理は、価格変化に依存する軽量な確認、現在価格の取得、新バー判定、必要な評価helperの呼び出しなどです。外部通信、全Object走査、全履歴走査、大量ログ、パネル全再構築などは、OnTimerや別helperへ分けることを検討します。
OnTickに置く処理・分ける処理
| 処理 | OnTick向きか | 理由 | 代替先 |
|---|---|---|---|
| 現在価格取得 | 向いている | tickごとに変化するため | – |
| 新バー判定 | 向いている | 軽量で制御しやすい | – |
| 軽量な状態確認 | 条件付きで向いている | 処理量を限定できる場合 | helperへ分離 |
| 外部制御取得 | 通常は不向き | 通信待ちや失敗処理が混ざる | OnTimer |
| 通知送信 | 通常は不向き | transport処理を分けたい | notification queue / OnTimer |
| 全Object再作成 | 不向き | 描画負荷が大きい | 差分更新 / OnTimer |
| 履歴全走査 | 不向き | 長期間稼働で重い | 範囲限定 / 必要時のみ |
| 詳細ログの連続出力 | 不向き | ログ過多になる | 状態変化時ログ |
OnTickを軽く保つ最小例
void OnTick()
{
UpdateTickSnapshot();
if(IsNewBar())
{
EvaluateOnNewBar();
}
RunLightRuntimeCheck();
}この例では、OnTick内に長い処理を直接書かず、役割ごとのhelperを呼び出しています。重い処理を後から見つけやすくするためにも、OnTickは短く保つ方が確認しやすくなります。
ログ出力が多すぎる時の問題
ログは、不具合確認や販売後サポートで重要です。ただし、同じログが毎tick出続けると、必要な情報が埋もれます。バックテストでは、ログ量が多すぎることで確認や実行時間に影響することもあります。
長時間稼働では、ログを「常時出すもの」「状態変化時だけ出すもの」「debug時だけ出すもの」「終了時summaryにするもの」に分けます。
ログ抑制方針表
| ログ種別 | 出力タイミング | 向いている内容 | 注意点 |
|---|---|---|---|
| INITログ | 起動時 | version、symbol、設定、handle、timer | 機密値は出さない |
| STATE_CHANGE | 状態が変わった時 | OKからNG、NGからOKなど | 同じ状態を連続出力しない |
| SUMMARY | 一定間隔または終了時 | 成功数、失敗数、skip数 | 短く比較しやすくする |
| WARN | 異常候補発生時 | 取得失敗、handle未準備、Object不足 | reasonを分ける |
| DEBUG | 検証時のみ | 詳細な内部値 | 通常時はOFFにする |
| SNAP | 手動操作または問い合わせ時 | 現在状態のまとめ | 再現情報として使う |
| DEINIT | 終了時 | 終了理由、timer停止、summary | 重い処理と混ぜない |
状態変化時だけ出す例
void PrintWhenStateChanged(const string label,
const string current)
{
static string last = "";
if(current != last)
{
Print("STATE_CHANGE: ", label,
" from=", last,
" to=", current);
last = current;
}
}この例では、同じ状態が続く間はログを出さず、状態が変わった時だけ出します。実務では、labelごとに前回値を持つなど、機能別に管理します。
indicator handleの管理
MQL5では、iMA、iATR、iBands などの関数でindicator handleを作成し、CopyBuffer で値を取得する構成がよく使われます。長時間稼働では、このhandle管理が重要です。
handleを毎tick作成したり、再初期化のたびに不要なhandleを残したりすると、確認しづらい不安定要因になります。基本は、OnInitで作成し、必要な期間は再利用し、終了時や不要になった時に解放する流れです。
handle管理表
| 場面 | 行うこと | 確認ログ例 |
|---|---|---|
| OnInit | 必要なhandleを作成する | HANDLE_INIT: name=MA handle=… |
| 作成失敗時 | INVALID_HANDLEを確認する | HANDLE_FAIL: reason=INVALID_HANDLE |
| 通常稼働 | 作成済みhandleを再利用する | BUFFER_LOAD: copied=… |
| CopyBuffer失敗時 | 取得本数とreasonを記録する | BUFFER_FAIL: copied=… |
| 設定変更時 | 必要に応じて再作成する | HANDLE_REBUILD: reason=PARAM_CHANGED |
| OnDeinit | 不要handleを解放する | HANDLE_RELEASE: ok=Y/N |
handle作成の最小例
int g_ma_handle = INVALID_HANDLE;
int OnInit()
{
g_ma_handle = iMA(_Symbol, PERIOD_CURRENT, 20, 0, MODE_SMA, PRICE_CLOSE);
if(g_ma_handle == INVALID_HANDLE)
{
Print("HANDLE_INIT_FAIL: name=MA");
return INIT_FAILED;
}
Print("HANDLE_INIT: name=MA status=OK");
return INIT_SUCCEEDED;
}この例では、OnInitでhandleを作成しています。実務では、銘柄、時間足、期間、適用価格などをログに出すと、設定確認がしやすくなります。
IndicatorReleaseの考え方
IndicatorRelease は、不要になったindicator handleを解放するために使います。長時間稼働や再初期化が関係するEA・インジケーターでは、handleの作成と解放の流れを整理しておくことが重要です。
ただし、IndicatorReleaseを呼べばすべて解決するというより、そもそもhandleを無駄に作らない設計が先です。毎tickでhandleを作成し、それを毎回解放するような構造ではなく、必要なhandleを作成して再利用する設計にします。
IndicatorReleaseの最小例
void OnDeinit(const int reason)
{
if(g_ma_handle != INVALID_HANDLE)
{
bool released = IndicatorRelease(g_ma_handle);
Print("HANDLE_RELEASE: name=MA ok=", released ? "Y" : "N");
g_ma_handle = INVALID_HANDLE;
}
EventKillTimer();
}この例では、OnDeinitでhandleを解放し、変数を INVALID_HANDLE に戻しています。解放対象、解放結果、終了理由をログに残すと確認しやすくなります。
IndicatorReleaseで確認すること
| 確認項目 | 内容 | 補足 |
|---|---|---|
| handleが有効か | INVALID_HANDLEではないか | 無効handleを処理しない |
| どこで作成したか | OnInit、再構築処理など | 作成場所と解放場所を対応させる |
| どこで解放するか | OnDeinit、再構築前など | 不要になったタイミングを明確にする |
| 再利用しているか | 毎tick作成していないか | 無駄な作成を避ける |
| ログがあるか | 作成・失敗・解放を確認できるか | 問い合わせ時に役立つ |
チャートオブジェクトが増えすぎる問題
パネルUI、ライン、ラベル、ボタン、ステータス表示、通知用マークなどを使うEA・インジケーターでは、チャートObjectの管理が重要です。Objectを毎tick作成し続けたり、削除対象を絞らずに増やし続けたりすると、表示が重くなる原因になります。
Objectは、作成・更新・削除・残存時の扱いを仕様化します。特に、表示専用Objectと、実ロジックに影響するObjectを分けることが重要です。
Object管理の基本表
| 分類 | 例 | 扱い |
|---|---|---|
| panel-control | ボタン、入力欄、タブ | パネル管理で作成・更新する |
| status-display | 状態ラベル、HELP、SNAP表示 | 差分更新する |
| visual-only | 確認用ライン、説明ラベル | 実ロジック参照には使わない |
| logic-reference | 判定に関係し得る管理ライン | 残存Objectを無条件採用しない |
| manual | ユーザーが手動で引いたライン | 原則削除しない |
| unknown | owner不明Object | 削除せず監査対象にする |
差分更新を基本にする
Objectは、毎回削除して作り直すのではなく、なければ作る、あれば必要なプロパティだけ更新する方式にします。これにより、ちらつきや描画負荷を抑えやすくなります。
void UpsertStatusLabel(const string name,
const string text)
{
if(ObjectFind(0, name) < 0)
{
ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, 10);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, 20);
}
ObjectSetString(0, name, OBJPROP_TEXT, text);
}この例では、Objectがなければ作成し、存在する場合は文字だけ更新します。実務では、前回のtextと同じなら更新しない、一定秒数ごとに更新するなど、さらに負荷を抑える設計も考えられます。
OnDeinit cleanupの注意
EAやインジケーターの終了時に、すべてのObjectを削除したくなることがあります。しかし、OnDeinitで全Object走査や大量削除を行うと、削除時、時間足変更時、再コンパイル時、チャート切替時に不安定化する場合があります。
OnDeinitでは、見た目の完全cleanupよりも、異常終了しないことを優先します。timer停止、handle解放、Comment解除などの軽量処理を中心にし、Object整理はprefixや用途を限定します。
Object lifecycle注意表
| 場面 | 推奨処理 | 避けたい処理 |
|---|---|---|
| OnInit | 必要Object作成、残存Object監査 | 理由なく全削除する |
| 通常稼働 | 差分更新、必要箇所だけ更新 | 毎tick全再作成 |
| OnTimer | 軽量メンテナンス、Object数確認 | 無制限走査 |
| OnChartEvent | クリック受付、再配置要求 | 重い再構築 |
| OnDeinit | timer停止、handle解放、最小cleanup | 全Object削除、大量ループ |
| 再セット時 | startup audit、残存Object分類 | 古いObjectの無条件採用 |
削除対象をprefixで絞る
Objectを削除する場合は、自EAが作成したObjectだけを対象にします。手動ライン、他EA、他インジケーターのObjectを巻き込まないために、Object名prefixを設計しておきます。
bool IsMyObject(const string name)
{
return (StringFind(name, "EAF_STABLE_") == 0);
}このようにprefixで対象を絞ると、cleanupやstartup auditの対象を管理しやすくなります。
OnTimerへ分離する処理
長時間稼働では、OnTickに処理を集中させず、一定間隔でよい処理をOnTimerへ分けることが有効です。外部制御、認証確認、通知queue、UIメンテナンス、Object数確認、heartbeatログなどはOnTimerに向いています。
OnTimerへ分離する処理表
| 処理 | OnTimer向きの理由 | 確認ログ例 |
|---|---|---|
| 外部制御取得 | tickごとに取得する必要が薄い | TIMER/EXTCTRL: state=OK |
| 認証状態確認 | 一定間隔で十分な場合が多い | TIMER/AUTH: status=OK |
| 通知queue処理 | 本体処理とtransportを分けられる | TIMER/NOTIFY: sent=… |
| UIメンテナンス | 毎tick再描画を避けられる | TIMER/UI: diff_update=Y |
| Object監査 | 低頻度で十分な場合が多い | TIMER/OBJECT: count=… |
| heartbeat | 長時間稼働中の生存確認 | TIMER/HEARTBEAT: alive=Y |
| summaryログ | ログ過多を避けられる | TIMER/SUMMARY: warn=… |
OnTimer分離の最小例
int OnInit()
{
EventSetTimer(5);
Print("INIT: timer=5sec");
return INIT_SUCCEEDED;
}
void OnTimer()
{
RefreshExternalStateIfNeeded();
ProcessNotificationQueue();
UpdatePanelIfChanged();
PrintHeartbeatIfNeeded();
}
void OnDeinit(const int reason)
{
EventKillTimer();
}OnTimerに分けても、処理量が多すぎれば重くなります。周期、処理対象、ログ量、Object更新量を管理してください。
外部連携と長時間稼働
WebRequest、通知、Google Sheets連携、外部認証、外部制御などを含むEAでは、長時間稼働時の確認項目が増えます。通信失敗、stale、設定不備、通知失敗、外部側の応答変化などを、本体処理と分けて扱う必要があります。
外部連携では、Webhook URL、GAS URL、APIキー、認証トークン、口座番号、個人情報などの実値をログや画面に出さないようにします。ログには、状態分類、成功/失敗、reason、最終取得時刻、stale判定などを出します。
外部連携の長時間稼働確認表
| 確認項目 | 見る内容 | ログ例 |
|---|---|---|
| 取得状態 | 成功、失敗、stale、invalid | EXT_STATE: status=… |
| 最終成功時刻 | いつ最後に成功したか | EXT_LAST_OK: time=… |
| 失敗理由 | 通信失敗、形式不正、応答なし | EXT_FAIL: reason=… |
| 通知queue | 未送信が溜まっていないか | NOTIFY_QUEUE: size=… |
| 通知失敗 | transport failureとpayload failureを分ける | NOTIFY_FAIL: reason=… |
| 機密値 | ログに実値が出ていないか | masked=Y |
| 本体影響 | 外部失敗で本体処理が止まりすぎていないか | EXT_POLICY: scope=… |
VPSで長時間動かす時の確認
VPSでEAやインジケーターを長時間動かす場合、MQL5コードだけでなく、MT5本体、VPSのリソース、同時稼働チャート数、ログ量、通信状態、Windows更新、再起動履歴なども確認対象になります。
VPS環境では、画面を常に見ていない時間が長くなります。そのため、Expertsログ、Journalログ、定期summary、SNAP、スクリーンショット、発生時刻の記録が重要です。
VPS長時間稼働チェック表
| 確認項目 | 内容 | 記録すること |
|---|---|---|
| MT5起動状態 | MT5が落ちていないか | 起動時刻、再起動履歴 |
| EA稼働状態 | 対象EAが動いているか | INITログ、heartbeat |
| チャート数 | 同時稼働が多すぎないか | 設置チャート一覧 |
| ログ量 | Experts / Journalが過剰でないか | 同一ログの反復有無 |
| CPU / メモリ | VPS全体が重くないか | リソース状況 |
| 通信状態 | 外部連携がある場合の通信 | 成功 / 失敗 / stale |
| 表示状態 | パネルやObjectが崩れていないか | スクリーンショット |
| 時間 | 発生時刻を記録する | PC時刻、サーバー時刻の区別 |
VPSで確認しやすいログ
| ログ名 | 目的 | 出力タイミング |
|---|---|---|
| INIT/SUMMARY | 起動状態の確認 | EA起動時 |
| TIMER/HEARTBEAT | 長時間稼働の生存確認 | 一定間隔 |
| STATE_CHANGE | 状態変化の確認 | 変化時 |
| EXT_STATE | 外部連携状態 | 取得時、変化時 |
| OBJECT_AUDIT | Object残存や増加の確認 | 起動時、必要時 |
| DEINIT/SUMMARY | 終了理由の確認 | EA終了時 |
フリーズ・ブラックアウト時の確認
チャートが固まる、黒くなる、パネルが消える、時間足変更で戻る、EA削除時に不安定になる、といった症状では、発生時刻と直前ログが重要です。
フリーズやブラックアウトは、Object更新、描画負荷、OnDeinit cleanup、外部連携、ログ過多、他インジケーターとの競合、VPSリソースなど、複数原因が関係する場合があります。
フリーズ時の確認表
| 確認項目 | 見る内容 | 提出するとよい情報 |
|---|---|---|
| 発生時刻 | いつ発生したか | 日時、チャート時間、PC時刻 |
| 直前のExpertsログ | 同じログの反復、ERROR、WARN | 発生前後のログ |
| Journalログ | MT5側の異常や接続状態 | 同時刻付近のログ |
| スクリーンショット | 表示崩れ、黒画面、Object残存 | チャート全体画像 |
| 再現手順 | 時間足変更、EA削除、再セットなど | 何をした直後か |
| 設置状況 | 同じチャートにあるEA・インジ | 設置一覧 |
| 外部連携 | 通信失敗や通知失敗 | 機密値を除いた状態ログ |
| VPS状態 | CPU、メモリ、再起動履歴 | 可能な範囲で記録 |
時間足変更で戻る場合
時間足変更で表示が戻る場合、パネル再配置、Object再作成、ChartRedraw、OnChartEvent、OnTimerメンテナンス、Object欠損チェックが関係している可能性があります。表示だけの問題なのか、EA内部状態も止まっているのかを分けて確認します。
販売後サポートで必要なログ
販売後サポートや不具合調査では、画面上の状態だけでは判断しにくいことがあります。長時間稼働の問題では、INIT、TIMER、STATE_CHANGE、OBJECT_AUDIT、HANDLE、DEINIT、SNAPのようなログがあると、原因の切り分けに役立ちます。
問い合わせ前情報表
| 情報 | 内容 | 理由 |
|---|---|---|
| EA / インジ名 | 対象ファイル名 | 対象を特定するため |
| バージョン | 画面表示やINITログのversion | 修正版との差分確認 |
| setファイル | 使用した設定 | 再現条件の確認 |
| 対象チャート | 銘柄、時間足 | 環境差の確認 |
| 発生時刻 | いつ起きたか | ログ照合のため |
| Expertsログ | EA・インジ側ログ | 処理状態の確認 |
| Journalログ | MT5本体側ログ | 接続やターミナル状態の確認 |
| スクリーンショット | 表示崩れやObject状態 | 画面状態の確認 |
| 再現手順 | 何をした後に起きたか | 検証再現のため |
| VPS情報 | 稼働時間、再起動、リソース | 長時間稼働の確認 |
SNAPログに入れるとよい項目
| 項目 | 内容 | 注意点 |
|---|---|---|
| version | EA・インジの版 | ファイル名と一致させる |
| symbol / timeframe | 対象チャート | 複数銘柄時は参照銘柄も分ける |
| timer状態 | OnTimerの有効状態 | 周期も記録する |
| handle状態 | 主要handleの作成状態 | 無効handleを確認する |
| object count | Object数 | 自EA prefix範囲に絞る |
| last reason | 直近の警告や停止理由 | 短いreasonで統一する |
| external state | 外部連携の状態 | URLやtokenは出さない |
| log profile | 通常 / debug / tester等 | ログ量の確認に使う |
安定化チェック表
長時間稼働前には、以下の観点で確認すると、後から問題を切り分けやすくなります。すべてを一度に完璧にするのではなく、対象EAやインジケーターの機能に応じて必要項目を確認します。
長時間稼働チェック表
| No | 確認項目 | 期待する状態 |
|---|---|---|
| 1 | OnInitで設定確認ログが出る | version、symbol、timer、handle状態が分かる |
| 2 | OnTimerを使う場合、OnDeinitで停止する | EventKillTimerが呼ばれる |
| 3 | indicator handleを毎tick作成していない | OnInit作成、再利用が基本 |
| 4 | 不要handleを解放している | IndicatorReleaseの対象が整理済み |
| 5 | 同じログが大量反復しない | 状態変化時ログまたはsummary |
| 6 | Objectを毎tick全再作成していない | 差分更新が基本 |
| 7 | Object名prefixがある | 他EAや手動Objectと分離できる |
| 8 | OnDeinitで広範囲Object削除をしていない | 軽量終了処理を優先 |
| 9 | 外部連携失敗reasonが分かる | fetch error、invalid、staleを分ける |
| 10 | 機密値がログに出ていない | URL、token、口座番号などを出さない |
| 11 | VPS長時間稼働でログ確認できる | heartbeatやsummaryがある |
| 12 | 問い合わせ前情報を集められる | SNAP、Experts、Journal、スクリーンショット |
次に読む技術講座
この講座とあわせて確認すると、MT5・MQL5開発、検証、不具合調査の流れを整理しやすくなります。
| No | 講座 | 確認できること |
|---|---|---|
| LEARN-003 | MT5検証・運用環境ガイド | VPS・検証環境の確認へ戻る |
| LEARN-014 | MQL5デバッグ・ログファースト開発完全ガイド | ログ抑制とSNAP整理を確認する |
| LEARN-018 | MQL5 WebRequest・JSON・外部API実装完全ガイド | 外部連携EAの安定化を確認する |
| LEARN-019 | MQL5チャートオブジェクト・パネルUI完全ガイド | Object lifecycleとパネルUIを確認する |
| LEARN-020 | MQL5イベント処理完全ガイド | OnTimer・OnDeinitの責務分離を確認する |
| LEARN-021 | MQL5マルチシンボル・マルチタイムフレーム完全ガイド | 複数銘柄・複数時間足の負荷管理を確認する |
次に確認するページ
技術講座を確認した後、導入・商品確認・開発相談・不具合報告へ進む場合は、以下のページも確認してください。
| ページ | 確認できること |
|---|---|
| 技術講座一覧 | MT5・MQL5・EA開発に関する技術講座を順番に確認できます。 |
| 導入ガイド | EA、インジケーター、補助ツールを導入する前の確認事項を整理できます。 |
| 商品一覧 | EAファンクラブで扱う補助ツール、インジケーター、コピーEAなどを確認できます。 |
| 開発代行ページ | EA、インジケーター、補助ツールの新規作成・改修相談を確認できます。 |
| 不具合報告・サポート依頼 | ログ、スクリーンショット、再現手順を整理して相談する場合に確認できます。 |
よくある質問
EAが重い時は何を確認しますか?
OnTick内の処理量、ログ出力頻度、Object更新回数、indicator handle作成回数、CopyBufferやCopyRatesの回数、外部連携処理、同時稼働チャート数を確認します。
ログを出しすぎると問題になりますか?
問題になる場合があります。同じログが大量に出ると、必要な情報が埋もれ、バックテストや長時間稼働時の確認もしづらくなります。状態変化時ログ、summary、debug切替に分けると確認しやすくなります。
IndicatorReleaseは必ず必要ですか?
indicator handleを作成している場合は、不要になったタイミングで解放する設計が重要です。ただし、毎tickで作成・解放するのではなく、必要なhandleを作成して再利用する設計が基本です。
OnDeinitで全Objectを削除してよいですか?
常に全削除すればよいとは限りません。OnDeinitでは軽量終了処理を優先し、Object削除はprefixや用途で対象を限定します。手動Objectや他EAのObjectを巻き込まないようにします。
VPSで長時間動かす時の注意点は何ですか?
MT5の起動状態、EA稼働状態、ログ量、同時稼働チャート数、CPU・メモリ、通信状態、外部連携状態、スクリーンショット、再起動履歴を確認します。
チャートがフリーズした時は何を送ればよいですか?
EA名、バージョン、setファイル、対象銘柄、時間足、発生時刻、Expertsログ、Journalログ、スクリーンショット、再現手順、同じチャートに入れているEAやインジケーターの情報を整理してください。
OnTimerに分けると安定しますか?
OnTimerへ分けるだけで必ず安定するわけではありません。ただし、tickごとに実行する必要がない処理を分離することで、OnTickの負荷を下げ、ログや外部連携の管理をしやすくできます。
外部連携EAは長時間稼働で注意が必要ですか?
注意が必要です。通信失敗、stale、通知失敗、外部応答の変化、機密値のログ出力、queue滞留などを確認します。外部連携の失敗理由は、本体処理と分けてログ化します。
Objectが残るのは不具合ですか?
仕様によります。表示専用ラインや履歴確認用Objectを残す設計もあります。ただし、再セット時に古いObjectを実ロジックへ無条件で使わないことが重要です。
時間足変更で表示が戻る場合、何が原因ですか?
パネル再配置、Object再作成、ChartRedraw、OnChartEvent、OnTimerメンテナンス、Object欠損チェックが関係している場合があります。表示だけの問題か、内部処理も止まっているかを分けて確認します。
まとめ
MQL5のEAやインジケーターを長時間安定して動かすには、OnTickに処理を詰め込みすぎないこと、indicator handleを適切に作成・再利用・解放すること、ログを状態変化時やsummaryへ整理すること、Objectを差分更新すること、OnDeinitで重いcleanupを避けることが重要です。
外部連携や通知を含むEAでは、通信失敗、stale、通知queue、機密値の扱いも確認対象になります。VPSで長時間動かす場合は、EA単体だけでなく、MT5本体、チャート数、ログ量、CPU・メモリ、通信状態、スクリーンショット、再起動履歴も整理してください。
学習内容を確認しても整理が難しい場合は、EA名、バージョン、setファイル、Expertsログ、Journalログ、発生時刻、スクリーンショットを整理したうえで相談してください。

