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

 

MQ5 프로그램은 실행이 완료된 후 생성된 모든 핸들의 IndicatorRelease를 항상 자동으로 생성합니까?

아니면 IndicatorCreate를 사용하여 스크립트를 통해 표시기를 실행한 다음 표시기에 대한 추가 작업을 위해 전역 변수 를 통해 핸들을 전달할 수 있습니까?

 

https://www.mql5.com/ru/docs/basis/preprosessor/compilation

끊임없는

유형

설명

tester_indicator

" indicator_name.ex5" 형식의 사용자 지정 표시기 이름입니다 . 테스트에 필요한 지표는 해당 매개변수가 상수 문자열로 설정된 경우 iCustom() 함수 호출에서 자동으로 결정됩니다. 다른 경우( IndicatorCreate() 함수 를 사용하거나 표시기의 이름을 지정하는 매개변수에 상수가 아닌 문자열을 사용하는 경우) 이 속성은 필수입니다.

IndicatorCreate - 거의(입력 매개변수 수에 제한 없음) 기초?

Документация по MQL5: Основы языка / Препроцессор / Свойства программ (#property)
Документация по MQL5: Основы языка / Препроцессор / Свойства программ (#property)
  • www.mql5.com
Основы языка / Препроцессор / Свойства программ (#property) - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
IndicatrorRelease는 iCustom+ChartIndicatorAdd 바인딩 후에 호출되는 경우 잘못 true를 반환합니다. 수정합니다.
 
fxsaber :
카운터는 무엇입니까?
어제 1687페이지에 대해 논의했습니다. :) 하지만 1686페이지에 있는 이 메시지를 읽는 것이 좋습니다. https://www.mql5.com/ru/forum/1111/page1686#comment_2790746 그런데 그 사람이 귀하의 질문에 답변했습니다. . 그냥 패턴이 되는 것입니다. 표시기 호출 요청은 터미널로 이동합니다. 저것들. 어드바이저나 스크립트는 인디케이터를 직접 호출하지 않으며, 터미널은 중개자 역할을 합니다. 터미널은 지정된 매개변수를 가진 표시기가 이미 존재하는지 여부를 확인합니다. 그렇다면 표시기를 호출한 프로그램으로 이미 존재하는 표시기에 대한 핸들(참조)을 반환합니다. 그리고 터미널 깊이에서 카운터에 이 표시기에 대한 또 다른 호출이 있음을 표시합니다. 저것들. 이 표시기에 반환된 핸들 수를 추적합니다. 누군가 IndicatorRelease를 만든다고 해서 동일한 매개변수를 사용하여 동일한 표시기를 호출한 다른 사람들이 더 이상 해당 표시기를 필요로 하지 않는다는 의미는 아닙니다. 따라서 터미널은 카운터를 하나 줄이지만 다른 사람이 사용하고 있기 때문에 표시기는 활성 상태로 둡니다. 이것은 카운터가 0으로 재설정될 때까지 계속됩니다. 그러나 재설정되면 터미널은 RAM에서 이 표시기를 영구적으로 취소 불가능하게 삭제합니다.
IndicatorRelease를 포함하지만 표시기 자체에 대한 호출을 포함하지 않는 코드를 생성하려고 하면 IndicatorRelease에 핸들을 전달해야 하고 표시기가 그렇지 않은 경우 컴파일하지 않을 것이라고 생각합니다. 프로그램에서 호출하면 핸들도 인식하지 못합니다.
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 리뷰: 8
  • www.mql5.com
Форум трейдеров MQL5.community
 

BlackTomcat :
Вчера обсуждали, страница 1687. :) Но читать лучше вот с этого сообщения на 1686-й странице: https://www.mql5.com/ru/forum/1111/page1686#comment_2790746 Кстати, человек на Ваш же вопрос отвечал. Просто получается, что схема такая. Запрос на вызов индикатора попадает в Терминал. Т.е. советник или скрипт не вызывают индикатор напрямую, терминал выступает посредником. В терминале происходит проверка, существует ли уже такой индикатор с указанными параметрами. Если да, то он возвращает программе, вызвавшей индикатор, хэндл (ссылку) на уже существующий индикатор. А в своих терминальных недрах помечает в счётчике, что был ещё один вызов на данный индикатор. Т.е. он ведёт учёт, сколько хэндлов на данный индикатор вернул. Когда кто-то делает IndicatorRelease, это не значит, что остальным, кто вызвал этот же индикатор с такими же параметрами, этот индикатор больше не нужен. Поэтому Терминал уменьшает счётчик на единицу, но оставляет индикатор активным, потому-что им ещё кто-то пользуется.

고맙습니다! 그것은 큰 절약을 만듭니다.

IndicatorRelease를 포함하지만 표시기 자체에 대한 호출을 포함하지 않는 코드를 생성하려고 하면 IndicatorRelease에 핸들을 전달해야 하고 표시기가 그렇지 않은 경우 컴파일하지 않을 것이라고 생각합니다. 프로그램에서 호출하면 핸들도 인식하지 못합니다.

전송할 수 있는 전역 변수를 통해 처리합니다. 따라서 그것들을 사용하는 것이 가능합니다.
 
fxsaber :


전송할 수 있는 전역 변수를 통해 처리합니다. 따라서 그것들을 사용하는 것이 가능합니다.
그리고 당신은 그것을 전달하지 않습니다. :) 또는 적어도 이러한 방식으로 얻은 핸들에서 IndicatorRelease()를 호출 하지 마십시오. 이렇게하면 언어 버그가 아니라 실수가 될 것입니다. 동의하십니까?
 
Sergei Vladimirov :
그리고 당신은 그것을 전달하지 않습니다. :) 또는 적어도 이러한 방식으로 얻은 핸들에서 IndicatorRelease()를 호출 하지 마십시오. 이렇게하면 언어 버그가 아니라 실수가 될 것입니다. 동의하십니까?

그리고 자유 시장에 대해 나쁜 책갈피를 작성할 것입니다. 이 책갈피는 어느 시점에서 단순히 전체 양의 정수 범위를 살펴보고 각각에 대해 IndicatorRelease를 시도할 것입니다.

이러한 스크립트는 ChartIndicatorAdd 없이 iCustom 에서 사용한 터미널의 모든 Expert Advisors 및 표시기를 포함합니다.

 

이것은 언어 버그가 아니라 의도적인 행동입니다. 이걸 왜 썼어?

그건 그렇고, 이 대화는 인디케이터를 사용하기 전에 핸들을 확인하는 방법에 대한 귀하의 질문으로 시작되었습니다. 따라서 핸들을 확인할 수는 없지만 닫힌 표시기의 핸들을 사용하려고 하면 오류 4807이 발생합니다. 따라서 -1을 반환하는 경우 CopyBuffer()를 호출할 때마다 추적합니다.

 
fxsaber :
전송할 수 있는 전역 변수를 통해 처리합니다. 따라서 그것들을 사용하는 것이 가능합니다.
음... 전역 변수는 무엇입니까? 터미널 또는 고문? 저는 터미널 변수로 작업한 적이 없으므로 이 주제에 대해서는 다루지 않겠습니다. Advisor의 전역 변수는 여기에서 주요 방법입니다. 표시기가 OnInit에서 초기화되고 IndicatorRelease가 OnDeinit에서 발생하면 전역 변수(EA)만 핸들을 전달할 수 있습니다.
 
A100 :
런타임 오류: '잘못된 포인터 액세스'(*)
그리고 A::여기를 가리키는 것은 무엇입니까?