AIを使って自作EAを作ろうシリーズ第2回です。
今回は半年前に一度断念したベースコード作成までやっていきます。
この半年の間にAIも学習していると思うので、いわばリベンジマッチです。
それではどうぞ。
前回の記事概要
前回の記事

Copilotを使ってEAを作ろう -第1回-
Copilotをつかっての自作EAコード作成に挑戦します。今回はテストコードを作成し動くのかどうかを検証しましたが、AI頼るメリットはあまりなさそうです。
前回は、決済のロジックがうまくいきませんでした。
命令文をどうやっても正しいコードを吐き出してくれなくて断念。
テストコードの作成
前回同様の命令文でそれぞれEAコードを作成させます。
作成されたEAに対して直近1年間のバックテストを走らせてみて、期待通りの動きになっているのか検証していきます。
バックテストの条件は以下。
・対象通貨ペア:USDJPY
・時間足:15M
・期間:2023年10月~2024年9月
・証拠金100万円
ロジック① 2本の移動平均線のクロス
コード作成
Copilotへの命令文は以下の通り。
<次のロジックになるようにMT4用のコード作成をしてください。5maと20maのクロスでエントリーし、逆のクロスで決済する。ロット数は0.01。>
作成されたコードは以下の通り。
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double ma5_current = iMA(NULL, 0, 5, 0, MODE_SMA, PRICE_CLOSE, 0);
double ma5_previous = iMA(NULL, 0, 5, 0, MODE_SMA, PRICE_CLOSE, 1);
double ma20_current = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
double ma20_previous = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
// ロングエントリー条件
if(ma5_previous <= ma20_previous && ma5_current > ma20_current)
{
if(!PositionExists())
OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0, "Buy Order", 0, 0, Blue);
}
// ショートエントリー条件
if(ma5_previous >= ma20_previous && ma5_current < ma20_current)
{
if(!PositionExists())
OrderSend(Symbol(), OP_SELL, 0.01, Bid, 3, 0, 0, "Sell Order", 0, 0, Red);
}
// 決済条件
if(PositionExists())
{
// ロングポジションの決済
if(OrderType() == OP_BUY && ma5_current < ma20_current)
ClosePosition();
// ショートポジションの決済
if(OrderType() == OP_SELL && ma5_current > ma20_current)
ClosePosition();
}
}
//+------------------------------------------------------------------+
//| ヘルパー関数 |
//+------------------------------------------------------------------+
bool PositionExists()
{
return(OrderSelect(0, SELECT_BY_POS));
}
void ClosePosition()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol())
{
if(OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrGreen);
if(OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrGreen);
}
}
}
バックテスト
なんと普通に動きました。
あっけないものです。AIは日々進歩していることがわかりました。


ロジック② ボリンジャーバンド2σラインにタッチ
コード作成
Copilotへの命令文は以下の通り。
<次のロジックになるようにMT4用のコード作成をしてください。20maのボリンジャーバンド2シグマタッチでエントリーおよび決済。ロット数は0.01。>
作成されたコードは以下の通り。
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double upperBand = iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, 0);
double lowerBand = iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, 0);
double middleBand = iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_MAIN, 0);
double currentPrice = Close[0];
// ロングエントリー条件 (価格が下部バンドにタッチ)
if(currentPrice <= lowerBand && !PositionExists())
{
OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0, "Buy Order", 0, 0, Blue);
}
// ショートエントリー条件 (価格が上部バンドにタッチ)
if(currentPrice >= upperBand && !PositionExists())
{
OrderSend(Symbol(), OP_SELL, 0.01, Bid, 3, 0, 0, "Sell Order", 0, 0, Red);
}
// ポジション決済条件 (価格が中央バンドにタッチ)
if(PositionExists())
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol())
{
if(OrderType() == OP_BUY && currentPrice >= middleBand)
OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrGreen);
if(OrderType() == OP_SELL && currentPrice <= middleBand)
OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrGreen);
}
}
}
}
//+------------------------------------------------------------------+
//| ポジションが存在するかを確認するヘルパー関数 |
//+------------------------------------------------------------------+
bool PositionExists()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol())
return(true);
}
return(false);
}
バックテスト
こちらのコードも普通に機能しました。


まとめ
今回はCopilotを使ってEA用のコードが作成できるのか再検証をしました。
結果としては、EA用のコードは作成することができ、そのままでも動くことがわかりました。
今回作成したコードをベースとして、利益が期待できるコードまで進化させていきたいと思います。
また次回お楽しみに。