【2025.07.11】重要な経済指標はありません。

ChatGPTを使ってEAを作ってみたら普通に作れてヤバすぎた!

記事内に商品プロモーションを含む場合があります
スポンサーリンク

EAを作りたいけどプログラミングがわからない。そんな悩みを解決してくれるのが、いま話題の「ChatGPT」。AIに指示を出すだけで、あなた専用の自動売買システムが作れるかもしれません。本記事ではChatGPTを使ったEA作成の基本から注意点まで、初心者にもわかりやすく紹介します。

ChatGPTでEAを作れるのか?

私は(AIは使わずに)EAを開発しているプログラマーですが、ChatGPTでEAが作れるかどうかを定期的に試しています。

2025年現在、ChatGPT(無料版)を使ってFXで自動売買をしてくれるEAって作れるの!?

率直な疑問だと思います。

結論としては、プログラミング能力が無くてもEAは作れちゃう!

のですが!果たしてどんな感じに作れるのか?EA作成初心者の方でもわかるよう解説していますので興味のある方は参考にしてみてください。

ChatGPTを理解して、使えるようにする

まずは、ChatGPTについて軽く理解していきましょう。

ChatGPTとは、大量のテキストを学習し、その学習結果を元に自然言語処理を行うAIです。ChatGPTを使ってEAを作成する場合、トレードに関する情報をChatGPTに入力し、応答が返ってきた結果を組み立てていきます。

アプリなどではなく、ブラウザで起動しますのでインストール等は不要です。

ChatGPTを使う方法

ChatGPTの公式から簡単な登録で利用可能になります。以下に解説していきます。

特にアカウント登録などはしなくてもEAの作成は可能です。

あとは赤枠の所に聞きたい事を入力していきます。聞きたい事を入力したら、右側上矢印ボタンをクリックします。

するとChatGPTが応答してくれます。

凄いですね!聞いたら何でも答えてくれます!

EAも作れるそうですが、得意という感じではなさそうですね。

ともかく、この機能を利用してEAを作っていきましょう。

スポンサーリンク

ChatGPTでEA作成する手順

では、早速ChatGPTにEAを作ってもらいましょう!1年前(2024年)はほどよくポンコツでしたが2025年はどうでしょうか!

まず、大前提としてChatGPTでEAを作るにはこの単語が必須です。

『MQL4』

これはどういう事かというと、EAはMQL4というプログラミング言語を使っていますのでこの『MQL4』という単語が必要です。この単語を含めるだけでChatGPTは「あ、EAが作りたいんだな」とこちらの要求を瞬時に理解してくれます。

実際のやりとりです。

わたし
わたし

MQL4で移動平均線を使ったプログラムを組んでください

すると、速攻でプログラムを組んでくれました。驚きです!

ChatGPT
ChatGPT

了解です!MQL4でシンプルに移動平均線(SMA)を使って売買シグナルを出す基本的なサンプルコードを作成します。

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   Print("Simple MA crossover EA started.");
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Print("EA stopped.");
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   // 期間20の単純移動平均線の現在値(最新足の終値ベース)
   double ma = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);

   // 1つ前のバーの終値
   double prevClose = Close[1];

   // 現在のバーの終値
   double currentClose = Close[0];

   // ポジション確認
   int totalPositions = OrdersTotal();
   bool hasLong = false;
   bool hasShort = false;

   for(int i=0; i < totalPositions; i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == 12345)
         {
            if(OrderType() == OP_BUY) hasLong = true;
            if(OrderType() == OP_SELL) hasShort = true;
         }
      }
   }

   // 売買判断

   // ロング条件:1つ前のクローズがMAより下で、現在のクローズがMAを上回ったとき
   if(prevClose < ma && currentClose > ma)
   {
      // もしショートポジションあれば決済
      if(hasShort) ClosePositions(OP_SELL);

      // ロングポジションが無ければエントリー
      if(!hasLong) OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "MA Cross Buy", 12345, 0, Green);
   }
   // ショート条件:1つ前のクローズがMAより上で、現在のクローズがMAを下回ったとき
   else if(prevClose > ma && currentClose < ma)
   {
      // ロングポジションあれば決済
      if(hasLong) ClosePositions(OP_BUY);

      // ショートポジションが無ければエントリー
      if(!hasShort) OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, 0, 0, "MA Cross Sell", 12345, 0, Red);
   }
}

//+------------------------------------------------------------------+
//| 指定タイプのポジションをすべて決済する関数                     |
//+------------------------------------------------------------------+
void ClosePositions(int type)
{
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == 12345 && OrderType() == type)
         {
            bool result;
            if(type == OP_BUY)
               result = OrderClose(OrderTicket(), OrderLots(), Bid, 3, Red);
            else if(type == OP_SELL)
               result = OrderClose(OrderTicket(), OrderLots(), Ask, 3, Green);

            if(result)
               Print("ポジション", OrderTicket(), "を決済しました。");
            else
               Print("ポジション決済に失敗しました。エラーコード:", GetLastError());
         }
      }
   }
}

