초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 985

 

do { ... 버퍼 채우기 코드

}

동안( 이 두 값은 일치하지 않습니다 )

간단히 말해서 루프에서 일치할 때까지 값을 가져오고 그 후에만 다음 코드를 실행합니다.
 
Maxim Dmitrievsky :

do { ... 버퍼 채우기 코드

}

동안( 이 두 값은 일치하지 않습니다 )

간단히 말해서 루프에서 일치할 때까지 값을 가져오고 그 후에만 다음 코드를 실행합니다.

따라서 문제는 하나의 지표가 작동할 때까지 데이터(스트림)가 다른 지표로 전송되지 않는다는 것입니다. 이 표시기의 OnCalculate 작업을 완료하지 않고 표시기의 주기는 도움이 되지 않습니다. 그리고 OnCalculate가 종료되자마자 데이터는 즉시 어드바이저에게 주어지는데, 그것들은 잘못된 것입니다.

아니면 내가 당신의 생각을 잘못 이해했습니다.
 
Aleksey Vyazmikin :

따라서 문제는 하나의 지표가 작동할 때까지 데이터(스트림)가 다른 지표로 전송되지 않는다는 것입니다. 이 표시기의 OnCalculate 작업을 완료하지 않고 표시기의 주기는 도움이 되지 않습니다.

다른 표시기의 버퍼에서 차례로 값을 가져오고 동일한 숫자가 아닌 경우 같을 때까지 다시 가져오고 스트림은 잊어버리십시오. 그러나 일반적으로 아무도 지표에서 지표의 이러한 왜곡을 수행하지 않습니다. 매우 천천히

 
Aleksey Vyazmikin :

따라서 문제는 하나의 지표가 작동할 때까지 데이터(스트림)가 다른 지표로 전송되지 않는다는 것입니다. 이 표시기의 OnCalculate 작업을 완료하지 않고 표시기의 주기는 도움이 되지 않습니다. 그리고 OnCalculate가 종료되자마자 데이터는 즉시 어드바이저에게 주어지는데, 그것들은 잘못된 것입니다.

아니면 내가 당신의 생각을 잘못 이해했습니다.

조건이 충족되어야 하며, 내가 이해한 대로 버퍼만 채워집니다(다른 표시기의 버퍼에 있는 막대 수가 일치하도록)

현재 표시기의 버퍼를 채우기 전에 모든 조건을 강제 실행

또는 잘못된 주제에서 문제를 해결해야 하는 이유를 비뚤어진 프로그래머에게 돌려주십시오.

 
Maxim Dmitrievsky :

다른 표시기의 버퍼에서 차례로 값을 가져오고 동일한 숫자가 아닌 경우 같을 때까지 다시 가져오고 스트림은 잊어버리십시오. 그러나 일반적으로 지표에서 지표의 이러한 왜곡을 수행하는 사람은 아무도 없습니다. 매우 천천히

막심 드미트리예프스키 :

조건이 충족되어야 하며, 내가 이해한 대로 버퍼만 채워집니다(다른 표시기의 버퍼에 있는 막대 수가 일치하도록)

현재 표시기의 버퍼를 채우기 전에 모든 조건을 강제 실행

또는 잘못된 주제에서 문제를 해결해야 하는 이유를 비뚤어진 프로그래머에게 돌려주십시오.

다른 지표에서 계산이 준비되지 않으면 값이 0이되므로 강제로 채우는 것은 의미가 없으며 과거 데이터를 채울 수 있지만 동일한 효과로 데이터를 요청할 수 있습니다. 표시기의 현재 막대, 그러나 과거의 경우 코드를 편집할 필요가 전혀 없습니다.

여기에서 논의하는 이유 - 테스터와 실제 계정의 상황이 다르기 때문에 수면 시뮬레이션은 매우 이상하게 작동하고 표시기는 수면의 15초에 한 번만 다시 계산되지만 매 틱마다 발생해야 합니다. 요청시 발생하며 로그로 판단하면 15초가 아니라 13초에 발생합니다.

