Przejdź do treści

Jak stworzyć cBota za pomocą ChatGPT

Generatywna sztuczna inteligencja jest na fali wznoszącej, a tworzenie cBota bez konieczności pisania ani jednej linijki kodu nie jest już marzeniem, lecz rzeczywistością. W tym artykule i odpowiadającym mu filmie pokażemy Ci, jak możesz stworzyć cBota za pomocą ChatGPT. Pokażemy również, jak możesz ocenić kod cBota dostarczony przez ChatGPT i upewnić się, że Twój bot wygenerowany przez AI działa w zaledwie kilka minut.

Stwórz prawidłowy prompt

Na potrzeby tego filmu będziemy używać modelu GPT-3.5. Jest on bezpłatny dla wszystkich i, pomimo braku funkcji w porównaniu z nowszymi modelami GPT, daje świetne rezultaty.

Pierwszą częścią tworzenia świetnego cBota za pomocą ChatGPT jest wpisanie prawidłowego promptu. Oto kilka zasad dotyczących tego, co stanowi dobry prompt:

1. Zachęć ChatGPT, aby spróbował wcielić się w rolę profesjonalnego programisty cBotów.

Możesz to osiągnąć, wpisując początkowy prompt ze słowami „Zagrajmy w grę, w której jesteś wykwalifikowanym programistą algorytmów dla cTrader..." lub coś w stylu „Udawaj, że jesteś profesjonalnym programistą cBotów dla cTrader..."

2. Bądź konkretny.

Im więcej szczegółów podasz ChatGPT, tym lepiej. Prompty takie jak „Stwórz dla mnie dochodowego cBota..." spowodowałyby wiele zamieszania po stronie AI.

Zalecamy określenie każdej części Twojego cBota tak precyzyjnie, jak to możliwe. Zastanów się, jakie parametry powinien mieć, na jakie warunki powinien reagować i jakie operacje handlowe powinien wykonywać. Jeśli tworzysz niestandardowy panel handlowy, zastanów się, jakie elementy interfejsu użytkownika powinien zawierać i gdzie powinny być umieszczone.

3. Bądź uprzejmy i pełen szacunku.

To może brzmieć zaskakująco, ale badania wykazały, że bycie uprzejmym wobec ChatGPT faktycznie poprawia jakość wyników. Uwzględnij zwroty takie jak „Byłbym wdzięczny, gdybyś...", „Byłoby miło, gdyby..." lub coś podobnego.

Stwórz cBota handlującego kolorami

Na początek chcemy po prostu stworzyć prostego cBota, który składa nowe zlecenie rynkowe przy otwarciu każdego słupka. Kierunek zlecenia zależy od tego, czy poprzedni słupek był zielony, czy czerwony. Jeśli słupek był czerwony, chcemy złożyć zlecenie sprzedaży, a jeśli był zielony, chcemy złożyć zlecenie kupna.

Oto jak możemy to zrobić, podając prawidłowe prompty.

  • Zdanie początkowe: „Udawaj, że jesteś profesjonalnym programistą cBotów dla cTrader, pisz bardzo prosty i zrozumiały kod."
  • Konkretne wymagania: „Stwórz cBota. Przy każdym słupku powinien składać nowe zlecenie rynkowe bez mechanizmów ochronnych. Wolumen zlecenia (w jednostkach) powinien być parametrem konfigurowalnym. Zlecenie kupna powinno zostać złożone, jeśli poprzedni słupek był zielony. Zlecenie sprzedaży powinno zostać złożone, jeśli poprzedni słupek był czerwony."
  • Uprzejmość: „Byłbym bardzo wdzięczny, gdybyś wykonał to zadanie, dziękuję!"

Dokładny kod wygenerowany przez ChatGPT może się różnić, ale w każdym przypadku możemy po prostu skopiować i wkleić go do okna edytora kodu, aby sprawdzić, czy jest poprawny i czy implementuje naszą pożądaną logikę.