ちゃんとしたプログラムが出力されました!!1年前に同じ質問をしたときはまったくエントリーしてくれないコードでしたが今回はしっかりエントリーもしてくれるちゃんとしたEAです!

このコードをEA化するにはコンパイルが必要なので、早速コンパイルしてみると・・・

ちゃんとコンパイルできました!!注意メッセージが出ていますがこれは、新規注文した際に結果をちゃんとチェックしましょうという注意メッセージなので特に今回修正は不要です。

コンパイルの仕方が分からない方はこちら↓

数時間程使い込みましたが、かなり精度の高いコードが返ってきます。稀にコンパイルエラーになる事もあるのでコンパイルしてエラーが無い事を確認しながらEAを作っていきましょう、

スポンサーリンク

どういった物が作れたのか

先ほどChatGPTが出力してくれたソースコードを確認してみます。普段EAを自作している私から見てもかなりいい感じのソースコードです。

 // 期間20の単純移動平均線の現在値(最新足の終値ベース)
   double ma = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);

で単純移動平均線(20)の値をしっかり参照していますね!

   for(int i=0; i < totalPositions; i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == 12345)
         {
            if(OrderType() == OP_BUY) hasLong = true;
            if(OrderType() == OP_SELL) hasShort = true;
         }
      }
   }

ここではポジションがあるかどうかをチェックしています。マジックナンバーが固定で12345なのが気になりますが、まずまず正常なコードです。ただ、決済処理も追加されており逆ポジションを持った際に勝手に決済してしまっています。

結論として、エントリー処理は正しいが決済処理はChatGPTが勝手に作っちゃった!

そもそも私がChatGPTに伝えた、これ

わたし
わたし

MQL4で移動平均線を使ったプログラムを組んでください

非常に曖昧な内容にも関わらずChatGPTはよくここまでEAを作ってくれたと思います。というわけで、

ChatGPTへの質問は、正しく明確な内容で伝える必要がある!

では、どう伝えたらいいのか次の章で確認していきましょう。

売り買いするEAを作ってもらう

では、気を取り直して『移動平均線を使ったプログラムを組んで』と伝えた内容をもう少し詳しくしてみます。

MQL4で移動平均線を使ってエントリーし、20pipsで利確と損切りをするプログラムを組んでください

ChatGPT
ChatGPT

以下に、MQL4で移動平均線(SMA)を使って売買し、20pipsで利確と損切りを行うシンプルなEAのコードを紹介します。

#property strict

//+------------------------------------------------------------------+
//| Expert initialization                                            |
//+------------------------------------------------------------------+
int OnInit()
{
   Print("MAエントリーEA起動しました。");
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   double ma = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);  // 1本前のMA20
   double prevClose = Close[2];  // 2本前の終値
   double currentClose = Close[1];  // 1本前の終値

   double slippage = 3;
   double lotSize = 0.1;
   int magic = 123456;

   double point = MarketInfo(Symbol(), MODE_POINT);
   double pip = (Digits == 3 || Digits == 5) ? point * 10 : point;
   double tp = 20 * pip;
   double sl = 20 * pip;

   // ポジションがないときだけエントリー
   if (OrdersTotal() == 0)
   {
      // 買いシグナル:終値がMAを上抜けた
      if (prevClose < ma && currentClose > ma)
      {
         double price = Ask;
         double takeProfit = price + tp;
         double stopLoss = price - sl;

         OrderSend(Symbol(), OP_BUY, lotSize, price, slippage, stopLoss, takeProfit, "Buy Order", magic, 0, clrBlue);
      }

      // 売りシグナル:終値がMAを下抜けた
      else if (prevClose > ma && currentClose < ma)
      {
         double price = Bid;
         double takeProfit = price - tp;
         double stopLoss = price + sl;

         OrderSend(Symbol(), OP_SELL, lotSize, price, slippage, stopLoss, takeProfit, "Sell Order", magic, 0, clrRed);
      }
   }
}

またまたエラーの無いコードを出力してくれました!そしてちゃんと『tp = 20 * pip』と20pipsで利確設定をしてくれている事がわかります。

出力されたソースコードでエントリーしてくれるかどうかをてっとり早く判断したいときは、ソースコード中に「OrderSend」という単語があるかどうかを確認しましょう!

おー、簡単に売買してくれるEAを作ってくれた!

もうプログラマーいらないんじゃ・・・!?』と思わせてくれるような進歩です。

スポンサーリンク

プロンプト設計のコツ

これまでの流れから、自分の思った通りのEAを作るにはこちらから質問する内容(プロンプト)がとても重要です。

具体的なワード指定で精度UP

私が先に質問した内容と、後から質問した内容を比較してみましょう。

