Funkcja Sleep()

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Funkcja Sleep()

Nieprzeczytany post autor: personov »

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 ?
Solą życia jest kasa.

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Re: Funkcja Sleep()

Nieprzeczytany post autor: Pierz Andrzej »

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

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Re: Funkcja Sleep()

Nieprzeczytany post autor: personov »

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 ?
Solą życia jest kasa.

Awatar użytkownika
mike_05
Maniak
Maniak
Posty: 1668
Rejestracja: 02 wrz 2010, 11:55

Re: Funkcja Sleep()

Nieprzeczytany post autor: mike_05 »

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.
Jeżeli chcesz odnieść sukces, naucz się cenić ludzi.

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Re: Funkcja Sleep()

Nieprzeczytany post autor: personov »

Tak, ale mi chodzi o taki zapis :

Kod: Zaznacz cały

if(.......){OrderSend(....);Sleep(100);}
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.
Solą życia jest kasa.

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Re: Funkcja Sleep()

Nieprzeczytany post autor: Pierz Andrzej »

Sleep jest po funkcji OrderSend wiec w niczym nie przeszkadza , 100 to 0.1 sekundy wiec w ogóle niezauważalne :D
z poważaniem
Andrzej Pierz
FOREX-SERVICE

ViTESOFT
Stały bywalec
Stały bywalec
Posty: 21
Rejestracja: 07 paź 2012, 04:27

Re: Funkcja Sleep()

Nieprzeczytany post autor: ViTESOFT »

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".
ViTE Software Solutions

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Re: Funkcja Sleep()

Nieprzeczytany post autor: Pierz Andrzej »

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 .
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.
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ędzie :D


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 :D

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);}
było

Kod: Zaznacz cały

while(....) {order.send(...);Sleep(100);}
z poważaniem
Andrzej Pierz
FOREX-SERVICE

ViTESOFT
Stały bywalec
Stały bywalec
Posty: 21
Rejestracja: 07 paź 2012, 04:27

Re: Funkcja Sleep()

Nieprzeczytany post autor: ViTESOFT »

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
Trudno mi w to uwierzyć, że taka sytuacja miała miejsce.
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

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Re: Funkcja Sleep()

Nieprzeczytany post autor: Pierz Andrzej »

ViTESOFT pisze:
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
Trudno mi w to uwierzyć, że taka sytuacja miała miejsce.
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.
hehehe :) kod na pewno jest / był dobrze skonstruowany

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

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 :) , naprawdę nie siedzę w MT4 od wczoraj i sytuacje które opisuje są z własnego doświadczenia.

ale nie ma co się przekomarzać i twierdzić kto ma rację a kto nie ;) ja tylko opisuje co mnie spotkało a nie to co powinno być :) a każdy i tak robi po swojemu :D
z poważaniem
Andrzej Pierz
FOREX-SERVICE

ODPOWIEDZ