技術講座

MQL5インジケーター開発・EA連携完全ガイド|iCustom・CopyBuffer・OnCalculate・SetIndexBufferの基本

EAファンクラブ

MQL5でインジケーターを開発する時は、チャートに線や矢印を表示するだけでなく、EAから値を取得できる構造にしておくことが重要です。特に、OnCalculate、SetIndexBuffer、indicator_buffers、indicator_plots、EMPTY_VALUE、iCustom、CopyBufferの関係を理解していないと、EA側で値が取れない、サインがずれる、現在足で値が変わる、リペイントの有無を確認できないといった問題が起きやすくなります。

前回のCopyBuffer記事では、EA側からiMA、iATR、iRSI、iCustomの値を取得する方法を整理しました。この記事では、EAから呼ばれる側であるインジケーター本体の作り方、バッファ設計、OnCalculateの考え方、SetIndexBufferの使い方、描画バッファと計算バッファ、EMPTY_VALUEの扱い、iCustomでEA連携する前提の設計を中心に整理します。

この記事は、MT5 / MQL5のインジケーター開発、EA連携、サインインジケーター作成、CopyBuffer連携、ログ確認を目的とした技術記事です。特定の売買判断、利益、勝率、損失回避、推奨ロット、推奨銘柄を案内するものではありません。

この記事で確認すること

  • MQL5インジケーター開発の基本構造
  • OnCalculateの役割
  • rates_totalとprev_calculatedの考え方
  • SetIndexBufferでバッファを登録する方法
  • indicator_buffersとindicator_plotsの違い
  • 描画バッファと計算バッファの使い分け
  • PlotIndexSetIntegerやPlotIndexSetDoubleの役割
  • EMPTY_VALUEを使ったサインなし表現
  • 矢印サインインジケーターの基本構造
  • iCustomでEAから呼ぶ前提のinput設計
  • CopyBufferでEAから値を取得する時の注意点
  • 現在足と確定足、リペイント確認
  • OnInit、OnCalculate、OnDeinitのログ設計
  • 開発依頼前に整理する情報

MQL5インジケーター開発の基本構造

MQL5のインジケーターは、チャート上に値を表示するためのプログラムです。移動平均線のようなライン表示、RSIのようなサブウィンドウ表示、矢印サイン、ヒストグラム、ラベル表示、パネル表示など、さまざまな形式があります。

EA連携を前提にしたインジケーターでは、単にチャートへ表示できるだけでは不十分です。EAからiCustomで呼び出し、CopyBufferで値を取得できるように、バッファ番号、input、EMPTY_VALUE、現在足と確定足の扱いを明確にする必要があります。

MQL5インジケーターの基本は、OnInitで初期化し、SetIndexBufferでバッファを登録し、OnCalculateで各バーの値を計算する流れです。終了時に必要な後処理がある場合はOnDeinitで行います。

要素役割確認ポイント
OnInitインジケーターの初期化を行います。バッファ登録、表示設定、初期ログを確認します。
SetIndexBuffer配列をインジケーターバッファとして登録します。バッファ番号と用途を明確にします。
OnCalculateバーごとの値を計算します。rates_total、prev_calculated、配列方向を確認します。
PlotIndexSet描画設定を行います。矢印、EMPTY_VALUE、線種、表示名などを設定します。
iCustomEAからカスタムインジケーターを呼びます。ファイル名、input順序、バッファ番号を確認します。
CopyBufferEAからインジケーター値を取得します。バッファ番号、shift、取得本数を確認します。

OnCalculateの役割

OnCalculateは、MQL5インジケーターで値を計算する中心的なイベント関数です。チャートの価格データや時系列データを受け取り、各バーに対してバッファへ値を入れます。

OnCalculateでは、rates_totalとprev_calculatedを使って、何本分のデータがあるか、前回どこまで計算したかを確認できます。すべてのバーを毎回再計算する設計もできますが、重いインジケーターでは差分更新を考える必要があります。

EA連携を前提にする場合、OnCalculateでどのバッファへどの値を入れるかが重要です。たとえば、買いサインをバッファ0、売りサインをバッファ1、フィルター値をバッファ2に入れるなど、仕様として明確にします。

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   if(rates_total < 50)
   {
      PrintFormat("CALC_SKIP reason=NOT_ENOUGH_BARS rates_total=%d", rates_total);
      return 0;
   }

   int start = 0;

   if(prev_calculated > 0)
      start = prev_calculated - 1;

   for(int i = start; i < rates_total; i++)
   {
      // ここで各バーの値を計算します。
   }

   PrintFormat("CALC_OK rates_total=%d prev_calculated=%d start=%d",
               rates_total,
               prev_calculated,
               start);

   return rates_total;
}

