コンテンツにスキップ

ChatGPTを使用してcBotを作成する方法

生成AIが台頭し、コードを1行も書かずにcBotを作成することはもはや夢ではなく、現実です。 この記事とその対応するビデオでは、ChatGPTを使用してcBotを作成する方法を紹介します。 また、ChatGPTが提供するcBotコードを評価し、AIが生成したボットが数分で動作することを確認する方法もご紹介します。

正しいプロンプトを作成する

このビデオの目的のために、GPT-3.5モデルを使用します。 これは誰でも無料で利用でき、新しいGPTモデルと比べて機能は劣るものの、素晴らしい結果を生み出します。

ChatGPTで素晴らしいcBotを作成する最初のステップは、正しいプロンプトを入力することです。 以下に、良いプロンプトを作成するためのいくつかのルールを示します:

1. ChatGPTにプロのcBot開発者の役割を演じるよう促します。

これを行うには、「cTraderの資格を持つアルゴ開発者としてゲームをプレイしましょう...」や「cTraderのプロのcBot開発者として振る舞ってください...」といった言葉で初期プロンプトを入力します。

2. 具体的にします。

ChatGPTに提供する詳細情報が多ければ多いほど、結果は良くなります。 「私のために利益を生むcBotを作成してください...」といったプロンプトは、AIにとって多くの混乱を招く可能性があります。

cBotの各部分をできるだけ正確に指定することをお勧めします。 どのパラメータを持つべきか、どの条件に反応すべきか、どの取引操作を実行すべきかを考慮します。 カスタム取引パネルを作成する場合は、どのUI要素を持つべきか、それらをどこに配置すべきかを考えます。

3. 礼儀正しく、敬意を払います。

これは驚くかもしれませんが、ChatGPTに対して礼儀正しく接することで、出力の品質が実際に向上することが研究で示されています。 「...していただけるとありがたいです」、「...していただけると嬉しいです」といったフレーズを含めます。

色取引cBotを作成する

まず、各バーの開始時に新しい市場注文を出すシンプルなcBotを作成します。 注文の方向は、前のバーが緑か赤かによって決まります。 バーが赤だった場合は売り注文を、緑だった場合は買い注文を出します。

以下に、正しいプロンプトを提供することでこれを実現する方法を示します。

  • 開始文:「cTraderのプロのcBot開発者として振る舞ってください。非常にシンプルで理解しやすいコードを書いてください。」
  • 具体的な要件:「cBotを作成してください。 各バーで、保護メカニズムなしで新しい市場注文を出す必要があります。 注文数量(単位)はカスタマイズ可能なパラメータである必要があります。 前のバーが緑だった場合は買い注文を、 赤だった場合は売り注文を出してください。」
  • 礼儀:「このタスクを実行していただけると本当にありがたいです。ありがとうございます!」

ChatGPTが出力する正確なコードは異なる場合がありますが、いずれにせよ、それをコードエディターウィンドウにコピー&ペーストして、正しいかどうか、および希望するロジックを実装しているかどうかを確認できます。

通常、修正が必要な非致命的なエラーはいくつかしかありません。 今回のケースでは、ExecuteMarketOrderメソッドのSymbolオブジェクトをSymbolName文字列に変更する必要がありました。 以下に、これらすべてを行った後に得られた最終的なコードを示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.API.Requests;
using cAlgo.Indicators;

namespace SimpleColorBasedMarketOrders
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]
    public class ColorBasedMarketOrders : Robot
    {
        [Parameter("Order Volume (Units)", DefaultValue = 10000, MinValue = 1000)]
        public int OrderVolume { get; set; }

        protected override void OnBar()
        {
            if (Bars.Count < 2)
                return;

            Color previousBarColor = Bars.Last(1).Close > Bars.Last(1).Open ? Color.Green : Color.Red;
            if (previousBarColor == Color.Green)
            {
                ExecuteMarketOrder(TradeType.Buy, SymbolName, OrderVolume, "Buy Order", null, null, null);
            }
            else if (previousBarColor == Color.Red)
            {
                ExecuteMarketOrder(TradeType.Sell, SymbolName, OrderVolume, "Sell Order", null, null, null);
            }
        }
    }
}

