Przejdź do treści

Cykl życia wskaźnika niestandardowego

Przykładowa struktura kodu

Ten artykuł poprowadzi Cię przez strukturę kodu i wyjaśni logikę stojącą za zdarzeniami i cyklem życia wskaźnika cTrader. Aby uzyskać dostęp do wskaźników niestandardowych, otwórz zakładkę Lokalne w aplikacji Algo.

Image title

Jako przykład możesz utworzyć nowy wskaźnik o nazwie „LifeCycle Test" z następującym przykładowym kodem dostępnym w oknie edytora kodu.

Image title

Aby zresetować do wersji szablonowej, skopiuj poniższy kod.

 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
{
    [Indicator(AccessRights = AccessRights.None)]
    public class LifeCycleTest : Indicator
    {
        [Parameter(DefaultValue = "Hello world!")]
        public string Message { get; set; }

        [Output("Main")]
        public IndicatorDataSeries Result { get; set; }

        protected override void Initialize()
        {
            // To learn more about cTrader Algo visit our Help Center:
            // https://help.ctrader.com/ctrader-algo/


            Print(Message);
        }

        public override void Calculate(int index)
        {
            // Calculate value at specified index
            // Result[index] = 
        }
    }
}

Na pierwszy rzut oka struktura kodu zawiera tylko dwie metody: metodę Initialize() i metodę Calculate(). Kliknij Kompiluj, aby kontynuować testowanie tego wskaźnika. Dodamy dodatkową metodę o nazwie OnDestroy() i wyjaśnimy jej przeznaczenie później.

Zdarzenie inicjalizacji

Gdy wskaźnik cTrader jest po raz pierwszy dołączany do wykresu lub gdy użytkownik zmienia którekolwiek z ustawień parametrów, instancja wskaźnika jest odtwarzana i wywoływana jest metoda Initialize(). Służy ona do inicjalizacji wszelkich zmiennych, które planujesz wykorzystać w swoim wskaźniku. Możesz również definiować i odwoływać się do dodatkowych wskaźników, aby utworzyć pojedynczy wskaźnik wykorzystujący formuły z innych wskaźników.

Domyślnie nowy szablon kodu zawiera ustawienie parametru o nazwie Message z wartością „Hello world!".

1
2
[Parameter(DefaultValue = "Hello world!")]
public string Message { get; set; }

W metodzie Initialize() znajduje się wiersz kodu, który drukuje tę wiadomość do dziennika.

1
Print(Message);

Aby zademonstrować metodę Initialize(), dodaj instancję wskaźnika, klikając ikonę Plus obok ikony Kompiluj i wybierając symbol. Jeśli klikniesz Więcej w wierszu wskaźnika i wybierzesz Dodaj instancję, symbol EURUSD z ramami czasowymi h1 zostanie dodany automatycznie.

Image title

Uwaga

Dodawanie instancji w cTrader Algo jest tym samym co dołączanie wskaźnika do wykresu w aplikacji Trade.

Teraz otwórz zakładkę Dziennik w panelu Trade Watch pod wykresem. Jak widać, wiadomość „Hello world" została wydrukowana.

Image title

Za każdym razem, gdy wskaźnik jest po raz pierwszy dodawany do wykresu lub gdy parametr jest zmieniany, wykres jest odświeżany i metoda Initialize() jest wywoływana ponownie. Wpisz inną wiadomość w sekcji Parametry, aby zobaczyć odpowiednią aktualizację wpisu dziennika.

Image title

Obliczanie wyniku wskaźnika

Metoda Calculate() jest wywoływana dla każdego indeksu danych historycznych i przy każdym przychodzącym ticku. Na przykład, jeśli bieżący wykres ma 1000 słupków, metoda Calculate() zostanie wywołana dla indeksu 0, 1, 2 i tak dalej, aż do maksymalnie 999.

1
public override void Calculate(int index)

Metoda Calculate() może być wywoływana wiele razy na sekundę w okresach wysokiej zmienności lub rzadziej, gdy rynek jest płaski. Aby przetestować, jak to działa, możesz dodać linię kodu do treści metody Calculate(), aby wyświetlić wartość indeksu przekazywaną do metody dla każdego nowego ticka danych. Nie zapomnij kliknąć Build za każdym razem po dodaniu zmian w oknie edytora kodu.

1
Print("Index: " + index);

Aby przełączyć się z okna edytora kodu na wykres, kliknij dodaną instancję wskaźnika. Jeśli otworzysz kartę Log w panelu Trade Watch, zobaczysz wartości wyświetlone dla każdego indeksu przekazanego do metody.

Image title

Metoda OnDestroy()

Metoda OnDestroy() jest wywoływana, gdy wskaźnik zostanie usunięty z wykresu i nie jest już potrzebny. Musisz zaimplementować tę metodę, ponieważ nie jest ona domyślnie dodawana podczas tworzenia nowego wskaźnika.

1
2
3
4
protected override void OnDestroy()
        {
            base.OnDestroy();            
        }

Ta metoda jest przydatna dla programistów, ponieważ pozwala im zwolnić niezarządzane zasoby i wykonać zadania finalizacyjne. Pomaga zapobiegać wyciekom pamięci i zapewnia, że wskaźnik nie zatrzymuje zasobów po usunięciu. Przykłady obejmują zamykanie połączeń z zewnętrznymi źródłami danych, zwalnianie dużych obiektów danych i inne operacje zwalniające pamięć.

Podsumowanie

Podsumowując, metody Initialize(), Calculate() i OnDestroy() ilustrują różne etapy cyklu życia wskaźnika niestandardowego. Dostosowując przykładowy kod w aplikacji Algo, możesz swobodnie decydować, jak inicjować zmienne wskaźnika, obliczać wynik wskaźnika i uruchamiać zadania finalizacyjne.

Image title