ChatGPTを使ってEAを作ったらヤバすぎた

EA
スポンサーリンク

概要

テキストを自動生成してくれるChatGPTが今話題ですが、プログラミングもできちゃうという事でEAが作れるかどうか試してみました。

結論。え、これ凄い簡単にEA作れちゃうよ!

果たしてどんな感じに作れるのか?興味のある方は参考にしてみてください。

早速EAを作ってみる

早速ChatGPTに以下の内容で尋ねてみました。

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

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

実際のChatGPTとのやりとり画面はこちら。

早速メタエディターに貼り付けてコンパイルできるかどうか確認してみると・・・。

エラーが出ました。答えてくれたコードをそのまま張り付けると、エラーがでるようです。

4時間程使い込みましたが、わりとエラーが出るソースコードが返ってきます。プログラミングの基礎知識が少しは必要そうです。

ChatGPTが答えてくれたコードには、定型文(property strictやらOnInitとか)が無かったので、メタエディターで新規生成して、OnTick()の所にChatGPTが答えてくれたコードを貼り付けるとエラーは出なくなりました。

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

ソースコードを見た感じ、5分足と15分足の移動平均線のクロスオーバーが発生した場合に、買い注文を出すか、ポジションをクローズするようなコードを組んでくれています。

ソースコード

OnTick()の所にChatGPTが答えてくれたコードを貼り付けたソースコードです

//+------------------------------------------------------------------+
//|                                                   ChatGPT_MA.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
double ma_fast, ma_slow;

void OnTick()
{
   ma_fast = iMA(NULL, PERIOD_M5, 5, 0, MODE_SMA, PRICE_CLOSE, 0); // 5分足の移動平均線を計算
   ma_slow = iMA(NULL, PERIOD_M15, 15, 0, MODE_SMA, PRICE_CLOSE, 0); // 15分足の移動平均線を計算
   
   if(ma_fast > ma_slow && OrdersTotal() == 0) // 5分足の移動平均線が15分足の移動平均線を上抜けかつポジションがない場合
   {
      int ticket = OrderSend("USDJPY", OP_BUY, 0.1, Ask, 3, 0, 0, "Buy USDJPY", 0, 0, Green); // 買い注文を出す
      
      if(ticket > 0) // 注文が正常に出された場合
      {
         Print("Buy order placed at ", Ask); // 注文の情報を表示
      }
      else // 注文が出せなかった場合
      {
         Print("Error placing buy order: ", GetLastError()); // エラーの情報を表示
      }
   }
   else if(ma_fast < ma_slow && OrdersTotal() > 0) // 5分足の移動平均線が15分足の移動平均線を下抜けかつポジションがある場合
   {
      for(int i = OrdersTotal() - 1; i >= 0; i--) // 全てのポジションをクローズする
      {
         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
         int ticket = OrderClose(OrderTicket(), OrderLots(), Bid, 3, Red); // 指定されたポジションをクローズする
         
         if(ticket > 0) // 注文が正常に出された場合
         {
            Print("Sell order placed at ", Bid); // 注文の情報を表示
         }
         else // 注文が出せなかった場合
         {
            Print("Error closing order: ", GetLastError()); // エラーの情報を表示
         }
      }
   }
}

//+------------------------------------------------------------------+

バックテスト結果

このコードでコンパイルをして、実際にバックテストをして結果を見るとこんな感じ。

おー、良いEAを作ってくれた!

もうプログラマーいらないんじゃ・・・!?』

いやいや、冒頭でも記載した通りこのEAでは売り注文はしてくれていません。プログラマーはそういった部分も作れるのでプログラマーの需要はまだまだあるはず!

え、売り買いのEAももしかして作れちゃう・・・?

売りの注文もして欲しい

こうなってくると売り注文もしてくれるソースコードを作ってくれないかなとChatGPTに尋ねてみました。

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

売りと買いのプログラムを組んでくれた!?

実際のChatGPTとのやりとり画面はこちら。

ただ、ソースコードを見ると先ほどと同じ買いだけのソースコードでした。

『売りのプログラムを作って』というと売りだけのEAは作ってくれるのですが、どうやら売りと買いを組み合わせたEAは作ってくれないようです。

※さらに色々試すと売り買いまで作ってくれる方法もみつけました

今回は、ChatGPTが書いてくれた売りと買いプログラムを私が組み合わせて、EAを自前で作ってみました。

ソースコード

//+------------------------------------------------------------------+
//|                                                   ChatGPT_MA.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
double ma_fast, ma_slow;

