오류, 버그, 질문 - 페이지 3032

 
Andrey Dik :

안드레이 감사합니다. 당신은 질문을 완전히 이해한 유일한 사람입니다.


이제 모든 것이 의도한 대로 작동하고 지표는 첫 번째 실행 시 한 번만 완전히 계산된 다음 새 막대에서 각각 한 번만 계산됩니다.


두 번째 표시기의 최종 코드는 내가 원하는 사람에게 유용할 것입니다.

여기에서 당신이 생각했어야 하는 것의 시작이 있습니다

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

알렉세이 빅토 로프 , 2021.05.28 08:36

왜 그런 수표?

 //проверка готовности данных и индикатора на другом TF
if ( SeriesInfoInteger ( Symbol (), tf, SERIES_SYNCHRONIZED ))
{
   if ( iBars ( Symbol (), tf) != BarsCalculated (handleFr)) return 0 ;
}
else return 0 ;

조건 반환 0 없이 작성하는 것이 더 쉬울 것입니다. 그리고 모든 것...

각각의 새 막대에서 조건이 충족되고 동기화와 상관없이 모든 막대가 다시 계산됩니다. 당신은 래쉬 코드를 작성하고 그것을 터미널 버그로 전달했습니다 ...


그리고 Igor Makanu는 이것에 대해 더 일찍 이야기했습니다...
 

나는 상기시키고 싶다.

1. 하나 이상의 차트가 열려 있는 각 기호에 대해 들어오는 틱을 처리하기 위해 별도의 스레드가 실행 중입니다. 특정 기호에 대해 여러 차트를 열 수 있지만 스트림은 여전히 동일합니다.

2. 심볼 스트림은 차트가 아니라 시계열을 처리합니다. 즉, CopyRates 요청에 제공된 바로 그 데이터 배열입니다.

3. OnTick 또는 OnCalculate 에서 기호가 동기화되었는지 여부를 묻는 것은 쓸모가 없습니다. 물론 예!

4. 모든 시계열은 가장 어린 것부터 가장 오래된 것까지 순서대로 처리됩니다. 먼저 틱을 적용한 다음 이 시계열에서 생성된 모든 지표를 계산합니다. M1에서 실행되는 표시기에서 동일한 H1 기호에 대한 데이터를 요청하면 적용된 틱이 있는 데이터를 받지 못합니다. 어떤 트릭을 사용하든 데이터는 항상 한 틱 백됩니다. 시간 프레임을 순차적으로 처리하는 심볼당 하나의 스레드 때문입니다.

5. Expert Advisors와 스크립트는 각각 별도의 스레드에서 작동하기 때문에 앞의 설명은 Expert Advisors와 스크립트에 적용되지 않습니다.

 
Slava :

나는 상기시키고 싶다.

1. 하나 이상의 차트가 열려 있는 각 기호에 대해 들어오는 틱을 처리하기 위해 별도의 스레드가 실행 중입니다. 특정 기호에 대해 여러 차트를 열 수 있지만 스트림은 여전히 동일합니다.

2. 심볼 스트림은 차트가 아니라 시계열을 처리합니다. 즉, CopyRates 요청에 제공된 바로 그 데이터 배열입니다.

3. OnTick 또는 OnCalculate 에서 기호가 동기화되었는지 여부를 묻는 것은 쓸모가 없습니다. 물론 예!

4. 모든 시계열은 가장 어린 것부터 가장 오래된 것까지 순서대로 처리됩니다. 먼저 틱을 적용한 다음 이 시계열에서 생성된 모든 지표를 계산합니다. M1에서 실행되는 표시기에서 동일한 H1 기호에 대한 데이터를 요청하면 적용된 틱이 있는 데이터를 받지 못합니다. 어떤 트릭을 사용하든 데이터는 항상 한 틱 백됩니다. 시간 프레임을 순차적으로 처리하는 심볼당 하나의 스레드 때문입니다.

5. Expert Advisors와 스크립트는 각각 별도의 스레드에서 작동하기 때문에 앞의 설명은 Expert Advisors와 스크립트에 적용되지 않습니다.

이와 같은 더 자세한 알림을 부탁드립니다! 고맙습니다!

 
Slava :

나는 상기시키고 싶다.

