ChatGPTにドル円の自動トレードのプログラムを作らせてみた
未知数の多い自動トレードプログラム開発。ChatGPTにドル円トレードの自動トレードプログラムを作成してもらい、成功するかどうか試行錯誤していきます。
MT4は、MetaTrader 4の略称で、外国為替取引や株式投資などで広く使用されている取引プラットフォームです。今回、ChatGPTによるドル円トレードの自動トレードプログラム開発には、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が回答してくれたようです(笑)
if (orderTicket > 0) {
if (OrderClose(orderTicket, lotSize, Ask, 3, Tomato)) {
orderTicket = 0;
}
}
デバッグもしてくれるのか・・・。
次は本当のコンパイルエラーの指摘をしてみました。
// MagicNumberを設定する
int MagicNumber = 12345; // 任意の数字を設定する
orderTicket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, Bid-StopLossPoint, Bid+TakeProfitPoint, "Buy", MagicNumber, 0, Green);
最後のコード修正は冗長ですが、解説が丁寧なので非常に良いです。そして、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に修正してもらいたいと思います。