Musi działać, a czasem nie działa :(

O jezykach programowania w platformach i nie tylko.
rrozak
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 19 mar 2010, 16:43

Nieprzeczytany post autor: rrozak »

Po pierwsze primo: mówimy o odczycie wartości funkcji OrdersTotal(), a nie o budowaniu pętli na podstawie tegoż odczytu.

Po drugie primo: w pierwszym poscie tego wątku zamieściłem kod, który był nieprawidłowo wykonywany i pętla w nim zawarta była zakodowana w sposób, jak sądzę, prawidłowy.

Po trzecie primo: jak wspomniałem wcześniej, loguje wartość zwracaną przez OrdersTotal() i winowajca został ustalony.

Pozdr.

R.

Awatar użytkownika
nufnuf
Stały bywalec
Stały bywalec
Posty: 81
Rejestracja: 23 wrz 2008, 13:09

Nieprzeczytany post autor: nufnuf »

Chyba jednak chcesz mieć te problemy, bo zamiast zwyczajnie restartować serwer, to wymyślasz powody, żeby tego nie robić :)
rrozak pisze:obawiam się, że restart klienta ma niewielki wpływ na wartość OrdersTotal() podawaną przez serwer.
A właśnie, że ma wpływ i to duży. Przyczyną Twoich problemów jest memory leak i z powodów, w jaki MT4 został napisany i skompilowany, właśnie funkcja OrdersTotal() jako pierwsza zaczyna błędnie działać. W dalszej kolejności zawiesza się cały MT4.
rrozak pisze:Nie wiem też, czy problem nie jest pochodną stosunkowo dużej ilości wystawianych zleceń, zwykle koło 40.
To ma znaczenie, bo świadczy o intensywnej pracy Twojego EA, a więc o zwiększonym prawdopodobieństwie kłopotów z memory leak.
Ludzie nieczęsto trafiają na ten błąd, bo zwykle stosują proste, oszczędniejsze w działaniu strategie.

rrozak
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 19 mar 2010, 16:43

Nieprzeczytany post autor: rrozak »

nufnuf pisze:Chyba jednak chcesz mieć te problemy, bo zamiast zwyczajnie restartować serwer, to wymyślasz powody, żeby tego nie robić :)
Serwer kolego to stoi u brokera. W domu mam terminal (klient).

Poza tym, możesz podać źródło informacji o rzekomych wyciekach pamięci w MT4, bo mam wrażenie, że stawiasz tą tezę nieco na wyrost.

Awatar użytkownika
nufnuf
Stały bywalec
Stały bywalec
Posty: 81
Rejestracja: 23 wrz 2008, 13:09

Nieprzeczytany post autor: nufnuf »

Przejęzyczenie - miałem na myśli terminal, naturalnie.

Nie stawiam żadnych tez, a jedynie piszę oczywistości. Może ktoś inny odwiedzający to miejsce, skorzysta. Bo problem na pierwszy rzut oka wydaje się trudny a jednak rozwiązanie jest proste.

rrozak
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 19 mar 2010, 16:43

Nieprzeczytany post autor: rrozak »

Niestety, Twoja rada dotycząca restartowania terminala nie działa. O czym pisałem wcześniej. Dlaczego nie działa też wcześniej pisałem.

Również Twoje sugestie dotyczące wycieków pamięci wydają mi się pochopne. Nie twierdze, że wycieki nie mają miejsca, ale nie obserwuję żadnych objawów, które zwykle tego typu awariom towarzyszą.

A wracając do meritum, to napisałem jak rozwiązałem problem. Może niezbyt elegancko ale skutecznie. Natomiast nieprawidłowe wartości zwracane (co prawda sporadycznie, ale jednak) przez OrdersTotal() należałoby zgłosić do brokera.

Jedyne co mnie intryguje, to to, że wygląda na to, że tylko ja mam tego typu problemy. System postawiony na nowo. Dwie świeże instancje MT4 (demo i real) i charakter problemu raczej wykluczają istnienie problemu po stronie klienckiej.