4. 모든 시계열은 가장 어린 것부터 가장 오래된 것까지 순서대로 처리됩니다. 먼저 틱을 적용한 다음 이 시계열에서 생성된 모든 지표를 계산합니다. M1에서 실행되는 표시기에서 동일한 H1 기호에 대한 데이터를 요청하면 적용된 틱이 있는 데이터를 받지 못합니다. 어떤 트릭을 사용하든 데이터는 항상 한 틱 백됩니다. 시간 프레임을 순차적으로 처리하는 심볼당 하나의 스레드 때문입니다.

5. Expert Advisors와 스크립트는 각각 별도의 스레드에서 작동하기 때문에 앞의 설명은 Expert Advisors와 스크립트에 적용되지 않습니다.

M1에서 작업하는 EA가 상위 TF에서 데이터를 가져오는 M1(또는 다른 TF?)의 표시기를 사용하는 경우 새 막대의 첫 번째 눈금에서 현재 값을 반환할 수 없다는 것을 정확히 이해합니다. 어쨌든 n 틱에서 상위 TF의 계산에 도달하기 때문에?

방금 이 동작에 부딪혀 표시기에서 문제를 찾았습니다. 이제 이것이 그래야 하는 것으로 나타났습니다. 그러나 이것이 사실이라면 OHLC 모드에서 테스트할 때 중요한 몇 개의 틱을 건너뛰어야 하기 때문에 테스트에 크게 방해가 됩니다.

 
Slava :

2. 심볼 스트림은 차트가 아니라 시계열을 처리합니다. 즉, CopyRates 요청에 제공된 바로 그 데이터 배열입니다.

....

4. 모든 시계열은 가장 어린 것부터 가장 오래된 것까지 순서대로 처리됩니다. 먼저 틱을 적용한 다음 이 시계열에서 생성된 모든 지표를 계산합니다. M1에서 실행되는 표시기에서 동일한 H1 기호에 대한 데이터를 요청하면 적용된 틱이 있는 데이터를 받지 못합니다. 어떤 트릭을 사용하든 데이터는 항상 한 틱 백됩니다. 시간 프레임을 순차적으로 처리하는 심볼당 하나의 스레드 때문입니다.

TF를 전환할 때 검은색 화면 "업데이트"가 나타나는 이유는 무엇입니까?

내가 이전에 사용한 차트(EURUSD의 H1)를 열고 표시기를 종료하고 2-3분 동안 아무 것도 하지 않은 다음 주니어 차트(M30 ... M1)로 차례로 전환하면 "검은 화면 업데이트"가 나타날 수 있습니다. 10초 동안

게다가 이 검은 화면은 빌드에 따라 다릅니다. 터미널에 검은 화면이 없을 때, 그리고 히스토리가 로드되었다는 것을 확실히 알고 있기 때문에 정말 화를 낼 수 있는 경우에는 터미널에 대한 차트를 그리기만 하면 되지만 일부의 경우 이 검은 화면을 기다리는 이유


따라서 문제는 다른 TF의 표시기를 호출하는 표시기에서 얼마나 자주 다른 TF에 액세스해야 하는지입니다. 표시기가 M5에서 시작되고 30분마다 한 번씩 H1에서 표시기를 호출하는 경우 - CopyBuffer()는 항상 H1에서 올바른 데이터를 수신합니까?

또는 사실이 아니므로 매 틱마다 H1에서 "지표를 당기십시오"(연결이 끊어진 옵션은 아직 고려되지 않음)

 

다른 함수에서 한 루프/함수의 변수로 작업하는 방법은 무엇입니까?

가시성을 더 글로벌하게 만드는 것이 가능합니까?

 
Igor Makanu :

TF를 전환할 때 검은색 화면 "업데이트"가 나타나는 이유는 무엇입니까?

내가 이전에 사용한 차트(EURUSD의 H1)를 열고 표시기를 종료하고 2-3분 동안 아무 것도 하지 않은 다음 주니어 차트(M30 ... M1)로 차례로 전환하면 "검은 화면 업데이트"가 나타날 수 있습니다. 10초 동안

게다가 이 검은 화면은 빌드에 따라 다릅니다. 터미널에 검은 화면이 없을 때, 그리고 히스토리가 로드되었다는 것을 확실히 알고 있기 때문에 정말 화를 낼 수 있는 경우에는 터미널에 대한 차트를 그리기만 하면 되지만 일부의 경우 이 검은 화면을 기다리는 이유