いつものように、ボットを保存してビルドします。 Tradeアプリケーションで、ボットのインスタンスをチャートにアタッチし、意図した通りに動作するかどうかを確認します。 ボットは完璧に動作し、過去のバーの色に反応して新しい注文を出します。 注文数量もカスタマイズ可能なパラメータです。

注意

ChatGPTが出力したコードを読む必要さえありませんでした。 コードエディターに表示されたすべての警告を修正し、その後ボットを起動しました。

トレンド取引cBotを作成する

先ほどのcBotは素晴らしく動作しましたが、シンプルなロジックを使用しており、市場のトレンドには注意を払いませんでした。 以前と同じプロンプトのアプローチを使用して、より複雑なものを作成してみます。

  • 開始文:「cTraderの熟練したcBot開発者であると想像してください。 私はあなたのクライアントです。」
  • 具体的な要件:「cBotを作成してください。 各バーで、50日移動平均が200日移動平均の上か下かを確認する必要があります。 上にある場合は買い注文を、 下にある場合は売り注文を出す必要があります。 同じ方向に既にオープンポジションが存在する場合、ボットは注文を出さないようにする必要があります。 注文数量はカスタマイズ可能なパラメータである必要があります。」
  • 礼儀:「ご協力ありがとうございます!」

再び、ChatGPTから提供されたコードをコードエディターウィンドウにコピー&ペーストし、ボットをビルドしようとします。 以下に、ビルドエラーのすべてを示します:

  • コードは古いMarketSeries APIメンバーを使用しています。 Bars.ClosePricesコレクションに置き換えることができます。
  • 再び、Symbol引数をSymbolNameに置き換える必要があります。
  • ExecuteMarketOrderメソッドからいくつかの不要な引数を削除する必要があります。これらは利用可能なメソッドオーバーロードに適合しません。

また、ロジックがどのように実現されたかを見ることができます。 OnStart()メソッドでは、移動平均を初期化します。 ChatGPTは、移動平均期間をカスタマイズ可能なパラメータにしましたが、私たちはそれを要求しませんでした。 コアロジックに影響を与えない限り、そのままにしておくことができます。

しかし、OnBar()メソッドでは、ボットがオープンポジションがない場合にのみ新しい注文を出すことがわかります(Positions.Count ==0)。 これは私たちが望むものではありません。ポジションの方向も確認したいのです。 コードを少し修正して、以下のボットを作成できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;

namespace MovingAverageCrossBot
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class MovingAverageCrossBot : Robot
    {
        [Parameter("MA50 Periods", DefaultValue = 50)]
        public int MA50Periods { get; set; }

        [Parameter("MA200 Periods", DefaultValue = 200)]
        public int MA200Periods { get; set; }

        [Parameter("Volume", DefaultValue = 10000, MinValue = 1000)]
        public int Volume { get; set; }

        private ExponentialMovingAverage MA50;
        private ExponentialMovingAverage MA200;

        protected override void OnStart()
        {
            MA50 = Indicators.ExponentialMovingAverage(Bars.ClosePrices, MA50Periods);
            MA200 = Indicators.ExponentialMovingAverage(Bars.ClosePrices, MA200Periods);
        }

        protected override void OnBar()
        {
            if (MA50.Result.LastValue > MA200.Result.LastValue && Positions.FindAll("Buy Order").Length == 0) 
            {
                // Place a buy order
                ExecuteMarketOrder(TradeType.Buy, SymbolName, Volume, "Buy Order");
            }
            else if (MA50.Result.LastValue < MA200.Result.LastValue && Positions.FindAll("Sell Order").Length == 0)
            {
                // Place a sell order
                ExecuteMarketOrder(TradeType.Sell, SymbolName, Volume, "Sell Order");
            }
        }
    }
}

Positions.FindAll(string label)メソッドを使用して、特定のラベルを持つすべてのポジションを取得し、その数を計算しました。

ボットをビルドすると、それをチャートに追加できます。 50日と200日の移動平均も追加して、cBotの動作を評価します。 少し待つと、ボットが期待通りに動作することがわかります。 必要なときに新しい注文が出されますが、特定の方向に複数のオープンポジションが存在することはありません。

他のAIを使用してcBotを作成する

概要

ChatGPTは、正確に定義されたロジックでcBotを迅速に作成する必要がある場合に貴重なツールです。 ChatGPTはいくつかのエラーを生成しますが、通常は重要ではなく、迅速に修正できます。

Image title