Funkcja Sleep()
Funkcja Sleep()
Co daje zastosowanie funkcji Sleep() zaraz po OrderSend() lub OrderClose() ?
Widziałem takie coś ostatnio w pewnym EA o charakterze agresywnego skalpu.
Po każdym otwarciu zlecenia był zapis Sleep(100).
Czy wstrzymanie wykonania kodu w tym miejscu ma za zadanie "nie przeszkadzanie" w natychmiastowym, ekspresowym otwarciu zlecenia ? Czy to coś daje ?
Widziałem takie coś ostatnio w pewnym EA o charakterze agresywnego skalpu.
Po każdym otwarciu zlecenia był zapis Sleep(100).
Czy wstrzymanie wykonania kodu w tym miejscu ma za zadanie "nie przeszkadzanie" w natychmiastowym, ekspresowym otwarciu zlecenia ? Czy to coś daje ?
Solą życia jest kasa.
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
Re: Funkcja Sleep()
jak cos działa w pętli to stosuje się Sleep by nie obciążać zbytnio procesor i dać trochę oddechu terminalowi 

z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE
Re: Funkcja Sleep()
OK. A czy to nie przeszkadza w funkcjonowaniu EA ? Szczególnie jeśli chodzi o jego szybkość. Jeśli Sleep(100) jest w klamrze zaraz po OrderSend() to zlecenie zostanie otwarte na pewno ? Czy Sleep(100) może coś tutaj kolidować.
Reasumując : czy taki zapis pomaga, czy przeszkadza ?
Reasumując : czy taki zapis pomaga, czy przeszkadza ?
Solą życia jest kasa.
Re: Funkcja Sleep()
Ja mam taki przypadek, ze jak włączy się trailing, zleceń do serwera może lecieć tyle, ile tickow w minucie. Przez to mam error modyfikacji 1. Czyli brak errora a prawdopodobnie jest to błąd platformy, że nie nadąża za modyfikacjami. Jak włączę sleep po modyfikacji trailem, trochę zmniejsza ilość tych zleceń.
edit:
http://www.mql4.com/search#!keyword=sleep%28%29
tu jest napisane, ze jednak sleep() przeszkadza. Wykonując polecenie, zamraża wszystkie działania skryptu, a przecież terminal mógłby w tym czasie robić inne obliczenia czy przetwarzanie.
edit:
http://www.mql4.com/search#!keyword=sleep%28%29
tu jest napisane, ze jednak sleep() przeszkadza. Wykonując polecenie, zamraża wszystkie działania skryptu, a przecież terminal mógłby w tym czasie robić inne obliczenia czy przetwarzanie.
Jeżeli chcesz odnieść sukces, naucz się cenić ludzi.
Re: Funkcja Sleep()
Tak, ale mi chodzi o taki zapis :
I taka pauza ma za zadanie wstrzymać wszelkie obliczenia na czas otwarcia zlecenia. Po to aby nie przeszkadzać samemu procesowi otwierania.
Teoretycznie. Ale czy w praktyce to nie przeszkodzi ? Czy ten OrderSend() zostanie zrealizowany. Przecież jest pierwszy w klamrze.
Oczywiście mówimy o EA skalpującym. Jeśli otwiera transakcje to nie ma konieczności szukać kolejnego otwarcia. Liczy się tylko szybkość otwarcia zlecenia.
Kod: Zaznacz cały
if(.......){OrderSend(....);Sleep(100);}
Teoretycznie. Ale czy w praktyce to nie przeszkodzi ? Czy ten OrderSend() zostanie zrealizowany. Przecież jest pierwszy w klamrze.
Oczywiście mówimy o EA skalpującym. Jeśli otwiera transakcje to nie ma konieczności szukać kolejnego otwarcia. Liczy się tylko szybkość otwarcia zlecenia.
Solą życia jest kasa.
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
Re: Funkcja Sleep()
Sleep jest po funkcji OrderSend wiec w niczym nie przeszkadza , 100 to 0.1 sekundy wiec w ogóle niezauważalne 

