Przejdź do treści

Kluczowe typy cBotów

cBoty to wszechstronne narzędzia, które w zależności od swojego kodu i logiki mogą pełnić różne role i funkcje, od w pełni zautomatyzowanego handlu po wsparcie dla wdrażania strategii handlu manualnego. W tym artykule i odpowiadającym mu filmie zdefiniujemy kluczowe typy cBotów, nakreślimy ich główne różnice i wymienimy niektóre najlepsze praktyki tworzenia i używania cBotów różnych typów.

Ogólnie rzecz biorąc, istnieją cztery kluczowe typy cBotów.

Uwaga

Poniższe kategorie różnią się wyłącznie na podstawie zachowań cBotów. W rzeczywistym kodzie cBota nie są określone żadne kategorie. Ponadto niektórzy programiści mogą również tworzyć niestandardowe klasyfikacje cBotów.

  • Zautomatyzowane strategie handlowe - jak sugeruje nazwa, cBoty tego typu autonomicznie wykonują strategie handlowe. Na przykład cBot Three black crows & three white soldiers składa nowe zlecenie kupna po napotkaniu trzech kolejnych zielonych świec i nowe zlecenie sprzedaży w przypadku trzech kolejnych czerwonych świec.
  • Skrypty - cBoty należące do tego typu wykonują akcję przy starcie i zatrzymują się po zakończeniu wykonywania. Na przykład skryptowy cBot może ustanowić stop loss dla wszystkich aktualnie otwartych pozycji, niezależnie od ich kierunku, wolumenu lub instrumentu.
  • Asystenci handlowi - są zaprojektowani do wykonywania pewnego rodzaju pomocnej akcji, która uzupełnia strategię handlu manualnego lub automatycznego. Na przykład cBot tego typu może zarządzać Twoimi trailing stop lossami przy użyciu niestandardowych reguł, które różnią się od wbudowanej funkcji trailing stop loss oferowanej przez cTrader.
  • Panele handlowe - cBoty tego typu nie handlują autonomicznie; zamiast tego tworzą niestandardowe kontrolki, które mogą być używane do różnych celów. Na przykład cBot może uruchomić WebView agregatora wiadomości Forex, integrując jednocześnie niestandardowe przyciski kupna i sprzedaży oraz selektor symboli wewnątrz WebView, umożliwiając użytkownikowi handel bez opuszczania strony z wiadomościami.

W poniższych podsekcjach omawiamy szczegółowo każdy z powyższych typów, nakreślamy ich zalety i ograniczenia oraz sugerujemy różne przypadki użycia.

Strategie handlu algorytmicznego

cBoty należące do typu zautomatyzowanej strategii handlowej są złożone, ale potężne. Muszą prawidłowo wdrażać strategię handlową, w tym wszystkie jej aspekty, takie jak zarządzanie ryzykiem, ustalanie wielkości pozycji i analiza techniczna.

Możesz stworzyć prostą zautomatyzowaną strategię handlową w niecałe dwie minuty, po prostu zastępując domyślny szablon nowego cBota poniższym kodem.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using cAlgo.API;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class BasicTrendBot : Robot
    {
        protected override void OnBar()
        {
            if (Bars.ClosePrices.Last(1) > Bars.ClosePrices.Last(2))
            {
                ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000, "FollowTrend");
            }
            else if (Bars.ClosePrices.Last(1) < Bars.ClosePrices.Last(2))
            {
                ExecuteMarketOrder(TradeType.Sell, SymbolName, 1000, "FollowTrend");
            }
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class BasicTrendBot():
    def on_bar(self):
        if api.Bars.ClosePrices.Last(1) > api.Bars.ClosePrices.Last(2):
            api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000, "FollowTrend")
        elif api.Bars.ClosePrices.Last(1) < api.Bars.ClosePrices.Last(2):
            api.ExecuteMarketOrder(TradeType.Sell, api.SymbolName, 1000, "FollowTrend")

cBot otwiera nową pozycję na każdym słupku. Pozycja długa jest otwierana, jeśli cena wzrosła na poprzednim słupku w porównaniu do słupka przed nim. I odwrotnie, pozycja krótka jest otwierana, jeśli cena spadła.

