はじめに
ここでは、ChatGPT(無料版)を使ってEAを作る事ができるのか!?について解説していきます。
テキストを自動生成してくれるChatGPTが昨年から話題ですが、なんとプログラミングもできちゃうという事でEAが作れるかどうかEAプログラマー目線で試してみました。
結論、プログラミング能力無くてもEAが作れちゃう!
果たしてどんな感じに作れるのか?EA作成初心者の方でもわかるよう解説していますので興味のある方は参考にしてみてください。
2024/05/30 去年よりもChatGPTが賢くなったので、また試してみました!
ChatGPTを理解して、使えるようにする
まずは、ChatGPTについて理解していきましょう。
ChatGPTとは、大量のテキストを学習し、その学習結果を元に自然言語処理を行うAIです。ChatGPTを使ってEAを作成する場合、トレードに関する情報をChatGPTに入力し、応答が返ってきた結果を組み立てていきます。
ChatGPTを使う方法
ChatGPTの公式から簡単な登録で利用可能になります。以下に解説していきます。
特にアカウント登録などはしなくてもEAの作成は可能です。
あとは赤枠の所に聞きたい事を入力していきます。聞きたい事を入力したら、右側上矢印ボタンをクリックします。
するとChatGPTが応答してくれます。
凄いですね!聞いたら何でも答えてくれます!
EAも作れるそうですが、得意という感じではなさそうですね。
ともかく、この機能を利用してEAを作っていきましょう。
EAを作ってみる
では、早速ChatGPTにEAを作ってもらいましょう!1年前はほどよくポンコツでしたが今はどうでしょうか!
実際のやりとりです。
MQL4で移動平均線を使ったプログラムを組んでください
すると、速攻でプログラムを組んでくれました。驚きですね!
MQL4を使って移動平均線を利用したプログラムを作成する方法を説明します。以下は、簡単な例です。この例では、単純移動平均(Simple Moving Average, SMA)を計算し、それをチャートにプロットします。
//+------------------------------------------------------------------+
//| SMA Example |
//| Copyright 2024, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property strict
// 変数定義
int maPeriod = 14; // 移動平均の期間
double maBuffer[]; // 移動平均の値を格納する配列
// 初期化関数
int OnInit()
{
// 移動平均を計算するための初期化
ArrayResize(maBuffer, 0);
return INIT_SUCCEEDED;
}
// 停止関数
void OnDeinit(const int reason)
{
// 配列を解放
ArrayFree(maBuffer);
}
// メイン関数
void OnTick()
{
// チャートから必要な価格データを取得
double closePrice = Close[0];
// 現在の価格を配列に追加
ArrayResize(maBuffer, ArraySize(maBuffer) + 1);
maBuffer[ArraySize(maBuffer) - 1] = closePrice;
// 移動平均を計算
double maValue = iMA(NULL, 0, maPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
// 移動平均を出力
Print("SMA Value: ", maValue);
}
// 移動平均の計算関数
double CalculateSMA(int period)
{
double sum = 0;
for (int i = 0; i < period; i++)
{
sum += maBuffer[ArraySize(maBuffer) - 1 - i];
}
return sum / period;
}
ちゃんとしたプログラムが出力されました!!1年前に同じ質問をしたときは断片的なソースコードで使いづらかったのですが、これはかなり精度が高そうです!しかも1年前は長いコードだと途切れて面倒でしたが今は字数制限も無いのかちゃんとすべてのコードが出力されています。
EA化するにはコンパイルが必要なので、早速コンパイルしてみると・・・
ちゃんとコンパイルできました!!1年前はエラーが出てコンパイル出来なかったのに進化していますね!
コンパイルの仕方が分からない方はこちら↓
ChatGPTが答えてくれたコードには、1年前には無かった定型文(property strictやらOnInitとか)もしっかり出力されているので、かなりまともなソースコードを出力してくれてますね!
どういった物が作れたのか
先ほどChatGPTが出力してくれたソースコードを確認してみます。
ロングやショートといったエントリーはしてくれませんが、移動平均線の値を計算してくれているEAです。
※ど、どこで使うんだこれ・・・
怪しいソースコードだなと思いながら、確認していくと・・・ここのコードは全く使ってないですね!
// 移動平均の計算関数
double CalculateSMA(int period)
{
double sum = 0;
for (int i = 0; i < period; i++)
{
sum += maBuffer[ArraySize(maBuffer) - 1 - i];
}
return sum / period;
}
で移動平均線の値は↓こっちで計算できてますね。
// 移動平均を計算
double maValue = iMA(NULL, 0, maPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
結論、あんまりいいソースコードでは無い!
そもそも私がChatGPTに伝えた『移動平均線を使ったプログラム』という内容が悪かったですね!
では、どう伝えたらいいのか次の章で確認していきましょう。
売り買いするEAを作ってもらう
では、気を取り直して『移動平均線を使ったプログラムを組んで』と伝えた内容を変えてみます。
MQL4で移動平均線を使ってエントリーし、20pipsで利確と損切りをするプログラムを組んでください
以下は、MQL4で移動平均線を使ってエントリーし、20pipsで利確と損切りをするプログラムの例です。
//+------------------------------------------------------------------+
//| Moving Average TP and SL |
//| Copyright 2024, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property strict
// パラメータ
input int MAPeriod = 50; // 移動平均の期間
input double LotSize = 0.1; // ロットサイズ
input int TakeProfitPips = 20; // 利確設定(ピップス)
input int StopLossPips = 20; // 損切り設定(ピップス)
// 変数
int ticket = 0; // オーダー番号
// 初期化関数
void OnInit()
{
// ログに表示
Print("Moving Average TP and SL EA initialized.");
}
// メイン関数
void OnTick()
{
// 現在の移動平均値を計算
double maValue = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
// 現在の価格を取得
double currentPrice = Ask;
// 買いエントリー条件
if(currentPrice > maValue)
{
// ポジションがない場合のみエントリー
if(ticket == 0)
{
ticket = OrderSend(Symbol(), OP_BUY, LotSize, currentPrice, 2, currentPrice - StopLossPips * Point, currentPrice + TakeProfitPips * Point, "MA TP and SL Buy", 0, 0, clrNONE);
if(ticket > 0)
{
Print("Buy order placed at price: ", currentPrice);
}
else
{
Print("Error placing buy order. Error code: ", GetLastError());
}
}
}
// 売りエントリー条件
else if(currentPrice < maValue)
{
// ポジションがない場合のみエントリー
if(ticket == 0)
{
ticket = OrderSend(Symbol(), OP_SELL, LotSize, currentPrice, 2, currentPrice + StopLossPips * Point, currentPrice - TakeProfitPips * Point, "MA TP and SL Sell", 0, 0, clrNONE);
if(ticket > 0)
{
Print("Sell order placed at price: ", currentPrice);
}
else
{
Print("Error placing sell order. Error code: ", GetLastError());
}
}
}
}
// オーダーが閉じられたときのイベント
void OnTrade()
{
// ポジションがクローズされたらオーダー番号をリセット
if (ticket != 0 && !OrderSelect(ticket, SELECT_BY_TICKET))
{
ticket = 0;
}
}
またまたエラーの無いコードを出力してくれました!そしてちゃんとOrderSendという単語がありエントリーをしてくれている事がわかります!
おー、簡単に売買してくれるEAを作ってくれた!
『もうプログラマーいらないんじゃ・・・!?』
ただ、このソースコードを実際にバックテストをしてみましたがエントリーはしようとしているけどエラーが出て1回もトレードをしてくれません。どこが悪いのかとソースコードを眺めていると、利確/損切りの値とかスリッページの値がおかしい等々・・・。すこし修正が必要ですね。
エントリーするように修正
ChatGPTが出力したソースコードをいくつか修正した内容がこちら↓
//+------------------------------------------------------------------+
//| Moving Average TP and SL |
//| Copyright 2024, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property strict
// パラメータ
input int MAPeriod = 50; // 移動平均の期間
input double LotSize = 0.1; // ロットサイズ
input int TakeProfitPips = 200; // 利確設定(ピップス)
input int StopLossPips = 200; // 損切り設定(ピップス)
// 変数
int ticket = 0; // オーダー番号
// 初期化関数
void OnInit()
{
// ログに表示
Print("Moving Average TP and SL EA initialized.");
}
// メイン関数
void OnTick()
{
// 現在の移動平均値を計算
double maValue = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
// 現在の価格を取得
double currentPrice = Ask;
// 買いエントリー条件
if(currentPrice > maValue)
{
// ポジションがない場合のみエントリー
if(OrdersTotal() == 0)
{
ticket = OrderSend(Symbol(), OP_BUY, LotSize, currentPrice, 20, currentPrice - StopLossPips * Point, currentPrice + TakeProfitPips * Point, "MA TP and SL Buy", 0, 0, clrNONE);
if(ticket > 0)
{
Print("Buy order placed at price: ", currentPrice);
}
else
{
Print("Error placing buy order. Error code: ", GetLastError());
}
}
}
// 売りエントリー条件
else if(currentPrice < maValue)
{
// ポジションがない場合のみエントリー
if(OrdersTotal() == 0)
{
ticket = OrderSend(Symbol(), OP_SELL, LotSize, currentPrice, 20, currentPrice + StopLossPips * Point, currentPrice - TakeProfitPips * Point, "MA TP and SL Sell", 0, 0, clrNONE);
if(ticket > 0)
{
Print("Sell order placed at price: ", currentPrice);
}
else
{
Print("Error placing sell order. Error code: ", GetLastError());
}
}
}
}
// オーダーが閉じられたときのイベント
void OnTrade()
{
// ポジションがクローズされたらオーダー番号をリセット
if (ticket != 0 && !OrderSelect(ticket, SELECT_BY_TICKET))
{
ticket = 0;
}
}
11行目、12行目は0を1桁増やす!37行目、54行目はOrdersTotal()に変える!39行目、56行目はスリッページの0を1桁増やすという感じで修正しました。
結果、少し修正するだけでしっかりトレードしてくれるようになりましたね!
ただ、プログラミング知識が無い状態でこの内容は修正できないと思うので、ChatGPTでEAを作るのはちょっと難しそうかな?と思いながらChatGPTに再度出力してもらってたら凄い事が起きました!
こちらから質問する内容と回数が重要
これまでの流れから、ちゃんとエントリーしてくれるプログラムを出力してもらうにはこちらから質問する内容がとても重要というのがわかります。
私が最初に質問した内容と、後から質問した内容を比較してみましょう。
最初『MQL4で移動平均線を使ったプログラムを組んでください』
後『MQL4で移動平均線を使ってエントリーし、20pipsで利確と損切りをするプログラムを組んでください』
後のように『エントリー』『利確』『損切り』という単語をいれてあげる事でChatGPTは自動売買をするEAを作ってくれます。
『利確』『損切り』の単語を入れないバージョンも試しましたが、この場合はエントリーしっぱなしで決済しないEAが出来てしまうので、しっかりどうしたいのかを伝える事が重要ですね!
また、全く同じ質問『MQL4で移動平均線を使ってエントリーし、20pipsで利確と損切りをするプログラムを組んでください』ですが、5回目ぐらいでまさかの
一切ソースコードを修正しなくてもトレードしてくれるプログラムを出力
してくれました。以下がそのソースコードです。
//+------------------------------------------------------------------+
//| MA_Cross.mq4|
//| Copyright 2023, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property strict
//--- input parameters
input int FastMAPeriod = 10; // Fast MA period
input int SlowMAPeriod = 30; // Slow MA period
input double LotSize = 0.1; // Lot size
input double TakeProfit = 20; // Take profit in pips
input double StopLoss = 20; // Stop loss in pips
double FastMA, SlowMA, PrevFastMA, PrevSlowMA;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// Initialization code
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// Deinitialization code
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// Calculate the current and previous values of the fast and slow MAs
FastMA = iMA(NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
SlowMA = iMA(NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
PrevFastMA = iMA(NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
PrevSlowMA = iMA(NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
// Check for a bullish crossover (Fast MA crosses above Slow MA)
if (PrevFastMA <= PrevSlowMA && FastMA > SlowMA)
{
// Close any short positions
if (OrdersTotal() > 0)
CloseAllOrders();
// Open a long position
OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, 0, 0, "Buy Order", 0, 0, clrGreen);
}
// Check for a bearish crossover (Fast MA crosses below Slow MA)
else if (PrevFastMA >= PrevSlowMA && FastMA < SlowMA)
{
// Close any long positions
if (OrdersTotal() > 0)
CloseAllOrders();
// Open a short position
OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, 0, 0, "Sell Order", 0, 0, clrRed);
}
// Manage existing orders
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
// Set take profit and stop loss
double tp = 0, sl = 0;
if (OrderType() == OP_BUY)
{
tp = OrderOpenPrice() + TakeProfit * Point;
sl = OrderOpenPrice() - StopLoss * Point;
}
else if (OrderType() == OP_SELL)
{
tp = OrderOpenPrice() - TakeProfit * Point;
sl = OrderOpenPrice() + StopLoss * Point;
}
if (OrderTakeProfit() != tp || OrderStopLoss() != sl)
OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrNONE);
}
}
}
//+------------------------------------------------------------------+
//| Close all open orders |
//+------------------------------------------------------------------+
void CloseAllOrders()
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrNONE);
else if (OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrNONE);
}
}
}
//+------------------------------------------------------------------+
TPとSLの桁数が1桁少ない間違いはお決まりですが、ここはパラメータ設定で修正できる(20→200にする)ので問題ないですね。コンパイル時にエラーも出ず、しっかりトレードもしてくれます!
何度も何度も繰り返しChatGPTに正しいプログラミングしてもらいましょう!
プログラミングを学ぼう!
上記の事から、プログラミング基礎知識は付けずとりあえずChatGPTに質問しまくってEAを作る事も可能ですが、かなり効率が悪いです。プログラミングを少し学ぶだけで時短になります。
この機会にプログラミングの基礎知識について学びたい方は、以下の記事で1から解説していますので参考にしてください!
プログラミング知識なしにEAを作るのであれば「EAつくーる」もオススメです
さいごに
以上、『ChatGPTを使ってEAを作ったらヤバすぎた』でした。
今回は移動平均線を使ったEAでしたが、他にもストキャスティクス等のEAも作ってみるとちゃんと作ってくれました。ChatGPTに質問する際にさらに色んな単語を付けるともっと面白いEAを作ってくれたりすると思います。
ChatGPTだけでEAを作るには、繰り返し繰り返し質問しコンパイルエラーが無いソースコード、しっかりトレードしてくれるソースコードになるまで質問し続けることが必要です。でも、少しだけプログラミング能力があれば繰り返しの数はめちゃくちゃ減りますので軽くプログラミング能力を身につけるのもオススメです。
とはいえ、プログラムの修正なしにトレードしてくれるEAが作れたのは凄いですね!この1年での成長を見ると近い将来プログラマーがいなくてもEAに限らず色々なシステムが組める日が訪れるのではないかと思ってしまいました。時代の進歩を感じます。
それでは、皆さんも色々質問して良いEAを作ってくださいね!
※ EAのサンプルソースを一覧表にまとめました
※オンラインレッスンやってます
コメント