z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE
Re: Funkcja Sleep()
Niestety nie zgodzę się z Andrzejem, że to w niczym nie przeszkadza i że jest niezauważalne - jest na odwrót to przeszkadza i jest zauważalne.
Sleep jak i każda inna funkcja w MQL4 działają na zasadzie blokowania wątku w którym są uruchomione. Innymi słowy, skrypt uruchomiony na wykresie przy wykonaniu jakiejkolwiek funkcji języka, nawet OrderSend, czeka aż dane polecenie zostanie wykonane i dopiero potem przechodzi do kolejnego, jeśli w tym czasie następują "tiki" na wykresie, to zajęty/pracujący skrypt ich nie obsłuży, a dobrą praktyką jest jak najszybsze wykonanie zadań które umieszczono w funkcji start() i jej opuszczenie.
Sleep(100) - tak to inaczej 0.1 sekundy, czyli teoretycznie maksymalnie ok. 10 razy na sekundę coś w Twoim skrypcie może się wydarzyć.
Pytanie, po co w ogóle używać Sleep?
Jeśli chcesz celowo/świadomie/z premedytacją spowolnić pracę skryptu, to tak, ale w MQL-u to w ogóle nie ma sensu, a skalperowi to w ogóle nie jest potrzebne.
Chyba że nie zależy Ci na szybkości.
Co prawda broker może i tak regulować czas wykonania funkcji operującej na zleceniach (OrderSend, OrderModify, OrderClose, OrderDelete) po swojej stronie, co po stronie użytkownika da się wyraźnie odczuć.
Ja osobiście tylko w ciężko pracujących skryptach używam Sleep(1). Co z doświadczenia wiem, że nie trwa krócej niż pozwala na to "system timer resolution".
Sleep jak i każda inna funkcja w MQL4 działają na zasadzie blokowania wątku w którym są uruchomione. Innymi słowy, skrypt uruchomiony na wykresie przy wykonaniu jakiejkolwiek funkcji języka, nawet OrderSend, czeka aż dane polecenie zostanie wykonane i dopiero potem przechodzi do kolejnego, jeśli w tym czasie następują "tiki" na wykresie, to zajęty/pracujący skrypt ich nie obsłuży, a dobrą praktyką jest jak najszybsze wykonanie zadań które umieszczono w funkcji start() i jej opuszczenie.
Sleep(100) - tak to inaczej 0.1 sekundy, czyli teoretycznie maksymalnie ok. 10 razy na sekundę coś w Twoim skrypcie może się wydarzyć.
Pytanie, po co w ogóle używać Sleep?
Jeśli chcesz celowo/świadomie/z premedytacją spowolnić pracę skryptu, to tak, ale w MQL-u to w ogóle nie ma sensu, a skalperowi to w ogóle nie jest potrzebne.
Chyba że nie zależy Ci na szybkości.
Co prawda broker może i tak regulować czas wykonania funkcji operującej na zleceniach (OrderSend, OrderModify, OrderClose, OrderDelete) po swojej stronie, co po stronie użytkownika da się wyraźnie odczuć.
Ja osobiście tylko w ciężko pracujących skryptach używam Sleep(1). Co z doświadczenia wiem, że nie trwa krócej niż pozwala na to "system timer resolution".
ViTE Software Solutions
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
Re: Funkcja Sleep()
to ja sobie też nie pozwolę sobie się zgodzić z postem powyżej , bo znam na tyle MT4 że wiem jakie czasami dziwne rzeczy robi
i to co w teorii nie sprawdza się w praktyce .
Co do Sleep(1) też stosowałem ale z doświadczenia wiem że użycie kilku EA z tak niskim Sleep-em powodowały na VPSach użycie procesora w 90%
to co sprawdza się w innych językach programowania nie zawsze działa w MQLu jest bardzo opornym językiem
Z MQLem jest tak właśnie że cza dużo rzeczy samemu sprawdzić i porównać
i naprawdę wiem o czym mówię mój system skalpujący oparty o snippinig pracował w pętli Sleep(100) i gdy wydawało mi się że dając Sleep(1) przyśpieszę jego działanie okazało się że zaczęło powodować nieprawidłowe działanie MT4 , najbardziej szkodzącym błędem było to że po mimo otwartego zlecenia w terminalu przez EA funkcja OrdersTotal() zwracała 0 dopiero po zatrzymaniu EA i jego ponownym włączeniu sytuacja się normowała dlatego nie zalecam stosowanie Sleep mniejszego niż 100 w mt4
może już w nowych wersjach się unormowało to nie wiem bo nie sprawdzałem teraz już nie używam sleep-a w mt4 bo jak wyżej napisałem jednorazowe użycie Sleepa nie przeszkodzi w niczym tym bardziej tak niskiego ale ciągłe jego użycie powoduje że zakłóca pracę MT4 dlatego teraz stosuje zewnętrzna bibliotekę która symuluje nadejście ticka co określony czas.
Co do użycia Sleepa w tym przypadku jest zbyteczny jeżeli jest to normalnie działające EA na tickach
co innego gdyby zamiast
było

jeżeli zależy Ci na ciągłej pracy EA i nie chcesz czekać na nadchodzące ticki to bez Sleep-a się nie obędziePytanie, po co w ogóle używać Sleep?
Jeśli chcesz celowo/świadomie/z premedytacją spowolnić pracę skryptu, to tak, ale w MQL-u to w ogóle nie ma sensu, a skalperowi to w ogóle nie jest potrzebne.

