Перейти к содержанию

Как создать сиБота с помощью ChatGPT

Генеративный ИИ набирает обороты, и создание сиБота без необходимости писать ни единой строки кода — это уже не мечта, а реальность. В этой статье и соответствующем видео мы покажем вам, как можно создать сиБота с помощью ChatGPT. Мы также продемонстрируем, как вы можете оценить код сиБота, предоставленный ChatGPT, и убедиться, что ваш бот, созданный с помощью ИИ, работает всего за несколько минут.

Создайте правильный промпт

Для целей этого видео мы будем использовать модель GPT-3.5. Она бесплатна для всех и, несмотря на меньшее количество функций по сравнению с более новыми моделями GPT, дает отличные результаты.

Первая часть создания отличного сиБота с помощью ChatGPT — это ввод правильного промпта. Вот несколько правил того, что делает промпт хорошим:

1. Побудите ChatGPT попытаться сыграть роль профессионального разработчика сиБотов.

Вы можете добиться этого, введя начальный промпт со словами "Давай сыграем в игру, где ты — квалифицированный разработчик алгоритмов для cTrader..." или что-то вроде "Притворись профессиональным разработчиком сиБотов для cTrader..."

2. Будьте конкретны.

Чем больше деталей вы предоставите ChatGPT, тем лучше. Промпты вроде "Создай для меня прибыльного сиБота..." приведут к большой путанице со стороны ИИ.

Мы рекомендуем указывать каждую часть вашего сиБота максимально точно. Подумайте, какие параметры он должен иметь, на какие условия он должен реагировать и какие торговые операции он должен выполнять. Если вы создаете пользовательскую торговую панель, подумайте, какие элементы интерфейса она должна иметь и где они должны быть размещены.

3. Будьте вежливы и уважительны.

Это может показаться удивительным, но исследования показали, что вежливость по отношению к ChatGPT на самом деле улучшает качество результата. Включайте фразы вроде "Я был бы признателен, если...", "Было бы здорово, если..." или что-то подобное.

Создайте сиБота для торговли по цвету

Для начала мы просто хотим создать простого сиБота, который размещает новый рыночный ордер при открытии каждого бара. Направление ордера зависит от того, был ли предыдущий бар зеленым или красным. Если бар был красным, мы хотим разместить ордер на продажу, а если он был зеленым, мы хотим разместить ордер на покупку.

Вот как мы можем это сделать, предоставив правильные промпты.

  • Начальное предложение: "Притворись профессиональным разработчиком сиБотов для cTrader, пиши очень простой и понятный код."
  • Конкретные требования: "Создайте сиБота. На каждом баре он должен размещать новый рыночный ордер без механизмов защиты. Объем ордера (в единицах) должен быть настраиваемым параметром. Ордер на покупку должен размещаться, если предыдущий бар был зеленым. Ордер на продажу должен размещаться, если предыдущий бар был красным."
  • Вежливость: "Я был бы очень признателен, если ты выполнишь эту задачу, спасибо!"

Точный код, который выдаст ChatGPT, может отличаться, но в любом случае мы можем просто скопировать и вставить его в окно редактора кода, чтобы проверить, правильный ли он и реализует ли он нашу желаемую логику.

Обычно есть только пара некритичных ошибок, которые нужно исправить. В нашем случае единственное, что требовало исправления, — это изменение объекта Symbol в методе ExecuteMarketOrder на строку 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. Мы просто исправили все предупреждения, отображаемые в редакторе кода, а затем запустили бота.

Создание сиБота для трендовой торговли

Хотя предыдущий сиБот работал отлично, он использовал простую логику и не учитывал рыночные тренды. Мы попробуем создать что-то более сложное, используя тот же подход к формулированию запросов, что и раньше.

  • Начальное предложение: "Давайте представим, что вы опытный разработчик сиБотов для cTrader. Я буду вашим клиентом."
  • Конкретные требования: "Создайте сиБота. На каждом баре он должен проверять, находится ли 50-дневная скользящая средняя выше или ниже 200-дневной скользящей средней. Если она выше, бот должен разместить ордер на покупку. Если она ниже, бот должен разместить ордер на продажу. Бот не должен размещать ордер, если уже существует открытая позиция в том же направлении. Объем ордера должен быть настраиваемым параметром."
  • Вежливость: "Спасибо за помощь!"

Еще раз мы просто скопируем и вставим код, предоставленный нам ChatGPT, в окно редактора кода и попробуем собрать бота. Вот все ошибки сборки, которые мы получаем:

  • Код использует устаревший элемент API MarketSeries. Мы можем заменить его коллекцией 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-дневные скользящие средние, чтобы оценить поведение сиБота. Немного подождав, мы увидим, что бот функционирует как ожидалось. Новые ордера размещаются при необходимости, но в заданном направлении существует не более одной открытой позиции.

Создание сиБота с помощью других ИИ

Обзор

ChatGPT может быть ценным инструментом, когда вам нужно быстро создать сиБота с точно определенной логикой. Хотя ChatGPT выдает некоторые ошибки, они обычно незначительны и могут быть быстро исправлены.

Image title