Dziękuję wszystkim za pomoc i temat chyba do zamknięcia.

Awatar użytkownika
nufnuf
Stały bywalec
Stały bywalec
Posty: 81
Rejestracja: 23 wrz 2008, 13:09

Nieprzeczytany post autor: nufnuf »

rrozak pisze:Twoja rada dotycząca restartowania terminala nie działa. O czym pisałem wcześniej. Dlaczego nie działa też wcześniej pisałem.
Gdzie o tym pisałeś? Nie znajduję.

rrozak
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 19 mar 2010, 16:43

Nieprzeczytany post autor: rrozak »

Sorry za wprowadzenie w błąd. Miałem napisać ale nie napisałem.

Restartowałem nie tyle terminal, co cały system. Raz, dwa razy na dobę. Ale przestaje to robić, bo nie widzę w tym sensu. Problem z błędnym odczytem OrdersTotal() wystąpił 10 min po uruchomieniu terminala.

A czemu restart terminal nie ma wpływu na wartości podawane przez OrdersTotal()? Dlatego że wartość ta jest podawana przez serwer. I jeśli serwer podaję tą wartość błędną to mogę sobie restartować klienta ile chcę, pluć po trzykroć przez lewe ramie itd.

green7
Maniak
Maniak
Posty: 2060
Rejestracja: 16 sty 2008, 18:44

Nieprzeczytany post autor: green7 »

rrozak pisze:Problem z błędnym odczytem OrdersTotal() wystąpił 10 min po uruchomieniu terminala.

A czemu restart terminal nie ma wpływu na wartości podawane przez OrdersTotal()? Dlatego że wartość ta jest podawana przez serwer.
Skoro jak zauważyłeś wartość podawana jest przez serwer to czas pracy terminala nie powinien mieć tu znaczenia .....

Ale aleeee.... ogólnie ważna sprawa - więc chętnie bym się dowiedział jak wywołać taki objaw ? Ile masz tych otwartych orderów (może po przekroczeniu jakiejś wartości zaczynają się problemy?) Czy ordery są na jednym symbolu ?
Jaka to wersja terminala ? Czy problem występuje u wielu brokerów ?

Ogólnie może to być istotne dla nas, więc nie zamykał bym tematu bez rozjaśnienia ....

Acha i jeszcze jedno co przyszło mi na myśl ... Twoja pętla może mieć dokładnie taki sam problem jak ten już opisany tu z zamykaniem orderów.
Lecisz przecież:
for( int i=0; i<OrdersTotal(); i++)

- jeśli orderów masz dużo, pętla wykonuje się chwile i zdarzyć się może, że OrdersTotal zmieni swoją zawartość. Ot choćby jakiś aktualnie otwarty order wypadnie na TP/SL ....
brałeś to pod uwagę w swoich testach ? Tłumaczyłoby to fakt, dlaczego nie zdarza się to w testerze a na realu bardzo rzadko ....
Green
Obrazek
Obrazek

rrozak
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 19 mar 2010, 16:43

Nieprzeczytany post autor: rrozak »

green7 pisze:
rrozak pisze:Problem z błędnym odczytem OrdersTotal() wystąpił 10 min po uruchomieniu terminala.

