OnTick() 핸들러에서 이 함수는 들어오는 처리된 틱의 시간을 반환합니다. 다른 경우(예: OnInit(), OnDeinit(), OnTimer() 핸들러 등에서 호출)에는 "종합시세" 창에 표시되는 모든 심볼의마지막 시세가 도착한 시간이며, 이 창의 제목에 표시되는 시간과 동일합니다.
OnTick() 핸들러에서 이 함수는 처리 중인 틱의 도착 시간을 반환합니다. 다른 경우(예: OnInit(), OnDeinit(), OnTimer() 등의 핸들러에서 호출)에는 이 시간이 "종합시세" 창에 표시되는 모든 심볼의마지막 호가 도착 시간이며, 이 창의 헤더에 표시되는 시간과 동일합니다.
예, 명확합니다. 온타임에 넣어야만 1분에 한 번만 시간을 업데이트할 수 있으며, 현재 온틱()에 넣으면 일부 쌍(멀티)에서 틱이 누락될 위험이 있습니다.
그리고 처리 블록에서 수행 할 작업은 명확합니다 (다중의 경우) - 새 값을 가져 와서 기존 값과 비교하고 새 틱이 있는지 여부를 결론을 도출합니다.
다시 한 번. 우리는 어떤 기호에 매달려있는 전문가 조언자에 대해 이야기하고 있습니다. 이벤트에 의해 시작됩니다.
void OnTick() {}
이 함수 안에 있고이 쌍에 한 시간 이상 틱이 없으면 한 시간 이내에 아무것도 할 수 없습니다. 지금까지 유일한 방법은 타이머에서 수행하는 것이며 악기에 틱이 도착하는 것과 관계없이 시작됩니다.
예, 우리가 이것의 틀 안에서 행동한다면 https://www.mql5.com/ko/docs/basis/function/events, 나는 지금 보이는 것처럼 최선의 선택이 OnTime이라는 데 동의합니다. 그러나 그것은 진드기의 도착에 대한 의존성에서만 우리를 구할 것입니다. 그리고 단일 스레딩으로부터 우리를 구할 수는 없습니다. 한 기기에 대한 신호를 처리하는 동안 다른 기기의 처리가 누락되거나 지연 될 위험이 있습니다. 특히 "거래 주문 처리 시간이 2초에서 7초"인 경우 + 재견적의 경우 더욱 그렇습니다.
시장 리뷰에서 모든 쌍에 대한 실시간 틱에 대해 흥미롭게 이야기하기 시작했기 때문에 TimeCuurent()에 대해 기억했습니다.
If you call this prototype function from one place, then we have what we need. But if we want to use this function, for example, again in another place in the same calculation loop, it will always return false, which means that there is no bar. And this will not always be true. Static variable in this case imposes an artificial limit on the number of prototype function calls.
맞습니다. 그러나 1 틱 동안 isnewbar()와 같은 함수를 여러 번 호출하는 것은 나쁜 습관입니다. 한 번만 호출하고 결과를 변수에 보관하세요.
문제는 정적 변수가 없는 클래스를 사용하여 제공하는 솔루션이 여러분이 강조한 것을 해결하지 못한다는 것입니다. 심지어 상황은 더 나빠졌습니다. 클래스의 인스턴스를 전역 변수(객체)로 선언해야 하고, OnInit()에서도 초기화해야 합니다. 클래스를 사용할사람은이 작업을알아야 합니다:
항상전역변수를사용하세요.
기호와기간이기본값인경우에도항상초기화합니다 (시간 차트의 경우).
마지막으로, "예를 들어 동일한 계산 루프의 다른 위치에서 이 함수를 다시 사용하려는 경우". 여전히 항상 거짓을 반환합니다.
어쨌든, isNewBar 함수를 사용했는데 컴파일할 때 다음과 같은 메시지가 표시됩니다:" 유형 변환으로 인한데이터 손실 가능성 ".
그래서 저는 이런 식으로 var 유형을 날짜/시간에서 길게 변경했습니다:
//+------------------------------------------------------------------+//| 기호/점호 쌍에 새 막대가 나타나면 참을 반환합니다.//+------------------------------------------------------------------+bool isNewBar()
{
//--- 정적 변수에서 마지막 막대가 열린 시간을 기억합니다.staticlong last_time=0;
//--- 현재 시간long lastbar_time=SeriesInfoInteger(CurrencyPair,Period01,SERIES_LASTBAR_DATE);
//--- 함수의 첫 번째 호출인 경우if(last_time==0)
{
//--- 시간을 설정하고 종료
last_time=lastbar_time;
return(false);
}
//--- 시간이 다른 경우if(last_time!=lastbar_time)
{
//--- 시간을 기억하고 참을 반환합니다.
last_time=lastbar_time;
return(true);
}
//--- 이 줄로 넘어가면 바가 새 것이 아니므로 거짓을 반환합니다.return(false);
}
Prival:
드물지만 한 상품의 시세가 오랫동안 동결되는 상황이 있습니다 (엔화에서 그런 상황을 보았습니다). 전문가 조언자가 이 쌍에 매달려 있다면 모든 코드를 OnTime()으로 번역하지 않았다면 문제가 있는 것입니다.
리자르:
이러한 이벤트는 TimeCuurent()를 사용하여 수신 할 수 있지만 더 이상 무엇을해야하는지, 동기화하는 방법은 질문입니다.
TimeCuurent()는 이것과 무슨 관련이 있나요?
도움말에 이렇게 나와 있습니다:
OnTick() 핸들러에서 이 함수는 들어오는 처리된 틱의 시간을 반환합니다. 다른 경우(예: OnInit(), OnDeinit(), OnTimer() 핸들러 등에서 호출)에는 "종합시세" 창에 표시되는 모든 심볼의 마지막 시세가 도착한 시간이며, 이 창의 제목에 표시되는 시간과 동일합니다.
시놉시스는 다음과 같습니다:
OnTick() 핸들러에서 이 함수는 처리 중인 틱의 도착 시간을 반환합니다. 다른 경우(예: OnInit(), OnDeinit(), OnTimer() 등의 핸들러에서 호출)에는 이 시간이 "종합시세" 창에 표시되는 모든 심볼의 마지막 호가 도착 시간이며, 이 창의 헤더에 표시되는 시간과 동일합니다.
예, 명확합니다. 온타임에 넣어야만 1분에 한 번만 시간을 업데이트할 수 있으며, 현재 온틱()에 넣으면 일부 쌍(멀티)에서 틱이 누락될 위험이 있습니다.
그리고 처리 블록에서 수행 할 작업은 명확합니다 (다중의 경우) - 새 값을 가져 와서 기존 값과 비교하고 새 틱이 있는지 여부를 결론을 도출합니다.
하지만 전문가 어드바이저에서 왜 그렇게 하나요?
시놉시스는 다음과 같습니다:
오류. 도움말은 다음과 같습니다: https: //www.mql5.com/ru/docs/basis/function/events
새 틱 이벤트는 전문가 어드바이저가 연결된 차트에 새 틱이 수신될 때 전문가 어드바이저에 대해서만 생성됩니다.
다시 한 번. 우리는 어떤 심볼에 매달려있는 전문가 조언자에 대해 이야기하고 있습니다. 이벤트에 의해 트리거됩니다.
void OnTick() {}
이 함수 안에 있고이 쌍에 한 시간 이상 틱이 없으면 한 시간 이내에 아무것도 할 수 없습니다. 지금까지 유일한 방법은 타이머를 사용하는 것뿐이며, 기기에 틱이 도착하는 것과 관계없이 시작됩니다.
하지만 이를 OnTime에 넣으면 1분에 한 번만 시간을 업데이트할 수 있고, 현재 OnTick()에 넣으면 일부 쌍(멀티)에서 틱이 누락될 위험이 있습니다.
오류가 발생했습니다. 도움말은 다음과 같습니다 https://www.mql5.com/ko/docs/basis/function/events.
다시 한 번. 우리는 어떤 기호에 매달려있는 전문가 조언자에 대해 이야기하고 있습니다. 이벤트에 의해 시작됩니다.
void OnTick() {}
이 함수 안에 있고이 쌍에 한 시간 이상 틱이 없으면 한 시간 이내에 아무것도 할 수 없습니다. 지금까지 유일한 방법은 타이머에서 수행하는 것이며 악기에 틱이 도착하는 것과 관계없이 시작됩니다.
예, 우리가 이것의 틀 안에서 행동한다면 https://www.mql5.com/ko/docs/basis/function/events, 나는 지금 보이는 것처럼 최선의 선택이 OnTime이라는 데 동의합니다. 그러나 그것은 진드기의 도착에 대한 의존성에서만 우리를 구할 것입니다. 그리고 단일 스레딩으로부터 우리를 구할 수는 없습니다. 한 기기에 대한 신호를 처리하는 동안 다른 기기의 처리가 누락되거나 지연 될 위험이 있습니다. 특히 "거래 주문 처리 시간이 2초에서 7초"인 경우 + 재견적의 경우 더욱 그렇습니다.
시장 리뷰에서 모든 쌍에 대한 실시간 틱에 대해 흥미롭게 이야기하기 시작했기 때문에 TimeCuurent()에 대해 기억했습니다.
매우 흥미로운 기사입니다. 이 모든 것을 공유해 주셔서 감사합니다.
그러나 몇 가지 발언:
이 기능에 대해 이야기하면서 당신은 말합니다 :
If you call this prototype function from one place, then we have what we need. But if we want to use this function, for example, again in another place in the same calculation loop, it will always return false, which means that there is no bar. And this will not always be true. Static variable in this case imposes an artificial limit on the number of prototype function calls.
정적 지역 변수를 전역 변수로 대체했는데, 이는 동일하며 문제를 해결하지 못했습니다.
그럼에도 불구하고 이 글은 사고를 확장하고 흥미로운 아이디어를 제공한다는 장점이 있습니다.
좋은 글, 공유해 주셔서 감사합니다! 모든 것이 매우 유용했습니다!
어쨌든, isNewBar 함수를 사용했는데 컴파일할 때 다음과 같은 메시지가 표시됩니다:" 유형 변환으로 인한데이터 손실 가능성 ".
그래서 저는 이런 식으로 var 유형을 날짜/시간에서 길게 변경했습니다:
이제 아무 문제 없이 컴파일되고 정상적으로 작동하는 것 같습니다. 감사합니다!