Backtesting i optymalizacja

Zautomatyzowane strategie handlowe zazwyczaj obejmują wiele ruchomych części i parametrów. W rezultacie takie cBoty często muszą być poddane obszernemu backtestingowi i optymalizacji przed uruchomieniem na kontach rzeczywistych. Na szczęście cTrader zapewnia wbudowane narzędzia, które mogą obsłużyć backtesting i optymalizację za Ciebie.

Narzędzie wiersza poleceń cTrader (CLI)

Zautomatyzowane strategie handlowe zazwyczaj muszą działać przez długie okresy czasu, aby mogły reagować na różne sygnały analizy technicznej. Aby zaoszczędzić na zużyciu pamięci RAM i procesora w takich przypadkach, możesz uruchamiać cBoty za pomocą cTrader CLI bez otwierania cTrader Windows (zauważ, że możliwe jest uruchomienie dowolnego cBota za pomocą cTrader CLI, nie tylko cBotów tego typu).

Skrypty

Skrypty są zazwyczaj potrzebne do wykonania pewnego rodzaju akcji, którą byłoby trudno lub czasochłonnie wykonać ręcznie. Te akcje są zazwyczaj podejmowane przy starcie cBota, dzięki czemu możesz uruchomić skrypt, obserwować wyniki jego działania, a następnie zatrzymać jego instancję po sukcesie, aby zaoszczędzić na zużyciu pamięci RAM i procesora.