또한 동기화 문제가 관련이 있으며 이러한 상황에서는 추가 계산을 수행할 수 없는 데이터 스트림을 다른 지표로 전송할 필요성에 대해 지표에 알리는 기능을 추가하는 것이 좋습니다. be solution - 계산을 완료하지 않고 스트림을 다른 스트림으로 전송하는 명령.

따라서 EA는 표시기에서 데이터를 수신할 때까지 기다려야 하며 전체 계산이 끝날 때까지 틱을 건너뛰어야 하며 이제 while 문 을 사용하여 올바른 계산 결과를 기다리려고 하면 정지/루프( 즉, 아무 일도 일어나지 않고 단지 테스터가 멈춥니다), 이것은 동일하지 않습니다.

물론 개발자에게 알렸지만 한 달 이상 그에게서 소식이 없었습니다. 프리랜서 비용입니다.

 

테스터의 상황과 실제 계정의 상황이 다르고 수면 시뮬레이션이 매우 이상하게 작동하며 표시기는 수면의 15초에 한 번만 다시 계산되지만 매 틱 또는 요청 시 발생해야 하며 그렇지 않습니다. 로그로 판단하면 15초, 13초에 발생합니다.

또한 동기화 문제가 관련이 있으며 이러한 상황에서는 추가 계산을 수행할 수 없는 데이터 스트림을 다른 지표로 전송할 필요성에 대해 지표에 알리는 기능을 추가하는 것이 좋습니다. be solution - 계산을 완료하지 않고 스트림을 다른 스트림으로 전송하는 명령.

따라서 EA는 표시기에서 데이터를 수신할 때까지 기다려야 하며 전체 계산이 끝날 때까지 틱을 건너뛰어야 하며 이제 while 문 을 사용하여 올바른 계산 결과를 기다리려고 하면 정지/루프( 즉, 아무 일도 일어나지 않고 단지 테스터가 멈춥니다), 이것은 동일하지 않습니다.

 

친애하는 Artyom Trishkin !

위의 질문이 초보자를 위한 것이라고 결정하셨기 때문에 이미 답변을 알고 계시며 저를 도울 수 있기를 바랍니다!

전문가의 답변을 기다립니다.

 
Aleksey Vyazmikin :

친애하는 Artyom Trishkin !

위의 질문이 초보자를 위한 것이라고 결정하셨기 때문에 이미 답변을 알고 계시며 저를 도울 수 있기를 바랍니다!

전문가의 답변을 기다립니다.

내가 조언할 수 있는 것은 다음과 같습니다. 표시기는 계산에 필요한 막대 수를 받지 못한 경우 OnCalculate()를 종료해야 합니다. if(rates_total<required_number_of_bars) return 0;

EA는 표시기로부터 수신된 데이터를 확인해야 하며 표시기의 빈 값과 같지 않은 경우에만 수신된 데이터로 계산을 수행합니다.

  1. 표시기에서 버퍼는 먼저 빈 값으로 초기화됩니다(무엇인지 - 표시기에서 설정할 수 있음)
  2. 표시기(버퍼는 이미 빈 값으로 채워져 있음)에서 사용 가능한 막대의 수를 확인합니다(위에 설명됨).
  3. 바 가용성 검사를 통과하면 버퍼가 필요한 값으로 채워진 상태에서 지표 계산 주기가 수행됩니다.
    ... ... ...
  4. EA에서는 표시기에 의해 계산된 막대의 수를 확인합니다(이를 위한 표준 BarsCalculated() 함수가 있음).
  5. 표시기에서 데이터 가져오기
  6. 받은 내용에 따라 - 이미 차량의 논리에 따라 다릅니다.
    1. 표시기가 선이면 빈 값은 아직 계산되지 않았음을 나타내므로 고려하지 않습니다.
    2. 표시기가 화살표이면 이미 다른 논리가 있습니다(빈 값도 작업 데이터이기 때문에). 예를 들어 프랙탈이면 3번 막대를 확인하고 얻은 값에서 시작합니다.
  7. 글쎄, 자신의 논리를 켜고 터미널의 버그에 모든 것을 비난하지 마십시오.
  8. 먼저 MYSELF에서 버그를 확인합니다.
  9. 그리고 너?
 
Artyom Trishkin :