A czemu restart terminal nie ma wpływu na wartości podawane przez OrdersTotal()? Dlatego że wartość ta jest podawana przez serwer.
Skoro jak zauważyłeś wartość podawana jest przez serwer to czas pracy terminala nie powinien mieć tu znaczenia .....
O czasie pracy terminala wspominałem w kontekście sugerowanych wycieków pamięci.
green7 pisze:
rrozak pisze: Ale aleeee.... ogólnie ważna sprawa - więc chętnie bym się dowiedział jak wywołać taki objaw ? Ile masz tych otwartych orderów (może po przekroczeniu jakiejś wartości zaczynają się problemy?) Czy ordery są na jednym symbolu ?
Jaka to wersja terminala ? Czy problem występuje u wielu brokerów ?
Ok. to po kolei:
1. Gram przeciętnie na 9 walorach, po 4 zlecenia na walor. Z tych 4 zleceń, część jest pracująca, część oczekująca. To taki mój podstawowy zestaw i trudno mi powiedzieć jak sytuacja by wyglądała przy pracy na mniejszej ilości walorów/zleceń. Warto by to było sprawdzić, tyle że problem występuje rzadko, co nie ułatwia zadania.
2. Terminal ver. 4 Build 226
3. Broker XTB - tylko u nich gram. Po urlopie zobaczę jak to wygląda w BOŚu

A co do relacji ilość zleceń -> ilość problemów to coś w tym jest. Ja widzę to tak: więcej zleceń -> więcej odczytów OrdersTotal() z których część będzie błędna. Gdyby zleceń było mnie, to i mniej by było w ogóle odczytów OrdersTotal().
green7 pisze:
rrozak pisze: Acha i jeszcze jedno co przyszło mi na myśl ... Twoja pętla może mieć dokładnie taki sam problem jak ten już opisany tu z zamykaniem orderów.
Lecisz przecież:
for( int i=0; i<OrdersTotal(); i++)

- jeśli orderów masz dużo, pętla wykonuje się chwile i zdarzyć się może, że OrdersTotal zmieni swoją zawartość. Ot choćby jakiś aktualnie otwarty order wypadnie na TP/SL ....
brałeś to pod uwagę w swoich testach ? Tłumaczyłoby to fakt, dlaczego nie zdarza się to w testerze a na realu bardzo rzadko ....
Bardzo celna uwaga. Chyba to pominąłem w analizie. Ale tak na szybko: problem zauważyłem nie dlatego, że zmniejszała się wartość OrdersTotal(), tylko dlatego że w pętli przeglądania zleceń, nie były odnajdywane istniejące zlecenia. Dopiero szukając przyczyn anomalii doszukałem się, że jest to zbieżne z nieprawidłowościami przy odczycie OrdersTotal(). Na pewno też występowały sytuacje, kiedy kolejny odczyt OrdersTotal() podawał wartość mniejszą niż poprzednia, a zleceń w tym czasie nie ubyło. Ale przyjrzę się temu jeszcze.

green7
Maniak
Maniak
Posty: 2060
Rejestracja: 16 sty 2008, 18:44

Nieprzeczytany post autor: green7 »

rrozak pisze:Chyba to pominąłem w analizie. Ale tak na szybko: problem zauważyłem nie dlatego, że zmniejszała się wartość OrdersTotal(), tylko dlatego że w pętli przeglądania zleceń, nie były odnajdywane istniejące zlecenia.
Jeśli OrdersTotal() zmniejszy Ci się w trakcie wykonywania pętli no to właśnie nie odnajdziesz istniejącego zlecenia. Istniejące zlecenia zmienią przecież swoje numery i ostatni OrderSelect() gdzie wybierasz order po jego pozycji nie zadziała.

Myślę, że prosto sprawdzić czy to właśnie taki przypadek, logując wartość OrdersTotal przed wejściem do tego Twojego kawałka kodu i po jego zakończeniu (zakładam, że robisz tam tylko to co wyżej, czyli ustawiasz zmienną i nie otwierasz/zamykasz orderów).
Jeśli dobrze zgadłem, to raz na jakiś czas OrdersTotal() po wykonaniu kodu będzie mniejszy niż przed i wtedy czasem (nie zawsze, bo masz wiele symboli) Twój kod nie zadziała jak oczekujesz.

Daj znać do czego dojdziesz bo to bardzo ciekawa sprawa mogąca powodować nieprzewidziane kłopoty. Rzekłbym nawet, że niektórzy widzieli by w tym spisek brokera :)
Green
Obrazek
Obrazek

ODPOWIEDZ