【MQL4】ChatGPTでFX自動売買(EA)は作れる?自作コードの修正点とバックテスト手順を徹底解説
【保存版】ChatGPTでFX自動売買(EA)は自作できる?初心者がハマる罠とエラー修正術をプロが完全解説
0. この記事のまとめ(忙しい方向け)
- ChatGPTを使えば、EAの「設計図」は数秒で作れる。
- ただし、そのままでは「エラーで動かない」「注文が止まらない」バグが必ず含まれる。
- 本記事では、初心者が絶対につまずく「名前の重複」や「無限注文」の直し方を徹底解説。
- 記事後半に、そのままコピーして使える「完全修正済みコード」を掲載!
1. 導入:AIでEA開発はどこまで可能なのか?
こんにちは!「はかせのFX自動売買研究所」のはかせです。
「Google検索の時代は終わる」とまで言わしめた生成AI、ChatGPT。このAI의 驚異的な言語能力は、日常会話だけでなく「プログラミング開発」の世界でも革命を起こしています。
そこで今回は、多くのトレーダーが気になっている以下の疑問に、エンジニア視点で答えていきます。
「ChatGPTを使って、FXの自動売買(EA)は自作できるのか?」
結論から言うと、「作れます。ただし、人間の手による修正(と少しの知識)が必須」です。
この記事では、ChatGPTに実際にコードを書かせ、発生したエラーを修正し、まともに動くEAに仕上げるまでの全工程を完全解説します。
- ChatGPTを使ってEAを作ってみたい
- プログラミング(MQL4)の勉強を始めたい
- AIが書くコードの実力を知りたい
そんな方にピッタリの内容になっていますので、ぜひ最後までご覧ください。
2. そもそもどんな「動き」をするコードを作るのか?
今回、ChatGPTに作ってもらったのは、FXの王道手法「移動平均線(MA)のクロス」を利用したEAです。
移動平均線クロス戦略の仕組み
- 買いの合図(ゴールデンクロス): 短期の線が、長期の線を「下から上」へ突き抜けた瞬間。「上昇トレンド開始」と見て買います。
- 売りの合図(デッドクロス): 短期の線が、長期の線を「上から下」へ突き抜けた瞬間。「下落トレンド開始」と見て売ります。
- 自動決済: 決めた利益が出たら「利確」、損が出たら「損切り」を自動で行います。
3. 【閲覧注意】ChatGPTが最初に出した「NGコード」
まずは、ChatGPTが最初に出力した、そのままでは絶対に動かない・使ってはいけないコードです。これをMetaEditor(MT4の編集ソフト)に貼り付けるとどうなるか、見てみましょう。
// 【NG例】ChatGPTが最初に出力した、バグだらけのコード extern int FastMA = 50; extern int SlowMA = 200; extern double Lots = 0.1; extern int TakeProfit = 50; // ← ミス1:50pipsのつもりが5pipsになる extern int StopLoss = 20; // ← ミス2:20pipsのつもりが2pipsになる int ticket = 0; int start(){ double FastMAValue = iMA(NULL, 0, FastMA, 0, MODE_EMA, PRICE_CLOSE, 0); double SlowMAValue = iMA(NULL, 0, SlowMA, 0, MODE_EMA, PRICE_CLOSE, 0); // ミス3:二重注文を防止する機能がなく、注文を「連打」してしまう if(FastMAValue > SlowMAValue && ticket == 0) { ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Bid-StopLoss*Point, Bid+TakeProfit*Point, "Buy", 0, 0, Green); } // ミス4:変数の作り方を間違えていて、ここでビルドエラーが出る if(OrderType() == OP_BUY) { bool closeOrder = OrderClose(ticket, Lots, Bid, 3, Green); } else if(OrderType() == OP_SELL) { bool closeOrder = OrderClose(ticket, Lots, Ask, 3, Red); // ←ここでエラー! } return(0); }
4. プロが教える「5つの致命的なバグ」と解決策
初心者の方が必ずつまずくポイントを、世界一わかりやすく解説します。
① ビルドエラー:変数の重複(名前の重複)
MetaEditorで 「variable already defined」 というエラーが出ます。
- 原因: プログラミングでは、データを保存する場所を「引き出し(変数)」として作ります。ChatGPTは、bool(新しく引き出しを作るぞ!という命令)を何度も使い、「全く同じ名前の引き出しを2つ作れ!」という命令を出してしまったのです。
- 直し方: 最初に1回だけ引き出しを用意し、2回目以降は「その引き出しを使い回す」ように、「bool」を消して名前だけを使います。
② 動作バグ:悪夢の「無限エントリー」
バックテストをすると、チャートが注文の矢印で埋め尽くされるバグです。
- 原因: 「クロスした瞬間」ではなく「クロスしている間」はずっと注文しろ!という命令になっているため、価格が1ミリ動くたびに、「ボタンを連打」するように注文を出し続けてしまいます。
- 直し方: 「すでに注文を1つ持っているなら、もう買わないよ」という見守り役のコードを追加します。
③ 「名札(マジックナンバー)」の欠如
- 原因: ロボットに 「自分の注文には名札(番号)をつけなさい」 と教えていない状態です。
- 直し方: これがないと、スマホでの手動トレードまでロボットが勝手に決済してしまいます。コードに 「EA専用の番号(MagicNumber)」 を指定します。
④ 「Point(ポイント)」の単位ミス
- 原因: AIは 「50=50pips」 だと思い込みますが、実際は 5pips と判断されます。
- 直し方: 意図した通りに動かすため、設定数値を 「10倍(500)」 に修正する必要があります。
⑤ 安全確認(OrderSelect)の不足
- 原因: 注文が成功したかを確認せずに次の処理に進む 「お祈りトレード」 状態のコードです。
- 直し方: 注文の情報を取得できたかを 「必ず確認してから次へ進む」 という慎重なコードに書き換えます。
5. 【初心者向け】徹底比較:どこをどう直したのか?
- 名前の重複
[Before] 同じ名前を2回作ってエラーが出る
[After] 最初に1つだけ用意し、それを使い回すようにした - 注文の連打
[Before] 1秒間に何十回も注文ボタンを押してしまう
[After] 「今はもう持ってるから、次まで待とう」と判断力をつけた - 単位ミス
[Before] 50 と設定(実は 5pips )
[After] 500 と設定(これで50pips)
6. 初心者向け:EAをMT4に導入する3ステップ
- MetaEditorを開く: MT4の上部にある「黄色い本のアイコン」をクリック。
- 新規作成: 「新規作成」から「エキスパートアドバイザ」を選択。
- 貼り付けとビルド: 最初から入っている文字を全部消して、下記の「完成版コード」を貼り付け。上部の 「コンパイル」 ボタンを押す。
※下の枠に「0 errors, 0 warnings」と出れば成功です!
7. 【完全完成版】コピペOK!修正済みソースコード
すべてのエラーを解消し、誰でも使えるように調整した「完全版」です。
//+------------------------------------------------------------------+
//| ChatGPT_Optimized_EA.mq4 |
//| はかせのFX自動売買研究所 |
//+------------------------------------------------------------------+
#property strict
//--- 設定画面で変更できる項目
input int FastMA = 50; // 短期移動平均線(50日)
input int SlowMA = 200; // 長期移動平均線(200日)
input double Lots = 0.1; // 取引量(ロット)
input int TakeProfit = 500; // 利益確定幅 (500=50pips)
input int StopLoss = 200; // 損切り幅 (200=20pips)
input int MagicNumber = 12345; // このEA専用の管理番号(名札)
int ticket = 0;
int OnInit() { return(INIT_SUCCEEDED); }
void OnTick()
{
// 1. 移動平均線の計算
double FastMAValue = iMA(NULL, 0, FastMA, 0, MODE_EMA, PRICE_CLOSE, 0);
double SlowMAValue = iMA(NULL, 0, SlowMA, 0, MODE_EMA, PRICE_CLOSE, 0);
// 2. 「引き出し(変数)」を準備
bool hasPosition = false;
// 3. すでに注文を持っていないかチェック(無限連打防止!)
for(int i = OrdersTotal() - 1; i >= 0; i--) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
// 同じ番号(名札)の注文があるか確認
if(OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) {
hasPosition = true; // すでに持っているので新しくは買わない
break;
}
}
}
// 4. 新規注文を出す判定
if(!hasPosition) {
if(FastMAValue > SlowMAValue) { // ゴールデンクロス(買い)
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3,
Bid - StopLoss * Point,
Bid + TakeProfit * Point, "EA_Buy", MagicNumber, 0, clrGreen);
}
else if(FastMAValue < SlowMAValue) { // デッドクロス(売り)
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 3,
Ask + StopLoss * Point,
Ask - TakeProfit * Point, "EA_Sell", MagicNumber, 0, clrRed);
}
}
}
8. まとめ:AIを「最高の助手」にするために
ChatGPTはEA開発の「時間を短縮してくれる魔法の杖」ですが、最後はあなたの手による 「仕上げ」 が必要です。
- AIのコードは必ず「修正が必要」だと疑う
- 今回解説した「名前の重複」や「無限注文」は特に出やすいバグだと知っておく
- 必ずデモ口座(バックテスト)で動きを確認してから使う
このステップを繰り返せば、プログラミング未経験のあなたでも、自分だけの最強EAを作り上げることができます。AIを賢く使いこなし、自由なトレードライフを手に入れましょう!
さらに動画で詳しく学びたい方はこちら
(YouTubeリンク:現在準備中)

コメント
この記事へのコメントはありません。
この記事へのトラックバックはありません。