따라서 문제는 다른 TF의 표시기를 호출하는 표시기에서 얼마나 자주 다른 TF에 액세스해야 하는지입니다. 표시기가 M5에서 시작되고 30분마다 한 번씩 H1에서 표시기를 호출하는 경우 - CopyBuffer()는 항상 H1에서 올바른 데이터를 수신 합니까?

또는 사실이 아니므로 매 틱마다 H1에서 "지표를 당기십시오"(연결이 끊어진 옵션은 아직 고려되지 않음)

나는 Glory의 말에 근거하여 그것이 사실이 아니라고 믿습니다.

모든 계산은 틱에 대해서만 이루어지기 때문에 묶인 표시기의 체인이 끝까지 완료되지 않을 수 있으며 다음 틱을 기다려야 합니다.

그러나 문서에서 찾지 못한 매우 흥미로운 오해가 있습니다.

틱이 사라지지 않을 때(예: 주말) 어떻게 해야 하나요? 현재 TF에서 작동하는 표시기를 추가하면 문제 없이 그려지며 흥미롭게도 이를 위해 틱 도착이 필요하지 않습니다! 그러나 표시기가 다른 TF에서 데이터를 요청하면 새 틱이 도착할 때까지 아무 것도 할 수 없으며 주말에는 틱이 가지 않습니다!

좋아, ontimer에서 ChartRedraw(ChartID())를 호출하고 Comment(cnt)가 있는지 확인 합니다.

그러나 컨텍스트 메뉴에서 새로 고침 버튼으로 화면을 새로 고치면 처음부터 끝까지 계산 한 후 표시기가 성공적으로 그려집니다.

그것은 밝혀졌다   ChartRedraw()와 Reload by button은 반대가 생각되지만 같은 것은 아닙니다.


ZY 두 번째 지표의 코드 예제가 작동하지만 Expert 코드가 더 빠릅니다.

 
Andrey Dik :

틱이 사라지지 않을 때(예: 주말) 어떻게 해야 하나요? 현재 TF에서 작동하는 표시기를 추가하면 문제 없이 그려지며 흥미롭게도 이를 위해 틱 도착이 필요하지 않습니다!

필요하지 않음

차트에 지표를 추가할 때 엄격하게 정의된 호출 시퀀스가 있습니다. OnInit() 및 즉시 OnCalculated() 즉, 첫 번째 OnCalculated()는 틱이 도착하기 전에 호출되므로 prev_calc를 0과 비교해야 합니다. 틱이 도착하거나 서버에 연결되면 OnCalculated()가 다시 호출되고 이 prev_calc 는 0이 됩니다.

안드레이 딕 :

ChartRedraw()와 Update by button은 비록 그 반대가 마음에 들지만 같은 것이 아니라는 것이 밝혀졌습니다.

NULL 매개변수와 현재 기간이 있는 ChartSetSymbolPeriod()를 사용해야 할 가능성이 높으므로 도움이 될 것입니다.

 
Igor Makanu :

NULL 매개변수와 현재 기간이 있는 ChartSetSymbolPeriod()를 사용해야 할 가능성이 높으므로 도움이 될 것입니다.

ChartSetSymbolPeriod

동일한 기호 및 시간 프레임으로 ChartSetSymbolPeriod를 호출하면 차트를 업데이트할 수 있습니다(터미널의 새로 고침 명령과 유사). 차트를 업데이트하면 차트에 연결된 지표의 재계산이 트리거됩니다. 따라서 눈금이 없어도(예: 주말) 차트에서 지표를 계산할 수 있습니다.

도왔다. 지금도 기억나는 대로 Ac Pushkin은 다음과 같이 말했습니다.

오, 우리는 얼마나 많은 놀라운 발견을 하고 있습니까?
깨달음의 정신을 준비하라
그리고 경험, 어려운 실수의 아들,
그리고 천재, 역설적인 친구,
그리고 기회, 신은 발명가입니다.

 
Andrey Dik :


틱이 사라지지 않을 때(예: 주말) 어떻게 해야 하나요? 현재 TF에서 작동하는 표시기를 추가하면 문제 없이 그려지며 흥미롭게도 이를 위해 틱 도착이 필요하지 않습니다! 그러나 표시기가 다른 TF에서 데이터를 요청하면 새 틱이 도착할 때까지 아무 것도 할 수 없으며 주말에는 틱이 가지 않습니다!


다른 시간대에서 현재 준비된 데이터를 가져옵니다. 즉, 출력에서 모든 데이터가 완벽하게 동기화됩니다.