この例では、必要本数が不足している場合は計算を見送り、prev_calculatedを使って計算開始位置を決めています。実際のインジケーターでは、計算に必要な期間、配列方向、初期化範囲を慎重に確認してください。

rates_totalとprev_calculatedの考え方

rates_totalは、OnCalculateに渡されるバー本数です。prev_calculatedは、前回OnCalculateが返した値です。この2つを使うことで、初回計算なのか、追加更新なのかを判断できます。

初回計算では、必要な範囲を広めに初期化することがあります。2回目以降は、前回計算済みの範囲を利用して、直近バーだけを更新することができます。ただし、現在足は価格更新ごとに変わるため、直近バーを再計算する設計が必要になる場合があります。

項目意味実務上の注意
rates_total現在利用可能なバー本数です。計算に必要な本数を満たしているか確認します。
prev_calculated前回計算済みとして返した本数です。初回か差分更新かの判断に使います。
start今回の計算開始位置です。現在足や1本前を再計算するか決めます。
return rates_total今回計算済み本数として返します。次回のprev_calculatedに関係します。
return 0計算失敗や不足時に使うことがあります。EA連携時はCopyBuffer取得に影響する場合があります。

SetIndexBufferでバッファを登録する

SetIndexBufferは、配列をインジケーターバッファとして登録するために使います。チャートへ表示する値や、EAからCopyBufferで取得する値は、基本的にバッファへ入れる必要があります。

インジケーター開発では、バッファ番号と値の意味を必ず整理します。EAからiCustomで呼ぶ場合、CopyBuffer(handle, 0, …) の0が何を意味するのか、CopyBuffer(handle, 1, …) の1が何を意味するのかが重要です。

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2

double BuySignalBuffer[];
double SellSignalBuffer[];

int OnInit()
{
   SetIndexBuffer(0, BuySignalBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, SellSignalBuffer, INDICATOR_DATA);

   PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_ARROW);
   PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_ARROW);

   PlotIndexSetInteger(0, PLOT_ARROW, 233);
   PlotIndexSetInteger(1, PLOT_ARROW, 234);

   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);

   Print("INIT_OK indicator buffers registered");

   return INIT_SUCCEEDED;
}

この例では、買いサイン用バッファと売りサイン用バッファを登録しています。EA側では、バッファ0を買いサイン、バッファ1を売りサインとしてCopyBufferで取得できるようになります。

indicator_buffersとindicator_plotsの違い

indicator_buffersは、インジケーターで使うバッファ数を指定します。indicator_plotsは、チャートへ描画するプロット数を指定します。両者は同じになる場合もありますが、必ず一致するとは限りません。

たとえば、表示するラインは1本でも、内部計算用に複数の計算バッファを持つことがあります。EA連携を前提にする場合、描画されているバッファだけでなく、EAが取得するバッファを明確にしてください。

項目意味注意点
indicator_buffers使用するバッファ数です。描画用と計算用を含めます。
indicator_plots描画するプロット数です。チャート上に表示する線や矢印の数です。
INDICATOR_DATA描画やCopyBuffer取得に使うバッファです。EA連携する値は基本的にこの用途で整理します。
INDICATOR_CALCULATIONS内部計算用バッファです。表示しない補助計算に使います。
PlotIndexSet描画設定を行います。線種、矢印、EMPTY_VALUEなどを設定します。

描画バッファと計算バッファの使い分け

インジケーターでは、チャートに表示する値を入れる描画バッファと、内部計算だけに使う計算バッファを分けることがあります。たとえば、表示するサインは買い・売りの2つでも、内部では移動平均、ATR、条件スコアなどを計算している場合があります。

EAから値を取得する前提がある場合は、どのバッファを公開値として扱うのかを決めます。内部計算だけに使う値をEA側が誤って参照すると、シグナル条件とズレる可能性があります。

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   2

double BuySignalBuffer[];
double SellSignalBuffer[];
double WorkBuffer[];

