📈

LLMでMT4のEAが作れた

はじめに

LLMやAI Agentを活用したVibe Codingが昨今流行しています。私自身、FXの知識が少しあり今回ManusやClaude Codeを活用してMeta Trader 4 (MT4)のEA (Expert Advisor) を作ってみました。ソースコードを見て頂ければわかりますが、人がロジックを作りこむのがかなり大変な領域ですがかなり的確にコーディングしてくれています。ロジックも単にインジケータをトリガーにするものは作りやすいのですが、作り手の言語化した仕様もかなり組んでくれています。(例えば、急騰、急落の検知)
実際のソースコードはGithubにリポジトリを作ったのでご確認ください。
興味ある方は、このコードをベースに煮るなり焼くなりしてカスタマイズしてみてください。笑
https://github.com/Masa1984a/EURUSD_Surge_EA
免責事項にも書きましたが、投資は自己判断でお願いします。いかなる損害、損失、不具合、システム影響等について、著者、開発者、および関係者は一切の責任を負いません。
あくまで、LLMやAI Agentを活用してEAが作れたという研究目的の記事となる点、留意ください。

ソースコードをバンっと置いてもどんな作りなのかわかりづらいと思います。
AIにProject内を解析して解説してもらいました。
ここまでEAを作れるんだ、ということを体感頂けると幸いです。

それでは、見ていきましょう!

プロジェクト構成

「EURUSD_Surge_EA」は、単一の巨大なファイルで構成されているわけではありません。メインとなるEAファイル(.mq4)と、特定の機能群をまとめた複数のヘッダーファイル(.mqh)によって構成されています。このようなモジュール化設計は、コードの可読性、再利用性、そして保守性を高めるための優れたプラクティスです。

以下に、このプロジェクトを構成する各ファイルの役割を概説します。

  1. EURUSD_Surge_EA.mq4: EA全体の制御を司るメインファイルです。EAの初期化、終了処理、そして価格が変動するたびに実行されるコアロジックが含まれます。他のすべての .mqh ファイルを #include ディレクティブで読み込み、それらの機能を利用して取引判断を行います。ユーザーが調整可能なパラメータ(ロットサイズ、リスク設定など)もここで定義されます。

  2. Utilities.mqh: プロジェクト全体で共通して使用される、汎用的な補助関数群(ユーティリティ)を提供します。時間管理(日付変更、取引時間判定など)、ログ出力、エラーハンドリング、そして注文失敗時の再試行ロジックなど、基本的ながら重要な機能が含まれています。

  3. MarketAnalysis.mqh: 市場の状況を分析するための関数群です。ボラティリティ(価格変動の大きさ)の計算、トレンドの方向性や強さの判定、レンジ相場の検出など、現在の相場環境を把握するための機能を提供します。

  4. EntryManagement.mqh: 新規にポジションを持つ(エントリーする)タイミングを決定するためのロジックが実装されています。このEAの核となる価格の急騰・急落(サージ)の検出、その後の調整期間の判定、そして具体的なエントリーポイントの計算を行います。

  5. RiskManagement.mqh: 取引におけるリスクを管理するための重要な機能を提供します。1回あたりの取引量(ロットサイズ)の計算、損失を限定するためのストップロス(損切り)価格の設定、利益を確定するためのテイクプロフィット価格の設定、そして利益の一部を早期に確保する部分決済のロジックが含まれます。

  6. FilteringSystem.mqh: 不利な市場環境での取引を避けたり、特定の時間に取引を終了させたりするためのフィルター機能を提供します。レンジ相場での取引回避や、週末前の強制決済などがこれにあたります。

このように、各ファイルが明確な責務を持つことで、コード全体の見通しが良くなり、特定の機能を修正・改善したい場合に、関連するファイルに集中して作業を進めることができます。

コアロジック詳解:急騰・急落を捉え、リスクを管理する仕組み

それでは、このEAがどのようにして取引を行っているのか、その核心部分を詳しく見ていきましょう。特に、ユーザー様が注目されている「急騰・急落の検知」と「ストップロス(SL)の設定」に焦点を当てて解説します。

1. 急騰・急落(サージ)の検知:市場のエネルギー変化を捉える

