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

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

今回から新しいテーマとして、Microsoft社のAIツール<Copilot>を使ってEAを自作していこうと思います。

このテーマのゴールは、勝率、ドローダウン、総利益の項目すべてで私の自作EAを超えるものを作るところです。

正直いま私のEA開発も煮詰まっているので、何かヒントがないか、手軽にEAを作れないかというチャレンジになっていますので、もしご興味あるようでしたら御目通しいただけると幸いです。

概要

自作EAで何が面倒かというと、どうしてもコードを書くところですよね。

私もネットを見ながらやりたいことを少しずつテキストにしていくのですが、どうしても想定通りの動きをしてくれず一つのEAロジックを作成するのにとても時間をかけています。

一方でいまAIの進化はすさまじく、年々精度、能力が上がっている状況なのは周知の事実です。

そこで今回は、CopilotをつかってEAのコードを作ってもらおうと思います。

ロジックを指定するとコードができる(らしい?)という情報をつかんだので、今回は動きEAが作れるのかの検証回とします。

テストコードの作成

それではさっそく、テストコード作成に入ります。

シンプルなロジックを2つ指定してあげて、それぞれEAコードを作成させます。

作成されたEAに対して直近1年間のバックテストを走らせてみて、期待通りの動きになっているのか検証していきます。

バックテストの条件は以下。

 ・対象通貨ペア:USDJPY

 ・時間足:15M

 ・期間:2023年10月~2024年9月

 ・証拠金10万円

ロジック① 2本の移動平均線のクロス

コード作成

Copilotへの命令文は以下の通り。

<次のロジックになるようにMT4用のコード作成をしてください。5maと20maのクロスでエントリーし、逆のクロスで決済する。ロット数は0.01。>

作成されたコードは以下の通り。

//+------------------------------------------------------------------+
//|                                                      MyStrategy.mq4|
//|                       Generated by Copilot                        |
//+------------------------------------------------------------------+
int start()
{
    // 直近の5期間移動平均値(5MA)と20期間移動平均値(20MA)を取得
    double ma5_current = iMA(NULL, 0, 5, 0, MODE_SMA, PRICE_CLOSE, 0);
    double ma20_current = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);

    // 1つ前の5期間移動平均値(5MA)と20期間移動平均値(20MA)を取得
    double ma5_previous = iMA(NULL, 0, 5, 0, MODE_SMA, PRICE_CLOSE, 1);
    double ma20_previous = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);

    // ポジションがない場合にエントリーを検討
    if (OrdersTotal() == 0)
    {
        // 5MAが20MAを上抜いた場合に買いエントリー
        if (ma5_previous <= ma20_previous && ma5_current > ma20_current)
        {
            OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0, "Buy on 5MA cross above 20MA", 0, 0, Blue);
        }
        // 5MAが20MAを下抜いた場合に売りエントリー
        else if (ma5_previous >= ma20_previous && ma5_current < ma20_current)
        {
            OrderSend(Symbol(), OP_SELL, 0.01, Bid, 3, 0, 0, "Sell on 5MA cross below 20MA", 0, 0, Red);
        }
    }
    else
    {
        // 買いポジションがある場合に逆のクロスで決済
        if (OrderType() == OP_BUY && ma5_current < ma20_current)
        {
            OrderClose(OrderTicket(), OrderLots(), Bid, 3, Violet);
        }
        // 売りポジションがある場合に逆のクロスで決済
        else if (OrderType() == OP_SELL && ma5_current > ma20_current)
        {
            OrderClose(OrderTicket(), OrderLots(), Ask, 3, Violet);
        }
    }
    return 0;
}

バックテスト

エントリーをしたまま決済されず、最終日に強制決済されていました。

5maと20maは表示されており、何度もクロスはしているので決済ロジックが機能していなかったものと思いますが、コードとしてはおおむね正しいような気もします。

ロジック② ボリンジャーバンド2σラインにタッチ

コード作成

Copilotへの命令文は以下の通り。

<次のロジックになるようにMT4用のコード作成をしてください。20maのボリンジャーバンド2シグマタッチでエントリーおよび決済。ロット数は0.01。>

作成されたコードは以下の通り。

//+------------------------------------------------------------------+
//|                                                      MyStrategy.mq4|
//|                       Generated by Copilot                        |
//+------------------------------------------------------------------+
int start()
{
    // ボリンジャーバンドの設定
    int period = 20;
    int deviation = 2;
    
    // ボリンジャーバンドの上限と下限を計算
    double upperBand = iBands(NULL, 0, period, deviation, 0, PRICE_CLOSE, MODE_UPPER, 0);
    double lowerBand = iBands(NULL, 0, period, deviation, 0, PRICE_CLOSE, MODE_LOWER, 0);
    double currentClose = iClose(NULL, 0, 0);

    // ポジションがない場合にエントリーを検討
    if (OrdersTotal() == 0)
    {
        // 現在のクローズ価格がボリンジャーバンドの上限に触れた場合に売りエントリー
        if (currentClose >= upperBand)
        {
            OrderSend(Symbol(), OP_SELL, 0.01, Bid, 3, 0, 0, "Sell on upper Bollinger Band touch", 0, 0, Red);
        }
        // 現在のクローズ価格がボリンジャーバンドの下限に触れた場合に買いエントリー
        else if (currentClose <= lowerBand)
        {
            OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0, "Buy on lower Bollinger Band touch", 0, 0, Blue);
        }
    }
    else
    {
        // 買いポジションがある場合にボリンジャーバンドの上限に触れたら決済
        if (OrderType() == OP_BUY && currentClose >= upperBand)
        {
            OrderClose(OrderTicket(), OrderLots(), Bid, 3, Violet);
        }
        // 売りポジションがある場合にボリンジャーバンドの下限に触れたら決済
        else if (OrderType() == OP_SELL && currentClose <= lowerBand)
        {
            OrderClose(OrderTicket(), OrderLots(), Ask, 3, Violet);
        }
    }
    return 0;
}

バックテスト

エントリーをしたまま決済されず、最終日に強制決済されていました。

こちらも同様に2σラインは表示されておりますので、コードとしてはおおむね正しいような気もします。ただし、やはり決済ロジックは機能していません。

まとめ

今回はCopilotを使ってEA用のコードが作成できるのかテストをしました。

結果としては、EA用のコードは作成することができるが、今回の命令文では思ったような動きをさせることができませんでした。

Copilotへの命令文は工夫する必要があることがわかりましたので、次回は命令文の書き方を検証してみたいと思います。

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