int OnInit()
{
   SetIndexBuffer(0, BuySignalBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, SellSignalBuffer, INDICATOR_DATA);
   SetIndexBuffer(2, WorkBuffer, INDICATOR_CALCULATIONS);

   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);

   Print("INIT_OK data_buffers=2 calc_buffers=1");

   return INIT_SUCCEEDED;
}

この例では、BuySignalBufferとSellSignalBufferをEA連携可能なデータバッファとして扱い、WorkBufferを内部計算用にしています。EA側から取得するバッファ番号は、仕様書や記事内で明記しておくと安全です。

EMPTY_VALUEを使ってサインなしを表現する

矢印サインや条件成立時だけ値を出すインジケーターでは、サインがないバーにEMPTY_VALUEを入れることがあります。EMPTY_VALUEを使うことで、チャート上に不要な点や矢印を表示しないようにできます。

EA連携では、EMPTY_VALUEの扱いが特に重要です。CopyBufferで値を取得できても、値がEMPTY_VALUEなら、そのバーではサインなしと判断します。CopyBuffer失敗とEMPTY_VALUEは別の状態として分けてログに出してください。

void SetSignalValues(int i, bool buy_signal, bool sell_signal, double low_price, double high_price, double point)
{
   BuySignalBuffer[i]  = EMPTY_VALUE;
   SellSignalBuffer[i] = EMPTY_VALUE;

   if(buy_signal)
      BuySignalBuffer[i] = low_price - 10.0 * point;

   if(sell_signal)
      SellSignalBuffer[i] = high_price + 10.0 * point;
}

この例では、サインがない場合にEMPTY_VALUEを入れ、買いサインがある場合はローソク足の下、売りサインがある場合はローソク足の上へ矢印を表示する想定です。実際には、point、digits、チャート表示位置、サブウィンドウ表示の有無を確認します。

矢印サインインジケーターの基本構造

矢印サインインジケーターは、条件成立時にチャート上へ買い矢印や売り矢印を表示する構成です。EA連携を前提にする場合、買いサインと売りサインを別バッファに分けると、EA側で判定しやすくなります。

たとえば、バッファ0を買いサイン、バッファ1を売りサインにします。EA側はCopyBufferでそれぞれのバッファを取得し、EMPTY_VALUEでなければサインありと判断します。

バッファ番号用途EA側の確認
0買いサイン。EMPTY_VALUEでなければ買い候補。
1売りサイン。EMPTY_VALUEでなければ売り候補。
2内部計算用。通常EAから直接参照しない。
input期間、閾値、表示ON/OFFなど。iCustom呼び出し時の引数順序に影響。

iCustomでEAから呼ぶ前提のinput設計

EAからカスタムインジケーターを呼ぶ場合、iCustomを使います。iCustomでは、インジケーター名、時間足、input値を指定してハンドルを作成します。この時、インジケーター側のinput順序とEA側のiCustom引数が一致している必要があります。

inputを後から追加・変更すると、EA側のiCustom呼び出しとズレる可能性があります。販売用・配布用・EA連携用のインジケーターでは、inputの順番、初期値、意味、単位を仕様として固定しておくことが重要です。

input int InpPeriod = 20;
input double InpThreshold = 1.5;
input bool InpUseFilter = true;

// EA側の例:
// handle = iCustom(_Symbol, PERIOD_CURRENT, "MySignalIndicator", 20, 1.5, true);

この例では、インジケーター側に3つのinputがあります。EA側からiCustomで呼ぶ場合も、同じ順序で値を渡す必要があります。型や順序が違うと、意図しない設定で動作する可能性があります。

EA側でCopyBuffer取得する時の前提

インジケーター側でバッファを設計したら、EA側ではiCustomでハンドルを作成し、CopyBufferで値を取得します。インジケーター側のバッファ番号とEA側のCopyBuffer番号が一致していることを確認してください。

EA側で値が取れない場合、インジケーター側のバッファ登録、EMPTY_VALUE、計算済み本数、input順序、iCustomファイル名、CopyBufferの戻り値を確認します。

int signal_handle = INVALID_HANDLE;

bool CreateSignalHandle()
{
   signal_handle = iCustom(_Symbol, PERIOD_CURRENT, "MySignalIndicator", 20, 1.5, true);

   if(signal_handle == INVALID_HANDLE)
   {
      PrintFormat("IND_HANDLE_FAIL name=MySignalIndicator last_error=%d", GetLastError());
      return false;
   }

   PrintFormat("IND_HANDLE_OK name=MySignalIndicator handle=%d", signal_handle);
   return true;
}