このEAの最大の特徴は、価格が一方向に大きく動く「サージ」を検出し、その動きに追随するのではなく、その後の反動(押し目・戻り)を狙う点にあります。このサージ検出は、主に MarketAnalysis.mqhEntryManagement.mqh の連携によって実現されています。

  • ボラティリティの計測: まず、MarketAnalysis.mqh 内の GetAveragePastVolatility 関数で、過去の平均的な価格変動の大きさ(ボラティリティ)を計算します。計算には、ATR(Average True Range)という指標、または単純な高値と安値の差が用いられます。
  • 動的な閾値設定: 次に GetDynamicVolatilityMultiplier 関数が、単なる固定値ではなく、短期と長期のボラティリティ比率や現在の時間帯(市場参加者が多い時間帯は変動が大きい傾向がある)を考慮して、「急騰・急落」と判断するための基準となる乗数(VolatilityMultiplier)を動的に調整します。これにより、静かな相場と活発な相場で判断基準を変える、より柔軟な対応を目指しています。
  • 候補となるローソク足の特定: IsHighVolatilityCandle 関数は、最新のローソク足(一定時間内の価格の動きを棒状に示したもの)の値動きが、上記の動的閾値を用いて計算された基準以上に大きいかどうかをチェックします。さらに、単に値幅が大きいだけでなく、ローソク足の実体(始値と終値の差)が全体の長さ(高値と安値の差)に対して一定割合以上(BodyToTotalRatio)あるかどうかも確認します。これは、方向感のある強い動きを捉えるための工夫です。
  • サージの確定: EntryManagement.mqh 内の DetectPriceSurge 関数が、これらの条件を満たすローソク足(陽線なら上昇サージ、陰線なら下降サージ)を検出します。さらに、IsValidCandlePattern で実体が全体の60%以上を占めるかなど、より明確なパターンを持つ足に絞り込みます。検出に成功すると、そのサージの方向、開始価格、終了価格などの情報が記録されます。

このように、複数の条件(ボラティリティ、実体比率、パターン)を組み合わせ、さらに動的な閾値を用いることで、単なるノイズ(一時的な価格のブレ)と、意味のある価格の急変動(サージ)を区別しようと試みています。

2. エントリー戦略:押し目買い・戻り売りのタイミング

サージを検出した後、EAはすぐにはエントリーしません。価格が一方向に急激に動いた後は、一時的に反対方向に調整する動き(上昇後の下落=押し目、下落後の上昇=戻り)が発生しやすいという考えに基づき、その調整後の再エントリーを狙います。

  • 調整期間の監視: IsAdjustmentComplete 関数は、サージ発生後、調整を示すローソク足が一定期間(AdjustmentCandlesMinAdjustmentCandlesMax)続いたかどうかを監視します。そして、最後に再びサージと同じ方向への動き(実体の大きなローソク足)が見られた場合に、調整期間が終了したと判断します。
  • エントリーポイントの計算: 調整完了後、DetectReentryPoint 関数が具体的なエントリー価格を計算します。これは、検出されたサージの値幅に対して、ユーザーが設定した割合(EntryPullbackPercent)だけ価格が押し戻されたポイントです。例えば、100ピップス上昇するサージがあり、EntryPullbackPercent が40%なら、最高値から40ピップス下がった価格に買いの指値注文(指定価格になったら買う予約注文)を設定します。これにより、高値掴みや安値売りを避け、より有利な価格でのエントリーを目指します。
  • 追加フィルターによる精度向上: エントリーの確度を高めるために、ConfirmEntrySignal 関数が追加のチェックを行います。RSIやMACDといった他のテクニカル指標がエントリー方向を支持しているか、また MarketAnalysis.mqh で判定された長期的なトレンド方向と一致しているかを確認します。これらのフィルターを通過した場合にのみ、実際に注文が発注されます。

3. リスク管理:損失を限定し、利益を確保する工夫

どんなに優れたエントリー戦略でも、損失を管理できなければ長期的に成功することは困難です。このEAは、リスク管理のためにいくつかの重要な機能を RiskManagement.mqh に実装しています。

  • ポジションサイジング(ロット計算): CalculatePositionSize 関数は、1回の取引で許容できる損失額に基づいて、適切な取引量(ロットサイズ)を自動計算します。ユーザーは、口座残高に対して何パーセントまでのリスクを許容するか(MaxRiskPercent)を設定します。EAは、エントリー予定価格と後述するストップロス価格の差(=最大損失幅)を考慮し、この許容リスク額を超えない最大のロットサイズを算出します。これにより、単一の取引で致命的な損失を被るリスクを低減します。
  • 動的ストップロス(SL)設定: 損失を限定するための損切り注文(ストップロス)の設定は、このEAの特に工夫された点です。CalculateDynamicStopLoss 関数は、状況に応じて最適なストップロス価格を計算します。
    1. ZigZagベース(優先): UseZigZagStopLoss が有効な場合、まず FindRecentZigZagPoint 関数が、MT4標準のZigZagインジケーターを利用して、直近の重要な高値(売りの場合)または安値(買いの場合)を探します。ZigZagが示す価格は、市場参加者に意識されやすいサポート(下値支持)やレジスタンス(上値抵抗)となることが多いため、これを基準に少しバッファ(ZigZagBufferPercent)を加えた価格をストップロスとします。市場の構造に基づいた、合理的な損切り設定を目指します。

