MQL5クラス・構造体・配列設計完全ガイド|EA開発で使うデータ整理の基本
MQL5でEA、インジケーター、スクリプト、補助ツールを作る時、最初は変数と関数だけでも実装できます。
しかし、機能が増えてくると、ロジックごとの状態、ポジション情報、インジケーター値、外部連携状態、通知状態、ログ設定、UI表示状態、バックテスト用の一時情報などを整理する必要が出てきます。
これらをすべてグローバル変数だけで扱うと、どの関数がどの状態を変更しているのか分かりにくくなり、改修時の影響範囲も追いにくくなります。
この記事では、MQL5でEAやインジケーターを保守しやすく作るために、変数、配列、構造体、クラス、includeファイル、mqh、runtime状態、複数ロジックEAの状態管理、position snapshot、配列範囲エラー対策を整理します。
このページは、MT5 / MQL5の技術学習記事です。特定の取引判断、売買タイミング、ロット、銘柄、運用結果を案内するものではありません。
この記事で確認すること
| 確認項目 | 確認する内容 |
|---|---|
| 変数・配列・構造体・クラスの違い | 単一値、複数値、関連データ、状態と処理のまとまりをどう使い分けるか確認します。 |
| 配列を使う場面 | 価格データ、インジケーターバッファ、複数ロジック、ポジション一覧、ログ集計を整理します。 |
| 構造体を使う場面 | LogicState、PositionSnapshot、SignalResult、RiskResultなど、関連する値をまとめる方法を確認します。 |
| クラスを使う場面 | 注文処理、ログ管理、外部連携、UI表示、状態管理など、データと処理をまとめる考え方を確認します。 |
| include / mqh | EA本体を肥大化させず、責務ごとにファイルを分ける考え方を整理します。 |
| runtime状態管理 | input初期値、OnInit初期化、稼働中状態、永続化状態、リセット処理を分けて確認します。 |
| 複数ロジックEA | Logic ID、Magic Number、signal、risk、exit、ログタグをロジック別に分ける方法を確認します。 |
| 配列範囲エラー対策 | CopyRates、CopyBuffer、ArraySize、ArrayResize、AS_SERIES、index範囲を確認します。 |
| 開発依頼前の整理 | mq5、mqh、setファイル、Expertsログ、Journalログ、再現条件を整理します。 |
変数・配列・構造体・クラスの違い
MQL5では、単一の値を扱う変数、同じ型の値を複数扱う配列、関連する値をまとめる構造体、データと処理をまとめるクラスを使い分けます。
どれを使うかは、コードの規模、扱うデータの種類、将来の改修予定、ログ確認のしやすさによって変わります。
| 種類 | 主な役割 | 向いている場面 | 注意点 |
|---|---|---|---|
| 変数 | 1つの値を保持する | ロット値、ON/OFF、カウント、価格、時刻 | 数が増えすぎると影響範囲を追いにくくなります。 |
| 配列 | 同じ型の値を複数保持する | 価格データ、インジケーター値、複数ロジック状態、履歴 | 範囲外アクセスや取得本数不足に注意します。 |
| 構造体 | 関連する複数の値をまとめる | ポジション情報、signal結果、risk結果、ロジック状態 | 処理までまとめたい場合はクラス化も検討します。 |
| クラス | データと処理をまとめる | 注文管理、ログ管理、外部連携、UI管理、状態管理 | 過剰にクラス化すると逆に読みにくくなる場合があります。 |
| include / mqh | コードを別ファイルへ分ける | 共通型、クラス、ユーティリティ、ログ処理、注文処理 | 依存関係と読み込み順を整理する必要があります。 |
小さなEAでは、変数と関数だけで十分な場合があります。一方で、複数ロジック、複数ポジション、外部連携、通知、パネル表示、ログ制御を扱うEAでは、構造体やクラスを使って状態を整理すると保守しやすくなります。
配列を使う場面
配列は、同じ種類の値を複数まとめて扱う時に使います。
MQL5では、価格データ、インジケーターバッファ、複数ロジックの状態、複数ポジションの情報、ログ用の集計値などで配列を使う場面があります。
| 用途 | 配列で扱う例 | 確認すること |
|---|---|---|
| 価格データ | 終値、高値、安値、MqlRates配列 | 取得本数、shift、時系列順、AS_SERIES |
| インジケーター値 | CopyBufferで取得した値 | バッファ番号、取得本数、EMPTY_VALUE |
| 複数ロジック | ロジック別ON/OFF、Magic、状態 | ロジック番号と配列indexの対応 |
| 複数ポジション | ticket、volume、price、profit | 件数、symbol、magic、direction |
| ログ集計 | GATE通過数、エラー数、通知数 | 初期化、リセット、出力タイミング |
| 最適化・検証 | 条件別のカウント、検証結果、内部統計 | テスト開始時の初期化と終了時の集計 |
配列を使う時は、配列サイズとindex範囲の確認が重要です。特に、CopyRatesやCopyBufferの戻り値が想定本数より少ない時に、そのまま配列を参照すると問題につながる場合があります。
構造体を使う場面
構造体は、関連する複数の値を1つのまとまりとして扱いたい時に使います。
たとえば、ロジック状態、ポジション情報、signal判定結果、risk判定結果、ログ出力用の状態などは、構造体にまとめると読みやすくなる場合があります。
struct LogicState
{
int logic_id;
long magic;
bool enabled;
datetime last_signal_time;
string last_reason;
};
上記は、状態をまとめる考え方を示す最小例です。取引条件や運用設定を示すものではありません。
| 構造体にまとめる候補 | 含める値の例 | メリット |
|---|---|---|
| LogicState | logic_id、magic、enabled、last_reason | ロジック別状態をまとめて確認できます。 |
| PositionSnapshot | ticket、symbol、magic、volume、profit | 保有状態を一覧化しやすくなります。 |
| SignalResult | direction、score、gate_ok、reason | 判定結果と理由を分けて渡せます。 |
| RiskResult | allowed、block_reason、normalized_lot | 新規許可と停止理由を整理できます。 |
| ExitState | trail_active、close_reason、last_exit_time | 保有後の決済管理を追いやすくなります。 |
| NotifyState | last_send_time、last_result、throttle_state | 通知状態と通知抑制を管理しやすくなります。 |
構造体は、関連する値をまとめたい時に便利です。ただし、1つの構造体にすべてを詰め込みすぎると意味が分かりにくくなるため、目的ごとに小さく分ける方が確認しやすくなります。
クラスを使う場面
クラスは、データと処理をひとまとまりにしたい時に使います。
MQL5では、注文管理、ポジション管理、ログ管理、外部連携、UIパネル管理、設定管理などでクラスを使うことがあります。
class CLogLimiter
{
private:
datetime m_last_time;
public:
CLogLimiter()
{
m_last_time = 0;
}
bool CanPrint(const int interval_sec)
{
datetime now_time = TimeCurrent();
if(now_time - m_last_time >= interval_sec)
{
m_last_time = now_time;
return true;
}
return false;
}
};
上記は、ログ出力間隔を管理する考え方を示す最小例です。特定のEA運用や取引設定を示すものではありません。
| クラス化しやすい処理 | まとめる内容 | 注意点 |
|---|---|---|
| 注文処理 | 注文送信、retcode確認、実行ログ | signal層とexecution層を混同しないようにします。 |
| ポジション管理 | 保有検索、snapshot作成、Magic別集計 | Hedging / Nettingの違いを確認します。 |
| ログ管理 | カテゴリ、抑制、出力形式、集計 | ログ過多を避ける設計にします。 |
| 外部連携 | WebRequest、CSV、送信結果、外部状態取得 | URLやtokenの実値をログに出さないようにします。 |
| UIパネル | ボタン、ラベル、表示更新、クリック処理 | 表示系と判定系を分けます。 |
| 設定管理 | input値、runtime値、保存値の整理 | input初期値と稼働中状態を混同しないようにします。 |
クラスは便利ですが、すべてをクラス化すればよいわけではありません。小さな処理まで過度にクラス化すると、かえって追いにくくなる場合があります。
includeファイルとmqhの役割
EA本体のmq5ファイルが大きくなる場合、共通処理やクラス定義をincludeファイルへ分けることがあります。
MQL5では、mqhファイルを使って、共通定義、構造体、クラス、ユーティリティ関数、ログ処理などを分離できます。
| 分割対象 | ファイル例 | 入れる内容 | 確認すること |
|---|---|---|---|
| 共通定義 | CommonTypes.mqh | enum、struct、共通常数、型定義 | 他ファイルから参照される基本型をまとめます。 |
| ログ処理 | LogUtil.mqh | PrintFormat補助、ログ抑制、カテゴリ管理 | ログ形式と出力量を揃えます。 |
| 注文処理 | TradeExecutor.mqh | 注文リクエスト、retcode確認、実行ログ | signal判定と注文実行を分けます。 |
| ポジション管理 | PositionSnapshot.mqh | 保有検索、snapshot作成、Magic別集計 | riskやexitへ渡すデータを整理します。 |
| 外部連携 | ExternalControl.mqh | WebRequest、CSV、外部状態取得 | 機密値をログへ出さない設計にします。 |
| UI表示 | PanelView.mqh | ボタン、ラベル、ステータス表示 | 表示系と判定系を分離します。 |
include分割では、ファイルを分けること自体が目的ではありません。責務ごとに分け、どこを見ればよいか分かる状態にすることが目的です。
グローバル変数を増やしすぎない考え方
MQL5では、グローバル変数を使うこと自体は珍しくありません。
ただし、EAの規模が大きくなるにつれて、グローバル変数が増えすぎると、どの関数がどの状態を変更しているのか分かりにくくなります。
| 状態 | 問題点 | 整理方法 |
|---|---|---|
| グローバル変数が多い | 影響範囲が追いにくい | 関連する値を構造体やクラスにまとめます。 |
| 似た名前の変数が多い | 誤参照しやすい | 命名ルールを決めます。 |
| runtime状態が混在 | 再起動時の挙動が分かりにくい | input、runtime、persistを分けます。 |
| 複数ロジックが同じ変数を使う | ロジック間で干渉する | ロジック別stateを用意します。 |
| 表示用と判定用が混在 | UI不具合が判定に影響する | 表示系と判定系を分離します。 |
| 外部連携状態が散在 | 通信失敗や認証状態を追いにくい | ExternalStateやAuthStateとして整理します。 |
すべてのグローバル変数をなくす必要はありません。重要なのは、何をグローバルに置くのか、何を構造体やクラスへまとめるのかを意図的に決めることです。
EAの状態管理を構造化する方法
EAでは、現在の稼働状態、認証状態、外部制御状態、signal結果、risk結果、exit状態、通知状態などを管理することがあります。
これらを1つずつ別変数にすると、規模が大きくなった時に追いにくくなります。状態を目的別に構造化すると、ログ確認や改修がしやすくなります。
| 状態カテゴリ | 含める値の例 | 確認するログ |
|---|---|---|
| RuntimeState | initialized、paused、last_tick_time | INIT、RUNTIME |
| SignalState | direction、score、gate_ok、reason | SIGNAL、GATE、SCORE |
| RiskState | allowed、block_reason、normalized_lot | RISK |
| ExitState | trail_active、close_reason、last_exit_time | EXIT |
| AuthState | auth_ok、masked_account、expiry_state | AUTH |
| NotifyState | last_send_time、last_result、throttle_state | NOTIFY |
| PanelState | visible、selected_tab、last_update_time | UI、OBJECT |
EAの状態管理では、input初期値とruntime状態を混同しないことが重要です。Inputs欄に表示される値と、稼働中に変化した状態は分けて管理してください。
複数ロジックEAでのデータ分離
複数ロジックEAでは、ロジックごとにsignal、ポジション、Magic Number、risk、exit、ログ、設定を分ける必要があります。
ロジック1とロジック2が同じ変数や同じMagic Numberを使っていると、どちらの処理でエントリーしたのか、どちらのexit条件で決済したのかが分かりにくくなります。
| 分離する項目 | 理由 | 確認すること |
|---|---|---|
| Logic ID | ロジックを識別するため | 配列indexとLogic IDの対応を固定します。 |
| Magic Number | ポジション識別のため | ロジックごとに重複していないか確認します。 |
| SignalState | 判定結果を分けるため | BUY / SELL / NO ENTRYの理由を分けます。 |
| RiskState | 停止理由を分けるため | ロット、最大数、外部停止を分けます。 |
| ExitState | 保有後の管理を分けるため | トレール、時間決済、反対条件を分けます。 |
| PositionSnapshot | 保有状態を分けるため | symbol、magic、direction、ticketを分けます。 |
| LogTag | ログ追跡しやすくするため | LOGIC01、LOGIC02などの表記を揃えます。 |
struct LogicRuntime
{
int logic_id;
long magic;
bool enabled;
string last_signal_reason;
};
LogicRuntime g_logic_states[4];
この例は、複数ロジックの状態を配列で持つ考え方を示すものです。実際のEAでは、初期化、index範囲、Magic Numberの重複確認、ログ出力をあわせて設計してください。
position snapshotの考え方
position snapshotとは、現在保有しているポジション情報を、ある時点の状態として整理しておく考え方です。
MQL5では、保有ポジションをその場で毎回探すだけでなく、symbol、magic、ticket、volume、price、profit、directionなどを一度整理してから、riskやexitで使う設計にすることがあります。
| snapshot項目 | 内容 | 使う場面 |
|---|---|---|
| ticket | ポジションまたは注文識別 | 決済、変更、ログ照合 |
| symbol | 対象銘柄 | チャート銘柄・対象銘柄の確認 |
| magic | ロジック識別 | EA別・ロジック別管理 |
| direction | BUY / SELL | 方向別集計、方向別決済 |
| volume | 保有量 | ロット集計、部分決済確認 |
| open_price | 建値 | 損益、距離、exit条件 |
| profit | 現在損益 | risk、exit、表示 |
| comment | 注文コメント | EAやロジック識別の補助 |
snapshotは、保有状態を固定的に記録するというより、特定時点の状態を整理して後続処理へ渡す考え方です。最新状態が必要な処理では、取得タイミングと更新タイミングを明確にしてください。
配列範囲エラーを避ける方法
配列範囲エラーは、配列の存在しないindexへアクセスした時に発生します。
MQL5では、CopyRatesやCopyBufferで取得できた本数が不足しているのに、想定本数がある前提で配列を読むと、実行時エラーや誤判定につながる場合があります。
| 原因 | 起きやすい場面 | 対策 |
|---|---|---|
| 取得本数不足 | CopyRates / CopyBufferの戻り値未確認 | 戻り値を確認してから参照します。 |
| index計算ミス | ロジック番号と配列indexのずれ | index変換ルールを固定します。 |
| 配列初期化漏れ | 起動直後やリセット後 | ArrayResizeや初期値設定を確認します。 |
| ループ条件ミス | for文の終了条件 | i < ArraySize(array)を確認します。 |
| 時系列配列の向き | AS_SERIESの扱い違い | shift 0と配列indexの意味を確認します。 |
| 空配列参照 | 対象ポジションがない時 | 件数0の場合の分岐を用意します。 |
| 削除中の配列参照 | 要素削除後に同じindexを読む時 | 削除順序や再取得を確認します。 |
double close_values[];
int copied = CopyClose(_Symbol, PERIOD_M15, 0, 3, close_values);
if(copied < 3)
{
PrintFormat("DIAG/DATA close_not_enough requested=%d copied=%d", 3, copied);
return;
}
double last_closed_bar = close_values[1];
この例は、配列を読む前に取得本数を確認する考え方を示すものです。実際の処理では、配列の向き、shift、必要本数、データ不足時の扱いを仕様として決めてください。
初期化・リセット・runtime状態の分離
EAでは、input初期値、OnInitで作る初期状態、稼働中に変わるruntime状態、再起動後も保持する状態を分けて考えます。
これらを混同すると、設定を変えていないのに状態が変わる、リセット後に一部だけ古い状態が残る、時間足変更後に挙動が変わる、といった問題につながる場合があります。
| 分類 | 意味 | 例 | 確認すること |
|---|---|---|---|
| input初期値 | EA起動時に読み込む設定 | ロット、時間、ON/OFF、Magic Number | Inputs欄とsetファイルで確認します。 |
| OnInit初期化 | 起動時に作る内部状態 | handle、配列、state初期化 | INITログで確認します。 |
| runtime状態 | 稼働中に変わる状態 | ボタンON/OFF、last signal、last send time | 再起動時の扱いを決めます。 |
| persist状態 | 再起動後も保持したい状態 | 一部のUI状態、許可状態、前回選択タブ | 保存・復元ルールを決めます。 |
| リセット処理 | 状態を初期化する処理 | 配列クリア、オブジェクト削除、カウンタ初期化 | 削除対象と保持対象を分けます。 |
input初期値とruntime状態の分離は、不具合調査やサポート対応でも重要です。再現条件を確認する時は、setファイルだけでなく、稼働中に変更された状態がないかも確認してください。
保守しやすい命名とコメント
変数、構造体、クラス、includeファイルを整理しても、命名が曖昧だと保守しにくくなります。
名前は、何を表すのか、どの層のデータなのか、runtime状態なのか、input設定なのかが分かるように付けると確認しやすくなります。
| 対象 | 分かりにくい例 | 整理した例 |
|---|---|---|
| ロジック状態 | flag1、state2 | logic_state、signal_state |
| 停止理由 | msg、reason | risk_block_reason、gate_skip_reason |
| 配列 | arr、data | close_values、logic_states |
| クラス | CMain、CWork | CTradeExecutor、CLogLimiter |
| include | common.mqh | PositionSnapshot.mqh、LogUtil.mqh |
| runtime状態 | enabled | runtime_entry_enabled |
| 表示状態 | text、color | panel_status_text、panel_status_color |
コメントは、多すぎても少なすぎても読みづらくなります。何をしているかではなく、なぜその処理が必要なのか、どの責務に属するのかを補足するコメントが有効です。
悪い設計と整理された設計の比較
MQL5の設計では、動くことだけを優先すると、後から改修しにくいコードになることがあります。
特に、大規模EA、複数ロジックEA、外部連携EA、パネル付きEAでは、状態管理と責務分離が重要になります。
| 項目 | 整理しにくい設計例 | 整理された設計例 |
|---|---|---|
| 状態管理 | グローバル変数が散らばっている | RuntimeStateやLogicStateにまとめる |
| 複数ロジック | ロジックごとの状態が混在している | logic_idとMagicで分離する |
| ログ | Printが大量に散在している | カテゴリ別ログにする |
| 配列 | 戻り値を見ずにindex参照している | 取得本数を確認してから読む |
| include | 何でも1ファイルへ詰め込む | 責務ごとにmqhへ分ける |
| UI | 表示状態と判定状態が同じ変数になっている | 表示系と判定系を分ける |
| 初期化 | 一部の状態がリセットされない | OnInit、reset、persistを分ける |
| 外部連携 | URLや送信状態が各所に散らばっている | ExternalStateやNotifyStateにまとめる |
整理された設計とは、必ず複雑なクラス構成にすることではありません。変更点、影響範囲、ログ、再現条件を追いやすい構造にすることです。
開発依頼時に伝えるべき構造情報
既存EAの改修、大規模EAの整理、複数ロジック化、外部連携追加を相談する場合は、現在の構造情報を整理しておくと確認しやすくなります。
ソースコードがある場合は、mq5本体、includeファイル、setファイル、ログ、再現条件をセットで整理してください。ソースコードがない場合でも、Inputs欄、画面表示、ログ、動作説明から構造を推定できる場合があります。
| 伝える情報 | 内容 | 注意点 |
|---|---|---|
| 対象ファイル | mq5、mqh、ex5など | 最新版か確認します。 |
| include構成 | 分割ファイル一覧 | 不足ファイルがないか確認します。 |
| ロジック数 | Logic1〜LogicNなど | Magic Numberとの対応を整理します。 |
| 状態管理 | グローバル変数、構造体、クラス | どこで更新されるか確認します。 |
| setファイル | input設定 | 認証情報やURLを確認してから送ります。 |
| Expertsログ | INIT、GATE、RISK、EXECUTIONなど | 発生前後を含めます。 |
| 再現条件 | 銘柄、時間足、発生時刻、操作 | 同条件で確認できるようにします。 |
| 要望内容 | 何を整理・追加・改修したいか | 表示変更か判定変更かを分けます。 |
送ってはいけない情報
ソース、setファイル、ログ、スクリーンショットを送る場合でも、機密情報はそのまま送らないでください。
| 送らない情報 | 理由 | 対応 |
|---|---|---|
| 口座番号の全桁 | 確認に不要な範囲まで共有される可能性があります。 | 必要に応じて一部をマスクします。 |
| ログインパスワード | 口座へアクセスできる情報です。 | 送らないでください。 |
| 投資家パスワード | 閲覧専用であっても共有不要です。 | 送らないでください。 |
| Webhook URL | 第三者が通知先へ送信できる可能性があります。 | 全文をマスクします。 |
| GAS URL | 外部連携先に関係する情報です。 | 全文をマスクします。 |
| APIキー・認証トークン | 外部サービスや認証に関係します。 | 送らないでください。 |
| 個人情報 | 確認に不要な情報が含まれる可能性があります。 | スクリーンショットやログから削除します。 |
| 第三者の情報 | 関係者以外の情報が含まれる場合があります。 | 共有前に削除します。 |
送ってよいか判断できない情報は、そのまま送らず、伏せ字にするか削除してください。
MQL5クラス・構造体・配列設計チェック表
クラス・構造体・配列設計を見直す時は、以下を確認してください。
| チェック項目 | 確認内容 |
|---|---|
| 変数、配列、構造体、クラスの役割を分けている | 単一値、複数値、関連データ、処理付き状態を混同していないか確認します。 |
| グローバル変数を増やしすぎていない | 関連する値を構造体やクラスへまとめられるか確認します。 |
| 関連する値を構造体へまとめている | LogicState、PositionSnapshot、RiskResultなどのまとまりを確認します。 |
| 必要な箇所だけクラス化している | 注文処理、ログ管理、外部連携、UI管理などを目的ごとに確認します。 |
| include / mqhの分割目的が明確になっている | ファイルを分ける理由と責務を説明できるか確認します。 |
| 複数ロジックEAではロジック別stateを分けている | Logic ID、Magic Number、signal、risk、exitを分離します。 |
| position snapshotの項目を整理している | ticket、symbol、magic、direction、volume、profitを確認します。 |
| 配列を読む前に戻り値を確認している | CopyRates、CopyBuffer、CopyCloseなどの取得本数を確認します。 |
| input初期値、runtime状態、persist状態を分けている | Inputs欄と稼働中に変化する状態を混同しないようにします。 |
| 表示系と判定系を分けている | UIの表示更新が判定ロジックへ不要に影響しないようにします。 |
| 命名とコメントが責務に沿っている | 何の値か、どの層の状態か、どこで更新されるかを追えるようにします。 |
| setファイル、Expertsログ、Journalログを保存している | 再現条件を後から確認できるようにします。 |
| 口座番号や認証情報をマスクしている | 共有前に機密情報を確認します。 |
よくある質問
クラスを使わなくてもEAは作れますか?
作れます。小規模なEAでは、変数と関数だけで十分な場合もあります。ただし、複数ロジック、外部連携、通知、UI、ログ管理が増えると、クラスや構造体で整理した方が保守しやすくなる場合があります。
構造体とクラスはどう使い分けますか?
関連する値をまとめたいだけなら構造体が向いています。状態に加えて、その状態を操作する処理もまとめたい場合はクラスを検討します。過剰にクラス化すると読みにくくなるため、目的に応じて使い分けます。
配列範囲エラーはなぜ起きますか?
存在しないindexを参照した時に起きます。CopyRatesやCopyBufferの取得本数不足、ループ条件ミス、配列初期化漏れ、ロジック番号と配列indexのずれなどが原因になる場合があります。
includeファイルを分けるメリットは何ですか?
責務ごとにコードを分けることで、注文処理、ログ処理、ポジション管理、外部連携、UIなどの確認場所を整理できます。ただし、分割しすぎると依存関係が追いにくくなるため、目的を明確にして分けることが重要です。
複数ロジックEAでは何を分けるべきですか?
Magic Number、signal状態、risk状態、exit状態、position snapshot、ログタグ、input設定の意味をロジックごとに分ける必要があります。ロジック間で同じ状態を共有すると、調査や改修が難しくなる場合があります。
グローバル変数が多いと何が問題ですか?
どの関数がどの状態を変更しているのか追いにくくなります。影響範囲が広くなり、改修時に予期しない挙動が出る場合があります。関連する値は構造体やクラスにまとめると確認しやすくなります。
配列と構造体を組み合わせてもよいですか?
可能です。複数ロジックの状態を管理する場合などは、構造体を配列で持つ設計が有効な場合があります。ただし、indexとロジック番号の対応、初期化、範囲チェックを明確にしてください。
UIパネルの状態も構造体で管理できますか?
管理できます。ただし、表示用の状態とEAの判定用状態は分けてください。UIの表示更新が遅れたり失敗したりしても、判定ロジックに不要な影響を与えない設計が重要です。
関連する技術講座
クラス、構造体、配列設計を確認する場合は、MQL5開発入門、関数、EA設計、デバッグ、価格データ、注文管理、マルチシンボル設計もあわせて確認してください。
| 技術講座 | 確認できること |
|---|---|
| MQL5開発入門 | MetaEditor、EA、インジケーター、イベント関数、コンパイルエラーの基本を確認できます。 |
| MQL5関数辞書 | EA・インジケーター開発で使う主要関数と役割を確認できます。 |
| MQL5 EA設計パターン完全ガイド | signal、execution、risk、exit、auth、external control、notificationの責務分離を確認できます。 |
| MQL5デバッグ・ログファースト開発完全ガイド | Print、Expertsログ、再現条件、ログ設計、原因切り分けを確認できます。 |
| MQL5時系列データ・価格取得完全ガイド | CopyRates、CopyBuffer、価格配列、shift、現在足と確定足の確認に使えます。 |
| MQL5注文・ポジション・履歴管理完全ガイド | OrderSend、Position、Deal、History、MqlTradeRequest、MqlTradeResultの基本を確認できます。 |
| MQL5マルチシンボル・マルチタイムフレーム完全ガイド | 複数銘柄、複数時間足、CopyRates、データ構造、同期確認を整理できます。 |
関連する確認ページ
技術講座を確認した後、導入、開発相談、不具合報告、資料整理へ進む場合は、以下のページも確認してください。
| 確認ページ | 確認できること |
|---|---|
| 技術講座一覧 | MT5・MQL5・EA開発に関する技術講座を順番に確認できます。 |
| 導入ガイド | EA、インジケーター、補助ツールを導入する前の確認事項を整理できます。 |
| MT5開発依頼前に用意する資料まとめ | 仕様書、setファイル、ログ、スクリーンショットなど、開発相談前の資料整理に使えます。 |
| 開発代行ページ | EA、インジケーター、補助ツールの新規作成・改修相談を確認できます。 |
| 不具合報告・サポート依頼 | ログ、スクリーンショット、再現手順、利用環境を整理して相談する方法を確認できます。 |
購入前・利用前に確認するページ
EA、インジケーター、補助ツールを利用する前には、商品一覧、動作環境、購入前確認、利用上の注意も確認してください。
| ページ | 確認できること |
|---|---|
| 商品一覧 | EAファンクラブで扱う補助ツール、インジケーター、コピーEAなどを確認できます。 |
| 動作環境 | MT4 / MT5、Windows PC、VPS、外部連携などの動作環境を確認できます。 |
| 購入前確認事項 | 購入前に確認しておきたい対応環境、利用条件、確認事項を整理できます。 |
| 免責事項・リスク説明 | 商品の利用上の注意、責任範囲、リスク説明を確認できます。 |
まとめ
MQL5でEAやインジケーターを保守しやすく作るには、変数、配列、構造体、クラス、includeファイルの役割を分けて考えることが重要です。
配列は複数の値を扱う時に便利ですが、取得本数やindex範囲を確認しないと、配列範囲エラーや誤判定につながる場合があります。構造体は関連する値をまとめる時に、クラスは状態と処理をまとめる時に役立ちます。
大規模EAや複数ロジックEAでは、Magic Number、signal、risk、exit、position snapshot、ログタグをロジックごとに分離すると、検証や改修がしやすくなります。
設計を確認しても整理が難しい場合は、EA名、バージョン、setファイル、Expertsログ、Journalログ、発生時刻、スクリーンショットを整理したうえで相談してください。口座番号、Webhook URL、GAS URL、APIキー、認証トークンなどの実値は、必要に応じてマスクしてください。