Na przykład skrypt może zamknąć wszystkie pozycje, których zysk brutto przekracza 50 jednostek waluty depozytu konta tradera. W efekcie skrypt działałby jako uniwersalny take profit dla wszystkich otwartych pozycji, który możesz uruchomić w dowolnym momencie. Oto jak wyglądałby kod tego skryptu.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using cAlgo.API;
using cAlgo.API.Collections;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class BasicScriptBot : Robot
    {

        protected override void OnStart()
        {
            foreach (var position in Positions) 
            {
                if (position.GrossProfit > 50) 
                {
                    ClosePosition(position);
                }
            }
            Stop();
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class BasicScriptBot():
    def on_start(self):
        for position in api.Positions:
            if position.GrossProfit > 50:
                api.ClosePosition(position)
        api.Stop()

Po uruchomieniu cBota powinniśmy zobaczyć kilka zyskownych pozycji stopniowo zamykanych.

Zatrzymywanie skryptów

Ponieważ skrypty muszą wykonać określoną akcję tylko raz, możesz poinstruować cTrader, aby natychmiast zamknął skrypt po pomyślnym zakończeniu wykonywania. Jak pokazano w powyższym przykładzie, możesz to zrobić, wywołując metodę Stop().

Asystenci handlowi

Celem asystentów handlowych jest regularne wykonywanie pomocnych akcji. Chociaż czyni to je podobnymi do skryptów, skrypty wykonują akcję tylko przy starcie instancji. W przeciwieństwie do tego asystenci handlowi są zaprojektowani do ciągłego reagowania na warunki rynkowe lub inne czynniki i wykonywania operacji w odpowiedzi na określone wzorce.

Na przykład rozważ cBota, który automatycznie zabezpiecza Twoje pozycje, gdy tylko je otworzysz. Kod tego cBota mógłby wyglądać następująco.

 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
using System;
using cAlgo.API;
using cAlgo.API.Collections;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class BasicAssistantBot : Robot

    {
        private bool hasHedgedPosition = false;

        protected override void OnStart()
        {
            Positions.Opened += Positions_Opened;
        }

        private void Positions_Opened(PositionOpenedEventArgs args) 
        {
            if (!hasHedgedPosition) 
            {
                hasHedgedPosition = true;
                var position = args.Position;
                var oppositeTradeType = position.TradeType == TradeType.Buy ? TradeType.Sell : TradeType.Buy;
                ExecuteMarketOrder(oppositeTradeType, SymbolName, position.VolumeInUnits / 2);
            }
            else 
            {
                hasHedgedPosition = false;            
            }
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class BasicAssistantBot():
    def on_start(self):
        self.hasHedgedPosition = False
        api.Positions.Opened += self.positions_opened

    def positions_opened(self, args):
        if not self.hasHedgedPosition:
            self.hasHedgedPosition = True
            position = args.Position
            opposite = TradeType.Sell if position.TradeType == TradeType.Buy else TradeType.Buy
            api.ExecuteMarketOrder(opposite, api.SymbolName, position.VolumeInUnits / 2)
        else:
            self.hasHedgedPosition = False

Po otwarciu pozycji cBot natychmiast próbuje otworzyć kolejną w przeciwnym kierunku; wolumen tej nowej pozycji wynosi dokładnie połowę wolumenu oryginalnej pozycji.

Zauważ, że używamy pola hasHedgedPosition, aby uniknąć nieskończonej pętli, dzięki czemu cBot zabezpiecza nową pozycję tylko raz.

Funkcje wywołania zwrotnego

Asystenci handlowi często używają funkcji wywołania zwrotnego działających jako procedury obsługi dla różnych zdarzeń. Aby dowiedzieć się, które zdarzenia możesz obsługiwać dla określonej klasy, otwórz wbudowaną dokumentację API, wyszukaj wymaganą klasę i przejdź do sekcji Events w spisie treści.

Panele handlowe

Panele handlowe wyświetlają niestandardowe kontrolki, które wyzwalają różne akcje podczas interakcji z nimi. Zazwyczaj zapewniają poprawę jakości życia w stosunku do domyślnego interfejsu użytkownika cTrader. Na przykład cBot może wyświetlać przycisk Buy, który po kliknięciu wykonuje zlecenie rynkowe dla predefiniowanego wolumenu w cTrader.

Aby stworzyć takiego cBota, po prostu użyj poniższego kodu.

 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;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class BasicPanelBot : Robot
    {

        Button buttonBuyOrder;

        protected override void OnStart()
        {

            buttonBuyOrder = new Button
            {
                Text = "Buy",
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment = VerticalAlignment.Center,
            };

            buttonBuyOrder.Click += ButtonBuyOrder_Click;

            Chart.AddControl(buttonBuyOrder);
        }

        private void ButtonBuyOrder_Click(ButtonClickEventArgs args) 
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000);
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class BasicPanelBot():
    def on_start(self):
        self.buttonBuyOrder = Button()
        self.buttonBuyOrder.Text = "Buy"
        self.buttonBuyOrder.HorizontalAlignment = HorizontalAlignment.Center
        self.buttonBuyOrder.VerticalAlignment = VerticalAlignment.Center
        self.buttonBuyOrder.Click += self.button_buy_order_click
        api.Chart.AddControl(self.buttonBuyOrder)

    def button_buy_order_click(self, args):
        api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 10000)

Po kliknięciu przycisku Buy składane jest nowe zlecenie rynkowe na 10 000 jednostek. Wygodne umieszczenie przycisku pozwala na szybkie reagowanie na nowe możliwości rynkowe.

Łączenie paneli handlowych z innymi typami cBotów

Panele handlowe zapewniają niestandardowe kontrolki interfejsu użytkownika, które pozwalają wykonywać różne operacje. Możesz ich używać wraz z innymi typami cBotów. Na przykład panel handlowy może zawierać niestandardowy przycisk Hedge, który po kliknięciu zabezpiecza wszystkie aktualnie otwarte pozycje, podobnie jak w powyższym przykładzie asystenta handlowego.

Podsumowanie

Wszystkie cztery kategorie cBotów mają uzasadnione zastosowania i mogą być łączone w zależności od Twoich preferencji. Na przykład możesz jednocześnie uruchomić zautomatyzowaną strategię handlową i asystenta handlowego, aby osiągnąć najlepsze możliwe wyniki. Możesz eksperymentować z cBotami różnych typów, aby upewnić się, że Twoje preferowane podejście do handlu jest wykonywane w pełni i bez błędów.

Image title