プロジェクト構成:モジュール化による開発効率と保守性の向上

「EURUSD_Surge_EA」は、単一の巨大なファイルで構成されているわけではありません。メインとなるEAファイル(.mq4)と、特定の機能群をまとめた複数のヘッダーファイル(.mqh)によって構成されています。このようなモジュール化設計は、コードの可読性、再利用性、そして保守性を高めるための優れたプラクティスです。

以下に、このプロジェクトを構成する各ファイルの役割を概説します。

  1. EURUSD_Surge_EA.mq4: EA全体の制御を司るメインファイルです。EAの初期化、終了処理、そして価格が変動するたびに実行されるコアロジックが含まれます。他のすべての .mqh ファイルを #include ディレクティブで読み込み、それらの機能を利用して取引判断を行います。ユーザーが調整可能なパラメータ(ロットサイズ、リスク設定など)もここで定義されます。

  2. Utilities.mqh: プロジェクト全体で共通して使用される、汎用的な補助関数群(ユーティリティ)を提供します。時間管理(日付変更、取引時間判定など)、ログ出力、エラーハンドリング、そして注文失敗時の再試行ロジックなど、基本的ながら重要な機能が含まれています。

  3. MarketAnalysis.mqh: 市場の状況を分析するための関数群です。ボラティリティ(価格変動の大きさ)の計算、トレンドの方向性や強さの判定、レンジ相場の検出など、現在の相場環境を把握するための機能を提供します。

  4. EntryManagement.mqh: 新規にポジションを持つ(エントリーする)タイミングを決定するためのロジックが実装されています。このEAの核となる価格の急騰・急落(サージ)の検出、その後の調整期間の判定、そして具体的なエントリーポイントの計算を行います。

  5. RiskManagement.mqh: 取引におけるリスクを管理するための重要な機能を提供します。1回あたりの取引量(ロットサイズ)の計算、損失を限定するためのストップロス(損切り)価格の設定、利益を確定するためのテイクプロフィット価格の設定、そして利益の一部を早期に確保する部分決済のロジックが含まれます。

  6. FilteringSystem.mqh: 不利な市場環境での取引を避けたり、特定の時間に取引を終了させたりするためのフィルター機能を提供します。レンジ相場での取引回避や、週末前の強制決済などがこれにあたります。

このように、各ファイルが明確な責務を持つことで、コード全体の見通しが良くなり、特定の機能を修正・改善したい場合に、関連するファイルに集中して作業を進めることができます。

コアロジック詳解:急騰・急落を捉え、リスクを管理する仕組み

それでは、このEAがどのようにして取引を行っているのか、その核心部分を詳しく見ていきましょう。特に、ユーザー様が注目されている「急騰・急落の検知」と「ストップロス(SL)の設定」に焦点を当てて解説します。

1. 急騰・急落(サージ)の検知:市場のエネルギー変化を捉える

このEAの最大の特徴は、価格が一方向に大きく動く「サージ」を検出し、その動きに追随するのではなく、その後の反動(押し目・戻り)を狙う点にあります。このサージ検出は、主に MarketAnalysis.mqhEntryManagement.mqh の連携によって実現されています。

  • ボラティリティの計測: まず、MarketAnalysis.mqh 内の GetAveragePastVolatility 関数で、過去の平均的な価格変動の大きさ(ボラティリティ)を計算します。計算には、ATR(Average True Range)という指標、または単純な高値と安値の差が用いられます。
    • 用語解説:ATR (Average True Range) とは、一定期間における価格の平均的な変動幅を示すテクニカル指標です。値が大きいほど、価格変動が激しい(ボラティリティが高い)ことを意味します。
  • 動的な閾値設定: 次に GetDynamicVolatilityMultiplier 関数が、単なる固定値ではなく、短期と長期のボラティリティ比率や現在の時間帯(市場参加者が多い時間帯は変動が大きい傾向がある)を考慮して、「急騰・急落」と判断するための基準となる乗数(VolatilityMultiplier)を動的に調整します。これにより、静かな相場と活発な相場で判断基準を変える、より柔軟な対応を目指しています。
  • 候補となるローソク足の特定: IsHighVolatilityCandle 関数は、最新のローソク足(一定時間内の価格の動きを棒状に示したもの)の値動きが、上記の動的閾値を用いて計算された基準以上に大きいかどうかをチェックします。さらに、単に値幅が大きいだけでなく、ローソク足の実体(始値と終値の差)が全体の長さ(高値と安値の差)に対して一定割合以上(BodyToTotalRatio)あるかどうかも確認します。これは、方向感のある強い動きを捉えるための工夫です。
  • サージの確定: EntryManagement.mqh 内の DetectPriceSurge 関数が、これらの条件を満たすローソク足(陽線なら上昇サージ、陰線なら下降サージ)を検出します。さらに、IsValidCandlePattern で実体が全体の60%以上を占めるかなど、より明確なパターンを持つ足に絞り込みます。検出に成功すると、そのサージの方向、開始価格、終了価格などの情報が記録されます。