내가 조언할 수 있는 것은 다음과 같습니다. 표시기는 계산에 필요한 막대 수를 받지 못한 경우 OnCalculate()를 종료해야 합니다. if(rates_total<required_number_of_bars) return 0;

조언 감사합니다 출력에는 문제가 없지만 이렇게 해도 상황이 해결되지 않고 지금까지 계산에 실패했습니다

 if (barsch!=channel. BarsCalculated ()) return (counted_bars=rates_total- 1 );

그리고 어떻게든 버퍼가 채워지고 다른 표시기에서 데이터가 수신되는 반면 조건이 충족될 때까지 데이터가 어드바이저로 전송되지 않습니다. 데이터의 정확성은 아직 확인되지 않았지만 육안으로 모든 것이 정확합니다. 아니면 내가 잘못했고 뭔가가 확실히 잘못 되었습니까?

Artyom Trishkin :

EA는 표시기로부터 수신된 데이터를 확인해야 하며 표시기의 빈 값과 같지 않은 경우에만 수신된 데이터로 계산을 수행합니다.

EA 는 새로운 막대가 도착하면 하나의 계산을 수행하므로 표시기에서 동안까지 올바른 값을 기다리려고 하면 테스터가 작동을 멈춥니다.

Artyom Trishkin :
  1. 표시기에서 버퍼는 먼저 빈 값으로 초기화됩니다(무엇인지 - 표시기에서 설정할 수 있음)
  2. 표시기(버퍼는 이미 빈 값으로 채워져 있음)에서 사용 가능한 막대의 수를 확인합니다(위에 설명됨).
  3. 바 가용성 검사를 통과하면 필요한 값으로 버퍼를 채우는 지표 계산 주기가 수행됩니다.
    ... ... ...
  4. EA에서는 표시기에 의해 계산된 막대의 수를 확인합니다(이를 위한 표준 BarsCalculated() 함수가 있음).
  5. 표시기에서 데이터 가져오기
  6. 받은 내용에 따라 - 이미 차량의 논리에 따라 다릅니다.
    1. 표시기가 선이면 빈 값은 아직 계산되지 않았음을 나타내므로 고려하지 않습니다.
    2. 표시기가 화살표이면 이미 다른 논리가 있습니다(빈 값도 작업 데이터이기 때문에). 예를 들어 프랙탈이면 3번 막대를 확인하고 얻은 값에서 시작합니다.
  7. 글쎄, 자신의 논리를 켜고 터미널의 버그에 모든 것을 비난하지 마십시오.
  8. 먼저 MYSELF에서 버그를 확인합니다.
  9. 그리고 너?

1. 그렇습니다.

2. 이렇게 됩니다. 그리고 다음 틱에서는 계산이 정확할 것이지만, 어드바이저가 다른 틱 주기에서 기다리지 않거나 내 인내심에 비례하지 않는 기대가 있기 때문에 첫 번째 틱에서 정확한 계산을 얻어야 합니다. 현실적이지 않음 - 오류가 있습니다.

3. 그렇습니다.

4. 물론입니다.

5. 예, 하지만 지표는 다른 지표에서 데이터를 가져와야 하고 그게 문제입니다!

6. 1-2. 표시기 버퍼에 의도적으로 잘못된 데이터를 넣는 것은 옳지 않습니다. 이는 코드의 EA 알고리즘에서 오류 감지를 복잡하게 만들 뿐입니다.

7. 모든 것을 논리적으로 설명하지만 지표를 작성하지 않았기 때문에 그 이유가 무엇인지 이해하기 어렵습니다. 지표 작업의 징후, 즉 버퍼 값을 얻지 않고 계산할 수 없다는 점을 합리적으로 설명했습니다. 데이터 흐름의 독점적 사용으로 인한 기타 지표(지표는 연속적으로 계산됨).

8. 나는 이미 저자가 아니라 그 이유를 확인하는 데 많은 시간을 보냈습니다. 거의 하루.

9. 그리고 나는 문제에 대한 해결책을 찾고 있습니다. 게다가 누군가가 이것을 발견하면 빨리 도와줄 수 있습니다. 다시 말씀드리지만 저는 Sleep 때문에 그 주제로 글을 쓰기 시작했고 테스터의 작업의 다른 기능이 나왔습니다. 저도 실수라고 생각합니다.

