PDA

Zobacz pełną wersję : Funkcja StrToTime



miggoxy
05-11-2009 21:08, 21:08
Kiedy używam tego, wydaje się, że Metatrader używa czasu lokalnego (komputerowego) w przeciwieństwie do czasu brokera.

Czy ktoś może to potwierdzić?

giraldiso99
12-14-2021 21:02, 21:02
Kiedy używam funkcji StrToTime, wydaje się, że Metatrader używa czasu lokalnego (komputerowego) w przeciwieństwie do czasu brokera. Czy ktoś może to potwierdzić?
To jest poprawne. jeśli twój ciąg zawiera tylko czas, ale nie ma daty, wypełni datę ustawioną na zegarze systemowym komputera.

miggoxy
12-14-2021 22:23, 22:23
Jak mogę uzyskać czas brokera?

giraldiso99
12-14-2021 23:44, 23:44
Jak mogę uzyskać czas brokera?
użyj Time Current () data time Time Current () Zwraca ostatni znany czas serwera (czas otrzymania ostatniego cytatu)

miggoxy
12-15-2021 01:05, 01:05
Niezupełnie o to mi chodziło. Wiesz zen, że niektóre z mojego kodu TradingTime używają tej funkcji łańcuchowej. Próbuję ustalić, jak najlepiej ustawić czasy transakcji z minuty na minutę.

vicdock
12-15-2021 02:25, 02:25
Niezupełnie o to mi chodziło. Wiesz zen, że niektóre z mojego kodu TradingTime używają tej funkcji łańcuchowej. Próbuję ustalić, jak najlepiej ustawić czasy transakcji z minuty na minutę.
Niejasny. najlepiej, jeśli umieścisz kody kodów, które chcesz zrobić. Napotkałem ten problem z konwersją czasu do lat temu.

miggoxy
12-15-2021 03:46, 03:46
Wstawiony ciąg kodu TradingTimes = Poza czasy transakcji; if (TimeCurrent () gt; StrToTime (10:00) TimeCurrent () lt; StoToTime (20:00)) TradingTimes = Inside Times handlu; Wydaje się, że funkcja StrToTime używa czasu lokalnego komputera w przeciwieństwie do czasu brokera, więc czasami ten problem z czasem transakcji nie działa poprawnie. Jak mogę nadal drążyć do minutę w zakresie handlu?

vicdock
12-15-2021 05:07, 05:07
Ah .. więc chcesz, aby była to prosta metoda, aby EA mogła handlować tylko w określonym przedziale czasowym. Ale żeby odpowiedzieć na twój problem. Zrobiłbym coś takiego: int TimeShift = TimeCurrent () - TimeLocal (); if (TimeCurrent () - TimeShift gt; StrToTime (10:00) TimeCurrent () - TimeShift lt; StrToTime (20:00)) TradingTimes = Wewnętrzne czasy transakcji; Aby zaoferować moją metodę, po prostu użyję TimeLocal () zamiast TimeCurrent (); w ten sposób kody są niezależne od brokera: if (TimeLocal () gt; StrToTime (10:00) TimeLocal () lt; StrToTime (20:00)) TradingTimes = Inside Times handlu;

vicdock
12-15-2021 06:28, 06:28
Ale jeśli naprawdę nalegasz na użycie TimeCurrent (), proponuję ten bardziej odpowiedni: if (TimeCurrent () gt; StrToTime (TimeToStr (TimeCurrent (), TIME_DATE) 10:00) TimeCurrent () lt; StrToTime (TimeToStr (TimeCurrent (), TIME_DATE) 20:00)) TradingTimes = Inside Trading Times; to zapewni, że StrToTime będzie zawierał prawidłową datę do konwersji czasu.