このように、複数の条件(ボラティリティ、実体比率、パターン)を組み合わせ、さらに動的な閾値を用いることで、単なるノイズ(一時的な価格のブレ)と、意味のある価格の急変動(サージ)を区別しようと試みています。

2. エントリー戦略:押し目買い・戻り売りのタイミング

サージを検出した後、EAはすぐにはエントリーしません。価格が一方向に急激に動いた後は、一時的に反対方向に調整する動き(上昇後の下落=押し目、下落後の上昇=戻り)が発生しやすいという考えに基づき、その調整後の再エントリーを狙います。

  • 調整期間の監視: IsAdjustmentComplete 関数は、サージ発生後、調整を示すローソク足が一定期間(AdjustmentCandlesMinAdjustmentCandlesMax)続いたかどうかを監視します。そして、最後に再びサージと同じ方向への動き(実体の大きなローソク足)が見られた場合に、調整期間が終了したと判断します。
  • エントリーポイントの計算: 調整完了後、DetectReentryPoint 関数が具体的なエントリー価格を計算します。これは、検出されたサージの値幅に対して、ユーザーが設定した割合(EntryPullbackPercent)だけ価格が押し戻されたポイントです。例えば、100ピップス上昇するサージがあり、EntryPullbackPercent が40%なら、最高値から40ピップス下がった価格に買いの指値注文(指定価格になったら買う予約注文)を設定します。これにより、高値掴みや安値売りを避け、より有利な価格でのエントリーを目指します。
    • 用語解説:ピップス (pips) とは、為替レートの変動単位のことです。EURUSDなどのドルストレート通貨ペアでは、通常0.0001ドル(1セントの100分の1)を1ピップスとします。
  • 追加フィルターによる精度向上: エントリーの確度を高めるために、ConfirmEntrySignal 関数が追加のチェックを行います。RSIやMACDといった他のテクニカル指標がエントリー方向を支持しているか、また MarketAnalysis.mqh で判定された長期的なトレンド方向と一致しているかを確認します。これらのフィルターを通過した場合にのみ、実際に注文が発注されます。
    • 用語解説:RSI (Relative Strength Index) は、買われすぎか売られすぎかを示す指標です。MACD (Moving Average Convergence Divergence) は、トレンドの方向性や転換点を探るのに使われる指標です。

3. リスク管理:損失を限定し、利益を確保する工夫

