はじめに
近年AIの勢いが凄いですよね!私もイラストにプログラムに色々活用しながら楽しんでます。
さて、今回はAIの『ChatGPT』を使ってEAを作る方法について解説します。
『ChatGPT』を使えるようにする方法から、『ChatGPT』とのコミュニケーションの取り方をお伝えします。
プログラミングは全く分からない!という方はこちら↓
ChatGPTを理解して、使えるようにする
まずは、ChatGPTについて理解していきましょう。
ChatGPTとは、大量のテキストを学習し、その学習結果を元に自然言語処理を行うAIです。ChatGPTを使ってEAを作成する場合、トレードに関する情報をChatGPTに入力し、応答が返ってきた結果を組み立てていきます。
ChatGPTを使う方法
ChatGPTの公式から簡単な登録で利用可能になります。以下に解説していきます。
特にアカウント登録などはしなくてもEAの作成は可能です。
あとは赤枠の所に聞きたい事を入力していきます。聞きたい事を入力したら、右側上矢印ボタンをクリックします。
するとChatGPTが応答してくれます。
凄いですね!聞いたら何でも答えてくれます!
EAも作れるそうですが、得意という感じではなさそうですね。
ともかく、この機能を利用してEAを作っていきましょう。
ChatGPTに質問してみる
それでは早速ChatGPTに質問していきましょう。質問内容はこんな感じにしてみましょう。
「ドル円の1時間足チャートを分析して、RSIを使って買いエントリーするMT4のEAプログラムをつくってほしい」
ポイントは『通貨ペア』や『時間足』『MT4』『インジケータ名』を使いながら『EAプログラムを作ってほしい』という質問内容にすることです。
すると、ChatGPTの応答はこんな感じでソースコードを返してくれます。
// インジケータの設定
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Blue
// 変数の宣言
double rsiBuffer[];
// 初期化関数
int OnInit()
{
// インジケータの設定
SetIndexBuffer(0, rsiBuffer);
return(INIT_SUCCEEDED);
}
// エントリーポイント
void OnTick()
{
// RSIを計算
int rsiHandle = iRSI(NULL, PERIOD_H1, 14, PRICE_CLOSE);
ArraySetAsSeries(rsiBuffer, true);
CopyBuffer(rsiHandle, 0, 0, 1, rsiBuffer);
// RSIが30未満の場合は買いエントリー
if (rsiBuffer[0] < 30)
{
// 現在の注文の数を確認
int totalOrders = OrdersTotal();
// 注文がない場合のみエントリー
if (totalOrders == 0)
{
// 買いエントリーの処理
double lotSize = 0.1; // 取引ロットサイズ
double stopLoss = 100; // ストップロス(ピップ単位)
double takeProfit = 200; // 利益を確定するピップ数
// 買い注文を出す
int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, 0, 0, "Buy Order", 0, 0, clrNONE);
// 注文が成功した場合
if (ticket > 0)
{
// ストップロスと利益を設定する
OrderModify(ticket, OrderOpenPrice(), NormalizeDouble(OrderOpenPrice() - stopLoss * Point, Digits),
NormalizeDouble(OrderOpenPrice() + takeProfit * Point, Digits), 0, clrNONE);
}
}
}
}
凄いですね、もうEAが完成しちゃいそうです!が、まだ早まってはいけません。コンパイルをしていきましょう。
コンパイルをすると、
ありゃ、エラーが出ちゃいましたね。これではEAが作れません。
ChatGPTはコンパイルが必ず成功するソースコードを返答しれくれるわけでありません。体感で1/3以上のソースコードでコンパイルが成功しません。
エラー内容が分かればいいですが、分からない場合は再度ChatGPTに同じ質問をしてエラーが出ないソースコードが出るまでチャレンジする必要があります。
プログラミング未経験者には高い壁が・・・
プログラミング未経験者が『ChatGPT』を使うと、上記のようなエラーで詰まっちゃう可能性は高いです。エラーは出ないけど正しくない(エントリー等をしてくれない)ソースコードも含めると、なかなか正しいプログラムは返ってきません。
※簡単なプログラム知識が必須
よくあるChatGPTの間違い
今回、私が確認したよくあるエラーを列挙します。
①関数の引数に誤りがある
今回のソースコードでRSIの計算をする記述の所に誤りがあります。
// RSIを計算
int rsiHandle = iRSI(NULL, PERIOD_H1, 14, PRICE_CLOSE);
これはこう修正します↓
// RSIを計算
int rsiHandle = iRSI(NULL, PERIOD_H1, 14, PRICE_CLOSE,1);
修正後は最後尾に『,1』を追加しています。こんな感じで関数の引数が不足しているためエラーが出ているので、iRSIには引数がいくつ必要なのかを調べて追加してあげる必要があります。
※iMACDやiMA等も基本間違えるので修正してあげる必要があります
②何故か配列バッファーにセットして間違える
今回のソースコードは何故か配列バッファーを使っています。しかも、そのCopyBufferでエラーが出ているのでたちが悪いです。
// RSIを計算
int rsiHandle = iRSI(NULL, PERIOD_H1, 14, PRICE_CLOSE,1);
ArraySetAsSeries(rsiBuffer, true);
CopyBuffer(rsiHandle, 0, 0, 1, rsiBuffer);
// RSIが30未満の場合は買いエントリー
if (rsiBuffer[0] < 30)
{
これはこう修正します↓
// RSIを計算
int rsiHandle = iRSI(NULL, PERIOD_H1, 14, PRICE_CLOSE,1);
// RSIが30未満の場合は買いエントリー
if (rsiHandle < 30)
{
いっぱい消しました、もうこれでOKです。これでエラー無くエントリーしてくれるようになりましたね!
※ChatGPTにプログラムを書いてもらうと大体こうなるので修正が必要です
③ポジション確認
今回のソースコードではこの問題はありませんでしたが、結構な頻度で出力されていました。
// ポジションがなければ・・・
if (!PositionSelect(Symbol()))
これはこう修正します↓
// ポジションがなければ・・・
if (OrdersTotal()==0)
ポジションのあるなしに関してChatGPTはPositionSelectを出力します。このPositionSelectというのはMQL5の関数ですので、MQL4では使えません。単純に上記の修正で代用できます。
ChatGPTを使ってEAを作成する
ChatGPTを使ってEAを作成するためには、ChatGPTにトレードに関する情報を聞いていきます。単語1つでかなりソースコードが変化したりします。基本的に普段自分が作るソースコードに似ているものを回答してくれるまで何度も質問していきましょう。
MT4以外の全く違うソースコードも返ってくることがありますので、冒頭でも述べた通り質問のやりとりの中で「MT4」や「MQL4」といった単語は必須になってきます。
あと、ChatGPTは前回質問した内容を引き継いで答えをだしてくれるので、この性質も使えます。
先ほどChatGPTを使ってEAを作成した際の問いかけは「ドル円の1時間足チャートを分析して、RSIを使って買いエントリーするEAを作成したい」でしたので、続けてこうChatGPTに聞いてみて下さい。
「ドル円の1時間足チャートを分析して、RSIを使って売りエントリーする機能を作成したい」
今回は『機能』という単語にしてみました。『EA』を作成したいと質問すると丸々1本のEAを作ろうとして謎の処理も多く返ってきますが、『機能』を作成したいにすると割とピンポイントで返ってくるイメージです。
結果、以下のような返答がありました。
// インジケータの設定
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
// 変数の宣言
double rsiBuffer[];
// 初期化関数
int OnInit()
{
// インジケータの設定
SetIndexBuffer(0, rsiBuffer);
return(INIT_SUCCEEDED);
}
// エントリーポイント
void OnTick()
{
// RSIを計算
int rsiHandle = iRSI(NULL, PERIOD_H1, 14, PRICE_CLOSE);
ArraySetAsSeries(rsiBuffer, true);
CopyBuffer(rsiHandle, 0, 0, 1, rsiBuffer);
// RSIが70を超えた場合は売りエントリー
if (rsiBuffer[0] > 70)
{
// 現在の注文の数を確認
int totalOrders = OrdersTotal();
// 注文がない場合のみエントリー
if (totalOrders == 0)
{
// 売りエントリーの処理
double lotSize = 0.1; // 取引ロットサイズ
double stopLoss = 100; // ストップロス(ピップ単位)
double takeProfit = 200; // 利益を確定するピップ数
// 売り注文を出す
int ticket = OrderSend(Symbol(), OP_SELL, lotSize, Bid, 3, 0, 0, "Sell Order", 0, 0, clrNONE);
// 注文が成功した場合
if (ticket > 0)
{
// ストップロスと利益を設定する
OrderModify(ticket, OrderOpenPrice(), NormalizeDouble(OrderOpenPrice() + stopLoss * Point, Digits),
NormalizeDouble(OrderOpenPrice() - takeProfit * Point, Digits), 0, clrNONE);
}
}
}
}
今度は売りのソースコードが出力されました。
これを先ほど作ったEAのソースコードに展開していくわけですが面倒ですので、続けてこう聞きます。
「上記をベースに売り買いのEAにしてください」
こうすることで、以下のような返答になります。
// インジケータの設定
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
// 変数の宣言
double rsiBuffer[];
// 初期化関数
int OnInit()
{
// インジケータの設定
SetIndexBuffer(0, rsiBuffer);
return(INIT_SUCCEEDED);
}
// エントリーポイント
void OnTick()
{
// RSIを計算
int rsiHandle = iRSI(NULL, PERIOD_H1, 14, PRICE_CLOSE);
ArraySetAsSeries(rsiBuffer, true);
CopyBuffer(rsiHandle, 0, 0, 1, rsiBuffer);
// 現在の注文の数を確認
int totalOrders = OrdersTotal();
// 買いエントリー
if (rsiBuffer[0] < 30 && totalOrders == 0)
{
Buy();
}
// 売りエントリー
if (rsiBuffer[0] > 70 && totalOrders == 0)
{
Sell();
}
}
// 買いエントリー関数
void Buy()
{
double lotSize = 0.1; // 取引ロットサイズ
double stopLoss = 100; // ストップロス(ピップ単位)
double takeProfit = 200; // 利益を確定するピップ数
// 買い注文を出す
int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, 0, 0, "Buy Order", 0, 0, clrNONE);
// 注文が成功した場合
if (ticket > 0)
{
// ストップロスと利益を設定する
OrderModify(ticket, OrderOpenPrice(), NormalizeDouble(OrderOpenPrice() - stopLoss * Point, Digits),
NormalizeDouble(OrderOpenPrice() + takeProfit * Point, Digits), 0, clrNONE);
}
}
// 売りエントリー関数
void Sell()
{
double lotSize = 0.1; // 取引ロットサイズ
double stopLoss = 100; // ストップロス(ピップ単位)
double takeProfit = 200; // 利益を確定するピップ数
// 売り注文を出す
int ticket = OrderSend(Symbol(), OP_SELL, lotSize, Bid, 3, 0, 0, "Sell Order", 0, 0, clrNONE);
// 注文が成功した場合
if (ticket > 0)
{
// ストップロスと利益を設定する
OrderModify(ticket, OrderOpenPrice(), NormalizeDouble(OrderOpenPrice() + stopLoss * Point, Digits),
NormalizeDouble(OrderOpenPrice() - takeProfit * Point, Digits), 0, clrNONE);
}
}
しっかりと売りと買いを組み合わせてくれます。
あっというまにRSIを使った売りと買いのEAが作れちゃいましたね!
あとは、コンパイル時のエラーを修正してあげるだけですが、これはエラー文を検索しながら修正していくしかないです。ChatGPTは同じエラーを結構出すので慣れてくると、あーまたこれかーとすぐに修正できるようになりますが・・・。
さいごに
以上が、『『ChatGPT』を使ってEAを作る方法』です。
やはりプログラミングをある程度理解している方がChatGPTでEAをつくりやすく、作る速度もあがるためプログラミングを学ぶことは現段階ではまだまだ重要そうです。
ただ、ChatGPTもかなり精度が上がってきておりうまく使えば開発の時短になる事も事実なのでうまく使っていきたいですね。
※ EAのサンプルソースを一覧表にまとめました
※EA作成依頼はこちら
※オンラインレッスンやってます
コメント