Grzegorz Molenda

Grzegorz Molenda Programista
(Delphi/Pascal,
MQL4, Oracle PL/SQL,
XML, JSON)

Temat: ViTESOFT.net MQL 4 KB

Witam!

Od kilku lat zajmuję się programowaniem w MQL4 i ostatnio stwierdziłem ku swojemu zdziwieniu, że są jeszcze takie zagadnienia, na które wcześniej nie zwracałem uwagi, a w związku z postępami w pracach nad udoskonalaniem własnych strategii, wpadłem na nie niespodziewanie.

Ponieważ zderzenie z tymi zagadnieniami spowodowało wystąpienie wielu "niepożądanych problemów", postanowiłem zająć się ich eliminacją.

W tym miejscu zrodził się pomysł opisania niektórych z tych zagadnień i opracowanych przeze mnie rozwiązań.
Grzegorz Molenda

Grzegorz Molenda Programista
(Delphi/Pascal,
MQL4, Oracle PL/SQL,
XML, JSON)

Temat: ViTESOFT.net MQL 4 KB

1. Pierwszy i najważniejszy problem/zagadnienie:

Często potrzeba skorzystać w implementowanej strategii z najbardziej podstawowej informacji jaką jest data i godzina, od której może być uzależniony przyszły zysk lub strata.

Jak wiadomo MQL4 posługuje się formatem
datetime czas;

jest to typowy unix-owy znacznik czasu (czyli liczba sekund po północy roku 1970.01.01).

Sama reprezentacja wartości nie jest tak istotna, jak fakt, że opieranie pracy strategii na funkcjach
datetime TimeCurrent()
datetime TimeLocal()

jest ok, do momentu w którym wykonanie pewnych czynności przez strategię w określonym czasie, nie jest nam potrzebne i oczywiście strategia nasza pracuje na "tikach".

Jest jednak taki moment, w którym bardziej rozgarnięty inwestor/programista zaczyna rozumieć, że kluczem do sukcesu jest działanie wyprzedzające zaistniałe zdarzenia i z tej prostej przyczyny wyklucza oczekiwanie na "tik".

Jak się okazuje, istnieje proste rozwiązanie, trzeba przejść na tzw. "tryb asynchroniczny", czyli innymi słowy przejąć kontrolę nad wykonywaniem się funkcji start i wykonywać ja w koło bez końca. Poniższy fragment kodu zobrazuje o co chodzi:
#property copyright "Copyright © 2011, ViTE Software Solutions"
#property link "http://vitesoft.net";

bool async_mode_running = false;

void timer() {
while(!IsStopped()) {
Sleep(100);
start();
}
}

int init() {
timer();
return(0);
}

int deinit() {
return(0);
}

int start() {
if (async_mode_running) return (0);

if (!IsConnected() || !IsTradeAllowed() || IsTradeContextBusy()) {
async_mode_running = false;
return (0);
}

async_mode_running = true;
// RefreshRates();

// tu wykonujemy nasze polecenia

async_mode_running = false;

return(0);
}


Teraz, kiedy nasza strategia kręci się w kółko, dochodzimy do sedna problemu!
TimeCurrent() i TimeLocal() są niestety zawodne.
Pierwsza funkcja bazuje na danych pochodzących z serwera kwotującego (naszego operatora) i zawiera informację o ostatnim odebranym kwotowaniu (tu w odniesieniu do zegara rynkowego), druga podaje czas pochodzący z naszego komputera, który może się różnić od czasu wykorzystywanego przez serwer, do którego jesteśmy podłączeni lub po prostu z uwagi na to, iż czas na naszym komputerze może być "mocno" nieprecyzyjny, także nie nadaje się do użycia.

Pytanie brzmi: Jaką mamy alternatywę, jeśli w ogóle jakąś mamy!?
MAMY! NIEZALEŻNY ZEGAR CZASU RZECZYWISTEGO. Dlatego powstał ten wątek...

Po pierwsze szukając w necie, nie natrafiłem na żadne dostępne rozwiązanie, pomimo tego, że pyta o to wiele osób.
Po drugie, jeśli już ktoś coś proponował, to nie widziałem ani grama kodu, który dało by się zaimplementować we własnych "ekspertach".

Tak więc konkluzja jest taka, wystarczy użyć mojego rozwiązania (kod poniżej) i wszystko będzie z głowy:
#import "exttimer.ex4"
datetime getTime(int gmt_offset = 0);
#import

int start() {
if (async_mode_running) return (0);

if (!IsConnected() || !IsTradeAllowed() || IsTradeContextBusy()) {
async_mode_running = false;
return (0);
}

async_mode_running = true;
// RefreshRates();

datetime now = getTime(2); // 2 oznacza przesunięcie czasu względem GMT
Comment(TimeToStr(now, TIME_DATE | TIME_SECONDS));

async_mode_running = false;

return(0);
}


Jeśli jesteście zainteresowani moim rozwiązaniem, proszę o kontakt.

Biblioteka MQL4 (exttimer.ex4) - Niezależny zegar czasu rzeczywistego / Independent real-time clock.
Cena: 199 PLN (nie udostępniam kodu źródłowego biblioteki).Grzegorz Molenda edytował(a) ten post dnia 05.09.12 o godzinie 06:11

Następna dyskusja:

MQL 4




Wyślij zaproszenie do