void OnTick()
{
   ma_fast = iMA(NULL, PERIOD_M5, 5, 0, MODE_SMA, PRICE_CLOSE, 0); // 5分足の移動平均線を計算
   ma_slow = iMA(NULL, PERIOD_M15, 15, 0, MODE_SMA, PRICE_CLOSE, 0); // 15分足の移動平均線を計算


   bool OrderKekka = OrderSelect(0,SELECT_BY_POS,MODE_TRADES);

   if(ma_fast > ma_slow && OrdersTotal() == 0) // 5分足の移動平均線が15分足の移動平均線を上抜けかつポジションがない場合
   {
      int ticket = OrderSend("USDJPY", OP_BUY, 0.1, Ask, 3, 0, 0, "Buy USDJPY", 0, 0, Green); // 買い注文を出す
      
      if(ticket > 0) // 注文が正常に出された場合
      {
         Print("Buy order placed at ", Ask); // 注文の情報を表示
      }
      else // 注文が出せなかった場合
      {
         Print("Error placing buy order: ", GetLastError()); // エラーの情報を表示
      }
   }
   else if(ma_fast < ma_slow && OrdersTotal() > 0 &&OrderType()==OP_BUY) // 5分足の移動平均線が15分足の移動平均線を下抜けかつポジションがある場合
   {
      for(int i = OrdersTotal() - 1; i >= 0; i--) // 全てのポジションをクローズする
      {
         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
         int ticket = OrderClose(OrderTicket(), OrderLots(), Bid, 3, Red); // 指定されたポジションをクローズする
         
         if(ticket > 0) // 注文が正常に出された場合
         {
            Print("Sell order placed at ", Bid); // 注文の情報を表示
         }
         else // 注文が出せなかった場合
         {
            Print("Error closing order: ", GetLastError()); // エラーの情報を表示
         }
      }
   }
   
   if(ma_fast < ma_slow && OrdersTotal() == 0) // 5分足の移動平均線が15分足の移動平均線を下抜けかつポジションがない場合
   {
      int ticket = OrderSend("USDJPY", OP_SELL, 0.1, Bid, 3, 0, 0, "Sell USDJPY", 0, 0, Red); // 売り注文を出す
      
      if(ticket > 0) // 注文が正常に出された場合
      {
         Print("Sell order placed at ", Bid); // 注文の情報を表示
      }
      else // 注文が出せなかった場合
      {
         Print("Error placing sell order: ", GetLastError()); // エラーの情報を表示
      }
   }
   else if(ma_fast > ma_slow && OrdersTotal() > 0 &&OrderType()==OP_SELL) // 5分足の移動平均線が15分足の移動平均線を上抜けかつポジションがある場合
   {
      for(int i = OrdersTotal() - 1; i >= 0; i--) // 全てのポジションをクローズする
      {
         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
         int ticket = OrderClose(OrderTicket(), OrderLots(), Ask, 3, Green); // 指定されたポジションをクローズする
         
         if(ticket > 0) // 注文が正常に出された場合
         {
            Print("Buy order placed at ", Ask); // 注文の情報を表示
         }
         else // 注文が出せなかった場合
         {
            Print("Error closing order: ", GetLastError()); // エラーの情報を表示
         }
      }
   }   
   
}

//+------------------------------------------------------------------+

39行目でOrderSelect()関数で持っているポジションが買いか売りかを確認して、買いポジションの場合は54行目で買いポジションの決済をするといった感じにしたり、72~101行目で売りのコードを追加したりしました。

バックテスト結果

上記の売り買いソースコードでバックテストしてみるとこんな感じでした。

ちゃんと売り注文と買い注文が入っている事がわかります。ただPFは少し落ちちゃいました。

さいごに

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

今回は移動平均線を使ったEAでしたが、他にもストキャスティクス等のEAも作ってみるとちゃんと作ってくれました。色んな注文を付けるともっと面白いEAを作ってくれたり、注文をつけすぎると答えてくれなくなったりするそうです笑

よければ是非皆さんも色々試してみて下さい。

今回は無料版のChatGPTで試しましたが中々の出来でした。ChatGPTを使えるようにする具体的な方法や基本的な使い方については以下の記事で解説していますので参考にしてみてください。

かゆい所にはまだまだ届かない感じで、ChatGPTを使うだけで自分の思い通りにEAを組むことはできないですが、近い将来プログラマーがいなくてもEAに限らず色々なシステムが組める日が訪れるのではないかと思ってしまいました。時代の進歩を感じます。

※ MT4・EAが使えるFX会社のおすすめ

※ EAのサンプルソースを一覧表にまとめました


コメント