どんなに優れたエントリー戦略でも、損失を管理できなければ長期的に成功することは困難です。このEAは、リスク管理のためにいくつかの重要な機能を RiskManagement.mqh に実装しています。

  • ポジションサイジング(ロット計算): CalculatePositionSize 関数は、1回の取引で許容できる損失額に基づいて、適切な取引量(ロットサイズ)を自動計算します。ユーザーは、口座残高に対して何パーセントまでのリスクを許容するか(MaxRiskPercent)を設定します。EAは、エントリー予定価格と後述するストップロス価格の差(=最大損失幅)を考慮し、この許容リスク額を超えない最大のロットサイズを算出します。これにより、単一の取引で致命的な損失を被るリスクを低減します。
  • 動的ストップロス(SL)設定: 損失を限定するための損切り注文(ストップロス)の設定は、このEAの特に工夫された点です。CalculateDynamicStopLoss 関数は、状況に応じて最適なストップロス価格を計算します。
    1. ZigZagベース(優先): UseZigZagStopLoss が有効な場合、まず FindRecentZigZagPoint 関数が、MT4標準のZigZagインジケーターを利用して、直近の重要な高値(売りの場合)または安値(買いの場合)を探します。ZigZagが示す価格は、市場参加者に意識されやすいサポート(下値支持)やレジスタンス(上値抵抗)となることが多いため、これを基準に少しバッファ(ZigZagBufferPercent)を加えた価格をストップロスとします。市場の構造に基づいた、合理的な損切り設定を目指します。
    2. ATRベース(代替1): ZigZagポイントが見つからない場合や、ZigZagを使用しない設定の場合、ATR(現在の平均的な値動きの大きさ)に基づいてストップロスを計算します(GetATRBasedStopLoss)。エントリー価格から、ATRに一定の乗数(ATRMultiplier)を掛けた値幅分離れた価格をストップロスとします。これは、現在の市場のボラティリティに適応した損切り設定です。
    3. 起点価格ベース(代替2): 上記のいずれも利用できない場合の最終手段として、サージの起点となった価格から固定ピップス(StopLossPips)分離れた価格をストップロスとします。
    4. 最小距離の保証: どの方法で計算された場合でも、ブローカーが定める最小ストップレベル(注文価格から最低限離さなければならない距離)を満たしているかを確認し、近すぎる場合は自動的に調整します。これにより、注文エラーを防ぎます。
  • テイクプロフィット(TP)設定: CalculateTakeProfit 関数は、利益確定の目標価格を設定します。これは、ストップロスまでの値幅(リスク)に対して、ユーザーが設定したリスクリワード比(RiskRewardRatio)を掛けた値幅(リワード)をエントリー価格に加減算して計算されます。例えば、リスクリワード比が2.0なら、損切り幅の2倍の利益を目標とします。
  • 部分決済: UsePartialClose が有効な場合、利益が一定レベル(損切り幅の PartialCloseTrigger 倍)に達した時点で、ポジションの一部(PartialClosePercent で指定した割合)を自動で決済します。これにより、利益を早期に確定させつつ、残りのポジションでさらなる利益伸長を狙うことが可能になります。

4. その他の機能:フィルターとユーティリティ

  • 市場フィルター: FilteringSystem.mqhShouldTradeInCurrentMarket 関数は、ボリンジャーバンドの幅などからレンジ相場(方向感のない相場)を検出し、そのような状況ではエントリーを見送ることで、無駄な取引を減らします。
  • 時間フィルター: 同じく FilteringSystem.mqhIsForceCloseTime 関数と、メインファイルの OnTick 内のロジックにより、指定した時刻(例: 週末前)にすべてのポジションを強制的に決済することができます。
  • 堅牢な注文処理: Utilities.mqh に含まれる SendOrderWithRetry などの関数は、一時的なサーバーエラーなどで注文が失敗した場合に自動で再試行する機能を提供し、EAの安定動作に貢献します。

EAの強みと弱み(考察)

ソースコードの分析から、この「EURUSD_Surge_EA」の潜在的な強みと弱みを考察してみましょう。

強み:

  • 明確な戦略: 価格の急騰・急落後の押し目・戻りを狙うという、明確な戦略に基づいています。
  • 高度なリスク管理: リスクベースのポジションサイジング、複数のロジック(ZigZag, ATR, 固定)を組み合わせた動的なストップロス設定、部分決済機能など、リスク管理機能が充実しています。
  • モジュール化された設計: 機能ごとにファイルが分割されており、コードの理解、修正、拡張が比較的容易です。
  • 多角的なフィルター: エントリー前の複数のテクニカル指標(RSI, MACD, トレンド)による確認や、レンジ相場フィルターにより、エントリー精度を高めようとしています。
  • 堅牢性への配慮: 注文再試行ロジックなど、実運用での安定性を考慮した作りになっています。

弱み:

  • パラメータ依存性: 多くのパラメータ(閾値、期間、割合など)があり、最適な設定を見つけるためには十分なテストと最適化が必要です。相場状況の変化によって、パラメータの再調整が必要になる可能性があります。
  • 特定市場への特化: EURUSDの5分足に特化しているため、他の通貨ペアや時間足でそのまま利用することは想定されていません。
  • ダマシの可能性: 急騰・急落やその後の調整の判断は、市場のノイズや不規則な動きによって「ダマシ」となる可能性があります。フィルター機能はありますが、完全には排除できません。
  • ZigZagの特性: ストップロス計算の基準となるZigZagインジケーターは、確定した過去の高値・安値を示すため、リアルタイムでの判断には注意が必要です(ただし、このEAでは確定したバーのZigZag値を使用しているため、リペイント問題は限定的と考えられます)。
  • 複雑性: 多機能である反面、ロジックがやや複雑であり、MQL4や取引の初心者が完全に理解するには時間がかかるかもしれません。

おわりに

いかがでしたか。こういったEA作成もLLMやAI Agentで実装できる時代になりました。興味ある方はご自身の仮説をぜひ形にしてみてはいかがでしょうか。

Accenture Japan (有志)

Discussion