跳转至

如何通过ChatGPT创建交易机器人

生成式人工智能正在崛起,无需编写一行代码即可创建交易机器人不再是梦想,而是现实。 在本文及其对应的视频中,我们将向您展示如何使用ChatGPT创建交易机器人。 我们还将演示如何评估 ChatGPT 提供的 cBot 代码,并确保您在几分钟内即可让 AI 生成的机器人正常运行。

创建正确的提示

在本视频中,我们将使用GPT-3.5模型。 它对所有人免费,尽管与新GPT模型相比功能有所欠缺,但它产生了出色的结果。

使用ChatGPT创建出色交易机器人的第一部分是输入正确的提示。 以下是创建良好提示的一些规则:

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

总结

当您需要快速创建一个具有精确定义逻辑的 cBot 时,ChatGPT 可以成为一个有价值的工具。 虽然 ChatGPT 会产生一些错误,但它们通常微不足道,可以快速修复。

Image title