MT5のビジュアルテストだけで動くEAでは、判断が価格・指標データに依存するのか、チャート上に描いた物に依存するのかを分けます。線やボタンは明示的なシグナル値の代用にはなりません。戦略を変える前にモード、版、データと最初のログ差分を比較します。以下はMT5を起動しない教育モデルで、利用不可をゼロへ置換せず、注文もしません。

ビジュアルモードで何が変わるか

MetaQuotesのテスター資料では、非ビジュアルのテスト・最適化ではグラフィカルオブジェクトを描画せず、作成したオブジェクトのプロパティ照会はゼロ値になると説明します。ビジュアルモードはこの制限の例外です。これは公式に記載された挙動で、当サイトがあなたのEAを実験した結果ではありません。全テスト差分がこの原因ともいえません。

線の価格やボタン状態を読む箇所は、指標値・価格データ取得から分離して記録します。そのモードで値が存在し、取得に成功したかを先に確かめます。技術的なゼロを価格として計算へ渡さず、利用不可ならそこで診断を止める設計を検討します。チャートが見えることも全入力の準備完了を証明しません。

数値シグナルと描画オブジェクトを分ける

作成した非取引シミュレーションです。正の数値1.1050、基準1.1040を宣言し、「シグナル>基準」を比較します。オブジェクト値が利用不可の経路と比べます。MT5の価格や執行ログではなく、データの流れを示すための架空状態です。

入力がないことはゼロ価格ではない

横にスクロールすると図全体を確認できます。

利用不可はゼロ価格ではない架空モデル。1.1050は1.1040より大きい。利用不可はnullとし比較しない。明示した数値1.1050基準:1.1040取得できない値null入力値なしモデルの結果true / unknown注文要求なし値と利用可否を別々に確認する。作成した教育モデル。架空の数値。
作成した非取引モデル。値1.1050、基準1.1040、利用不可はnull。MT5実行ログではありません。
一つの基準、三つの入力状態
経路入力評価
明示した数値1.10501.1050>1.1040はtrue
利用不可null比較しない
誤った置換欠損を0にする0>1.1040はfalseに見える

最後は故障した版の説明です。保護した経路は欠損をnullとして保持します。ゼロは数値、nullはこのモデルの入力欠如を表し、異なる問いに答えています。逆の「基準未満」なら、誤ったゼロが条件成立に見える場合さえあります。任意の代替値でプログラムを修復したことにしません。nullは当サイトの表現で、MT5の関数がnullを返すという説明ではありません。

データと描画を分けて試す

ブラウザー内で動く学習用模型です。口座・APIへ接続せず、入力を送信・永続保存しません。パスワードや個人情報を入力しないでください。

本稿の規則を再現する模型で、MT5でEAを試験するものではありません。半角小数点の正数10⁻⁸〜10⁸、15桁以内を使います。オブジェクト情報なしは模型でnullとし、別の誤った版はゼロを代入します。この比較から実際のEAの失敗原因は断定できません。

この教材は二つの正の有限数を変更し、明示値を比較する一方、利用不可のオブジェクト経路は未評価に保ちます。正の小数点表記10⁻⁸〜10⁸、最大15桁という教材の入力範囲です。仮定モードをビジュアル/非ビジュアルに切り替え、同値も試します。例の確認、リセット、結果TXTのダウンロードは教材内の操作です。JavaScriptがなくても本文の計算は読めます。パスワードや個人情報を入力しないでください。チャートを読むEAテストでも、投資シグナルでもなく、実プログラムの原因を特定するものでもありません。

注文なしでモードを記録する

MQL_TESTER、MQL_VISUAL_MODE、MQL_OPTIMIZATIONは実行環境、TERMINAL_BUILDは端末のビルドを示します。窓の見た目から推測せず、実際の値を記録します。フラグの一致だけではデータやパラメーターの一致は証明できません。

以下は独立した診断用EAです。OnInitで設定をログへ出し、OnTickは空です。注文送信・変更はありません。別のMQ5ファイルとしてMetaEditorでコンパイルし、自分の端末の実際の結果とログを保存してください。ここで実機コンパイルしたとは主張しません。

