해도에 설치된 인디케이터의 버퍼 읽기

 

차트에 지표가 있습니다. 동시에 Timer, ChartEvent 및 Calculate 이벤트 에서 다시 그려집니다.

스크립트는 CTRL+D로 볼 수 있는 표시기 버퍼 ( INDICATOR_DATA )의 현재 표시기를 읽어야 합니다. MT4에서 가능한가요?

 

DLL을 통한 솔루션은 "지표 간 데이터 전송 - 고통스러운 문제에 대한 간단한 솔루션" 기사에 나와 있습니다. 그러나 외부 GetPtr 에 대한 호출을 표시기의 소스에 추가해야 하며 이것이 항상 가능한 것은 아닙니다.

DLL이 없으면 버퍼를 읽기만 할 수 있습니까(쓰기 없이, 이 기사에서도 수행됨)? 기사가 작성된 이후(2010년) 이 주제에 대해 변경된 사항이 있습니까?

 
iCustom() 이 도움이 될 것입니다.
iCustom - Технические индикаторы - Справочник MQL4
iCustom - Технические индикаторы - Справочник MQL4
  • docs.mql4.com
iCustom - Технические индикаторы - Справочник MQL4
 
Alexey Viktorov :
iCustom() 이 도움이 될 것입니다.

불행히도, 이 경우

Timer, ChartEvent 및 Calculate 이벤트 에 의해 다시 그려집니다 .

도움이되지 않습니다.

 
얼마나 많은 값이 필요합니까? 표시기 자체가 터미널의 전역 변수 , 차트의 개체 속성, 파일에 이러한 값의 복제본을 저장하도록 합니다.
 
Alexander Puzanov :
얼마나 많은 값이 필요합니까? 지표 자체가 터미널의 전역 변수 , 차트의 개체 속성, 파일에 이러한 값의 복제본을 저장하도록 합니다.

스크립트를 사용하여 차트에서 (최소한 하나) 표시기의 버퍼 값을 가져와야 합니다. 표시기에서 파일로 버퍼를 던지는 것은 스크립트에서 버퍼를 읽는 것이 아닙니다.

위의 기사에는 차트의 다른 표시기의 버퍼를 읽을 수 있을 뿐만 아니라 덮어쓸 수도 있는 포인터를 통한 아름다운 솔루션이 있습니다. 이것을 버퍼 읽기라고 합니다. 하지만 DLL입니다.

그런 계획을 구현하는 것이 가능합니다.

  • 표시기는 전역 변수가 버퍼를 파일에 쓰기를 기다리고 있습니다.
  • 스크립트는 실행될 때 이러한 변수를 생성하고 해당 파일을 수신합니다.
그러나 그것은 목발도 아닙니다. 이것은 버퍼를 읽는 것이 아닙니다 .

침묵으로 판단하면 이 문제가 네 번째 포럼에서 공개적으로 발표된 지 7년이 넘었지만(Google 기억) 이 기능의 개발자는 생성되지 않았습니다.

어떤 이유로 차트에서 지표 데이터를 사람이 읽는 것은 여전히 불가능합니다! 미친 소리 같지만 사실입니다.

 
comp :

불행히도, 이 경우

도움이되지 않습니다.

왜 안 돼? iCustom()은 이 버퍼가 채워지는 방식에 관계없이 표시기 버퍼 를 읽습니다. 결국 버퍼는 어떤 경우에도 전역 변수 수준에서 선언됩니다.
 
Alexey Viktorov :
왜 안 돼? iCustom()은 이 버퍼가 채워지는 방식에 관계없이 표시기 버퍼 를 읽습니다. 어쨌든 버퍼는 전역 변수 수준에서 선언됩니다.

iCustom은 Timer 및 ChartEvent 이벤트에 대해 아무것도 모르기 때문입니다.

예를 들어, 차트의 표시기는 1초마다 임의의 숫자로 버퍼를 채웁니다(타이머 이벤트)(또는 EMA를 이전 버퍼 값에 적용). 몇 줄의 코드일 뿐입니다. 이 경우 iCustom은 차트에 표시되는 내용을 반환하지 않습니다.

 
comp :

iCustom은 Timer 및 ChartEvent 이벤트에 대해 아무것도 모르기 때문입니다.

예를 들어, 차트의 표시기는 1초마다 임의의 숫자로 버퍼를 채웁니다(타이머 이벤트)(또는 EMA를 이전 버퍼 값에 적용). 몇 줄의 코드일 뿐입니다. 이 경우 iCustom은 차트에 표시되는 내용을 반환하지 않습니다.

내 혼란을 이해합니다. 감사합니다.
 
Alexey Viktorov :
왜 안 돼? iCustom()은 이 버퍼가 채워지는 방식에 관계없이 표시기 버퍼 를 읽습니다. 결국 버퍼는 어떤 경우에도 전역 변수 수준에서 선언됩니다.

iCustom은 차트의 표시기에서 버퍼를 읽지 않고 메모리에 표시기의 자체 복사본을 생성하고 읽습니다. 복사 버퍼는 차트에 표시되지 않습니다. 그러나 표시기가 자체적으로 차트에 무언가를 그리는 경우 iCustom을 통해 호출할 때 그려지므로 문제가 발생합니다.

예를 들어 표시기에 다음 코드가 있는 경우 iCustom이 호출될 때 그려지고 차트의 표시기에서 텍스트가 겹쳐집니다.

 ObjectSetString ( 0 , ShortName, OBJPROP_TEXT , "какой-то текст" );
ChartRedraw ();
 
Alexey Volchanskiy :

iCustom은 차트의 표시기에서 버퍼를 읽지 않고 메모리에 표시기의 자체 복사본을 생성하고 읽습니다. 복사 버퍼는 차트에 표시되지 않습니다. 그러나 표시기가 자체적으로 차트에 무언가를 그리는 경우 iCustom을 통해 호출할 때 그려지므로 문제가 발생합니다.

예를 들어 표시기에 다음 코드가 있는 경우 iCustom이 호출될 때 그려지고 차트의 표시기에서 텍스트가 겹쳐집니다.

기이한. 도움말 어딘가에서 표시기가 이미 실행 중이면 복사본이 생성되지 않는다고 읽었습니다. 엠비. 이해하지 못한 것.