![見出し画像](https://assets.st-note.com/production/uploads/images/100854528/rectangle_large_type_2_1744cbe204d8cfd5ab17ee6ad920c3d7.jpeg?width=800)
ChatGPTにドル円の自動トレードのプログラムを作らせてみた
未知数の多い自動トレードプログラム開発。ChatGPTにドル円トレードの自動トレードプログラムを作成してもらい、成功するかどうか試行錯誤していきます。
MT4は、MetaTrader 4の略称で、外国為替取引や株式投資などで広く使用されている取引プラットフォームです。今回、ChatGPTによるドル円トレードの自動トレードプログラム開発には、MT4を使用します。
まずは、トレンドフォロー戦略を元にしたコードの作成を指示します。
Q:トレンドフォロー戦略を元にしたMT4のコードを書いてください。
A:以下は、移動平均線を使用したドル円のトレンドフォロー戦略のためのMT4コードの例です。
// 外部変数
extern int fastMA = 5; // 短期移動平均線
extern int slowMA = 25; // 長期移動平均線
extern double lotSize = 0.1; // 取引量
extern double stopLossPips = 50; // ストップロス(pips)
extern double takeProfitPips = 100; // テイクプロフィット(pips)
// グローバル変数
int orderTicket = 0; // 注文番号
void OnTick()
{
// 短期移動平均線を計算する
double fastMAVal = iMA(NULL, 0, fastMA, 0, MODE_SMA, PRICE_CLOSE, 0);
// 長期移動平均線を計算する
double slowMAVal = iMA(NULL, 0, slowMA, 0, MODE_SMA, PRICE_CLOSE, 0);
// ゴールデンクロスが発生したら買いのエントリー
if (fastMAVal > slowMAVal && orderTicket == 0) {
orderTicket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, Bid - stopLossPips * Point, Bid + takeProfitPips * Point, "Buy Order", MagicNumber, 0, Green);
}
// デッドクロスが発生したら売りのエントリー
if (fastMAVal < slowMAVal && orderTicket == 0) {
orderTicket = OrderSend(Symbol(), OP_SELL, lotSize, Bid, 3, Ask + stopLossPips * Point, Ask - takeProfitPips * Point, "Sell Order", MagicNumber, 0, Red);
}
// オーダーが存在している場合は、損切り・利確の判断を行う
if (orderTicket != 0) {
if (OrderSelect(orderTicket, SELECT_BY_TICKET, MODE_TRADES)) {
if (OrderType() == OP_BUY) {
// 買いオーダーの場合
if (Bid - OrderStopLoss() >= takeProfitPips * Point) {
// テイクプロフィット
OrderClose(orderTicket, lotSize, Bid, 3, LimeGreen);
orderTicket = 0;
} else if (Bid - OrderStopLoss() <= stopLossPips * Point) {
// ストップロス
OrderClose(orderTicket, lotSize, Bid, 3, Tomato);
orderTicket = 0;
}
} else if (OrderType() == OP_SELL) {
// 売りオーダーの場合
if (OrderStopLoss() - Ask >= takeProfitPips * Point) {
// テイクプロフィット
OrderClose(orderTicket, lotSize, Ask, 3, LimeGreen);
orderTicket = 0;
} else if (OrderStopLoss() - Ask <= stopLossPips * Point
// ストップロス
OrderClose(orderTicket, lotSize, Ask, 3, Tomato);
orderTicket = 0;
}
}
}
}
このコードは、ドル円の短期移動平均線と長期移動平均線のクロスを基に、トレンドフォロー戦略を実行します。ゴールデンクロスが発生した場合は買いエントリーし、デッドクロスが発生した場合は売りエントリーします。また、オーダーが存在する場合は、テイクプロフィットとストップロスを設定し、注文をクローズします。
え、ちょっとすごすぎませんか?
コメントが入っていて、このプログラムの解説までつけてくれるなんて・・・。ただ、リソースのクローズ漏れの警告が発生したため、警告メッセージをコピーして質問してみました。※質問内容は「コンパイルエラー」ではなく、空気を読んでChatGPTが回答してくれたようです(笑)
Q:40行目で次のコンパイルエラーが発生します。 return value of 'OrderClose' should be checked ChatGPT_trend_follow.mq4 40 21
A:すみません、確かにそのエラーがあります。正しくは、OrderClose()関数の戻り値を確認する必要があります。OrderClose()関数は、注文をクローズするために使用される関数であり、正常にクローズされた場合はクローズされた注文のチケット番号を返します。したがって、戻り値がゼロでないことを確認する必要があります。エラーを修正するためには、以下のようにコードを修正してください。
if (orderTicket > 0) {
if (OrderClose(orderTicket, lotSize, Ask, 3, Tomato)) {
orderTicket = 0;
}
}
OrderClose()関数の戻り値をif文で確認し、注文が正常にクローズされた場合はorderTicketをゼロにリセットします。これでエラーが解決され、コードが正常にコンパイルできるようになります。
デバッグもしてくれるのか・・・。
次は本当のコンパイルエラーの指摘をしてみました。
Q:21行目で次のエラーが発生します。
'MagicNumber' - undeclared identifier ChatGPT_trend_follow.mq4 21 139
A:申し訳ありません。MagicNumberは、MT4の注文に使用される特別なパラメーターで、注文を識別するために使用されます。MagicNumberを指定することで、同じEAを使用する複数のチャートで複数の注文を管理できます。
MagicNumberは通常、EAの初期化関数で設定されます。コードにMagicNumberが定義されていない場合は、次のように定義する必要があります。
// MagicNumberを設定する
int MagicNumber = 12345; // 任意の数字を設定する
上記のコードでは、MagicNumberに12345という値を設定しています。注文を管理するための一意の識別子として使用するため、この数字を変更してください。
そして、21行目の以下のコードを修正してください。
orderTicket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, Bid-StopLossPoint, Bid+TakeProfitPoint, "Buy", MagicNumber, 0, Green);
このコードでは、最後の引数であるMagicNumberを追加して、注文を識別するための識別子を設定しています。これで、コンパイルエラーが解決されます。
最後のコード修正は冗長ですが、解説が丁寧なので非常に良いです。そして、ChatGPTによって作成されたコードはこちらです。
// 外部変数
extern int fastMA = 5; // 短期移動平均線
extern int slowMA = 25; // 長期移動平均線
extern double lotSize = 0.1; // 取引量
extern double stopLossPips = 50; // ストップロス(pips)
extern double takeProfitPips = 100; // テイクプロフィット(pips)
// MagicNumberを設定する
int MagicNumber = 12345; // 任意の数字を設定する
// グローバル変数
int orderTicket = 0; // 注文番号
void OnTick()
{
// 短期移動平均線を計算する
double fastMAVal = iMA(NULL, 0, fastMA, 0, MODE_SMA, PRICE_CLOSE, 0);
// 長期移動平均線を計算する
double slowMAVal = iMA(NULL, 0, slowMA, 0, MODE_SMA, PRICE_CLOSE, 0);
// ゴールデンクロスが発生したら買いのエントリー
if (fastMAVal > slowMAVal && orderTicket == 0) {
orderTicket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, Bid - stopLossPips * Point, Bid + takeProfitPips * Point, "Buy Order", MagicNumber, 0, Green);
}
// デッドクロスが発生したら売りのエントリー
if (fastMAVal < slowMAVal && orderTicket == 0) {
orderTicket = OrderSend(Symbol(), OP_SELL, lotSize, Bid, 3, Ask + stopLossPips * Point, Ask - takeProfitPips * Point, "Sell Order", MagicNumber, 0, Red);
}
// オーダーが存在している場合は、損切り・利確の判断を行う
if (orderTicket != 0) {
if (OrderSelect(orderTicket, SELECT_BY_TICKET, MODE_TRADES)) {
if (OrderType() == OP_BUY) {
// 買いオーダーの場合
if (Bid - OrderStopLoss() >= takeProfitPips * Point) {
// テイクプロフィット
//OrderClose(orderTicket, lotSize, Bid, 3, LimeGreen);
//orderTicket = 0;
if (orderTicket > 0) {
if (OrderClose(orderTicket, lotSize, Bid, 3, LimeGreen)) {
orderTicket = 0;
}
}
} else if (Bid - OrderStopLoss() <= stopLossPips * Point) {
// ストップロス
//OrderClose(orderTicket, lotSize, Bid, 3, Tomato);
//orderTicket = 0;
if (orderTicket > 0) {
if (OrderClose(orderTicket, lotSize, Ask, 3, Tomato)) {
orderTicket = 0;
}
}
}
} else if (OrderType() == OP_SELL) {
// 売りオーダーの場合
if (OrderStopLoss() - Ask >= takeProfitPips * Point) {
// テイクプロフィット
//OrderClose(orderTicket, lotSize, Ask, 3, LimeGreen);
//orderTicket = 0;
if (orderTicket > 0) {
if (OrderClose(orderTicket, lotSize, Ask, 3, LimeGreen)) {
orderTicket = 0;
}
}
} else if (OrderStopLoss() - Ask <= stopLossPips * Point) {
// ストップロス
//OrderClose(orderTicket, lotSize, Ask, 3, Tomato);
//orderTicket = 0;
if (orderTicket > 0) {
if (OrderClose(orderTicket, lotSize, Ask, 3, LimeGreen)) {
orderTicket = 0;
}
}
}
}
}
}
}
ChatGPTの指示に従って、コードをコピペしただけで、他には何も加えていません。このコードをコンパイルして実行することで、実際に動作させることができました。
ただし、このコードはエントリー条件を満たすたびに売買を行うため、短時間で多数の注文が行われ、実用性に欠けます。
次回はこの問題点をChatGPTに修正してもらいたいと思います。
この記事が気に入ったらサポートをしてみませんか?