giraldiso99
12-15-2021 07:48, 07:48
co powiesz na to? Wstawiony kod/ --------------------------------------------- --------------------- /| test.mq4 |/| Copyright © 2009, MetaQuotes Software Corp./| http://www.metaquotes.net |/ ----------------------------------------------- ------------------- #property copyright Copyright © 2009, MetaQuotes Software Corp. #property link http://www.metaquotes.net/zanotuj zmianę w danych wejściowych type extern int StartHour = 0; extern int StartMinute = 30; extern int EndHour = 3; extern int EndMinute = 30; int init () {start ();/Usuń to, gdy zaimplementujesz fragment kodu do swojego kodu. return (0); }/ ---------------------------------------------- -------------------- /| Funkcja iteracji wskaźnika niestandardowego |/ ----------------------------------------------- ------------------- int start () {//Znajdź End Time Shift int EndTimeShift = 0; bool EndTimeFound = false; while (! EndTimeFound) {//sprawdzenie segmentu minutowego pozwala dołączyć ten EA do niższych ram czasowych, jeśli (TimeHour (Time # 91; EndTimeShift # 93;) == EndHour TimeMinute (Time # 91; EndTimeShift # 93;) == EndMinute) {EndTimeFound = true; } else {EndTimeShift ; }}/Znajdź najnowszy czas rozpoczęcia przed czasem zakończenia int StartTimeShift = EndTimeShift; bool StartTimeFound = Fałsz; while (! StartTimeFound) {if (TimeHour (Czas # 91; StartTimeShift # 93;) == StartHour TimeMinute (Czas # 91; StartTimeShift # 93;) == StartMinute) {StartTimeFound = true; } else {StartTimeShift ; }} Komentarz (StartTimeShift: StartTimeShift nEndTimeShift: EndTimeShift); } ale aby użyć tej wartości, wartość minutowa musi być czymś, co może zaoferować przedział czasowy. co oznacza, że ​​jeśli ustawisz minutę na 30, ale załączysz to na wykresie godzinowym. utkniesz w nieskończonej pętli, ponieważ wszystkie świece na wykresie godzinowym mają tylko 0 jako wartość minutową. Być może możesz wymyślić sposób obejścia tego ograniczenia. powodzenia. pozdrowienia, Zen