先:『MQL4で移動平均線を使ったプログラムを組んでください』
後:『MQL4で移動平均線を使ってエントリーし、20pipsで利確と損切りをするプログラムを組んでください』

後のように『エントリー』『利確』『損切り』という単語をいれてあげる事でChatGPTは自動でエントリー・決済をするEAを作ってくれます。

『利確』『損切り』の単語を入れないバージョンも試しましたが、この場合はエントリーしっぱなしで決済しないEAが出来てしまうので、しっかりどうしたいのかを伝える事が重要ですね!

以下にプロンプト例を紹介します。こんな感じで簡単なプロンプトでもしっかりとEAを作ってくれますので、『pips』や『利確』や『損切り』等の文言を意識しましょう!

プロンプト例
  • 「MQL4で、20pipsごとにナンピンエントリーするロジックを含んだEAを作ってください。最大ナンピン回数は3回でお願いします。」
  • 「MQL4で、20EMAより上にローソク足があるときに買いエントリーするEAを作ってください。」
  • 「MQL4で、50pipsの利確と30pipsの損切りを設定したEAを作ってください。」
  • 「MQL4で、口座番号12345678のときだけ動作するEAを作ってください。」

複数回の対話で完成度を高める

ChatGPTでEAを作る際、一度のプロンプトで完璧なコードが生成されることは稀です。特にロジックが複雑な場合や、自分の意図をうまく伝えきれなかった場合、期待通りの出力が得られないことがあります。

そんなときは、一度のやり取りで完結させようとせず、何度か対話を繰り返して微調整するのがコツです。

例えば、

  • 「このロジックでは利確・損切りが入っていないので追加して」
  • 「ポジションが既にあるときは新規エントリーしないようにして」
  • 「現在価格から20pips以上離れていたらエントリーしない条件を加えて」

など、具体的な修正指示を少しずつ伝えていくことで、理想のコードに近づけていけます

ChatGPTは一度のプロンプトにすべての要望を盛り込むよりも、段階的なやりとりの方が精度の高い出力が得られやすいため、対話ベースで調整していく姿勢が大切です。

✅ 例:トレンドフォロー型のロングエントリーEAを作りたい場合

① 最初のプロンプト(基本設計)

移動平均線を使ったトレンドフォローのEAをMQL4で作ってください。  
条件は、EMA20がEMA50を上抜けたらロングエントリー、決済はTP30pips、SL20pipsです。

ChatGPTが基本的なEAコードを生成してくれます。


② 修正の依頼(具体化)

このコードに、1つのポジションしか持たないようにしてください。  
また、前回のポジション決済後に3分以上経ってから次のエントリーを許可するようにしてください。

→ ChatGPTはエントリー条件に時間制限や保有中のチェックを追加します。


③ 条件の追加(実戦向け)

現在価格とエントリー価格の差が20pips以上ある場合は、エントリーを見送るようにしてください。

→ より現実的なロジックに近づけていきます。


✅ このように段階的に伝えていくことで…

  • ロジックの誤解を防げる
  • 不要なコードを減らせる
  • 自分の意図とマッチしたEAができる

というメリットがあります。

スポンサーリンク

ChatGPT活用に必要なプログラミング知識

上記の事から、プログラミング基礎知識は付けずとりあえずChatGPTに質問してEAを作る事も可能ですが、かなり効率が悪いです。プログラミングを少し学ぶだけで時短になります。

この機会にプログラミングの基礎知識について学びたい方は、以下の記事で1から解説していますので参考にしてください!

プログラミング知識なしにEAを作るのであれば「EAつくーる」もオススメです

まとめと今後の展望

以上、『ChatGPTを使ってEAを作ったらヤバすぎた』でした。

今回は移動平均線を使ったEAでしたが、他にもストキャスティクス等のEAも作ってみるとちゃんと作ってくれました。ChatGPTに質問する際にさらに色んな単語を付けるともっと面白いEAを作ってくれたりすると思います。

ChatGPTだけでEAを作るには、繰り返し繰り返しプロンプトを調整しながら質問しコンパイルエラーが無いソースコード、しっかりトレードしてくれるソースコードになるまで質問し続けることが必要です。でも、少しだけプログラミング能力があれば繰り返しの数はめちゃくちゃ減りますので軽くプログラミング能力を身につけるのもオススメです。

今回は触れていませんが、取扱説明書レベルのプロンプトを作成して質問するという手段もありますが、長文のプロンプトを使うのはChatGPTでプログラムやEAをたくさん作った後(慣れた後)でいいと思います。

とはいえ、プログラムの修正なしにトレードしてくれるEAが作れたのは凄いですね!この1年での成長を見ると近い将来プログラマーがいなくてもEAに限らず色々なシステムが組める日が訪れるのではないかと思ってしまいました。時代の進歩を感じます。

それでは、皆さんも色々質問して良いEAを作ってくださいね!


※ EAのサンプルソース一覧表へ

コメント