Co do Sleep(1) też stosowałem ale z doświadczenia wiem że użycie kilku EA z tak niskim Sleep-em powodowały na VPSach użycie procesora w 90%
to co sprawdza się w innych językach programowania nie zawsze działa w MQLu jest bardzo opornym językiem

Z MQLem jest tak właśnie że cza dużo rzeczy samemu sprawdzić i porównać
i naprawdę wiem o czym mówię mój system skalpujący oparty o snippinig pracował w pętli Sleep(100) i gdy wydawało mi się że dając Sleep(1) przyśpieszę jego działanie okazało się że zaczęło powodować nieprawidłowe działanie MT4 , najbardziej szkodzącym błędem było to że po mimo otwartego zlecenia w terminalu przez EA funkcja OrdersTotal() zwracała 0 dopiero po zatrzymaniu EA i jego ponownym włączeniu sytuacja się normowała dlatego nie zalecam stosowanie Sleep mniejszego niż 100 w mt4
może już w nowych wersjach się unormowało to nie wiem bo nie sprawdzałem teraz już nie używam sleep-a w mt4 bo jak wyżej napisałem jednorazowe użycie Sleepa nie przeszkodzi w niczym tym bardziej tak niskiego ale ciągłe jego użycie powoduje że zakłóca pracę MT4 dlatego teraz stosuje zewnętrzna bibliotekę która symuluje nadejście ticka co określony czas.
Co do użycia Sleepa w tym przypadku jest zbyteczny jeżeli jest to normalnie działające EA na tickach
co innego gdyby zamiast
Kod: Zaznacz cały
if(....) {order.send(...);Sleep(100);}
Kod: Zaznacz cały
while(....) {order.send(...);Sleep(100);}
z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE
Re: Funkcja Sleep()
Trudno mi w to uwierzyć, że taka sytuacja miała miejsce.Pierz Andrzej pisze:mój system skalpujący oparty o snippinig pracował w pętli Sleep(100) i gdy wydawało mi się że dając Sleep(1) przyśpieszę jego działanie okazało się że zaczęło powodować nieprawidłowe działanie MT4 , najbardziej szkodzącym błędem było to że po mimo otwartego zlecenia w terminalu przez EA funkcja OrdersTotal() zwracała 0 dopiero po zatrzymaniu EA i jego ponownym włączeniu sytuacja się normowała
OrdersTotal() powinno zwracać prawidłową wartość (czyli liczbę transakcji wpuszczonych w rynek) niezależnie od tego w jakim podejściu go używano, czy po tikach, czy asynchronicznie.
Jeśli tak było, to przyczyna leży raczej po stronie wadliwie skonstruowanego kodu w skrypcie, a nie samego MT4.
I proszę nie brać tego do siebie, to nie jest atak, czy zaczepka do polemiki, tylko proste stwierdzenie, bo w większości przypadków tak po prostu jest.
ViTE Software Solutions
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
Re: Funkcja Sleep()
heheheViTESOFT pisze:Trudno mi w to uwierzyć, że taka sytuacja miała miejsce.Pierz Andrzej pisze:mój system skalpujący oparty o snippinig pracował w pętli Sleep(100) i gdy wydawało mi się że dając Sleep(1) przyśpieszę jego działanie okazało się że zaczęło powodować nieprawidłowe działanie MT4 , najbardziej szkodzącym błędem było to że po mimo otwartego zlecenia w terminalu przez EA funkcja OrdersTotal() zwracała 0 dopiero po zatrzymaniu EA i jego ponownym włączeniu sytuacja się normowała
OrdersTotal() powinno zwracać prawidłową wartość (czyli liczbę transakcji wpuszczonych w rynek) niezależnie od tego w jakim podejściu go używano, czy po tikach, czy asynchronicznie.
Jeśli tak było, to przyczyna leży raczej po stronie wadliwie skonstruowanego kodu w skrypcie, a nie samego MT4.
I proszę nie brać tego do siebie, to nie jest atak, czy zaczepka do polemiki, tylko proste stwierdzenie, bo w większości przypadków tak po prostu jest.

MQL ma dużo niedociągnięć wystarczy użyć funkcji IsConnected() która działa jak jej się podoba

kolejnym przykład zamulenia MT4 przez szybką pętle w kodzie to zlecenie oczekujące które zostało zrealizowane ale w MT4 wisi nadal jako oczekujące , przykładów jest multum

ale nie ma co się przekomarzać i twierdzić kto ma rację a kto nie



z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE