TimeCurrent() 및 iTime() 버그/문제

 

안녕하세요 여러분,

흥미로운 문제/버그를 발견하고 이전에 식별되었는지 또는 브로커 특정인지 확실하지 않습니다.

일부 표시기 코드에서 다음을 사용하고 시작 시 표시기를 실행하고 MT4를 처음 실행할 때 값을 기록해 두십시오(MT4가 다시 시작하기 전에 최소 10분 동안 실행되지 않았는지 확인하십시오).

 Print (TimeToStr( TimeCurrent (), TIME_DATE | TIME_MINUTES ));
Print (TimeToStr(iTime( NULL , PERIOD_M1 , 0 ), TIME_DATE | TIME_MINUTES ));

반환된 시간은 실제로 MT4가 마지막으로 실행된 시간임을 알 수 있습니다.

이 문제를 해결하기 위해 내 코드에 지연을 도입해야 했습니다. 이는 표시기에 적합하지 않습니다.

누구든지 더 웅변적인 솔루션이 있는지 궁금합니다. 매번 시작할 때 정확한 MT4 서버 시간 이 반환되지 않는 것이 이상적입니다.

문안 인사

폴비

 
Paul_B :

안녕하세요 여러분,

흥미로운 문제/버그를 발견하고 이전에 식별되었는지 또는 브로커 특정인지 확실하지 않습니다.

일부 표시기 코드에서 다음을 사용하고 시작 시 표시기를 실행하고 MT4를 처음 실행할 때 값을 기록해 두십시오(MT4가 다시 시작하기 전에 최소 10분 동안 실행되지 않았는지 확인하십시오).

반환된 시간은 실제로 MT4가 마지막으로 실행된 시간임을 알 수 있습니다.

이 문제를 해결하기 위해 내 코드에 지연을 도입해야 했습니다. 이는 표시기에 적합하지 않습니다.

누구든지 더 웅변적인 솔루션이 있는지 궁금합니다. 매번 시작할 때 정확한 MT4 서버 시간이 반환되지 않는 것이 이상적입니다.

문안 인사

폴비


이것 ??
 Print (TimeToStr( TimeCurrent (), TIME_DATE | TIME_SECONDS ));
 

안녕하세요 deVries님,

TIME_SECONDS도 사용할 수 있습니다. 코드가 init{}에 있거나 start{} 시작 부분에 있는 한 별로 중요하지 않습니다.

요점은 MT4가 마지막으로 실행된 시간을 알 수 있다는 것입니다. 이는 잠재적으로 몇 시간 또는 며칠 전일 수 있습니다.

 
Paul_B :

안녕하세요 여러분,

흥미로운 문제/버그를 발견하고 이전에 식별되었는지 또는 브로커 특정인지 확실하지 않습니다.

일부 표시기 코드에서 다음을 사용하고 시작 시 표시기를 실행하고 MT4를 처음 실행할 때 값을 기록해 두십시오(MT4가 다시 시작하기 전에 최소 10분 동안 실행되지 않았는지 확인하십시오).

반환된 시간은 실제로 MT4가 마지막으로 실행된 시간임을 알 수 있습니다.

이 문제를 해결하기 위해 내 코드에 지연을 도입해야 했습니다. 이는 표시기에 적합하지 않습니다.

누구든지 더 웅변적인 솔루션이 있는지 궁금합니다. 매번 시작할 때 정확한 MT4 서버 시간이 반환되지 않는 것이 이상적입니다.

문안 인사

폴비

이 점에 대한 문서가 100% 명확하지 않습니까? "마지막으로 알려진 서버 시간 (최신 견적 수신 시간)을 1970년 1월 1일 00:00부터 경과된 시간(초)으로 반환합니다." 마지막 틱이 10분 전이면 TimeCurrent()는 해당 시간을 기준으로 datetime을 반환합니다. . .
 
RaptorUK :
이 점에 대한 문서가 100% 명확하지 않습니까?

그렇지 않습니다.

EA와 표시기 사이에는 문서에서 다루지 않은 중요한 차이점이 있습니다. EA는 브로커 연결과 새 틱이 있는 경우에만 start()에 대한 호출을 받는 반면 표시기는 항상 시작 전 또는 없이 초기 호출을 받습니다. 브로커 연결이 설정되고 있습니다. 따라서 TimeCurrent()는 EA와 지표에서 다른 의미를 가질 수 있습니다.