bool GetBuySignalValue(int shift, double &value)
{
   double buffer[];
   ArraySetAsSeries(buffer, true);

   ResetLastError();

   int copied = CopyBuffer(signal_handle, 0, shift, 1, buffer);

   if(copied != 1)
   {
      PrintFormat("COPYBUFFER_FAIL buffer=0 shift=%d copied=%d last_error=%d",
                  shift,
                  copied,
                  GetLastError());
      return false;
   }

   if(buffer[0] == EMPTY_VALUE)
   {
      PrintFormat("BUFFER_EMPTY buffer=0 shift=%d", shift);
      return false;
   }

   value = buffer[0];

   PrintFormat("COPYBUFFER_OK buffer=0 shift=%d value=%.5f",
               shift,
               value);

   return true;
}

この例では、バッファ0を買いサインとして取得しています。売りサインを取得する場合は、インジケーター側で売りサインとして定義したバッファ番号をCopyBufferに指定します。

現在足と確定足を分ける

インジケーターをEA連携する時は、現在足と確定足を分けて扱います。現在足は価格更新に応じて値が変わるため、サインが出たり消えたりすることがあります。確定足はすでに閉じた足なので、判定の再現性が高くなります。

EA側のCopyBufferでshift=0を指定すると現在足、shift=1を指定すると1本前の確定足を参照する構成になります。インジケーター側の設計でも、現在足にサインを出すのか、確定足にサインを出すのかを明確にしてください。

指定意味注意点
shift=0現在足。値が変化し、サインが消える可能性があります。
shift=11本前の確定足。判定の再現性を高めやすいです。
現在足サイン早い反応が可能。リペイントや再描画確認が必要です。
確定足サインバー確定後に判定。反応は遅くなりますが検証しやすいです。

リペイント確認の考え方

リペイントとは、過去のバーに表示されたサインや値が後から変わることを指す場合があります。すべての現在足更新が問題というわけではありませんが、EA化やバックテスト検証では、過去値が後から変わるかどうかを確認する必要があります。

サインインジケーターをEAに取り込む場合、現在足のサインを使うのか、確定足のサインを使うのか、過去足の値が変わらない設計なのかを確認してください。特に、ジグザグ系、ピーク判定系、後続足で条件確定するインジケーターは注意が必要です。

リペイント確認では、現在足、1本前、2本前のバッファ値をログに出し、次のバーで過去値が変わっていないかを確認します。EA化する場合は、再現可能な判定条件として使えるかを検証します。

確認項目内容確認方法
現在足の値shift=0の値。ティックごとに変わるか確認します。
確定足の値shift=1の値。バー確定後に固定されるか確認します。
過去足の値shift=2以降の値。後から変化しないか確認します。
サインなしEMPTY_VALUEの扱い。サインなしと取得失敗を分けます。
EA判定どのshiftを使うか。仕様として固定します。

MTFインジケーター開発で注意すること

MTFインジケーターは、現在チャートとは別の時間足を参照するインジケーターです。たとえば、M5チャート上でH1の方向を表示する構成です。MTFでは、時系列データの同期、上位足の確定タイミング、CopyBufferやCopyRatesの取得本数に注意が必要です。

EA連携を前提にする場合、インジケーター側が上位足の現在足を使っているのか、確定足を使っているのかを明確にしてください。上位足の現在足を使うと、値が変わりやすくなります。確定足を使うと、反応は遅くなりますが、検証しやすくなります。

MTFインジケーターでは、バーの時刻対応も重要です。下位足のどのバーに、上位足のどの値を表示するのかを整理しないと、見た目とEA判定がずれることがあります。

マルチシンボルインジケーターで注意すること

マルチシンボルインジケーターは、現在チャート以外の銘柄データを参照します。別銘柄の価格、インジケーター値、相関、強弱などを表示する場合があります。

この場合、SymbolSelect、Market Watch、ヒストリーデータ、対象銘柄名、ブローカー接尾辞を確認する必要があります。EA連携を前提にするなら、どの銘柄の値をどのバッファへ入れているのかを明確にします。

別銘柄データが取得できない場合、値が0やEMPTY_VALUEになるだけでは原因が分かりません。銘柄選択、データ取得、バッファ出力を分けてログに残す設計が必要です。

インジケーター開発のログ設計

