Utwórz wskaźnik techniczny w cTrader
Ten artykuł przedstawia kroki tworzenia niestandardowych wskaźników technicznych, w tym narzędzi do handlu algorytmicznego lub działań manualnych w cTrader.
Wskazówka
Dowiedz się, jak tworzyć wskaźniki techniczne, oglądając film w przewodniku krok po kroku.
W zakładce Wskaźniki aplikacji Algo kliknij przycisk Nowy, aby otworzyć kreatora tworzenia algorytmu.
Wprowadź nazwę swojego wskaźnika, a następnie wybierz język programowania spośród C# i Python.
Wybierz metodę tworzenia spośród:
-
Od podstaw – nowy wskaźnik będzie zawierał tylko podstawowy szablon.
-
Używając szablonu – będziesz mógł wybrać gotowy algorytm z listy szablonów Python# lub C#, obejmujących szeroki zakres typów wskaźników, narzędzi analizy technicznej i innych.
Uwaga
Gotowe algorytmy zawierają już logikę obliczeń i konfigurowalne parametry. Takie wskaźniki są gotowe do wyświetlenia na wykresach po zapisaniu i zbudowaniu.
Po kliknięciu Utwórz otwiera się edytor kodu i możesz rozpocząć edycję kodu wskaźnika.
Edytuj kod
W zależności od wybranej metody tworzenia przykładowy kod wskaźnika powinien zawierać jeden lub więcej z następujących elementów:
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 | |
Atrybut Indicator wraz z jego opcjonalnymi właściwościami, takimi jak TimeZone i AccessRights, poprzedza deklarację klasy wskaźnika (SimpleIndicator).
Te metody są domyślnie zawarte w każdym wskaźniku:
- Metoda
Initialize()jest wywoływana raz, gdy wskaźnik się uruchamia. Zazwyczaj służy do konfigurowania zmiennych, zagnieżdżonych wskaźników i serii, które muszą być gotowe od początku. - Metoda
Calculate()jest wywoływana automatycznie na każdym słupku historycznym i w czasie rzeczywistym przy każdym nowym tiku. To tutaj implementujesz formułę wskaźnika i definiujesz sposób obliczania i wyświetlania wyników.
Atrybut [Output()] określa wartości generowane przez wskaźnik i sposób ich wyświetlania na wykresie. Możesz dostosować nazwę i styl każdego wyniku, na przykład ustawiając kolor jego linii.
Metody Initialize() i Calculate() stanowią podstawę każdego wskaźnika niestandardowego i nigdy nie powinny być pomijane. Możesz dodawać własne metody, aby rozszerzyć funkcjonalność, tak jak podczas kodowania cBota. Aby dowiedzieć się więcej o algorytmach, zacznij od przewodnika Podstawy C# i zapoznaj się z przykładami kodu wskaźników.
Uwaga
Odniesienia zawierają wszystkie klasy, zdarzenia, metody, zmienne itp. do budowania algorytmów w cTrader, podczas gdy pełne przykłady algorytmów i szablony są dostępne w repozytorium GitHub.
Zastosuj swoją nową wiedzę, aby edytować kod wskaźnika i dostosować go do swoich potrzeb.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Klasa SimpleIndicator definiuje niestandardowy wskaźnik w Pythonie.
Te metody są domyślnie zawarte w każdym wskaźniku:
- Metoda
initialize(self)jest wywoływana raz, gdy wskaźnik się uruchamia. Zazwyczaj służy do inicjalizacji zmiennych, zagnieżdżonych wskaźników i serii, które muszą być gotowe od początku. - Metoda
calculate(self, index)jest wywoływana automatycznie na każdym słupku historycznym i w czasie rzeczywistym przy każdym nowym tiku. To tutaj implementujesz formułę wskaźnika i definiujesz sposób obliczania i wyświetlania wyników.
Metody initialize(self) i calculate(self, index) stanowią podstawę każdego wskaźnika niestandardowego i nigdy nie powinny być pomijane. Możesz również dodawać własne metody pomocnicze wewnątrz klasy, aby rozszerzyć funkcjonalność, tak jak podczas kodowania cBota. Aby dowiedzieć się więcej o algorytmach, zacznij od Podstaw Pythona i zapoznaj się z przykładami kodu wskaźników.
Zastosuj swoją nową wiedzę, aby edytować kod wskaźnika i dostosować go do swoich potrzeb.
Zapisz i zbuduj
Zapisz swój kod, klikając przycisk Zapisz u góry edytora kodu lub użyj skrótu Ctrl+S.
Zanim będziesz mógł użyć swojego wskaźnika, musisz zweryfikować jego kod, budując projekt wskaźnika. Kliknij przycisk Zbuduj u góry edytora kodu lub naciśnij Ctrl+B.
Zapisz swój kod, klikając ikonę Zapisz u góry edytora kodu lub użyj skrótu Cmd+S.
Zanim będziesz mógł użyć swojego wskaźnika, musisz zweryfikować jego kod, budując projekt wskaźnika. Kliknij ikonę Zbuduj u góry edytora kodu lub naciśnij Cmd+B.
Gdy budowanie zakończy się sukcesem, zobaczysz komunikat potwierdzający w Wynik budowania. Jeśli budowanie się nie powiedzie, zamiast tego pojawi się podsumowanie wszystkich napotkanych błędów.
Jeśli od ostatniego budowania wprowadzono zmiany w kodzie, obok ikony Zbuduj pojawia się gwiazdka. W takim przypadku powinieneś ponownie zbudować wskaźnik przed dodaniem jego instancji do jakiegokolwiek wykresu.
Aby użyć lub wyświetlić wskaźnik na wykresie, dodaj instancję wskaźnika lub możesz kontynuować modyfikowanie kodu wskaźnika, jak wyjaśniono w sekcjach.
Używaj arytmetyki NaN
Wskaźniki wykonują obliczenia w celu wyprowadzenia konkretnych wizualizacji i istotne jest, aby Twój kod poprawnie obsługiwał przypadki brzegowe i warunki graniczne podczas tych obliczeń.
Rozważ następujący fragment kodu ze wskaźnika, który wyprowadza oscylator ceny pozbawionej trendu:
1 2 3 4 5 6 7 8 9 10 11 | |
Powyższy kod definiuje ogólne reguły obliczeń, ale pomija warunki graniczne. Na przykład, jeśli Periods jest ustawione na 10, a index mieści się w zakresie 0–9, obliczenie zwróci NaN (Not a Number). Ten problem występuje, ponieważ wskaźnik nie może obliczyć wartości dla wykresu słupkowego z ujemnym indeksem.
Aby rozwiązać ten problem, możesz dodać warunek, jak pokazano poniżej:
1 2 3 4 5 6 7 | |
Kod dla samej prostej średniej ruchomej musi również sprawdzać, czy index >= Periods. Jeśli używasz zagnieżdżonego wskaźnika, takiego jak inny typ średniej ruchomej, warunek będzie się różnił, aby uwzględnić dodatkowe obliczenia.
Chociaż możesz zdefiniować wyraźne warunki graniczne, C# oferuje wygodny sposób na uniknięcie tych problemów poprzez arytmetykę NaN. W szczególności typ danych double w pełni obsługuje obliczenia NaN. Na przykład:
1 2 3 4 5 | |
Jednak gdy dowolny operand w obliczeniu to NaN, wynik również będzie NaN. Ponieważ niestandardowe wskaźniki cTrader działają na typie DataSeries, jeśli spróbujesz uzyskać dostęp do elementu DataSeries z ujemnym indeksem, zwróci on NaN, a wartość nie zostanie narysowana na wykresie handlowym. To zachowanie pozwala wskaźnikowi kontynuować działanie bez zgłaszania wyjątków. W większości przypadków możesz bezpiecznie zignorować warunki graniczne i skupić się tylko na ogólnej logice obliczeń.
Dodaj wyraźne sprawdzenia
Chociaż arytmetyka NaN upraszcza obsługę warunków granicznych, niektóre przypadki nadal wymagają wyraźnych sprawdzeń NaN. Wskaźniki rekurencyjne są typowym przykładem. Wskaźnik rekurencyjny oblicza swoją bieżącą wartość na podstawie poprzednio obliczonej wartości.
Rozważ następującą implementację wykładniczej średniej ruchomej:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Gdy wskaźnik oblicza pierwszy okres, wartość początkowa musi być wyraźnie ustawiona na typ inny niż NaN. W przeciwnym razie wszystkie kolejne obliczenia zwrócą NaN, czyniąc wskaźnik bezużytecznym.
W powyższym kodzie jest to obsługiwane za pomocą metody double.IsNaN(previousValue). Operator == nie może być użyty do tego sprawdzenia (previousValue == double.NaN), ponieważ każde porównanie NaN z inną wartością, w tym z samym sobą, zawsze zwraca false.
Gdy będziesz zadowolony z kodu wskaźnika, zbuduj go, a następnie użyj go, dodając instancję do wykresu.
Powiązane artykuły
