Expert Advisor w MQL5 to program działający w MetaTraderze 5. Może analizować dane, zarządzać pozycjami lub wysyłać zlecenia, jeśli jego kod i uprawnienia na to pozwalają. Sama nazwa EA nie oznacza kompletnej strategii ani automatycznego otwierania transakcji.
Z czego składa się EA?
Kod źródłowy MQ5 kompilujesz w MetaEditorze do EX5. Plik wynikowy uruchamia terminal; nie jest on zamiennikiem źródła do swobodnej edycji. Znajomość języka nie daje automatycznie dostępu do kodu zamkniętego produktu kupionego w sklepie.
EA zwykle łączysz z wykresem, ale jego działanie może obejmować więcej niż jeden symbol. Wskaźnik ma inny model zdarzeń i nie służy do bezpośredniego wysyłania zleceń; może za to wykonywać obliczenia i powiadamiać, więc stwierdzenie „tylko rysuje” byłoby zbyt wąskie.
Przydatny podział projektu obejmuje dane, sygnał, kontrolę ryzyka, wykonanie oraz zapis zdarzeń. Nawet prosta reguła wejścia potrzebuje odpowiedzi na pytanie, co zrobić z istniejącą pozycją i co oznacza brak danych. Te decyzje warto spisać przed wyborem wskaźników.
Zdarzenia nie sprowadzają się do każdej kwotacji
OnInit obsługuje inicjalizację programu. Może pojawić się ponownie po zmianach wymagających przeładowania, na przykład parametrów lub interwału. Nie zakładaj, że wykona się tylko raz przez cały okres życia strategii. OnDeinit pozwala obsłużyć zakończenie danej instancji i jego przyczynę.
OnTick reaguje na nowe kwotowanie symbolu wykresu. Jeżeli takie zdarzenie jest już obsługiwane lub czeka w kolejce, kolejne nie zostaje dopisane. Dlatego długie obliczenia w tej funkcji mogą sprawić, że nie otrzymasz oddzielnego wywołania dla każdego przychodzącego ticka.
EA może korzystać także z OnTimer, OnBookEvent czy OnChartEvent. Nie musi zawierać OnTick, a cała strategia nie musi mieścić się w jednej funkcji. Dobór zdarzeń zależy od zadania: okresowa kontrola czasu ma inne wymagania niż reakcja na zmianę kwotowania.
W programie wieloinstrumentowym tick wykresu EUR/USD nie oznacza, że właśnie odświeżyły się wszystkie pozostałe pary. Sprawdzaj czas i dostępność danych każdego symbolu. Ustal, czy sygnał wymaga równoczesnych obserwacji i jak długo możesz uznawać ostatnie dane za aktualne.
Indeks zero bufora nie musi być ostatnią zamkniętą świecą
Przyjmij udane CopyBuffer z start_pos = 1 i count = 3 do zwykłej tablicy bez AS_SERIES. API wybiera trzy zamknięte wartości, a w fizycznej pamięci najstarsza z nich jest pierwsza. W tym konkretnym wariancie ostatnia zamknięta wartość znajduje się pod indeksem 2.
Przesuń diagram w bok, aby zobaczyć całość
Fikcyjne wartości wskaźnika 103, 101 i 102. Kopiowanie zwróciło dokładnie 3 elementy; brak częściowego wyniku i błędu. Diagram dotyczy zwykłej tablicy bez AS_SERIES. Próg 102,5 jest testem odczytu, nie sygnałem transakcyjnym. Dokument MQL5 — CopyBuffer potwierdza: liczenie start_pos od bieżącego baru oraz umieszczanie najstarszego kopiowanego elementu na początku fizycznej pamięci.
Zapisz w teście EA zarówno start_pos, liczbę zwróconych elementów, jak i sposób indeksowania tablicy docelowej. Weryfikacja count bez weryfikacji kolejności może pozostawić błąd wyboru świecy. Dla innych ustawień tablicy nie przenoś indeksu 2 jako uniwersalnej zasady.
Oddziel żądanie od wykonanej transakcji
OrderSend wysyła opis operacji do serwera. Wartość true nie jest sama w sobie dowodem wykonania całej transakcji. Trzeba zbadać wynik żądania, kod odpowiedzi oraz późniejszy stan zleceń i pozycji. OrderCheck pomaga sprawdzić parametry, ale też nie gwarantuje późniejszej realizacji.
Klasa CTrade upraszcza przygotowanie żądań przez metody takie jak Buy, Sell czy PositionClose. Nie usuwa konieczności kontroli wyniku. Dokumentacja Buy wskazuje sprawdzenie ResultRetcode i ResultDeal, zamiast opierania całej logiki na samym bool zwróconym przez metodę.
OnTradeTransaction pomaga śledzić zmiany dotyczące realizacji. Jedno żądanie może wywołać kilka zdarzeń; kolejność ich nadejścia nie jest gwarantowana. Program powinien odtwarzać stan operacji z identyfikatorów i historii, a nie zakładać „jedno wywołanie równa się jednej zamkniętej sprawie”.
Własny przykład problemu: EA wysyła kupno 0,10 lota, po czym traci pewność, czy otrzymał odpowiedź. Ponowne wysłanie bez kontroli może dać łącznie 0,20 lota. Najpierw trzeba uzgodnić stan rachunku z poprzednim żądaniem. Sam brak lokalnego komunikatu nie dowodzi, że serwer niczego nie zrobił.
Usunięcie zlecenia z listy nie zeruje wykonanej pozycji
Dokumentacja OnTradeTransaction odróżnia usunięcie aktywnego zlecenia od dodania wykonania do historii i nie gwarantuje kolejności nadejścia zdarzeń. Rozważ kontrolowany przykład bez pozycji początkowej: kupno wykonano w dwóch częściach D1 = 0,04 i D2 = 0,06 lota, a zlecenie usunięto z listy aktywnych.
| Kolejność | Licznik zerowany przy ORDER_DELETE | Suma wykonań |
|---|---|---|
| D1, D2, ORDER_DELETE | 0,00 lota | 0,10 lota |
| ORDER_DELETE, D1, D2 | 0,10 lota | 0,10 lota |
Wadliwy licznik traktuje koniec zlecenia jak koniec pozycji. Pierwsza kolejność zaniża ekspozycję do zera. Suma potwierdzonych wykonań pozostaje taka sama, bo ich kolejność nie zmienia 0,04 + 0,06.
To mały test rozdzielenia stanów: aktywne zlecenie, historia wykonań i pozycja nie są jednym polem. Używaj identyfikatorów, odczytuj właściwości zdarzenia i uzgadniaj aktualną pozycję z terminalem. Sama suma kupna nie jest pełnym księgowaniem: rzeczywisty program musi uwzględnić także sprzedaże, odwrócenia, korekty historii i tryb rachunku. Test wykrywa tylko konkretny błąd zerowania po ORDER_DELETE.
Zaprojektuj zachowanie przy problemach
Poniższa karta nie jest gotowym kodem. Pokazuje pytania, na które powinien odpowiadać projekt i test. Dla każdego przypadku zachowaj przykład oczekiwanego zachowania oraz zapis faktycznego wyniku na demo lub w kontrolowanej symulacji.
| Sytuacja | Oczekiwane zachowanie do zdefiniowania |
|---|---|
| Niepełne dane wskaźnika | Brak nowego sygnału do czasu uzyskania prawidłowych danych |
| Wolumen niezgodny z krokiem | Odrzucenie lub jawne przeliczenie bez przekroczenia ryzyka |
| Niepewny wynik wysłania | Kontrola zleceń, pozycji i historii przed ponowieniem |
| Restart terminala | Odtworzenie istniejącej ekspozycji i wersji strategii |
| Brak połączenia | Zatrzymanie nowych żądań i określona procedura powrotu |
Wolumen powinien respektować minimum, maksimum i krok instrumentu. Zaokrąglenie do najbliższego kroku może podnieść ryzyko ponad limit; nie traktuj go jako czysto kosmetycznej zmiany. Sprawdź również poziomy stopów, sesję, dozwolony sposób realizacji i wolny depozyt.
Uwzględnij tryb rachunku. W nettingu jeden symbol ma wspólną pozycję netto; w hedgingu może mieć wiele oddzielnych pozycji. Dwa EA na tym samym instrumencie mogą wpływać na wspólną ekspozycję. Sam Magic Number nie tworzy osobnego rachunku ani wydzielonego kapitału.
Co działa po wyłączeniu programu?
Wyłączenie lokalnego AutoTrading blokuje żądania handlowe EA, ale nie zatrzymuje jego obliczeń ani nie zamyka istniejących pozycji. Zdjęcie EA z wykresu również nie oznacza automatycznej likwidacji ekspozycji. Takie zachowanie wymaga odpowiednio zaprojektowanej logiki i skutecznego wykonania.
Stop loss przyjęty przez serwer może działać po zamknięciu lokalnego terminala. Reguła wyjścia obliczana wyłącznie przez EA wymaga działającego programu. Przy zerwanym połączeniu dodatkowy EA na tym samym terminalu też nie może wysłać skutecznego zamknięcia do niedostępnego serwera.
MetaQuotes Virtual Hosting uruchamia przeniesione środowisko osobno. Lokalny przycisk nie wyłącza zdalnego robota; na wirtualnej platformie handel automatyczny jest dozwolony. Zwykły VPS z Windows to inny rodzaj usługi. Wymagania opisuje poradnik ciągłości pracy EA.
Testuj działanie i ekonomię osobno
Najpierw sprawdź zgodność pojedynczych zdarzeń z regułami. Dopiero potem oceniaj wynik netto, koszty i obsunięcia. Rzeczywiste ticki w testerze MT5 pochodzą z historii udostępnianej przez brokera, a nie z jednego uniwersalnego serwera notowań MetaQuotes.
Optymalizacja może prowadzić do przedopasowania, ale nie jest matematyczną gwarancją przyszłej straty ani świetnego raportu. Zapisuj wszystkie próby, kontroluj chronologię i zachowuj dane do sprawdzianu. Sposób pracy wyjaśnia plan walidacji strategii.
Handel pod dane ekonomiczne, klasyfikację warunków czy informacje zewnętrzne można częściowo lub szerzej automatyzować. Trudnością jest definicja reguł, jakość informacji i wykonanie, a nie ogólny zakaz takich strategii dla EA. MQL5 obsługuje również uruchamianie modeli ONNX, co nie oznacza automatycznej przewagi modelu.
Oceń także ręczne ingerencje. Zmiana stopa, zamknięcie części pozycji lub uruchomienie drugiej kopii programu może sprawić, że zapisany przez EA stan przestanie odpowiadać rachunkowi. Program powinien rozpoznać taką rozbieżność i wykonać wcześniej ustaloną procedurę, zamiast odtwarzać pozycję tylko dlatego, że pamięta poprzedni sygnał.
Uchwyt istnieje — czy wskaźnik ma już wartość?
Utworzenie uchwytu nie potwierdza, że wskaźnik policzył potrzebną świecę. BarsCalculated zwraca liczbę obliczonych danych lub −1 przy błędzie. Następnie sprawdź rzeczywistą liczbę wyników CopyBuffer, właściwy bufor i przesunięcie świecy. Nie zastępuj nieudanego odczytu zerem; dla RSI zero byłoby informacją o skrajnym stanie, a nie komunikatem „jeszcze nie wiem”.
Uchwyt istnieje — czy wskaźnik ma już wartość?
Własny model wymaga jednej wartości: (A) nieprawidłowy uchwyt — brak odczytu; (B) uchwyt istnieje, lecz skopiowano 0 — czekamy; (C) skopiowano 1, lecz wartość jest EMPTY_VALUE — brak użytecznego sygnału; (D) skopiowano 1 poprawną wartość 45 — dopiero wtedy można ocenić regułę. Liczba 45 jest fikcyjnym odczytem, nie sygnałem inwestycyjnym.
EMPTY_VALUE ma domyślnie wartość DBL_MAX, czyli skończoną liczbę; sama kontrola skończoności nie wystarcza. Własny wskaźnik może używać innego znacznika pustej wartości. Ustal jego kontrakt, zamiast odrzucać każde zero. Brak historii, pusta wartość i poprawna liczba są trzema różnymi stanami.
Ćwiczenie: jest uchwyt i jedna kopia, lecz wynik to EMPTY_VALUE. Co robisz?
Nie oceniasz progu strategii. Sprawdzasz bufor, świecę i znacznik pustej wartości, zapisujesz stan braku danych i ponawiasz kontrolę przy kolejnym właściwym zdarzeniu. Zera nie dopisujesz jako zastępczej obserwacji.
Dane z API wymagają osobnej kontroli dostępności: odtwarzanie informacji w teście offline. Logika zależna od obiektu wykresu ma inne ograniczenia: różnice testu wizualnego.
Od czego zacząć naukę?
Pierwszy projekt może tylko zapisywać sygnał i jego dane wejściowe. Porównaj log z wykresem, sprawdź restart i błędny parametr. Dopiero w środowisku demonstracyjnym dodaj kontrolowane wysłanie zlecenia, z identyfikacją rachunku i jasnym limitem ekspozycji.
Nie ma wspólnego terminu nauki trzech miesięcy ani miesiąca demo wystarczającego każdemu. Zakres prób wynika z funkcji programu i częstości zdarzeń. Jeżeli pełna automatyzacja nie jest potrzebna, użyteczny może być sam moduł alarmów lub obliczania wielkości pozycji.
Zachowaj źródła, kompilację, parametry i dziennik zmian. Własny program daje możliwość przeglądu, ale może zawierać własne błędy; gotowy program wymaga oceny dokumentacji i zachowania. Porównanie MQL5 z Pythonem pomaga dobrać narzędzia do konkretnych zależności.
Sprawdź, czy rozumiesz
Jedno krótkie ćwiczenie
Około 2 min · możesz spróbować ponownie
Udane CopyBuffer od shift 1 zwróciło 3 wartości do zwykłej tablicy bez AS_SERIES: [103, 101, 102]. Którą wartość porównasz z progiem dla ostatniego zamkniętego baru?
- 103, bo każdy indeks 0 oznacza aktualny bar.
- 101, bo środkowy element jest najnowszy po pominięciu aktualnego baru.
- 102 z indeksu 2, czyli shift 1 w tym wywołaniu.
Sprawdź odpowiedź i wyjaśnienie
102 z indeksu 2, czyli shift 1 w tym wywołaniu.
Najstarszy element leży fizycznie na początku, a najnowszy z trzech skopiowanych na końcu. Przy zwykłej tablicy ostatni indeks 2 odpowiada tutaj shift 1.
Jeszcze jedno ćwiczenie
EA nie ma pewności, czy kupno 0,10 lota zostało wykonane. Czy może bez sprawdzenia wysłać je ponownie?
Sprawdź odpowiedź
Nie powinien zakładać, że brak potwierdzenia oznacza brak wykonania. Najpierw trzeba sprawdzić stan i historię; ponowienie może zwiększyć ekspozycję do 0,20 lota.

