Jak obsługiwać zdarzenia słupków
Zdarzenia słupków są niezbędne w cyklu życia każdego cBota. Prawidłowa obsługa tych zdarzeń ma kluczowe znaczenie dla zarządzania tym, jak Twoje cBoty reagują na nowe warunki rynkowe. W tym artykule i odpowiadającym mu filmie pokażemy kluczowe typy zdarzeń słupków i omówimy procedury obsługi tych zdarzeń udostępniane przez API cTrader.
- Słupek - odnosi się do różnych typów obiektów, które są sekwencyjnie rysowane na wykresie handlowym przez cTrader. Mogą to być świece, cegły Renko, słupki zakresowe, a nawet świece Heiken Ashi.
Obsłuż zdarzenie BarOpened
Zdarzenia słupków występują, gdy nowy słupek zaczyna być rysowany na wykresie handlowym powiązanym z cBotem. Zdarzenie BarOpened występuje dla nowego słupka, który właśnie zaczął być rysowany na wykresie.
Obsługa tego zdarzenia odbywa się za pomocą metody OnBar(), która jest metodą dziedziczoną z klasy bazowej Robot. Teraz utworzymy cBota, który obsługuje zdarzenie BarOpened w ramach naszej strategii analizy nastrojów rynkowych. Usuniemy metody OnStart() i OnStop() z szablonu i zastąpimy procedurę obsługi OnTick() procedurą obsługi OnBar().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
cBot ma być uruchamiany na wykresach z ramą czasową D1 (dzienną). Na każdym słupku porównuje różnicę ceny otwarcia z ceną otwarcia poprzedniego słupka i składa nowe zlecenie w odpowiednim kierunku. Jeśli różnica cen jest nieznaczna, bot zamiast tego zamyka wszystkie aktualnie otwarte pozycje.
Jeśli uruchomimy backtest tego prostego bota, wyniki wydają się być obiecujące.

Obsłuż zdarzenie BarClosed
Gdy otwiera się nowy słupek, faktycznie nie ma żadnych danych cenowych poza ceną otwarcia. W wielu przypadkach możesz chcieć, aby Twój cBot miał dostęp do danych z poprzedniego słupka, aby zapewnić płynne wykonanie strategii. Dlatego zdarzenie BarClosed występuje dla słupka, który właśnie się zamknął (tego bezpośrednio przed nowym słupkiem) i pozwala łatwo wykorzystać jego dane cenowe i wolumenowe. Gdy zdarzenie BarClosed jest wyzwalane, nowo otwarty słupek jest całkowicie pomijany w kolekcji Bars
Aby obsłużyć zdarzenie BarClosed, API udostępnia metodę OnBarClosed.
Uwaga
W poprzednim przykładzie użyliśmy właściwości Bars.LastBar.Open, aby uzyskać cenę otwarcia nowo otwartego słupka. Gdybyśmy użyli tej samej właściwości w metodzie OnBarClosed(), otrzymalibyśmy cenę otwarcia słupka, który właśnie się zamknął.
Utworzymy prostego cBota, który używa procedury obsługi OnBarClosed() w następujący sposób.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
cBot wykrywa wzór zwyżkowy (młotek), oceniając długość dolnego knota świecy. Jeśli zostanie wykryty wzór młotka, wszystkie wcześniej otwarte pozycje są zamykane i składane jest nowe zlecenie kupna ze stop lossem wynoszącym 50 pipsów.
Jeśli przeprowadzimy backtest bota, otrzymamy przyzwoite wyniki.

Dodaj niestandardowe procedury obsługi zdarzeń
Podczas obsługi zdarzeń BarOpened i BarClosed możesz również użyć nieco innej składni, przypisując te zdarzenia do niestandardowych procedur obsługi. Podczas gdy OnBar() i OnBarClosed() są wyzwalane tylko raz, możesz przypisać tyle niestandardowych procedur obsługi, ile chcesz, co pozwala na dodanie złożonej logiki.
Uwaga
Niestandardowe procedury obsługi zdarzeń muszą być dodane w metodzie OnStart(). Niestandardowe procedury obsługi muszą również akceptować argument typu BarOpenedEventArgs (dla zdarzenia BarOpened) lub BarClosedEventArgs (dla zdarzenia BarClosed).
1 2 3 4 5 6 7 8 9 10 | |
Stworzymy kolejnego cBota, który używa dwóch niestandardowych procedur obsługi dla zdarzenia BarOpened, aby reagować na możliwe odwrócenia zwyżkowe i spadkowe.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
cBot sprawdza, czy cena otwarcia nowo otwartego słupka jest wyższa niż ceny zamknięcia dwóch poprzednich słupków. Jeśli tak jest, składane jest zlecenie kupna. Jeśli cena otwarcia jest niższa niż ceny zamknięcia dwóch poprzednich słupków, składane jest zlecenie sprzedaży. Użycie dwóch oddzielnych procedur obsługi zdarzeń pozwala nam podzielić naszą logikę handlową na mniejsze komponenty, które w razie potrzeby możemy łatwo zmodyfikować później.
Wyniki backtestingu na interwale D1 są również pozytywne.

Podsumowanie
Ucząc się, jak prawidłowo obsługiwać zdarzenia słupków, możesz sprawić, że Twoje cBoty będą robić dokładnie to, co chcesz, aby robiły i kiedy chcesz, aby to robiły.