Jak dodawać metody do API cTrader
Metody rozszerzające są kluczowym narzędziem, jeśli chcesz dodać nowe funkcjonalności do API cTrader. Używając stosunkowo prostej składni, możesz dodać nowe zachowania do dowolnej predefiniowanej klasy API, takiej jak Symbol lub Position. Po zdefiniowaniu metody rozszerzającej możesz ją wywołać z dowolnego obiektu klasy, którą rozszerzyłeś.
Przypadek użycia metod rozszerzających
Najpierw przeprowadzimy krótką demonstrację, dlaczego możesz chcieć używać metod rozszerzających.
Używając cBota, chcemy mieć możliwość dostępu do rozmiaru danej pozycji w lotach, ponieważ ta informacja bezpośrednio wpływa na naszą preferowaną strategię handlową. Aby to zrobić, możemy spróbować zainicjować zmienną klasy Position, a następnie spróbować uzyskać dostęp do jej metody Lots().
1 2 | |
Jeśli po prostu wpiszemy kod w takiej postaci, otrzymamy błąd sugerujący, że akcesor Lots() nie istnieje w API. Ale co, gdyby istniał sposób na dodanie nowej metody do istniejącego elementu API bez wpływu na inne funkcjonalności?
Zakładając, że taka metoda istnieje, moglibyśmy utworzyć prosty cBot, który przy każdym słupku iterowałby po liście wszystkich bieżących pozycji i wypisywał ich rozmiar w lotach w dzienniku. Zdefiniowalibyśmy metodę OnBar() w następujący sposób.
1 2 3 4 5 6 | |
Metody rozszerzające pozwalają nam dodać funkcjonalność Lots() w zaledwie kilku linijkach kodu, a następnie używać jej wielokrotnie na dowolnym obiekcie klasy Position. Poniżej wyjaśniamy, jak możesz ją utworzyć i podajemy kilka przykładów algorytmów, które z nich korzystają.
Jak działają metody rozszerzające
Pracując z metodami rozszerzającymi, pamiętaj o następujących zasadach.
- Metody rozszerzające są zawsze statyczne.
Aby zadeklarować metodę statyczną, wystarczy użyć słowa kluczowego static. Poniżej zadeklaruj metodę Lots() z pustym ciałem.
1 2 3 4 | |
- Metody rozszerzające mogą mieć dowolną liczbę argumentów, ale pierwszy argument zawsze musi określać typ danych/klasę, dla której metoda ma być wywoływana, poprzedzony słowem kluczowym
this.
Dodamy obiekt klasy Position jako pierwszy i jedyny argument metody Lots(). Ponieważ obiekt Position zawiera również informacje o symbolu, dla którego pozycja jest otwarta, nie potrzebujemy żadnych innych argumentów.
1 2 3 | |
- Metody rozszerzające mogą zawierać dowolną logikę odpowiednią dla podanych argumentów.
Nie ma potrzeby używania specjalnej składni podczas definiowania ciała metody rozszerzającej. Możemy traktować ją jak każdą inną metodę i dlatego możemy zdefiniować jej ciało w następujący sposób.
1 2 3 4 5 | |
- Metody rozszerzające mogą być wywoływane jako metody instancji lub metody statyczne.
Istnieją dwa możliwe sposoby wywołania naszej metody rozszerzającej w kodzie cBota.
Używając składni metody instancji, wywołujemy metodę z dowolnego odpowiedniego obiektu typu Position.
1 2 | |
Używając składni metody statycznej, możemy wywołać naszą metodę rozszerzającą po pełnym określeniu odpowiadającej jej klasy statycznej.
1 2 | |
To od Ciebie zależy, która metoda wywoływania metod rozszerzających jest najwygodniejsza.
Sygnatury metod
Używając składni instancji, unikaj przypadków, w których Twoje metody rozszerzające mają takie same sygnatury jak którakolwiek z wbudowanych metod API (takich jak Position.Close()). W takich sytuacjach wbudowana metoda będzie wywoływana za każdym razem, gdy spróbujesz wywołać metodę rozszerzającą z pasującą sygnaturą.
IntelliSense
Gdy próbujemy wywołać metodę rozszerzającą, IntelliSense używa specjalnej ikony, aby odróżnić ją od wbudowanych elementów API.
Aby zademonstrować naszą nową metodę w działaniu, możemy utworzyć cBota, który składa trzy zlecenia przy starcie, każde z innym wolumenem. Przy każdym słupku cBot wypisuje wolumen wszystkich aktualnie otwartych pozycji w lotach.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Po zbudowaniu i uruchomieniu naszego cBota powinniśmy zobaczyć prawidłowe wartości wypisywane w dzienniku.
Używaj metod rozszerzających w cBotach
Teraz spróbujemy utworzyć bardziej złożony cBot. Przy każdym słupku nasz algorytm przejdzie przez listę aktualnie otwartych pozycji i dostosuje ich poziomy Stop loss tak, aby znajdowały się na progu rentowności. Aby to zrobić, będziemy musieli utworzyć metodę rozszerzającą BreakEven() dla klasy Position.
Tworzymy nowy cBot i zmieniamy jego nazwę. Następnie usuwamy cały kod, którego nie potrzebujemy i dodajemy klasę MyExtensions.
1 2 3 | |
Nasz kod dla metody BreakEven() jest stosunkowo prosty. Sprawdzamy, czy pozycja ma Stop loss, czy jej zysk brutto jest większy niż zero i czy aktualnie ustawiony Stop loss nie jest równy cenie otwarcia pozycji. Jeśli wszystkie te warunki są spełnione, modyfikujemy Stop loss pozycji tak, aby był równy cenie otwarcia pozycji.
1 2 3 4 5 6 7 | |
W samym cBocie nie musimy używać żadnej metody poza OnBar(). Przy każdym słupku prosimy cBota o wykonanie prostej operacji, a mianowicie iterację po kolekcji Positions i wywołanie nowej metody BreakEven() dla każdego elementu w niej.
1 2 3 4 5 6 | |
Po zbudowaniu i uruchomieniu naszego cBota możemy zobaczyć go w działaniu. Może być użytecznym asystentem handlowym, szczególnie przy zarządzaniu wieloma otwartymi pozycjami.
Używaj metod rozszerzających we wskaźnikach
Utworzymy również użyteczny wskaźnik, który opiera się na metodach rozszerzających. Wskaźnik będzie mierzył zmienność, wykreślając procent, o jaki zmieniła się cena symbolu na każdym słupku w porównaniu z ceną otwarcia tego słupka.
Aby to zrobić, utworzymy nowy wskaźnik i zmienimy jego nazwę. W oknie edytora kodu utworzymy klasę MyExtensions, aby rozszerzyć klasę Bar.
1 2 3 | |
Dodamy również metodę PercentageChange(). W zmiennej priceChange odejmujemy cenę zamknięcia słupka od jego ceny otwarcia. Metoda zwraca naszą zmianę ceny podzieloną przez cenę otwarcia i pomnożoną przez 100.
1 2 3 4 5 6 7 8 | |
W samym kodzie wskaźnika nie potrzebujemy metody Initialize() ani niepotrzebnych parametrów. W ciele metody Calculate() po prostu wywołujemy naszą nową metodę PercentageChange() na każdym słupku.
1 2 3 4 5 6 7 8 | |
Następnie zapisujemy i budujemy nasz wskaźnik. Po utworzeniu jego instancji powinniśmy zobaczyć wykreślane prawidłowe zmiany procentowe. Mogą być one używane do określania krótko- i długoterminowej zmienności, co przynosi korzyści wszystkim rodzajom strategii handlowych.
Podsumowanie
Podsumowując, metody rozszerzające są cennym narzędziem, jeśli chcesz tworzyć kod wielokrotnego użytku, który dodaje nowe funkcjonalności do API cTrader. Gorąco zalecamy eksperymentowanie z metodami rozszerzającymi, ponieważ mogą sprawić, że Twoje algorytmy będą bardziej wydajne i łatwiejsze w utrzymaniu.