Wykonywanie kodu niezależnie od ticków

Analizując słowa kluczowe wpisane w wyszukiwarkach znalazłem tematy na kolejnych kilka postów. Dzisiaj opiszę mechanizm timera, który nazywam także „trybem asynchronicznym”. Jak to działa? Już tłumaczę.

Standardowo EA posiada trzy funkcje:

  • init – wywoływaną podczas inicjacji EA
  • deinit – wywoływaną podczas usuwania EA
  • start – wywoływaną przy nadejściu każdego ticku

Czasami jednak rozwiązanie z funkcją start nie wystarcza, na przykład w EA, które handlują na bazie korelacji kilku par lub też we wszelakiego rodzaju news traderach. W tego typu przypadkach nie można sobie pozwolić na beztroskie oczekiwanie na następny tick, ponieważ może on nadejść zbyt późno.

Rozwiązaniem jest wywoływanie asynchronicznie (w sensie niezależnie od nadchodzących ticków) pożądanego kodu.

Implementacja tego mechanizmu jest bardzo prosta:

extern int TimerInterval=500;

int init() {
   timer();
}

void timer() {

   while(true) {
    Sleep(TimerInterval);

    if(IsStopped() || !IsExpertEnabled()) {
     return;
    }

    RefreshRates();
    start();
   }
}

int start() {
   // kod właściwy
}

Uwagi odnośnie powyższego kodu:

  • Tuż po inicjacji EA następuje przejście do funkcji timera, a tam do nieskończonej pętli.
  • TimerInterval określa w milisekundach czas między kolejnymi wywołaniami funkcji start.
  • RefreshRates() jest konieczne, bowiem w przypadku istnienia powyższej pętli EA nie jest w stanie działać wg nadchodzących ticków, a co za tym idzie nie następuje automatyczne odświeżenie zmiennych typu Ask i Bid. RefreshRates rozwiązuje ten problem.
  • Warunek z  IsStopped() znajduje się tutaj, aby prawidłowo móc zakończyć pracę EA w przypadku usunięcia go z wykresu (usunie szybciej niż w trybie wymuszonym, gdzie terminal wymusza usunięcie po ok 2,5 sek.).
  • Podczas działania takiej pętli nie jest możliwa edycja parametrów EA.
  • Częściowym rozwiązaniem powyższego problemu jest umieszczenie warunku z IsExpertEnabled() – dzięki temu po globalnym wyłączeniu zezwolenia na handel EA wyjdzie z pętli, a co za tym idzie – będzie możliwa zmiana parametrów.

Autor: Łukasz Tomaszkiewicz

Podziel się ze znajomymi:

Prześlij nam swoje uwagi

Imię i nazwisko (wymagane)

Adres email (wymagane)

Treść wiadomości

  • Facebook