MQL5 EAサンプルコードの読み方|OnInit・OnTick・OrderSend・CopyBufferの基本構造
MQL5でEAを作り始める時、多くの人が最初に探すのがEAのサンプルコードです。サンプルコードは、OnInit、OnTick、input、注文処理、インジケーター値取得、ログ出力などの基本構造を理解する入口になります。
ただし、サンプルコードをそのままコピーして動かすだけでは、実際のEA開発や改修には不十分な場合があります。サンプルコードは説明用に簡略化されていることが多く、発注前チェック、エラー処理、Magic Number管理、ログ設計、バックテスト条件、外部連携、配布前確認まで含まれていないこともあります。
この記事では、MQL5 EAサンプルコードを読む時に確認したい基本構造を整理します。OnInit、OnTick、OnDeinit、input、グローバル変数、関数分割、OrderSend、CTrade、CopyBuffer、Magic Number、ポジション管理、PrintFormat、retcode、GetLastError、バックテスト前確認までを、実務目線で順番に確認します。
なお、この記事はMT5 / MQL5でEAサンプルコードを読むための技術解説です。特定の売買判断、利益、勝率、損失回避、推奨ロット、推奨銘柄を案内するものではありません。サンプルコードを利用する場合も、必ずデモ環境やバックテストで動作確認を行ってください。
- この記事で確認すること
- MQL5 EAサンプルコードを見る前に確認すること
- EAサンプルコードの基本構造
- 最小構成サンプルを読む時の考え方
- OnInitで確認する初期化処理
- OnTickで確認する判定処理
- inputと内部変数の読み方
- シグナル判定と発注処理を分けて読む
- OrderSendを使うサンプルコードの見方
- CTradeを使うサンプルコードの見方
- CopyBufferでインジケーター値を使うサンプルの見方
- Magic Numberとポジション管理の見方
- ログ出力・PrintFormat・retcodeの確認
- 発注前チェックがあるか確認する
- バックテスト前に確認すること
- サンプルコードを実運用向けに使う時の注意
- サンプルコードを開発依頼に使う時の整理
- サンプルコードを読む時の実務チェック表
- よくある質問
- 関連ページ
- まとめ
この記事で確認すること
- MQL5 EAサンプルコードを見る前に確認すること
- EAサンプルコードの基本構造
- OnInitで確認する初期化処理
- OnTickで確認する判定処理
- inputと内部変数の読み方
- シグナル判定と発注処理を分けて読む理由
- OrderSendを使うサンプルコードの見方
- CTradeを使うサンプルコードの見方
- CopyBufferでインジケーター値を使うサンプルの見方
- Magic Numberとポジション管理の確認
- ログ出力、PrintFormat、retcode、GetLastErrorの確認
- バックテスト前に確認すること
- サンプルコードを実運用向けに使う時の注意
- 開発依頼前にサンプルコードから整理すること
MQL5 EAサンプルコードを見る前に確認すること
MQL5 EAサンプルコードを見る時は、最初に「このコードが何を説明するためのものか」を確認します。サンプルコードには、EAの最小構成を示すもの、注文処理だけを示すもの、インジケーター値取得だけを示すもの、ログ確認用に作られたもの、バックテスト用に簡略化されたものなどがあります。
サンプルコードの目的を確認せずにそのまま使うと、実際のEAに必要な安全確認が抜けることがあります。たとえば、OrderSendのサンプルには、ロットステップ、最小ロット、証拠金、StopLevel、スプレッド制限、最大ポジション数、取引時間制限が含まれていないことがあります。
また、CopyBufferのサンプルでは、インジケーターハンドルの作成、BarsCalculated、取得本数、配列方向、確定足の扱いが簡略化されている場合があります。サンプルコードは学習の入口として有効ですが、実運用や開発依頼に使う場合は、足りない確認項目を追加する必要があります。
| 確認項目 | 見る内容 | 注意点 |
|---|---|---|
| コードの目的 | EA最小構成、注文処理、インジ値取得、ログ確認など。 | 目的外の処理が省略されている可能性があります。 |
| 対象環境 | MT5用か、MQL5用か、EA用か、インジケーター用か。 | MQL4コードをそのままMQL5へ移せない場合があります。 |
| 発注機能の有無 | 実際に注文を送るコードか、読み取り専用か。 | 発注コードを含む場合は必ずデモ環境で確認します。 |
| ログの有無 | Print、PrintFormat、retcode、GetLastErrorがあるか。 | ログがないと失敗理由を追いにくくなります。 |
| 発注前チェック | ロット、スプレッド、証拠金、SL/TP距離など。 | 説明用サンプルでは省略されがちです。 |
| バックテスト可否 | Strategy Testerで動作確認できる構造か。 | 外部連携や通知は通常環境と挙動が違うことがあります。 |
EAサンプルコードの基本構造
MQL5 EAのサンプルコードは、一般的にイベント関数を中心に構成されています。代表的なのは、起動時に動くOnInit、終了時に動くOnDeinit、価格更新ごとに動くOnTickです。必要に応じて、OnTimerやOnTradeTransactionを使うこともあります。
EAのサンプルコードを読む時は、上から順に読むだけではなく、どのイベントでどの処理が呼ばれるのかを追います。OnTickの中でシグナル判定をしているのか、関数に分けているのか、注文処理を直接書いているのか、発注前チェックを挟んでいるのかを確認してください。
| 構成要素 | 役割 | 読む時のポイント |
|---|---|---|
#property | EAの説明やバージョンなどの情報を定義します。 | バージョン管理や表示名を確認します。 |
input | 利用者が設定画面で変更できる値を定義します。 | 初期値と実行時の状態を混同しないようにします。 |
| グローバル変数 | EA全体で使う状態やハンドルを管理します。 | 初期化、更新、リセットのタイミングを確認します。 |
OnInit | EA起動時に初期化を行います。 | input確認、ハンドル作成、初期ログを確認します。 |
OnTick | 価格更新ごとに処理を行います。 | 毎ティック処理と新バー処理を分けて見ます。 |
OnDeinit | EA終了時の後処理を行います。 | ハンドル解放、Object削除、終了理由ログを確認します。 |
| 補助関数 | シグナル、発注、決済、ログなどを分けます。 | 責務が混ざっていないか確認します。 |
最小構成サンプルを読む時の考え方
EAの最小構成サンプルは、OnInit、OnDeinit、OnTickの流れを理解するために役立ちます。ただし、最小構成はあくまで動作の入口を確認するためのものであり、そのまま実運用に使う前提ではありません。
// 最小構成の例
int OnInit()
{
Print("INIT_OK");
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
PrintFormat("DEINIT reason=%d", reason);
}
void OnTick()
{
Print("TICK");
}このような最小構成では、EAが起動するか、OnTickが呼ばれるか、終了時にOnDeinitが呼ばれるかを確認できます。一方で、実際のEAに必要なシグナル判定、発注前チェック、注文処理、決済処理、ログ設計、エラー処理は含まれていません。
最小構成サンプルを読んだ後は、次に「どこへ何を追加するのか」を整理します。OnInitには初期化と設定確認、OnTickには判定入口、補助関数にはシグナル判定や発注処理、OnDeinitには後処理を置く、といった役割分担を考えると読みやすくなります。
OnInitで確認する初期化処理
OnInitは、EAをチャートへ適用した時や、パラメータ変更、時間足変更、再読み込みなどのタイミングで呼ばれる初期化処理です。EAサンプルコードを読む時は、OnInitで何を確認しているかを見ます。
OnInitでは、input値の範囲確認、インジケーターハンドル作成、ファイルパス確認、通知機能の初期状態、外部連携のON/OFF、初期ログ出力などを行うことがあります。設定不正がある場合は、理由をログに出し、必要に応じて初期化失敗を返します。
| OnInitで見る項目 | 確認内容 | ログ例 |
|---|---|---|
| EA名・バージョン | どのEAを起動したか。 | INIT name=SampleEA version=1.00 |
| input確認 | ロット、期間、閾値、ON/OFF設定。 | INPUT lot=0.10 period=20 |
| 設定不正 | ロットが0以下、期間が短すぎるなど。 | INIT_FAIL reason=INVALID_LOT |
| ハンドル作成 | iMA、iRSI、iATR、iCustomなど。 | HANDLE_OK ma_handle=12 |
| 外部連携 | 通知やWebRequestを使うか。 | NOTIFY enabled=true url=MASKED |
| 初期化結果 | 起動成功か失敗か。 | INIT_OK |
OnInitで何もログが出ないサンプルコードは、学習用としては簡単ですが、不具合時に原因を追いにくくなります。特にCopyBufferを使うEAでは、ハンドル作成に失敗していないかをOnInitで確認することが重要です。
OnTickで確認する判定処理
OnTickは、価格更新ごとに呼ばれるEAの中心的なイベントです。EAサンプルコードでは、OnTickの中にシグナル判定、発注条件、注文処理が直接書かれていることがあります。ただし、実務ではOnTickにすべてを書くよりも、責務ごとに関数へ分ける方が確認しやすくなります。
OnTickを読む時は、まず処理の入口を確認します。毎ティックで判定しているのか、新バーができた時だけ判定しているのか、取引時間やスプレッド制限を先に確認しているのかを見ます。特に短期EAでは、毎ティック処理が重くなりすぎないように注意が必要です。
void OnTick()
{
if(!IsNewBar())
return;
int signal = CheckSignal();
if(signal == 0)
{
Print("SIGNAL_NONE");
return;
}
if(!CanEntry())
{
Print("ENTRY_BLOCK");
return;
}
ExecuteEntry(signal);
}この例では、OnTickの中で、新バー確認、シグナル判定、発注前チェック、注文処理の呼び出しを分けています。実際のEAでは、それぞれの関数で何を確認しているかを読む必要があります。
| OnTick内の処理 | 見る内容 | 注意点 |
|---|---|---|
| 新バー判定 | 毎ティック判定か、新バー判定か。 | 判定回数や重複発注に影響します。 |
| シグナル判定 | BUY / SELL / 見送りの判定。 | 見送り理由をログで追えるか確認します。 |
| フィルター | スプレッド、時間帯、最大ポジション数など。 | シグナル不成立とフィルター停止を分けます。 |
| 発注前チェック | ロット、証拠金、SL/TP距離。 | 注文前に止める理由を明確にします。 |
| 注文処理 | OrderSendまたはCTradeの呼び出し。 | retcodeとGetLastErrorを確認します。 |
inputと内部変数の読み方
MQL5 EAサンプルコードでは、inputとして設定値を定義することが多くあります。inputは、MT5のEA設定画面から利用者が変更できる値です。ロット、マジックナンバー、移動平均期間、RSI期間、スプレッド制限、SL/TP、通知ON/OFFなどがinputになることがあります。
一方で、内部変数はEAの実行中に変化する状態を保持します。たとえば、インジケーターハンドル、最終バー時刻、最終注文時刻、連続エラー回数、前回シグナル、ポジション数などです。input初期値と実行中の状態を混同しないことが重要です。
| 種類 | 例 | 読む時のポイント |
|---|---|---|
| input値 | InpLots、InpMagic、InpMAPeriod | 利用者が変更する前提の値か確認します。 |
| 内部状態 | ma_handle、last_bar_time、last_signal | どこで初期化され、どこで更新されるかを確認します。 |
| 固定値 | コード内の定数、enum、defineなど。 | 変更してよい値か、内部仕様かを分けます。 |
| 実行時の計算値 | 現在スプレッド、必要証拠金、インジ値。 | ログに出して確認できるかを見ます。 |
| 外部設定 | WebRequest URL、通知ON/OFF、CSV出力先。 | 機密情報をinputやログに出しすぎないようにします。 |
サンプルコードを改修する場合は、「inputとして利用者に出すべき値」と「内部固定にすべき値」を分けて考えます。すべてをinputにすると設定画面が複雑になります。一方で、運用で変更したい値を固定してしまうと使いにくくなります。
シグナル判定と発注処理を分けて読む
EAサンプルコードで特に重要なのは、シグナル判定と発注処理を分けて読むことです。シグナル判定は「買い候補・売り候補が出たか」を判断する処理です。発注処理は「実際に注文を送る」処理です。この2つを混同すると、不具合時に原因を追いにくくなります。
シグナルが出ていても、スプレッドが広い、証拠金が足りない、最大ポジション数に達している、取引時間外である、ロットが銘柄仕様に合っていない、といった理由で発注を止めることがあります。サンプルコードではこの確認が省略されることがあるため、実務用にする場合は補う必要があります。
| 責務 | 内容 | ログで確認したいこと |
|---|---|---|
| signal | BUY / SELL / 見送りを判定します。 | どの条件で候補が出たか。 |
| filter | スプレッド、時間帯、最大ポジション数などを確認します。 | どの条件で止めたか。 |
| precheck | ロット、証拠金、SL/TP距離、銘柄仕様を確認します。 | 発注直前に問題がないか。 |
| execution | OrderSendまたはCTradeで注文します。 | retcode、GetLastError、注文結果。 |
| risk | 最大ロット、最大損失、日次停止などを管理します。 | 停止条件に該当したか。 |
| exit | TP/SL、トレーリング、建値、時間決済を管理します。 | どの理由で決済したか。 |
OrderSendを使うサンプルコードの見方
OrderSendを使うサンプルコードでは、MqlTradeRequestとMqlTradeResultを確認します。MqlTradeRequestには、注文方向、銘柄、ロット、価格、SL/TP、Magic Number、注文タイプなどの要求内容を入れます。MqlTradeResultには、注文送信後の結果が入ります。
OrderSendのサンプルを見る時は、注文要求を作っている部分と、注文結果を確認している部分を分けて読みます。注文が失敗した場合、retcode、GetLastError、要求ロット、価格、SL/TP距離、銘柄仕様をログで確認できるかが重要です。
bool SendBuyOrder(double lots)
{
MqlTradeRequest request;
MqlTradeResult result;
ZeroMemory(request);
ZeroMemory(result);
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = lots;
request.type = ORDER_TYPE_BUY;
request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
request.magic = 123456;
bool ok = OrderSend(request, result);
PrintFormat("ORDER_SEND ok=%s retcode=%d last_error=%d lot=%.2f price=%.5f",
ok ? "true" : "false",
result.retcode,
GetLastError(),
lots,
request.price);
return ok;
}この例は、OrderSendを読むための簡略例です。実際には、発注前に最小ロット、最大ロット、ロットステップ、証拠金、SL/TP距離、スプレッド、取引可能状態などを確認する必要があります。また、retcodeの意味を確認し、失敗時の理由をログで追えるようにします。
| 見る場所 | 確認内容 | 注意点 |
|---|---|---|
request.action | 成行、指値、決済などの取引種別。 | 目的と合っているか確認します。 |
request.symbol | 注文対象の銘柄。 | チャート銘柄と対象銘柄が一致しているか確認します。 |
request.volume | 注文ロット。 | volume min / max / stepに合っているか確認します。 |
request.type | BUY / SELLなどの注文方向。 | シグナル方向と一致しているか確認します。 |
request.price | 発注価格。 | BUYはAsk、SELLはBidを使う場面が基本です。 |
request.magic | EA識別用のMagic Number。 | 他EAや手動ポジションと混同しないようにします。 |
result.retcode | 注文結果コード。 | 注文失敗時の中心的な確認項目です。 |
CTradeを使うサンプルコードの見方
CTradeは、MQL5標準ライブラリの取引クラスです。OrderSendを直接使うよりも、Buy、Sell、PositionCloseなどのメソッドで注文処理を整理しやすい場合があります。ただし、CTradeを使っていても、注文結果の確認は必要です。
CTradeのサンプルコードでは、CTradeオブジェクトの作成、Magic Number設定、Buy / Sellの呼び出し、ResultRetcodeの確認、ResultRetcodeDescriptionの確認を見ます。BuyやSellの戻り値だけで判断せず、取引サーバー側の結果も確認してください。
#include <Trade/Trade.mqh>
CTrade trade;
int OnInit()
{
trade.SetExpertMagicNumber(123456);
Print("INIT_OK CTrade ready");
return INIT_SUCCEEDED;
}
void TryBuy(double lots)
{
bool ok = trade.Buy(lots, _Symbol);
PrintFormat("CTRADE_BUY ok=%s retcode=%d desc=%s last_error=%d",
ok ? "true" : "false",
trade.ResultRetcode(),
trade.ResultRetcodeDescription(),
GetLastError());
}CTradeを使うとコードは読みやすくなりますが、発注前チェックが自動で十分に行われるわけではありません。ロット、証拠金、スプレッド、SL/TP距離、取引時間、最大ポジション数などは、EA側で確認する必要があります。
CopyBufferでインジケーター値を使うサンプルの見方
MQL5 EAでは、iMA、iRSI、iATR、iCustomなどでインジケーターハンドルを作成し、CopyBufferで値を取得する構成がよく使われます。EAサンプルコードでCopyBufferが出てきた場合は、ハンドル作成、BarsCalculated、CopyBufferの戻り値、配列方向、確定足の扱いを確認します。
CopyBufferの読み方で重要なのは、「値が0なのか」「値が取得できていないのか」を分けることです。CopyBufferに失敗しているのに配列の初期値を見て判断してしまうと、シグナル判定が誤ります。
int ma_handle = INVALID_HANDLE;
int OnInit()
{
ma_handle = iMA(_Symbol, PERIOD_CURRENT, 20, 0, MODE_SMA, PRICE_CLOSE);
if(ma_handle == INVALID_HANDLE)
{
PrintFormat("HANDLE_FAIL last_error=%d", GetLastError());
return INIT_FAILED;
}
PrintFormat("HANDLE_OK ma_handle=%d", ma_handle);
return INIT_SUCCEEDED;
}
bool GetMAValue(double &ma_value)
{
double buffer[];
ArraySetAsSeries(buffer, true);
int copied = CopyBuffer(ma_handle, 0, 1, 1, buffer);
if(copied != 1)
{
PrintFormat("COPYBUFFER_FAIL copied=%d last_error=%d", copied, GetLastError());
return false;
}
ma_value = buffer[0];
PrintFormat("MA_VALUE shift=1 value=%.5f", ma_value);
return true;
}| 確認項目 | 見る内容 | 注意点 |
|---|---|---|
| ハンドル作成 | iMA、iRSI、iATR、iCustomが有効なハンドルを返しているか。 | INVALID_HANDLEならOnInitで止める判断も必要です。 |
| BarsCalculated | 必要な計算本数が揃っているか。 | 起動直後やデータ不足では値が取れないことがあります。 |
| CopyBuffer戻り値 | 要求本数どおり取得できたか。 | 戻り値を確認せずに値だけ使わないようにします。 |
| 配列方向 | 現在足と過去足の位置関係。 | ArraySetAsSeriesの扱いを確認します。 |
| 確定足 | shift=0か、shift=1か。 | 現在足で判定するか確定足で判定するかを決めます。 |
| EMPTY_VALUE | インジケーターが無効値を返していないか。 | 矢印系インジやカスタムインジで重要です。 |
Magic Numberとポジション管理の見方
EAサンプルコードで注文処理を読む時は、Magic Numberとポジション管理を必ず確認します。Magic Numberは、EAごとにポジションを識別するために使われます。複数EA、複数チャート、手動ポジションが混在する場合、Magic Numberの扱いが曖昧だと誤決済や重複発注につながります。
サンプルコードでは、現在ポジションがあるかどうかだけを簡単に確認している場合があります。しかし実務では、銘柄、Magic Number、ポジション方向、チケット、コメント、保有数を分けて確認する必要があります。
| 確認項目 | 内容 | 注意点 |
|---|---|---|
| Magic Number | EAごとの識別番号。 | 他EAや手動ポジションと混同しないようにします。 |
| Symbol | 対象銘柄。 | 複数銘柄EAでは特に重要です。 |
| Position type | BUY / SELL。 | 反対方向のポジションを誤って扱わないようにします。 |
| Ticket | 個別ポジションや注文の識別番号。 | 決済対象の特定に使います。 |
| Position count | 保有数。 | 最大ポジション数や重複発注制御に関係します。 |
| Comment | 注文コメント。 | 識別補助に使えますが、完全依存は避けます。 |
ポジション管理のサンプルを読む時は、単に「ポジションがあるか」ではなく、「このEAが管理すべきポジションか」を確認しているかを見ます。Magic Number、銘柄、方向を確認せずに一括決済するコードは、他EAや手動ポジションへ影響する可能性があります。
ログ出力・PrintFormat・retcodeの確認
MQL5 EAサンプルコードを読む時は、ログ出力の有無を確認します。PrintやPrintFormatで処理の流れ、判定結果、発注前チェック、注文結果、エラー情報を出しているかを見ることで、不具合時に原因を追えるかどうかが分かります。
ログが「OK」「NG」だけでは、後から原因を追えません。シグナル不成立、スプレッド停止、ロット不正、証拠金不足、CopyBuffer失敗、OrderSend失敗、通知失敗などを分けて出すことが重要です。
| ログ対象 | 残したい内容 | 理由 |
|---|---|---|
| INIT | EA名、バージョン、主要input、ハンドル作成結果。 | 起動時の状態を確認するため。 |
| SIGNAL | BUY候補、SELL候補、見送り理由。 | シグナル不成立を追うため。 |
| FILTER | スプレッド、時間帯、最大ポジション数。 | 発注前に止めた理由を確認するため。 |
| PRECHECK | ロット、証拠金、SL/TP距離、銘柄仕様。 | 注文前の条件不備を確認するため。 |
| ORDER | 注文方向、ロット、価格、retcode、GetLastError。 | 注文結果を追うため。 |
| EXIT | 決済理由、対象チケット、決済結果。 | 決済の根拠を確認するため。 |
| EXTERNAL | 通知、WebRequest、CSV出力結果。 | 外部連携失敗を分けるため。 |
また、ログには出してはいけない情報もあります。Webhook URL、APIキー、認証トークン、口座番号、パスワードなどはログに出さないようにしてください。共有用ログでは、必要な技術情報だけを残し、機密情報はマスクします。
発注前チェックがあるか確認する
実務用EAでは、シグナルが出たからすぐ注文するのではなく、発注前チェックを行います。サンプルコードでは、説明を簡単にするために発注前チェックが省略されていることがあります。サンプルを実用化する場合は、必ず確認項目を追加してください。
| 発注前チェック | 確認内容 | 失敗時のログ例 |
|---|---|---|
| スプレッド | 現在スプレッドが許容範囲内か。 | ENTRY_BLOCK reason=SPREAD current=32 max=20 |
| ロット | 最小ロット、最大ロット、lot stepに合っているか。 | LOT_INVALID request=0.03 step=0.10 |
| 証拠金 | 必要証拠金を満たすか。 | MARGIN_BLOCK free=10000 required=12000 |
| SL/TP距離 | StopLevelやFreezeLevelに反していないか。 | STOPS_INVALID sl_distance=20 stop_level=50 |
| 取引可能状態 | 口座や銘柄が取引可能か。 | TRADE_DISABLED symbol=XAUUSD |
| 最大ポジション数 | 同一EAの保有数が上限以下か。 | POSITION_LIMIT current=3 max=3 |
発注前チェックがないサンプルコードは、学習用としては理解しやすい一方で、実際のEAとしては不足があります。EAが注文に失敗した時に、取引サーバー側のエラーだけでなく、EA側で事前に止めるべき条件がなかったかを確認してください。
バックテスト前に確認すること
サンプルコードを変更したら、すぐに実運用で使うのではなく、まずコンパイル、バックテスト、ログ確認を行います。コンパイルが通ることと、EAが想定どおり動くことは別です。さらに、バックテストで動くことと、実運用で同じ結果になることも別です。
バックテストでは、銘柄、時間足、期間、スプレッド、モデル、初期証拠金、setファイル、ログを記録してください。サンプルコードの変更前後を比較する場合は、同じ条件で比較しないと差分を判断できません。
- MetaEditorでコンパイルエラーと警告を確認する
- EAがExpertsフォルダに配置されているか確認する
- OnInitログで初期化成功を確認する
- Strategy Testerで銘柄・時間足・期間を固定する
- 使用したsetファイルを保存する
- 注文が出る理由と出ない理由をログで確認する
- OrderSendやCTradeのretcodeを確認する
- CopyBufferの戻り値を確認する
- バックテスト結果を将来成績保証として扱わない
サンプルコードを実運用向けに使う時の注意
サンプルコードを実運用向けに使う場合は、学習用の簡略部分を補う必要があります。特に、注文処理、決済処理、ログ、エラー処理、Magic Number、複数ポジション、外部連携、設定不正時の停止、バックテスト条件の記録は重要です。
また、サンプルコードには、特定の銘柄や時間足を前提にしているものがあります。USDJPYでは動いても、XAUUSDや指数、仮想通貨CFDなどでは、digits、point、スプレッド、StopLevel、lot stepが異なるため、同じ処理では不十分な場合があります。
| 追加確認 | 内容 | 理由 |
|---|---|---|
| 銘柄仕様 | digits、point、volume min / step、StopLevel。 | 銘柄差で注文失敗することがあるため。 |
| 複数ポジション | 最大保有数、同一方向、反対方向、Magic Number。 | 重複発注や誤決済を避けるため。 |
| 決済処理 | TP/SL、トレーリング、建値、時間決済。 | エントリーだけではEAとして不十分なため。 |
| ログ設計 | INIT、SIGNAL、FILTER、ORDER、EXIT。 | 不具合時に原因を追うため。 |
| 設定不正 | inputの範囲、ON/OFF、外部連携設定。 | 不正設定のまま動かさないため。 |
| 安全確認 | デモ環境、バックテスト、フォワード確認。 | いきなり実口座で動かさないため。 |
サンプルコードを開発依頼に使う時の整理
開発依頼を行う時に、参考サンプルコードがあると仕様確認が進めやすくなることがあります。ただし、サンプルコードだけを送って「これと同じように」と伝えるだけでは不十分です。どの部分を参考にしたいのか、どの部分を変えたいのか、どの機能を追加したいのかを分けて整理してください。
たとえば、OnTickの流れだけを参考にしたいのか、OrderSendの書き方を参考にしたいのか、CopyBufferでインジケーター値を取る部分を参考にしたいのかで、確認内容が変わります。開発依頼前には、ロジック、発注条件、決済条件、ログ、通知、バックテスト条件を整理しておくとよいです。
| 整理する情報 | 内容 | 理由 |
|---|---|---|
| 参考にしたい部分 | OnInit、OnTick、OrderSend、CopyBufferなど。 | 開発対象を明確にするため。 |
| 変更したい部分 | ロジック、フィルター、決済、表示、通知など。 | サンプルとの差分を整理するため。 |
| 対象環境 | MT5、銘柄、時間足、ブローカー、VPS。 | 動作条件を確認するため。 |
| setファイル | input設定。 | 検証条件を再現するため。 |
| ログ | Expertsログ、Journalログ、Testerログ。 | 不具合や動作確認に使うため。 |
| スクリーンショット | チャート、設定画面、エラー画面。 | 文章だけで伝わりにくい状態を補うため。 |
| 送らない情報 | 口座番号、パスワード、APIキー、Webhook URL。 | 機密情報を保護するため。 |
サンプルコードを読む時の実務チェック表
- このサンプルコードの目的を確認した
- EA用コードか、インジケーター用コードか確認した
- OnInitで何を初期化しているか確認した
- OnTickで毎ティック判定か新バー判定か確認した
- inputと内部変数の違いを確認した
- シグナル判定と発注処理が分かれているか確認した
- OrderSendまたはCTradeの結果確認があるか確認した
- retcodeとGetLastErrorをログに出しているか確認した
- CopyBufferの戻り値を確認しているか確認した
- Magic Numberと対象ポジションの範囲を確認した
- 発注前チェックがあるか確認した
- バックテスト条件とsetファイルを保存した
- 口座情報、Webhook URL、APIキーなどをログに出していないか確認した
よくある質問
MQL5 EAサンプルコードはそのまま使えますか?
学習用サンプルは、そのまま実運用へ使う前提ではない場合があります。発注前チェック、ログ、エラー処理、Magic Number、証拠金、SL/TP距離、バックテスト条件を確認し、デモ環境やStrategy Testerで動作確認してください。
OnInitとOnTickは何が違いますか?
OnInitはEAの起動時に初期化を行う処理です。OnTickは価格更新ごとに呼ばれる処理です。OnInitでは設定確認やハンドル作成、OnTickではシグナル判定や発注前チェックを行うことが多くなります。
OrderSendとCTradeはどちらを読めばよいですか?
どちらも確認する価値があります。OrderSendはMqlTradeRequestとMqlTradeResultを直接確認しやすく、CTradeは標準ライブラリを使って注文処理を整理しやすい方法です。どちらでもretcodeやGetLastErrorの確認は重要です。
CopyBufferのサンプルでは何を確認すべきですか?
ハンドル作成、BarsCalculated、CopyBufferの戻り値、配列方向、確定足、EMPTY_VALUEを確認してください。値が0なのか、取得に失敗しているのかを分けてログで確認することが重要です。
サンプルコードを改修依頼に使う場合は何を送ればよいですか?
参考にしたいコード、変更したい内容、対象銘柄、時間足、setファイル、Expertsログ、Journalログ、スクリーンショット、再現手順を整理してください。口座番号、パスワード、APIキー、Webhook URLなどの実値は送らないようにしてください。
ex5ファイルだけでもサンプルとして読めますか?
通常、ex5ファイルはコンパイル済みの実行用ファイルであり、ソースコードとして読むことはできません。コードの読み方や改修を行うには、mq5ファイルや関連するmqhファイルが必要です。
関連ページ
MQL5 EAサンプルコードを読む時は、開発環境、ログ確認、EA設計、注文処理、CTrade、CopyBuffer、バックテスト、開発依頼前資料を分けて確認すると、理解しやすくなります。
| 確認したい内容 | 関連ページ |
|---|---|
| MQL5開発環境を確認する | MQL5開発入門 |
| ログ確認とデバッグを確認する | MQL5デバッグ・ログファースト開発完全ガイド |
| EA自作前の整理を確認する | 自動売買EAを自作する前に確認すること |
| バックテストと最適化を確認する | MT5ストラテジーテスター・最適化完全ガイド |
| EA設計の責務分離を確認する | MQL5 EA設計パターン完全ガイド |
| 注文・ポジション・履歴管理を確認する | MQL5注文・ポジション・履歴管理完全ガイド |
| CTradeを使った注文処理を確認する | MQL5標準ライブラリ・CTrade完全ガイド |
| インジケーター開発とEA連携を確認する | MQL5インジケーター開発・EA連携完全ガイド |
| CopyBufferの基本を確認する | MQL5でインジケーター値をEAに取り込む方法 |
| 時系列データと価格取得を確認する | MQL5時系列データ・価格取得完全ガイド |
| CSVログ出力を確認する | MQL5ファイル操作・CSVログ出力完全ガイド |
| MQL5関数を確認する | MQL5関数辞典 |
| 開発依頼前に用意する資料を確認する | MT5開発依頼前に用意する資料まとめ |
| 開発・改修相談の入口を確認する | 開発・改修の相談ページ |
まとめ
MQL5 EAサンプルコードを読む時は、OnInit、OnTick、OnDeinit、input、グローバル変数、補助関数、注文処理、インジケーター値取得、ログ出力を分けて確認することが重要です。サンプルコードは学習の入口として有効ですが、実運用や開発依頼に使う場合は、発注前チェック、ログ、エラー処理、バックテスト条件を補う必要があります。
OrderSendを使うコードではMqlTradeRequestとMqlTradeResultを確認し、CTradeを使うコードではResultRetcodeやResultRetcodeDescriptionを確認します。CopyBufferを使うコードでは、ハンドル作成、戻り値、配列方向、確定足を確認してください。
サンプルコードを参考にEAを作る場合でも、いきなり実口座で動かさず、まずMetaEditorでコンパイルし、Strategy Testerやデモ環境で動作確認を行ってください。開発依頼へ進む場合は、参考にしたいコード、変更したい内容、setファイル、ログ、スクリーンショットを整理し、口座情報や認証情報は共有しないようにしてください。