vicdock
12-15-2021 09:09, 09:09
A co z ludźmi używającymi zakresów, które przechodzą przez północ?
Wstawiony kod stringTimeStart = 22:00;/10PM stringTimeEnd = 10:00;/10AM następnego dnia stringBrokerDate; int_TimeStart, _TimeEnd;/te powinny znajdować się wewnątrz start () NIGDY w obrębie init, jeśli (TimeCurrent () gt; _TimeEnd) {//pierwszy raz będzie to zawsze prawdziwe, upewniając się, że BrokerDate jest poprawne/dlaczego to robimy? aby zapewnić, że BrokerDate i _TimeEnd nie zakończą się wyścigiem kotówmyszy BrokerDate = TimeToStr (TimeCurrent (), TIME_DATE); } _TimeStart = StrToTime (BrokerDate TimeStart); _TimeEnd = StrToTime (BrokerDate TimeEnd); if (_TimeStart gt; _TimeEnd) {_TimeEnd = _TimeEnd 86400;/dodaj 1 dzień}/teraz swobodnie użyj _TimeStart i _TimeEnd, aby porównać z TimeCurrent () Ten kod jest napisany dla EAScript. W zależności od tego, gdzie chcesz tego użyć, może mieć różne efekty.

aspksakdrusk
12-15-2021 10:30, 10:30
Oto fragment kodu z opakowania EA, które napisałem dla klienta kilka miesięcy temu: Inserted Code::::::: extern string StartTime = 07:00;/czas rozpoczęcia ustalania ceny w łańcuchu zewnętrznym ciąg EndTime = 08:00;/czas zakończenia okresu obowiązywania ceny zewnętrznej dla okna zewnętrznego ExpiryTime = 06:00;/czas, w którym wygasają oczekujące zamówienia, a wszelkie wciąż otwarte zamówienia zamknięte extern int Rozliczenie = 5;/cena wejścia ”tolerancja” bezpieczeństwa powyżej okna wysokiego, poniżej okna dolna zewnętrzna podwójna MinWinHgt = 0;/jeśli okno cenowe (w tym Wyprzedaż) lt; ta wartość, bez złożenia zamówienia, jest obecnie dozwolona na poziomie zewnętrznym double MaxWinHgt = 9999;/jeśli okno cenowe (w tym Wyprzedaż) gt; ta wartość, bez możliwości złożenia zamówienia, jest dzisiaj możliwa::::::: int start () {double dt0 = StrToTime (TimeToStr (TimeCurrent (), TIME_DATE) 00:00:00); double dt1 = StrToTime (TimeToStr (TimeCurrent (), TIME_DATE) StartTime : 00); double dt2 = StrToTime (TimeToStr (TimeCurrent (), TIME_DATE) EndTime : 00); double dt3 = StrToTime (TimeToStr (TimeCurrent (), TIME_DATE) ExpiryTime : 00); jeżeli (dt3 dt2) dt3 = 86400; int ib1 = iBarShift (NULL, 0, dt1); int ib2 = iBarShift (NULL, 0, dt2); if (TimeCurrent () gt; = dt2 TimeCurrent () lt; = dt3) {double vHigh = 0, vLow = 999; dla (int j = ib1; jgt; ib2; j--) {vHigh = MathMax (vHigh, High # 91; j # 93; Clearance * pnt); vLow = MathMin (vLow, Low # 91; j # 93; -Clearance * pnt); } if (vHigh-vLow lt; = MaxWinHgt * pnt vHigh-vLow gt; = MinWinHgt * pnt) {::::::: dt0 to północ (czas MT4) w bieżącym dniu dt1 to czas rozpoczęcia (czas MT4 ) pola breakout dt2 to czas zakończenia (czas MT4) pola breakout dt3 to czas wygaśnięcia (czas MT4) Zamówienia można umieszczać tylko między dt2 (koniec pola breakout) a dt3 (wyznaczony czas wygaśnięcia) . Dlatego dodaję 86400 (liczba sekund w 24-godzinnym dniu) do dt3, jeśli to konieczne, aby zapewnić, że jest zawsze większy niż dt2 (tak jak robi to Ragnakore). Następnie EA składa zamówienia tylko wtedy, gdy TimeCurrent () znajduje się pomiędzy dt2 i dt3. (vHigh i vLow są najwyższymi i najniższymi cenami osiągniętymi w polu breakout, plus określony dystans dostarczony przez użytkownika). Mam nadzieję że to pomoże.

miggoxy
12-15-2021 11:51, 11:51
Wow Hanower !!! Dziękuję bardzo za blok kodu. Zastanawiam się jednak, nie widzę zmiennej dt0 używanej nigdzie poza inicjalizacją. Jak więc pracujesz przez północ? Powiedzmy, że chciałem, aby początek zakresu wynosił 23:00 wczoraj, a koniec zakresu wynosił już 3:00. Jak to robi ten blok kodu? Dodałem fragment pogrubiony, aby spróbować osiągnąć to, co próbuję zrobić. Wstawiony kod::::::: extern string StartTime = 07:00;/czas rozpoczęcia ustalania ceny w łańcuchu zewnętrznym ciąg EndTime = 08:00;/czas zakończenia okresu obowiązywania ceny zewnętrznej dla okna zewnętrznego ExpiryTime = 06:00;/czas, w którym wygasają oczekujące zamówienia, a wszelkie wciąż otwarte zamówienia zamknięte extern int Rozliczenie = 5;/cena wejścia ”tolerancja” bezpieczeństwa powyżej okna wysokiego, poniżej okna dolna zewnętrzna podwójna MinWinHgt = 0;/jeśli okno cenowe (w tym Wyprzedaż) lt; ta wartość, bez złożenia zamówienia, jest obecnie dozwolona na poziomie zewnętrznym double MaxWinHgt = 9999;/jeśli okno cenowe (w tym Wyprzedaż) gt; ta wartość, bez możliwości złożenia zamówienia, jest dzisiaj możliwa::::::: int start () {double dt0 = StrToTime (TimeToStr (TimeCurrent (), TIME_DATE) 00:00:00); double dt1 = StrToTime (TimeToStr (TimeCurrent (), TIME_DATE) StartTime : 00); double dt2 = StrToTime (TimeToStr (TimeCurrent (), TIME_DATE) EndTime : 00); double dt3 = StrToTime (TimeToStr (TimeCurrent (), TIME_DATE) ExpiryTime : 00); jeżeli (dt3 dt2) dt3 = 86400; # 91; b # 93; if (dt1 gt; dt2) dt1 = StrToTime (TimeToStr (TimeCurrent () - 86400, TIME_DATE) StartTime : 00); # 91;b # 93;/Jeśli StartTime jest większy niż EndTime w tym samym dniu, kod zakłada, że ​​planowany czas rozpoczęcia to 86400 sekund wcześniej. int ib1 = iBarShift (NULL, 0, dt1); int ib2 = iBarShift (NULL, 0, dt2); if (TimeCurrent () gt; = dt2 TimeCurrent () lt; = dt3) {double vHigh = 0, vLow = 999; dla (int j = ib1; jgt; ib2; j--) {vHigh = MathMax (vHigh, High # 91; j # 93; Clearance * pnt); vLow = MathMin (vLow, Low # 91; j # 93; -Clearance * pnt); } if (vHigh-vLow lt; = MaxWinHgt * pnt vHigh-vLow gt; = MinWinHgt * pnt) {:::::::