こんにちは!はかせです。
Googleに変わると
言われているChatGPTですが、
このAIは驚異の言語能力を持っています。
このAIを活用してFX自動売買を
開発する方法を解説していきます。
ChatGPTを使ってプログラミングを勉強したい
簡単なEAを作ってみたい
AIを上手いこなしたい
AIと自動売買の可能性を感じている
ChatGPTとはOpenAI社が
開発したAIメッセージ応答サービスです。
このChatGPTはプログラミングも出来ます
但し、現段階ではまるっきり
頼る事は出来ません。
今回の記事では、
このChatGPTを使った
プログラミングの活用例と共に
修正した点をまとめていきます。
AIを利用したプログラミングを学ぶことで
資産形成のポートフォリオの
一部にすることが可能になると思います。
是非最後までご覧ください。
まず最初に活用例をお見せします。
こちらのyoutubeにChatGPTを
使った自動売買開発の活用例を
載せているので、ご覧ください。
動画をご覧いただくと
分かるかと思いますが、
ChatGPTがかいた
プログラミングコードは
手直しする必要があります。
それはプログラミング精度が
完璧ではない。という事です。
数値の設定が悪かったり
エントリーを何度も繰り返してしまう
という事が多々あります。
試しにどのような点を
直したか一つずつ見ていきましょう。
ChatGPTがプログラミングした
コードは下記の通りです。
// MAクロスに基づくシンプルなトレードシステム
// エントリー条件: ゴールデンクロスが起きたら買い、デッドクロスが起きたら売り
// 決済条件: 50pipsで利確、20pipsで損切り
// 外部変数の設定
extern int FastMA = 50; // 短期MAの期間
extern int SlowMA = 200; // 長期MAの期間
extern double Lots = 0.1; // 取引量
extern int TakeProfit = 50; // 利確設定
extern int StopLoss = 20; // 損切り設定
// グローバル変数の設定
int ticket = 0; // 取引注文番号を保持する変数
// 初期化関数
int init()
{
return(0);
}
// スタート関数
int start()
{
// MAの計算
double FastMAValue = iMA(NULL, 0, FastMA, 0, MODE_EMA, PRICE_CLOSE, 0);
double SlowMAValue = iMA(NULL, 0, SlowMA, 0, MODE_EMA, PRICE_CLOSE, 0);
// ゴールデンクロス/デッドクロスの判定
if(FastMAValue > SlowMAValue && ticket == 0) // ゴールデンクロスの場合、買い注文を出す
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Bid-StopLoss*Point, Bid+TakeProfit*Point, "Buy", 0, 0, Green);
if(ticket > 0) // 注文が成功した場合、ログに出力
{
Print("Buy order placed, ticket ", ticket);
}
else // 注文が失敗した場合、エラーメッセージをログに出力
{
Print("Error placing buy order, error ", GetLastError());
}
}
else if(FastMAValue < SlowMAValue && ticket == 0) // デッドクロスの場合、売り注文を出す
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+StopLoss*Point, Ask-TakeProfit*Point, "Sell", 0, 0, Red);
if(ticket > 0) // 注文が成功した場合、ログに出力
{
Print("Sell order placed, ticket ", ticket);
}
else // 注文が失敗した場合、エラーメッセージをログに出力
{
Print("Error placing sell order, error ", GetLastError());
}
}
// 注文の決済処理
if(ticket > 0) // 注文が存在する場合
{
// 注文情
OrderSelect(ticket, SELECT_BY_TICKET); // 注文を選択する
if(OrderType() == OP_BUY) // 買い注文の場合
{
if(Bid - OrderOpenPrice() >= TakeProfit*Point) // 利確条件を満たした場合、決済注文を出す
{
bool closeOrder = OrderClose(ticket, Lots, Bid, 3, Green);
if(closeOrder) // 決済注文が成功した場合、ログに出力
{
Print("Buy order closed with profit, ticket ", ticket);
}
else // 決済注文が失敗した場合、エラーメッセージをログに出力
{
Print("Error closing buy order with profit, error ", GetLastError());
}
ticket = 0; // 注文番号を初期化する
}
else if(OrderOpenPrice() - Bid >= StopLoss*Point) // 損切り条件を満たした場合、決済注文を出す
{
bool closeOrder = OrderClose(ticket, Lots, Bid, 3, Red);
if(closeOrder) // 決済注文が成功した場合、ログに出力
{
Print("Buy order closed with loss, ticket ", ticket);
}
else // 決済注文が失敗した場合、エラーメッセージをログに出力
{
Print("Error closing buy order with loss, error ", GetLastError());
}
ticket = 0; // 注文番号を初期化する
}
}
else if(OrderType() == OP_SELL) // 売り注文の場合
{
if(OrderOpenPrice() - Ask >= TakeProfit*Point) // 利確条件を満たした場合、決済注文を出す
{
bool closeOrder = OrderClose(ticket, Lots, Ask, 3, Red);
if(closeOrder) // 決済注文が成功した場合、ログに出力
{
Print("Sell order closed with profit, ticket ", ticket);
}
else // 決済注文が失敗した場合、エラーメッセージをログに出力
{
Print("Error closing sell order with profit, error ", GetLastError());
}
ticket = 0; // 注文番号を初期化する
}
else if(Ask - OrderOpenPrice() >= StopLoss*Point) // 損切り条件を満たした場合、決済注文を出す
{
bool closeOrder = OrderClose(ticket, Lots, Ask, 3, Green);
if(closeOrder) // 決済注文が成功した場合、ログに出力
{
Print("Sell order closed with loss, ticket ", ticket);
}
else // 決済注文が失敗した場合、エラーメッセージをログに出力
{
Print("Error closing sell order with loss, error ", GetLastError());
}
ticket = 0; // 注文番号を初期化する
}
}
}
return(0);
}
こちらをMT4に入れてコンパイルしてみましょう。
closeOrder-variable already defined
というエラーになりましたね。
直していきます。
//closeOrderがboolで何度も定義されている
bool closeOrder = OrderClose(ticket, Lots, Bid, 3, Green);
closeOrderが何度も定義されている為、
このようなエラーが出ます。
bool closeOrderの定義を一つだけにします。
次にコンパイル時にはワーニングが出てしまいました。
こちらの箇所が悪さをしています。
OrderSelect関数を使う場合には、必ず戻り値を格納する変数を用意しましょう。
OrderSelect(ticket, SELECT_BY_TICKET); // 注文を選択する
再度コンパイルすると
エラーがなくなりました。
ではバックテストをして、
想定通りのエントリーに
なっているか確認してみましょう。
ビジュアルモードで
バックテストをしたところ、
このように何度も
エントリーしてしまいましたね。
ここがChatGPT最大の
ミスと言ってもよいでしょう。
何が悪いのか見ていきます。
エントリー価格:109.615
S/L:109.554 (約5pips)
T/P:109.624 (約1pips)
となっており、想定の利確、
損切りではない事が分かります。
extern int TakeProfit = 500; // 利確設定を変更
extern int StopLoss = 200; // 損切り設定を変更
ポジションによって、エントリー~利確、
エントリー~損切りまでの
価格差に若干の誤差がありますが、
大体は利確50pips,損切り20pipsに
設定できました。
この誤差の原因は、スプレッドです。
このスプレッドの計算方法を
加味されていないので、
このように誤差が出てきます。
修正した動画は以下の通り
youtubeにアップしましたので、
併せてご覧ください。
(現在準備中)
まだまだ課題の多いChatGPTですが、
可能性は無限大に秘めていますね。
引き続きChatGPTの
動向もウォッチしつつ記事にしていきます