이는 터미널 아키텍처와 인디케이터 알고리즘의 결과입니다. 인디케이터는 심볼 스트림에서 실행되며, 즉 계산 과정에서 틱 처리, 다른 인디케이터 계산, 서버와의 기록 동기화, 심볼 시간대별 기록 구축 또는 로드 등 기록이 있는 많은 작업이 불가능합니다.
스트림에 대한 개념을 이해할 수 없으며 데이터 액세스에 대한 도움말을 50번이나 읽었습니다(( 스크립트가 예시로 나와 있습니다. 그리고 실행하는 데 약 1 분 (긴 시간)이 걸리지 만, 나는 그것을 얻기 시작한 것 같습니다. 지표가 계산되는 동안, 즉 함수가 실행되기 시작했다는 것을 올바르게 이해 했습니까?
int OnCalculate () { 컴퓨터 (터미널)의 모든 자원 이 작업에 제공되며 실행 (완료)될 때까지)
return(rates_total);}
다음 중 어느 것도 하지 않아야 합니다:
- 이 기호가 누락된 경우 이 기호로 기록을 읽으려고 시도합니다.
- 다른 기간 요청
- 다른 심볼 요청
프로그램을 다시 실행하는 방법을 이해했다고 생각하는데, 첫 번째 호출에서 모든 줄을 설정하고 if(prev_calculated==0)까지 잊어 버려야합니다.
괜찮으시다면요. 제한 해제 창에서 막대를 설정하고 M15, M5 및 M1을 통과하십시오. 여기에 로그에 결과를 게시하십시오. M1에 문제가 있습니다 - 서비스에 썼습니다. 저만 그런 건지 아니면 모두 그런 건지 알고 싶어요.
여기 내 로그가 있습니다.
2010.06.17 11:39:55 그리드 (EURUSD,M1) 실패 또는 첫 실행 시간= 1293476 바에 대해 1.2초 ObjectsTotal= 48010 _time= 2002.10.25 06:41:00 2010.06.17 11:39:52 그리드 (EURUSD,M5) 실패 또는 첫 실행 시간= 0.0초 847192 바에 대해 ObjectsTotal= 423 _time= 2010.06.02 21:35:00 2010.06.17 11:39:48 그리드 (EURUSD,M15) 실패 또는 첫 실행 시간= 0.0초 285186 바에 대해 ObjectsTotal= 962 _time= 2010.05.04 22:00:00
이 스레드 개념을 이해할 수 없으며 데이터 액세스에 대한 도움말을 50 번 읽었습니다 (( 스크립트가 예제로 제공됩니다. 그리고 실행하는 데 약 1 분이 걸리지 만 (긴 시간), 나는 그것을 얻기 시작했다고 생각합니다. 지표 계산이 진행되는 동안, 즉 함수가 실행되기 시작했다는 것을 올바르게 이해합니까?
int OnCalculate () { 모든 컴퓨터 (터미널) 리소스가이 작업에 제공되고 실행될 때까지 (완료 될 때까지)
return(rates_total); }
모든 리소스는 아닙니다. 그러나 이 심볼과 관련된 대부분의 계산은 OnCalculate()가 완료될 때까지 대기합니다.
다음 중 어느 것도 수행해서는 안 됩니다:
- 이 심볼에 대한 기록이 누락된 경우 이 기록을 읽어 보려고 시도합니다.
예. 현재 심볼에 대한 히스토리가 충분하지 않으면 OnCalculate() 실행이 확실히 개선되지 않습니다.
- 다른 기간 요청하기
요청할 수 있지만 데이터가 누락되었거나 불충분한 경우 OnCalculate()에서 기다리는 것은 의미가 없습니다. 현재 심볼에 대한 다른 인디케이터의 데이터도 마찬가지입니다.
- 다른 심볼 요청하기
다른 심볼(기록, 인디케이터)의 데이터 처리가 다른 스레드에서 이루어지기 때문에 이론적으로는 필요한 모든 데이터가 나타날 때까지 루프에서 기다릴 수도 있습니다. 그러나 그렇게하지 않는 것이 좋습니다. OnCalculate ()의 대기 루프는 현재 심볼의 데이터 처리를 중지합니다.
.
첫 번째 호출에서 모든 줄을 설정하는 데 필요한 프로그램을 다시 실행하는 방법을 이해하고 if(prev_calculated==0)를 잊어 버리는 방법을 이해한다고 생각합니다.
사용자 지정 지표를 작성할 때 일반적인 권장 사항: 오류가 감지되거나 데이터가 부족하면 반환(0)을 사용하여 OnCalculate() 실행을 즉시 중지합니다. 다음 틱에서 if(prev_calculated==0)에 대한 계산을 새로 시도합니다.
너무 큰 문제가 아니라면. 제한 해제 창에서 막대를 설정하고 M15, M5 및 M1을 통과합니다. 로그에 기록 될 결과는 여기에 게시하십시오. M1에 문제가 있습니다-서비스에 썼습니다. 나는 그것이 나 또는 모든 사람인지 확인하고 싶습니다.
2010.06.17 11:58:59 6op0k (EURUSD,M1) 실패 또는 첫 실행 시간 4009008 바에 대해 0.1초 ObjectsTotal=403_time=2010.06.15 07:45:00 2010.06.17 11:58:54 6op0k (EURUSD,M5) 실패 또는 첫 실행 시간=0.0초 847196 바에 대해 ObjectsTotal=605_time=2010.06.02 21:55:00 2010.06.17 11:58:44 6op0k (EURUSD,M15) 실패 또는 첫 실행 시간=0.0초 285187 바에 대해 ObjectsTotal=1108_time=2010.05.04 22:15:00
antt: 2010.06.17 11:58:59 6op0k (EURUSD,M1) 실패 또는 첫 실행 시간=0.1초 4009008 바에 대해 ObjectsTotal=403_time=2010.06.15 07:45:00 2010.06.17 11:58:54 6op0k (EURUSD,M5) 실패 또는 첫 실행 847196 바에 대한 시간=0.0초 ObjectsTotal=605_time=2010.06.02 21:55:00 2010.06.17 11:58:44 6op0k (EURUSD,M15) 실패 또는 첫 실행 285187 바에 대한 시간=0.0초 ObjectsTotal=1108_time=2010.05.04 22:15:00
감사합니다. 그것은 내가 마침내 모든 것을 올바르게 썼고 "표시기"가 실제로 내가 의도 한대로 작동한다는 것을 의미합니다. 내가 가진 실패는 터미널의 문제입니다 (모든 것이 정상입니다). _time=2010.06.15 07:45:00 개발자가 서비스 덱스에서 침묵하는 것은 유감입니다. 적어도 그들은 몇 마디 (( 같은
감사합니다. 마침내 모든 것을 올바르게 작성했고 "표시기"가 실제로 의도 한대로 작동한다는 것을 의미합니다. 내가 가진 실패는 터미널의 문제입니다 (당신은 잘하고 있습니다). _time=2010.06.15 07:45:00). 개발자가 서비스 덱스에서 침묵하는 것이 유감입니다. 적어도 그들은 몇 마디 (( 같은
문제가 재현되었습니다... 우리는 생각합니다... 감사합니다.
수정할 수 있습니다:
H1 gravfik에서 수직 또는 수평선을 운반하는 경우 다른 시간 간격으로 전환하면 표시기와 관련이없는 선이 삭제됩니다.
이것은 가격 단계를 시각적으로 결정하기 위해 기록을 확인하는 데 매우 편리한 지표이지만 더 작은 시간 간격으로 전환 할 때 이전 시간 간격에 표시된 표시 (수직 및 수평선)가 사라지기 때문에 불편 해집니다.
코드베이스에 새 버전 3.09를 게시했으니 다운로드할 수 있습니다.
조금 더 개선할 수 있습니다.
if(ObjectFind(0,nm)<0) ObjectCreate(0,nm,OBJ_VLINE,0,t1,2);
이러한 구조에서 ObjectFind()는 분명히 불필요합니다. ObjectCreate() 로 만들 때 이름으로 목록에서 유사한 검색을 수행하고 새 개체를 만들거나 기존 개체의 앵커 포인트 매개 변수를 변경합니다(
).
ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,false);
MQL 프로그램에서 생성된 객체의 경우 이 속성은 false로 강제 설정됩니다.
마찬가지로 OBJPROP_WIDTH의 값을 변경하는 것은 의미가 없으며 어쨌든 1과 같을 것입니다.
제 측정에 따르면 이러한 편집으로 빌드 시간이 약 10% 단축되었습니다.
고마워요, 명심할게요 지금 작업 중인데 문제가 생겼어요.
그리드만 있는 8개의 차트가 열려 있습니다.
5분 동안 인터넷 연결이 끊기는 시뮬레이션을 해봅니다. 인터넷 전원을 켠 후의 모습입니다. 2개의 차트가 충돌합니다.
새 버전의 그리드 버전 4.01을 첨부합니다.
고마워요, 명심할게요 지금 작업 중인데 문제가 생겼어요.
그리드만 있는 8개의 차트가 열려 있습니다.
5분 동안 인터넷 연결이 끊기는 시뮬레이션을 해봅니다. 인터넷 전원을 켠 후의 모습입니다. 2개의 차트가 충돌합니다.
그리드 버전 4.01의 새 버전을 첨부합니다.
이것은 터미널 아키텍처와 표시기 알고리즘의 결과입니다. 인디케이터는 심볼 스트림에서 실행되므로 계산 중에 틱 처리, 다른 인디케이터 계산, 서버와의 기록 동기화, 심볼 시간대별 기록 작성 또는 로드 등 기록이 있는 많은 작업이 불가능합니다.
그리드 인디케이터는 오랜 시간 동안 계산되고 다른 심볼 타임프레임의 데이터를 사용하므로 오류가 발생할 경우 계산을 중단하는 것이 바람직합니다. 코드를 다시 작성하지 않으려면 다음과 같이 할 수 있습니다:
bool isNewBar_i(datetime date,ENUM_TIMEFRAMES timeFrame,bool& error)
{
...
else
{
Print("Timeframe ",fTimeFrameName(timeFrame)," is not ready");
error=true;
}
이렇게 하면 됩니다:
//--- определимся с цветом линии
if(_Period<PERIOD_H1) if(isNewBar_i(time[i],PERIOD_H1,error) && _Period<PERIOD_M30) line_color=new_hour;
if(_Period<PERIOD_D1) if(isNewBar_i(time[i],PERIOD_D1,error) && _Period<PERIOD_H4 ) line_color=new_day;
if(_Period<PERIOD_W1) if(isNewBar_i(time[i],PERIOD_W1,error) && _Period<PERIOD_D1 ) line_color=new_week;
if(_Period<PERIOD_MN1)if(isNewBar_i(time[i],PERIOD_MN1,error)&& _Period<PERIOD_MN1) line_color=new_mon;
//---
if(error) return(0);
이는 터미널 아키텍처와 인디케이터 알고리즘의 결과입니다. 인디케이터는 심볼 스트림에서 실행되며, 즉 계산 과정에서 틱 처리, 다른 인디케이터 계산, 서버와의 기록 동기화, 심볼 시간대별 기록 구축 또는 로드 등 기록이 있는 많은 작업이 불가능합니다.
스트림에 대한 개념을 이해할 수 없으며 데이터 액세스에 대한 도움말을 50번이나 읽었습니다(( 스크립트가 예시로 나와 있습니다. 그리고 실행하는 데 약 1 분 (긴 시간)이 걸리지 만, 나는 그것을 얻기 시작한 것 같습니다. 지표가 계산되는 동안, 즉 함수가 실행되기 시작했다는 것을 올바르게 이해 했습니까?
int OnCalculate () {
컴퓨터 (터미널)의 모든 자원 이 작업에 제공되며 실행 (완료)될 때까지)
return(rates_total); }
다음 중 어느 것도 하지 않아야 합니다:
- 이 기호가 누락된 경우 이 기호로 기록을 읽으려고 시도합니다.
- 다른 기간 요청
- 다른 심볼 요청
프로그램을 다시 실행하는 방법을 이해했다고 생각하는데, 첫 번째 호출에서 모든 줄을 설정하고 if(prev_calculated==0)까지 잊어 버려야합니다.
개미맞죠 ?
S.Y.
Renat의 평가에 따르면 저는 레벨 5입니다 :-))) , https://www.mql5.com/ru/forum/1165/page3 한 단계 더 나아갔습니다 )))
코드를 완전히 다시 작성했습니다. 다른 기간은 요청하지 않았습니다.
괜찮으시다면요. 제한 해제 창에서 막대를 설정하고 M15, M5 및 M1을 통과하십시오. 여기에 로그에 결과를 게시하십시오. M1에 문제가 있습니다 - 서비스에 썼습니다. 저만 그런 건지 아니면 모두 그런 건지 알고 싶어요.
여기 내 로그가 있습니다.
2010.06.17 11:39:55 그리드 (EURUSD,M1) 실패 또는 첫 실행 시간= 1293476 바에 대해 1.2초 ObjectsTotal= 48010 _time= 2002.10.25 06:41:00
2010.06.17 11:39:52 그리드 (EURUSD,M5) 실패 또는 첫 실행 시간= 0.0초 847192 바에 대해 ObjectsTotal= 423 _time= 2010.06.02 21:35:00
2010.06.17 11:39:48 그리드 (EURUSD,M15) 실패 또는 첫 실행 시간= 0.0초 285186 바에 대해 ObjectsTotal= 962 _time= 2010.05.04 22:00:00
미리 감사드립니다. 그리드 버전 4.11
이 스레드 개념을 이해할 수 없으며 데이터 액세스에 대한 도움말을 50 번 읽었습니다 (( 스크립트가 예제로 제공됩니다. 그리고 실행하는 데 약 1 분이 걸리지 만 (긴 시간), 나는 그것을 얻기 시작했다고 생각합니다. 지표 계산이 진행되는 동안, 즉 함수가 실행되기 시작했다는 것을 올바르게 이해합니까?
int OnCalculate () {
모든 컴퓨터 (터미널) 리소스가이 작업에 제공되고 실행될 때까지 (완료 될 때까지)
return(rates_total); }
다음 중 어느 것도 수행해서는 안 됩니다:
- 이 심볼에 대한 기록이 누락된 경우 이 기록을 읽어 보려고 시도합니다.
- 다른 기간 요청하기
요청할 수 있지만 데이터가 누락되었거나 불충분한 경우 OnCalculate()에서 기다리는 것은 의미가 없습니다. 현재 심볼에 대한 다른 인디케이터의 데이터도 마찬가지입니다.
- 다른 심볼 요청하기
.
첫 번째 호출에서 모든 줄을 설정하는 데 필요한 프로그램을 다시 실행하는 방법을 이해하고 if(prev_calculated==0)를 잊어 버리는 방법을 이해한다고 생각합니다.
너무 큰 문제가 아니라면. 제한 해제 창에서 막대를 설정하고 M15, M5 및 M1을 통과합니다. 로그에 기록 될 결과는 여기에 게시하십시오. M1에 문제가 있습니다-서비스에 썼습니다. 나는 그것이 나 또는 모든 사람인지 확인하고 싶습니다.
2010.06.17 11:58:54 6op0k (EURUSD,M5) 실패 또는 첫 실행 시간=0.0초 847196 바에 대해 ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) 실패 또는 첫 실행 시간=0.0초 285187 바에 대해 ObjectsTotal=1108_time=2010.05.04 22:15:00
2010.06.17 11:58:59 6op0k (EURUSD,M1) 실패 또는 첫 실행 시간=0.1초 4009008 바에 대해 ObjectsTotal=403_time=2010.06.15 07:45:00
2010.06.17 11:58:54 6op0k (EURUSD,M5) 실패 또는 첫 실행 847196 바에 대한 시간=0.0초 ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) 실패 또는 첫 실행 285187 바에 대한 시간=0.0초 ObjectsTotal=1108_time=2010.05.04 22:15:00
감사합니다. 그것은 내가 마침내 모든 것을 올바르게 썼고 "표시기"가 실제로 내가 의도 한대로 작동한다는 것을 의미합니다. 내가 가진 실패는 터미널의 문제입니다 (모든 것이 정상입니다). _time=2010.06.15 07:45:00 개발자가 서비스 덱스에서 침묵하는 것은 유감입니다. 적어도 그들은 몇 마디 (( 같은
문제가 재현되었습니다... 우리는 생각합니다... 감사합니다.
감사합니다. 마침내 모든 것을 올바르게 작성했고 "표시기"가 실제로 의도 한대로 작동한다는 것을 의미합니다. 내가 가진 실패는 터미널의 문제입니다 (당신은 잘하고 있습니다). _time=2010.06.15 07:45:00). 개발자가 서비스 덱스에서 침묵하는 것이 유감입니다. 적어도 그들은 몇 마디 (( 같은
문제가 재현되었습니다... 우리는 생각합니다... 감사합니다.
수정할 수 있습니다:
H1 gravfik에서 수직 또는 수평선을 운반하는 경우 다른 시간 간격으로 전환하면 표시기와 관련이없는 선이 삭제됩니다.
이것은 가격 단계를 시각적으로 결정하기 위해 기록을 확인하는 데 매우 편리한 지표이지만 더 작은 시간 간격으로 전환 할 때 이전 시간 간격에 표시된 표시 (수직 및 수평선)가 사라지기 때문에 불편 해집니다.
이 표시기는 터미널 창에서 가격 척도를 사용할 수 있는 문제를 완벽하게 해결했습니다.
최대 3021 빌드까지 컴파일해도 오류가 표시되지 않으며 모든 것이 정상적으로 그려집니다(이전에 컴파일한 버전을 터미널의 새 빌드에 넣어도).
후속 빌드에서의 컴파일에는 오류가 표시되지 않지만 터미널에서 가산기는 수직 마크업을 그리지 않으며 로그에 다음과 같이 기록됩니다. 누출 된 문자열 1 개가 남았습니다.
줄에 주석을 달았습니다:
StringConcatenate(line_name,IntegerToString(str.hour,2,'0'),":":",IntegerToString(str.min,2,'0'),"_N",line_counter);
그러면 터미널 로그의 오류가 사라집니다(선이 그려지지는 않지만).
어떤 방법으로 파낼까요? 훌륭한 도구를 어떻게 되살릴 수 있을까요?