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

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

아마 뭔가를 이해하지 못했을 것입니다. 이 모든 가설을 확인하고 두 개의 버퍼로 표시기를 만들었습니다. 하나는 OnCalculate()에서 채워지고 다른 하나는 OnTimer(), 스크립트, 어드바이저에서... 어드바이저에서 iCustom()을 통해 OnCalculate( )가 인쇄되고 OnTimer()에서 빈 값이 표시됩니다. 동시에 지표는 내가 스크립트를 던지거나 고문을 놓는 차트에 멈춥니다.

결론: iCustom()을 통해 표시기를 호출하면 표시기의 OnTimer() 이벤트가 실행되지 않습니다...

아마도 이러한 이유로 문서에 다음과 같이 나와 있습니다.

OnTimer() 함수는 Expert Advisors 및 표시기에 대해서만 시스템 타이머에 의해 생성되는 Timer 이벤트가 발생할 때 호출되며 스크립트에서는 사용할 수 없습니다.

지표는 어떤 식 으로든 언급되지 않습니다 ...

분명히 mql에는 유용한 문서화되지 않은 기능과 문서화되지 않은 문제가 있습니다...

События клиентского терминала - Программы MQL4 - Справочник MQL4
События клиентского терминала - Программы MQL4 - Справочник MQL4
  • docs.mql4.com
События клиентского терминала - Программы MQL4 - Справочник MQL4
 
comp :

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

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

읽기 및 쓰기 및 DLL nafik이 필요하지 않습니다.
 
pako :
읽기 및 쓰기 및 DLL nafik이 필요하지 않습니다.
글쎄, 예는 어디에 있습니까?
 
Alexey Viktorov :
글쎄요, 그 예가 어디에 있습니까?
지표는 어디에 있습니까?
 
comp :

불행히도, 이 경우

도움이되지 않습니다.

도움이 되지 않는 이유는 무엇입니까?
 
pako :
지표는 어디에 있습니까?
드미트리 페도세예프 :
도움이 되지 않는 이유는 무엇입니까?

실험적:

 #property strict

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed

#define PAUSE 100

input double EMA = 0.1 ;       // Коэффициент экспоненциального сглаживания
input int Amount = 100 ;       // Сколько раз применить до "сброса"

double Buffer[];

int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{
   return (rates_total);
}

void OnInit ( void )
{
   SetIndexBuffer ( 0 , Buffer);

   EventSetMillisecondTimer (PAUSE);

   return ;
}

void OnDeinit ( const int reason )
{
   EventKillTimer ();

   return ;
}

void SetBuffer( const bool Random )
{
   const int Size = ArraySize (Buffer);

   if (Random)
  {
     MathSrand (( int ) TimeLocal ());

     for ( int i = 0 ; i < Size; i++)
      Buffer[i] = MathRand ();
  }
   else
     for ( int i = 1 ; i < Size; i++)
      Buffer[i] += (Buffer[i - 1 ] - Buffer[i]) * EMA;

   return ;
}

void OnTimer ( void )
{
   static int Count = 0 ;

  SetBuffer(Count % Amount == 0 );
   ChartRedraw ();

  Count++;

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

최근에 표시기를 게시 했는데 텍스트 문자열 만 표시됩니다. 그리고 iCustom을 통해 호출할 때 차트의 표시선과 iCustom이 서로 간섭하여 프로그래밍 방식으로 하나의 결론만 도출해야 했습니다.

코드 사본이 메모리에 생성되지 않을 수 있지만 재계산에는 자체 매개변수가 포함됩니다.

https://www.mql5.com/ru/code/14737/83151#!tab=code

 
comp :

실험적:

그래서 무엇?
 
Alexey Volchanskiy :

최근에 표시기를 게시 했는데 텍스트 문자열 만 표시됩니다. 그리고 iCustom을 통해 호출할 때 차트의 표시선과 iCustom이 서로 간섭하여 프로그래밍 방식으로 하나의 결론만 도출해야 했습니다.

코드 사본이 메모리에 생성되지 않을 수 있지만 재계산에는 자체 매개변수가 있습니다.

https://www.mql5.com/ru/code/14737/83151#!tab=code

코드의 복사본은 동적 로딩이기 때문에 생성될 수 밖에 없습니다.
 
Алексей Тарабанов :
코드의 복사본은 동적 로딩이기 때문에 생성될 수 밖에 없습니다.

주장입니까, 아니면 MQ 개발자입니까? :))

프로그램 코드가 하나의 복사본에 있고 클라이언트를 위해 데이터 인스턴스가 생성되는 DLL과 유추하여 제 생각에는 그렇게 생각합니다.

간단히 말해서 실제 의미는 차트에 칠면조가 있는 경우 iCustom이 차트에서 데이터를 가져오는 것이 아니라 별도로 생성된 인스턴스에서 데이터를 가져오는 것입니다.