Zazwyczaj występuje tylko kilka niekrytycznych błędów, które wymagają naprawy. W naszym przypadku jedyną rzeczą wymagającą naprawy była zmiana obiektu Symbol w metodzie ExecuteMarketOrder na ciąg znaków SymbolName. Oto ostateczny kod, który otrzymaliśmy po wykonaniu wszystkich tych czynności.

 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);
            }
        }
    }
}

Jak zwykle zapisujemy i budujemy bota. W aplikacji Trade dołączamy instancję bota do wykresu i sprawdzamy, czy działa zgodnie z zamierzeniami. Bot działa bezbłędnie i reaguje na kolor poprzednich słupków, składając nowe zlecenia. Wolumen zlecenia jest również parametrem konfigurowalnym.

Uwaga

Zauważ, że nawet nie musieliśmy czytać kodu wygenerowanego przez ChatGPT. Po prostu naprawiliśmy każde ostrzeżenie wyświetlane w edytorze kodu, a następnie uruchomiliśmy bota.

Stwórz cBota handlującego trendem

Chociaż wcześniejszy cBot działał świetnie, używał prostej logiki i nie zwracał uwagi na trendy rynkowe. Spróbujemy stworzyć coś bardziej złożonego, stosując to samo podejście do promptowania co wcześniej.

  • Zdanie początkowe: „Wyobraźmy sobie, że jesteś wykwalifikowanym programistą cBotów dla cTrader. Będę Twoim klientem."
  • Konkretne wymagania: „Stwórz cBota. Przy każdym słupku powinien sprawdzać, czy 50-dniowa średnia krocząca jest powyżej, czy poniżej 200-dniowej średniej kroczącej. Jeśli jest powyżej, bot powinien złożyć zlecenie kupna. Jeśli jest poniżej, bot powinien złożyć zlecenie sprzedaży. Bot nie powinien składać zlecenia, jeśli istnieje już otwarta pozycja w tym samym kierunku. Wolumen zlecenia powinien być parametrem konfigurowalnym."
  • Uprzejmość: „Dziękuję za pomoc!"

Ponownie po prostu skopiujemy i wkleimy kod podany nam przez ChatGPT do okna edytora kodu i spróbujemy zbudować bota. Oto wszystkie błędy kompilacji, które otrzymujemy:

  • Kod używa przestarzałego elementu API MarketSeries. Możemy zastąpić go kolekcją Bars.ClosePrices.
  • Ponownie musimy zastąpić argument Symbol argumentem SymbolName.
  • Powinniśmy również usunąć niektóre niepotrzebne argumenty z metod ExecuteMarketOrder, ponieważ nie pasują one do żadnego z dostępnych przeciążeń metody.

Możemy również przyjrzeć się, jak została zrealizowana nasza logika. W metodzie OnStart() inicjalizujemy nasze średnie kroczące. ChatGPT uczynił okresy średnich kroczących parametrami konfigurowalnymi, mimo że o to nie prosiliśmy. Możemy to pozostawić bez wpływu na podstawową logikę.

Jednak w metodzie OnBar() widzimy, że bot składa nowe zlecenia tylko wtedy, gdy nie ma otwartych pozycji (Positions.Count ==0). To nie jest to, czego chcemy, ponieważ chcemy również sprawdzać kierunek pozycji. Możemy nieznacznie zmodyfikować kod, aby uzyskać następującego bota.

 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");
            }
        }
    }
}

Użyliśmy metody Positions.FindAll(string label), aby uzyskać wszystkie pozycje z daną etykietą i obliczyć ich liczbę.

Kiedy zbudujemy bota, możemy dodać go do wykresu. Dodamy również 50- i 200-dniowe średnie kroczące, abyśmy mogli ocenić zachowania cBota. Po odczekaniu chwili możemy zobaczyć, że bot funkcjonuje zgodnie z oczekiwaniami. Nowe zlecenia są składane w razie potrzeby, ale w danym kierunku istnieje nie więcej niż jedna otwarta pozycja.

Utwórz cBota za pomocą innej AI

Podsumowanie

ChatGPT może być cennym narzędziem, gdy musisz szybko utworzyć cBota z precyzyjnie zdefiniowaną logiką. Chociaż ChatGPT generuje pewne błędy, są one zazwyczaj nieznaczne i można je szybko naprawić.

Image title