Sprawdzając jego działanie na rachunku demo, zauważyliśmy, że zawiera on transakcje zbyt często, a jedynym ograniczeniem jest dla niego wielkość dostępnych na rachunku wolnych środków. Dlaczego tak się dzieje i jak rozwiązać ten problem?
Problem funkcji OnTick()
Zanim przejdziemy do sedna tematu, chcieliśmy zaznaczyć, że tym tekstem wkraczamy na nieco bardziej zaawansowany poziom programowania, do którego zrozumienia potrzebna jest przynajmniej uważna lektura poprzednich materiałów tego dodatku. Ponadto chcieliśmy nadmienić, że wszystkie zaproponowane tutaj rozwiązania dotyczące kodowania poszczególnych elementów robota nie są ani najbardziej efektywne, ani ostateczne. Z programowaniem jest bowiem jak z matematyką – do rozwiązania problemu można dojść na wiele sposobów, a wybór sposobu zależy od preferencji i umiejętności.
Przejdźmy teraz do tytułowego problemu. W poprzednim materiale wspominaliśmy, że instrukcje dla robota umieszczone są wewnątrz funkcji specjalnej „OnTick()", która jest wywoływana za każdym razem, gdy kurs danego aktywa (w przypadku naszego robota jest to para walutowa EUR/USD) wykona minimalny ruch, wynikający z zawarcia jakiejś transakcji na rynku. Tym samym nasz robot z każdym takim tickiem sprawdza, czy warunki otwarcia pozycji są spełnione. Przykładowo – jeśli uruchomiliśmy go na wykresie minutowym, na którym właśnie budowana jest kolejna świeca, a trzy poprzednie były wzrostowe, to z każdym tickiem robot otwierał będzie długą pozycję (dopóki nie zabraknie mu środków na rachunku). Z każdym nowym tickiem robot dostaje bowiem informację, że na wykresie są trzy białe świece.
Ten przykład dobrze ilustruje to, jak istotnym elementem programowania jest przewidywanie różnych możliwych scenariuszy. Musimy pamiętać, że robot będzie działał tak, jak go „nauczymy", sam z siebie nic nie wymyśli, a już na pewno się nie domyśli, że gdzieś popełniamy błąd. Instrukcje muszą więc bardzo precyzyjnie wyjaśniać to, w jaki sposób ma działać nasza strategia. Pamiętajmy, że podczas kompilacji kodu program sprawdza tylko poprawność składni, nie jest natomiast w stanie wychwycić błędów w konstrukcji samej strategii (przykładowo – program nie zwróci błędu, jeśli warunki kupna i sprzedaży ustawiliśmy na odwrót).
Aby rozwiązać problem nadmiernej aktywności naszego robota, musimy zakodować mu kolejny warunek – by kryteria otwarcia pozycji sprawdzał tylko wtedy, gdy na wykresie pojawi się nowa świeca. W tym celu musimy zbudować funkcję logiczną, która zwróci „true", gdy na wykresie pojawi się nowa świeca, i „false", gdy takowa się nie pojawi. Jak to zrobić?