DLL을 통한 솔루션은 "지표 간 데이터 전송 - 고통스러운 문제에 대한 간단한 솔루션" 기사에 나와 있습니다. 그러나 외부 GetPtr 에 대한 호출을 표시기의 소스에 추가해야 하며 이것이 항상 가능한 것은 아닙니다.
DLL이 없으면 버퍼를 읽기만 할 수 있습니까(쓰기 없이, 이 기사에서도 수행됨)? 기사가 작성된 이후(2010년) 이 주제에 대해 변경된 사항이 있습니까?
![iCustom - Технические индикаторы - Справочник MQL4 iCustom - Технические индикаторы - Справочник MQL4](https://c.mql5.com/36/8/icustom-tehnicheskie-indikatori.png)
- docs.mql4.com
스크립트를 사용하여 차트에서 (최소한 하나) 표시기의 버퍼 값을 가져와야 합니다. 표시기에서 파일로 버퍼를 던지는 것은 스크립트에서 버퍼를 읽는 것이 아닙니다.
위의 기사에는 차트의 다른 표시기의 버퍼를 읽을 수 있을 뿐만 아니라 덮어쓸 수도 있는 포인터를 통한 아름다운 솔루션이 있습니다. 이것을 버퍼 읽기라고 합니다. 하지만 DLL입니다.
그런 계획을 구현하는 것이 가능합니다.
- 표시기는 전역 변수가 버퍼를 파일에 쓰기를 기다리고 있습니다.
- 스크립트는 실행될 때 이러한 변수를 생성하고 해당 파일을 수신합니다.
어떤 이유로 차트에서 지표 데이터를 사람이 읽는 것은 여전히 불가능합니다! 미친 소리 같지만 사실입니다.
iCustom은 Timer 및 ChartEvent 이벤트에 대해 아무것도 모르기 때문입니다.
예를 들어, 차트의 표시기는 1초마다 임의의 숫자로 버퍼를 채웁니다(타이머 이벤트)(또는 EMA를 이전 버퍼 값에 적용). 몇 줄의 코드일 뿐입니다. 이 경우 iCustom은 차트에 표시되는 내용을 반환하지 않습니다.
왜 안 돼? iCustom()은 이 버퍼가 채워지는 방식에 관계없이 표시기 버퍼 를 읽습니다. 결국 버퍼는 어떤 경우에도 전역 변수 수준에서 선언됩니다.
iCustom은 차트의 표시기에서 버퍼를 읽지 않고 메모리에 표시기의 자체 복사본을 생성하고 읽습니다. 복사 버퍼는 차트에 표시되지 않습니다. 그러나 표시기가 자체적으로 차트에 무언가를 그리는 경우 iCustom을 통해 호출할 때 그려지므로 문제가 발생합니다.
예를 들어 표시기에 다음 코드가 있는 경우 iCustom이 호출될 때 그려지고 차트의 표시기에서 텍스트가 겹쳐집니다.
ObjectSetString ( 0 , ShortName, OBJPROP_TEXT , "какой-то текст" ); ChartRedraw ();
iCustom은 차트의 표시기에서 버퍼를 읽지 않고 메모리에 표시기의 자체 복사본을 생성하고 읽습니다. 복사 버퍼는 차트에 표시되지 않습니다. 그러나 표시기가 자체적으로 차트에 무언가를 그리는 경우 iCustom을 통해 호출할 때 그려지므로 문제가 발생합니다.
예를 들어 표시기에 다음 코드가 있는 경우 iCustom이 호출될 때 그려지고 차트의 표시기에서 텍스트가 겹쳐집니다.
차트에 지표가 있습니다. 동시에 Timer, ChartEvent 및 Calculate 이벤트 에서 다시 그려집니다.
스크립트는 CTRL+D로 볼 수 있는 표시기 버퍼 ( INDICATOR_DATA )의 현재 표시기를 읽어야 합니다. MT4에서 가능한가요?