インジケーターはチャート上の表示だけで確認されがちですが、EA連携や不具合調査ではログ設計が重要です。OnInit、OnCalculate、バッファ出力、EMPTY_VALUE、iCustom連携、CopyBuffer取得結果を追えるようにします。

ログを出しすぎるとExpertsログが読みにくくなるため、開発時・検証時・通常運用時でログ粒度を切り替える設計が現実的です。

ログ名残す内容目的
INIT_OKバッファ数、プロット数、input値。初期化確認。
INIT_FAIL初期化失敗理由。設定ミスや依存関係の確認。
CALC_OKrates_total、prev_calculated、start。計算範囲の確認。
CALC_SKIP必要本数不足、データ不足。値を出さない理由の確認。
BUFFER_SETbuffer番号、shift、value。サイン出力の確認。
BUFFER_EMPTYEMPTY_VALUEの出力。サインなしと取得失敗の切り分け。
ICUSTOM_HANDLEEA側のハンドル作成結果。EA連携確認。
COPYBUFFER_OKbuffer、shift、取得値。EA側での取得確認。

バックテストで確認すること

インジケーターをEAに連携する場合、バックテストでも表示と取得値の整合を確認します。チャート上の矢印やラインと、EA側のCopyBuffer取得値が一致しているかを確認してください。

特に、現在足サイン、確定足サイン、EMPTY_VALUE、MTF、マルチシンボル、リペイント確認はバックテスト時に見落としやすいポイントです。見た目ではサインが出ていても、EA側が別のshiftや別バッファを参照していると、エントリー条件が一致しません。

  • インジケーター名とバージョンを記録する
  • EA側のiCustom引数を保存する
  • バッファ番号と意味を整理する
  • 現在足と確定足のどちらを使うか決める
  • EMPTY_VALUEの扱いを確認する
  • チャート表示とCopyBuffer取得値を照合する
  • リペイントの有無を確認する
  • MTFやマルチシンボルの場合は参照先を記録する
  • バックテスト結果を将来成績保証として扱わない

よくある不具合と確認ポイント

インジケーター開発とEA連携では、チャートには表示されるのにEAで値が取れない、CopyBufferで値が取れるがサイン判定がずれる、現在足で値が変わる、過去サインが変わる、iCustomのハンドル作成に失敗する、といった問題が起きます。

症状確認する場所主な原因候補
EAで値が取れないiCustom、CopyBuffer、バッファ番号。ファイル名違い、input順序違い、バッファ番号違い。
チャート表示とEA判定がずれるshift、EMPTY_VALUE、描画位置。現在足と確定足の混同。
サインが消える現在足、リペイント確認。形成中バーで値が変化している。
過去サインが変わるOnCalculate、計算範囲、アルゴリズム。後続足で過去値を再計算している。
iCustomがINVALID_HANDLEになるファイル名、パス、input型。インジケーター名や引数の不一致。
EMPTY_VALUEを注文条件にしてしまう取得値、判定条件。サインなしをサインありと誤判定している。
MTFだけずれる上位足のshift、時刻対応。上位足現在足やバー同期の問題。

開発依頼前に整理する情報

インジケーター開発やEA連携を依頼する場合は、表示したい内容だけでなく、EAから取得したい値、バッファ番号、サインなしの扱い、現在足か確定足か、リペイント許容の有無を整理しておく必要があります。

「矢印が出たらEAでエントリーしたい」という依頼でも、EAが見るべきバッファ、shift、EMPTY_VALUE、サイン確定条件が不明だと、実装後にズレが出やすくなります。

整理する情報内容理由
インジケーター名ファイル名、表示名、バージョン。iCustom呼び出しに必要です。
表示内容ライン、矢印、ヒストグラム、ラベルなど。描画形式を決めるため。
バッファ仕様買い、売り、フィルター、計算用など。EAからCopyBufferで取得するため。
input期間、閾値、ON/OFF設定。EA側のiCustom引数と一致させるため。
サインなしEMPTY_VALUEか0か。EA側の判定条件に影響します。
判定足現在足か確定足か。再現性とエントリータイミングに影響します。
リペイント過去値が変わるか。EA化やバックテストの信頼性に影響します。
送らない情報口座番号、パスワード、APIキー、Webhook URL。機密情報を保護するため。