#property strict
int OnInit()
{
   PrintFormat("tester=%d visual=%d optimization=%d build=%d symbol=%s period=%d",
      (int)MQLInfoInteger(MQL_TESTER),
      (int)MQLInfoInteger(MQL_VISUAL_MODE),
      (int)MQLInfoInteger(MQL_OPTIMIZATION),
      (int)TerminalInfoInteger(TERMINAL_BUILD),
      _Symbol, (int)_Period);
   return INIT_SUCCEEDED;
}
void OnTick() {}

既存EAへ二つ目のOnInitを追加したり、初期化を丸ごと置き換えたりしません。既存の流れを保ったログ追加が必要です。公式資料は最適化時のPrintFormat制限にOnInit内の例外を示します。他の段階の出力がないことだけでは、その段階が実行されなかったと証明できません。

最終利益ではなく最初の差を探す

二つの実行についてビジュアル有無、端末・コード版、入力、銘柄と時間足、ティック生成モデル、要求開始と実開始、データのスナップショット、費用と初期状態を対にして保存します。設定ファイルと版識別子も残します。宣言が違えば窓だけの影響とはいえません。二つのバックテスト記録比較で未確認欄を分けます。

取得成功、データ時刻、指標準備、シグナル、条件、判断のどこで最初に値が異なったかを調べます。「利益120対80」だけでは段階を特定できません。元ログを保持して小さな比較表を横に作り、以前記録していなかった値を捏造しません。対応付けられる観測ID、要求入力、時刻または順序位置、受理可否を残します。安定IDなしで全てを出力すると差が埋もれます。同じ価格が同じ観測とは限らず、ログ設計だけで全依存性を自動発見できる保証もありません。

シグナルの設計をどう変えるか

計算は明示値と利用可否を返し、描画側がそれを表示する構造にします。描画を止めても入力元を意図的に切り替えずに済みます。利用不可、基準と同値を含む制御入力で同じモジュールを確かめます。ただし全テストの一致は、版・データ・費用・他の依存性も関係するため保証しません。

ソースコードがなければ、EA作者へ渡せる対照記録と最初の記録済み差分を用意します。実口座で試行注文を繰り返して診断に代えません。一般的な準備はMT4・MT5バックテストの準備を確認します。

追加比較:数値があるだけで新しい入力とは限らない

別の架空ログ例です。要求観測IDを41とします。キャッシュにあるID40の1.1050は数値として有効ですが、要求した観測ではありません。ID41の新しい値を1.1030、基準を1.1040とすると、古い値はtrue、新しい値はfalseです。利用可否だけの確認ではこの違いを見落とします。41の取得に失敗したら、40で黙って代用せず「要求41は利用不可」と記録します。

架空の要求ID41に対する比較
記録値>1.1040要求との対応
ID40、1.1050true数値はあるが別観測
ID41、1.1030false要求観測の値
ID41取得失敗未評価null、代用しない

ID完全一致はこの教材の明示した受理規則です。実戦略が許容する時刻差、バーの確定、キャッシュ用途は別に仕様化します。ID40が常に使用禁止だという普遍的なMT5規則でも、実際のEAから採取したログでもありません。

利用可能な数値でも要求した観測とは限らない

利用可能な数値でも要求した観測とは限らない架空の要求ID41、基準1.1040。ID一致を受理規則とした説明。仮定に基づく計算キャッシュID401.1050 → true取得ID411.1030 → falseID41取得失敗null → 未評価
利用可能な数値でも要求した観測とは限らない. 架空の要求ID41、基準1.1040。ID一致を受理規則とした説明。

利用可否に加え、要求ID・データ時刻・受理規則を記録する。実戦略の許容鮮度は別途仕様化する。

小さな画面では横にスクロールするか、図を拡大できます。数値と要点は下のテキストにも記載しています。

キャッシュID40
1.1050 → true – 値はあるが要求IDと違う。
取得ID41
1.1030 → false – 要求した観測。
ID41取得失敗
null → 未評価 – 古い値へ黙って置換しない。

次に行う三つの確認

  1. 対照する一組のモード、コード・端末版、入力、データと期間を保存し、不明欄を表示。同じEAファイルだけで全条件一致とはしない。
  2. 教材で1.1050と1.1040、その後は同値を比較。明示値の結果と無関係に、利用不可がnullに残ることを確かめる。取引口座は不要。
  3. 別のデモ設定かテスターで非取引の診断記録を集め、入力・利用可否・条件の最初の差を調べる。収益性の証明や投資助言ではない。