Copilotを使ってEAを作ろう -第2回-

FX_第二章【システムトレード】

AIを使って自作EAを作ろうシリーズ第2回です。

今回は半年前に一度断念したベースコード作成までやっていきます。

この半年の間に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用のコードは作成することができ、そのままでも動くことがわかりました。

今回作成したコードをベースとして、利益が期待できるコードまで進化させていきたいと思います。

また次回お楽しみに。

タイトルとURLをコピーしました