実務チェック表

  • OnCalculateのrates_totalとprev_calculatedを確認している
  • 必要本数不足時に計算を止めている
  • SetIndexBufferでバッファ番号と用途を整理している
  • indicator_buffersとindicator_plotsの違いを理解している
  • 描画バッファと計算バッファを分けている
  • EMPTY_VALUEをサインなしとして扱っている
  • EAから取得するバッファ番号を明記している
  • iCustomのinput順序を固定している
  • CopyBufferで取得するshiftを仕様化している
  • 現在足と確定足を混同していない
  • リペイントの有無を検証している
  • ログで初期化・計算・バッファ出力を追跡できる
  • 口座情報や認証情報をログへ出していない

よくある質問

MQL5インジケーターをEAから使うには何が必要ですか?

EA側ではiCustomでインジケーターハンドルを作成し、CopyBufferでバッファ値を取得します。インジケーター側では、SetIndexBufferでEAから取得できるバッファを設計しておく必要があります。

SetIndexBufferは何のために使いますか?

配列をインジケーターバッファとして登録するために使います。チャートに表示する値やEAからCopyBufferで取得する値は、バッファへ入れる必要があります。

EMPTY_VALUEとは何ですか?

値なしを表すために使われる値です。矢印サインインジケーターでは、サインがないバーにEMPTY_VALUEを入れることで、不要な表示を避けられます。EA側では、CopyBuffer成功とEMPTY_VALUEを分けて確認します。

現在足のサインをEAで使ってもよいですか?

使うことはできますが、現在足の値は価格更新に応じて変化します。サインが出たり消えたりする可能性があるため、再現性を重視する場合は確定足を使う設計が扱いやすいです。

リペイントするインジケーターはEA化できますか?

EA化自体は可能な場合がありますが、過去値が変わる前提を理解して仕様化する必要があります。バックテストや実運用で同じ判断を再現できるかを確認してください。

iCustomでINVALID_HANDLEになる時は何を確認しますか?

インジケーター名、保存場所、input引数の順番、引数の型、コンパイル状態、対象銘柄・時間足を確認します。EA側ではGetLastErrorをログに出してください。

関連ページ

インジケーター開発とEA連携を整理する時は、CopyBuffer、時系列データ、マルチシンボル、チャートオブジェクト、イベント処理、ログ確認、EA設計をあわせて確認すると、表示とEA判定のズレを切り分けやすくなります。

確認したい内容関連ページ
EAからCopyBufferで値を取得するMQL5でインジケーター値をEAに取り込む方法
時系列データと価格取得を確認するMQL5時系列データ・価格取得完全ガイド
マルチシンボル・MTF対応を確認するMQL5マルチシンボル・マルチタイムフレーム完全ガイド
チャートオブジェクトとパネルUIを確認するMQL5チャートオブジェクト・パネルUI完全ガイド
イベント処理を確認するMQL5イベント処理完全ガイド
MQL5関数全体を確認するMQL5関数辞典
インジケーター関数を確認するMQL5インジケーター関数辞典
ログ確認とデバッグを確認するMQL5デバッグ・ログファースト開発完全ガイド
EA設計の責務分離を確認するMQL5 EA設計パターン完全ガイド
バックテストと最適化を確認するMT5ストラテジーテスター・最適化完全ガイド
CSVログ出力を確認するMQL5ファイル操作・CSVログ出力完全ガイド
MT5インジケーター商品を確認するMT5インジケーター辞典
EAログを問い合わせ前に確認するEAのログを問い合わせ前に確認する方法
開発・改修相談の入口を確認する開発・改修の相談ページ

まとめ

MQL5インジケーター開発では、OnCalculate、SetIndexBuffer、indicator_buffers、indicator_plots、EMPTY_VALUE、PlotIndexSetを理解することが重要です。チャートに表示できるだけでなく、EAからiCustomとCopyBufferで取得できる構造にしておくと、EA連携や検証が進めやすくなります。

EA連携を前提にする場合は、バッファ番号、input順序、現在足と確定足、EMPTY_VALUE、リペイントの有無を仕様として明確にしてください。チャート表示とEA側の取得値が一致しているかを、ログとバックテストで確認することが重要です。

サインインジケーター、MTFインジケーター、マルチシンボルインジケーターをEA化する場合は、見た目だけで判断せず、CopyBufferで取得できる値、shift、バッファ番号、過去値の変化を確認してください。実装前に仕様を整理しておくことで、EA化後の判定ズレや不具合調査を進めやすくなります。

ABOUT ME
記事URLをコピーしました