표시기의 TimeCurrent()에 대해 확실히 새로 고친 값을 원하는 경우 IsConnected()를 사용하여 TimeCurrent()가 이전 세션에서 마지막으로 알려진 시간을 참조할 수 있는지 여부를 확인할 수 있습니다.

 

추가 요점으로 나는 시도했습니다.

https://docs.mql4.com/windows/RefreshRates

TimeCurrent()를 호출하기 전에 차이가 없었습니다. 확실히 명심해야 할 사항입니다.

MT4 서버 시간과 GMT 간의 오프셋을 가져오기 위해 일부 코드의 일부로 사용하고 있으며 후속 계산을 던지고 있습니다.

 
cyclops993 :

그렇지 않습니다.

EA와 표시기 사이에는 문서에서 다루지 않은 중요한 차이점이 있습니다. EA는 브로커 연결과 새 틱이 있는 경우에만 start()에 대한 호출을 받는 반면 표시기는 항상 시작 전 또는 없이 초기 호출을 받습니다. 브로커 연결이 설정되고 있습니다. 따라서 TimeCurrent()는 EA와 지표에서 다른 의미를 가질 수 있습니다.

문서에서 말하는 내용을 염두에 두고 관련성이 있다고 생각하지 않습니다. . . 새 틱이 도착하기 전에 TimeCurrent()를 확인 하면 마지막 틱의 시간을 얻습니다. 문서에 그렇게 나와 있지 않습니까?
 
RaptorUK :
문서에서 말하는 내용을 염두에 두고 관련성이 있다고 생각하지 않습니다. . . 새 틱이 도착하기 전에 TimeCurrent()를 확인하면 마지막 틱의 시간을 얻습니다. 문서에 그렇게 나와 있지 않습니까?

여전히 오해의 소지가 있지만 현학적이고 싶다면 문제가 TimeCurrent() 의 정의가 아니라 https://docs.mql4.com/runtime/start 의 정의에 있다고 말할 수 있습니다. 즉, "새로운 견적이 들어오면 첨부된 전문가 및 사용자 지정 지표의 start() 함수가 실행됩니다"입니다. start()는 EA의 경우와 같이 새 틱과 관련해서만 호출되며 암시적으로 TimeCurrent()는 MT4 소프트웨어를 사용하는 이전 세션에서 마지막 틱의 시간을 반환할 수 없다는 분명한 의미가 있습니다. .

[다시 말하지만, 이 모든 것에 대한 한 가지 대답은 IsConnected()가 false를 반환하는 경우 표시기에서 start()에 대한 호출을 무시하는 것입니다.]

 
cyclops993 :

여전히 오해의 소지가 있지만 현학적이고 싶다면 [...]

훨씬 더 현학적으로 MT4를 새로 설치하고 MT4를 처음 시작하기 전에 표시기가 첨부된 차트 파일에 복사하면 표시기가 TimeCurrent()가 보고된 start()에 대한 호출을 받게 될 것입니다. 1970년 1월 1일. 따라서 TimeCurrent() 문서에는 "...마지막으로 알려진 서버 시간 또는 서버 연결이 없는 경우 1970년 1월 1일"이라고 나와야 합니다.

 
cyclops993 :

훨씬 더 현학적으로 MT4를 새로 설치하고 MT4를 처음 시작하기 전에 표시기가 첨부된 차트 파일에 복사하면 표시기가 TimeCurrent()가 보고된 start()에 대한 호출을 받게 될 것입니다. 1970년 1월 1일. 따라서 TimeCurrent() 문서는 "...마지막으로 알려진 서버 시간 또는 서버 연결이 없는 경우 1970년 1월 1일"이라고 말해야 합니다.

소란을 일으킬 필요가 없습니다. 첫 번째/다음 틱을 기다리면 TimeCurrent()가 업데이트되고 모든 것이 정상입니다. 과거 가격에 대한 지표는 쓸모가 없습니다.
 
angevoyageur :
소란을 일으킬 필요가 없습니다. 첫 번째/다음 틱을 기다리면 TimeCurrent()가 업데이트되고 모든 것이 정상입니다. 과거 가격에 대한 지표는 쓸모가 없습니다.
문제는 표시기에 대해 처음 start() 가 호출될 때 새 틱의 결과가 아닐 수 있다는 것입니다. . . 이 경우 TimeCurrent()는 잘못된 시간을 보고합니다. 나는 이것을 확인하지 않았다. . .

이 경우 첫 번째 눈금을 무시합니다. . . 틱 2부터 정상적으로 계속합니다.