EAのinput変数が増えてくると、「このロット計算用の設定、

どこまでが一式だったか」、と迷った経験はありませんか。

構造体(struct)は、関連する複数の変数を、1つのまとまりとして扱える仕組みです。

この記事では、構造体の基本的な宣言方法と、関数への渡し方を解説します。

資金管理設定をひとまとめにする実装例についても扱います。

この記事で分かること
・構造体(struct)の宣言方法
・値渡しと参照渡し(&)の違い
・資金管理設定を構造体でまとめる実装例
・MQL4/MQL5共通で使える理由

なぜ構造体が必要なのか

まず、構造体を使う理由を整理します。

input変数が増えると管理が煩雑になる

リスク%、最大ロット、最大ドローダウン等、関連する設定が増えるほど、

個別のinput変数だけでは関係性が見えにくくなります。

関数に渡す引数が多くなりすぎる問題

関連設定を個別の引数として渡すと、関数の引数が5個、10個と増え、

呼び出し側で順序を間違えるミスが起きやすくなります。

この記事で扱う範囲

この記事では、構造体の基本文法と、資金管理設定を1つの構造体にまとめて関数に渡す、

実装例を中心に扱います。

構造体(struct)の基本的な宣言方法

構文と、変数としての使い方を確認します。

構造体の宣言構文

struct RiskSettings
  {
   double riskPercent;    // 口座残高に対するリスク%
   double maxLotSize;     // 許可する最大ロット
   double maxDrawdownPct; // 許可する最大ドローダウン%
  };

structキーワードの後に名前を付け、波カッコの中にメンバー(変数)を列挙します。

末尾のセミコロンを忘れないようにしてください。

変数としての宣言・値の代入

RiskSettings settings;
settings.riskPercent    = 2.0;
settings.maxLotSize     = 1.0;
settings.maxDrawdownPct = 20.0;

構造体名を型のように使い、ドット(.)でメンバーにアクセスします。

単純構造体はコピーできる

単純構造体の性質
・int/double等の基本型だけで構成される構造体
・同じ構造体どうしは代入(コピー)がそのまま可能
・文字列や配列を含む場合は暗黙のコンストラクタが付く

関数への値渡しと参照渡し(&)の違い

構造体を関数の引数にする2つの書き方を見ていきます。

値渡し(コピーが渡る)

void ShowSettings(RiskSettings settings)
  {
   Print("リスク%: ", settings.riskPercent);
  }

この書き方では、構造体のコピーが関数に渡されます。

関数内でメンバーを書き換えても元の変数には影響しません。

参照渡し(&を付ける)

void AdjustSettings(RiskSettings &settings)
  {
   settings.maxLotSize = settings.maxLotSize * 0.5;
  }

引数の型に&を付けると、元の変数そのものを関数に渡す参照渡しになり、

関数内の書き換えが呼び出し元にも反映されます。

どちらを使うべきか

設定を読み取るだけなら値渡し、関数内で設定を書き換えたいなら参照渡しを選びます。

大きな構造体を値渡しにするとコピーのコストがかかる点も覚えておくとよいでしょう。

実際に動くコード全体(資金管理設定を構造体でまとめる)

リスク%ベースのロット計算を、構造体で整理した実装です。

設計のポイント(設定と計算を分離する)

構造体に設定値だけを持たせ、計算ロジックは別の関数として分離することで、

設定の見直しと計算処理の修正を独立して行えるようにします。

コード全文

//+------------------------------------------------------------------+
//|                                              RiskSettingsDemo.mq4 |
//|                     Copyright 2026, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property strict

struct RiskSettings
  {
   double riskPercent;
   double maxLotSize;
   double maxDrawdownPct;
  };

RiskSettings g_risk;

int OnInit()
  {
   g_risk.riskPercent    = 2.0;
   g_risk.maxLotSize     = 1.0;
   g_risk.maxDrawdownPct = 20.0;
   return(INIT_SUCCEEDED);
  }

double CalcLotByRisk(const RiskSettings &settings, double stopLossPoints)
  {
   double balance   = AccountBalance();
   double riskMoney = balance * settings.riskPercent / 100.0;
   double tickValue = MarketInfo(Symbol(), MODE_TICKVALUE);

   double lot = riskMoney / (stopLossPoints * tickValue);
   lot = MathMin(lot, settings.maxLotSize);
   lot = NormalizeDouble(lot, 2);

   return(lot);
  }

void OnTick()
  {
   double lot = CalcLotByRisk(g_risk, 300);
   Comment("リスク%ベースのロット計算結果: ", lot);
  }

MetaEditorでのコンパイル・実行手順

MetaEditorで保存してコンパイルし、エラーが0件であることを確認したうえで、

デモ口座のチャートに適用して動作を確認します。

構造体を使うメリットと注意点

実務上のメリットと注意点を整理します。

設定変更が1箇所で済むメリット

複数戦略のEAを運用する場合、戦略ごとに構造体を1つ用意すれば、

設定の受け渡しミスを減らせます。

配列・クラスとの組み合わせ

構造体の配列を使えば、複数戦略の設定を1つの配列でまとめて管理する、という応用もできます。

やりすぎると可読性が落ちる

注意
・構造体を何段にもネストすると逆に読みにくくなる
・メンバー数が多すぎる構造体は役割が不明確になりやすい
・関連性の強い設定だけをまとめるのが基本

MQL4とMQL5の違い

構造体に関する2言語の違いを確認します。

言語仕様自体はほぼ共通

構造体の宣言構文・値渡し・参照渡しの仕組みは、MQL4とMQL5でほぼ共通の言語仕様です。

MQL5の標準構造体との接続

MQL5のMqlTradeRequest等の標準構造体も、

本記事と同じ考え方で設計されています。

関連する値を1つにまとめるという考え方です。

クラス(class)という発展形がある

構造体にメンバー関数を持たせたい場合は、

クラス(class)という発展形の仕組みを使います。

本記事では構造体の基本のみを扱いました。

よくある質問

構造体について、よくある疑問に回答します。

構造体と配列はどう違いますか?

配列は同じ型の値を並べたもの、構造体は異なる型のメンバーを1つにまとめたものです。

役割がはっきり異なります。

構造体のメンバーにstring型を入れられますか?

入れられますが、その場合は暗黙のコンストラクタが付きます。

単純構造体としての自由なコピーはできなくなります。

グローバル変数の代わりに使えますか?

使えます。

関連する複数のグローバル変数を構造体1つにまとめると、管理しやすくなる場面が多くあります。

【MQL】構造体(struct)でEAの設定をひとまとめにする方法について解説してみた(MQL4/MQL5共通):まとめ

構造体(struct)は、関連する複数の変数を、1つのまとまりとして扱える仕組みです。

input変数や関数の引数が増えて管理が煩雑になったら、

構造体でまとめることを検討してみてください。

値渡しと参照渡し(&)の違いを理解しておくと、

意図した通りに設定を読み書きできるようになります。

構造体をうまく使うと、複数戦略のEAや資金管理ロジックの見通しが良くなります。

関連記事