답변 해주셔서 감사합니다.

 
Aleksey Vyazmikin :

조언 감사합니다 출력에는 문제가 없지만 이렇게 해도 상황이 해결되지 않고 지금까지 계산에 실패했습니다

그리고 어떻게든 버퍼가 채워지고 다른 표시기에서 데이터가 수신되는 반면 조건이 충족될 때까지 데이터가 어드바이저로 전송되지 않습니다. 데이터의 정확성은 아직 확인되지 않았지만 육안으로 모든 것이 정확합니다. 아니면 내가 잘못했고 뭔가가 확실히 잘못 되었습니까?

EA 는 새로운 막대가 도착하면 하나의 계산을 수행하므로 표시기에서 동안까지 올바른 값을 기다리려고 하면 테스터가 작동을 멈춥니다.

1. 그렇습니다.

2. 이렇게 됩니다. 그리고 다음 틱에서는 계산이 정확할 것이지만, 어드바이저가 다른 틱 주기에서 기다리지 않거나 내 인내심에 비례하지 않는 기대가 있기 때문에 첫 번째 틱에서 정확한 계산을 얻어야 합니다. 현실적이지 않음 - 오류가 있습니다.

3. 그렇습니다.

4. 물론입니다.

5. 예, 하지만 지표는 다른 지표에서 데이터를 가져와야 하고 그게 문제입니다!

6. 1-2. 표시기 버퍼에 의도적으로 잘못된 데이터를 넣는 것은 옳지 않습니다. 이는 코드의 EA 알고리즘에서 오류 감지를 복잡하게 만들 뿐입니다.

7. 모든 것을 논리적으로 설명하지만 지표를 작성하지 않았기 때문에 이유가 무엇인지 이해하기 어렵습니다. 지표의 작업의 징후, 즉 버퍼 값을 얻지 않고 계산할 수 없다는 점을 합리적으로 설명했습니다. 데이터 흐름의 독점적 사용으로 인한 기타 지표(지표는 연속적으로 계산됨).

8. 나는 이미 저자가 아니라 그 이유를 확인하는 데 많은 시간을 보냈습니다. 거의 하루.

9. 그리고 나는 문제에 대한 해결책을 찾고 있습니다. 게다가 누군가가 이것을 발견하면 빨리 도와줄 수 있습니다. 다시 말씀드리지만 저는 Sleep 때문에 그 주제로 글을 쓰기 시작했고 테스터의 작업의 다른 기능이 나왔습니다. 저도 실수라고 생각합니다.

답변 해주셔서 감사합니다.

OnInit()에서 심볼의 시계열을 호출합니다. iTime(Symbol,Timeframe,1);

OnTick()에서 맨 처음에 해당 iFunc()를 통해 필요한 시계열의 필수 막대를 요청합니다. 최소한 동일한 if( iTime(Symbol,Timeframe,10)==0) return;

그러면 어드바이저는 새 막대의 정의에 도달하지 않고 다음 틱을 기다립니다.

OnInit()에서 시계열 데이터를 요청하여 데이터 페이징을 활성화했습니다.

OnTick()에서 EA에 필요한 최소 기록의 가용성을 확인하고 아직 사용할 수 없는 경우 다음 틱을 기다리기 위해 떠납니다.

그리고 EA가 요구하는 모든 데이터가 수신될 때까지 다음 틱을 계속 기다립니다.

필요한 모든 데이터가 다운로드되고 수신되는 즉시 EA는 새 막대와 필요한 기록 작업을 시작합니다.

직렬 데이터를 최신 상태로 유지하려면 2분에 한 번 이상 직렬 데이터에 액세스해야 합니다. 약 1분 30초(90초) 동안 두 번째 타이머를 만들고 iTime(Symbol,Timeframe,1)과 같이 원하는 기호의 시계열을 참조하기만 하면 됩니다. 수신된 데이터를 확인하지 않고 스토리를 "이동"하십시오. 그러면 기호의 모든 데이터가 항상 최신 상태가 됩니다.

사유: