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

 
comp :

실험적:

올바르게 작성하면 행복할 것입니다.
 
Dmitry Fedoseev :
그래서 무엇?

표시기 를 실행한 다음 어드바이저를 실행합니다.

 #property strict

#define PAUSE 100

sinput int BufferIndex = 0 ;     // Номер буфера индикатора
sinput bool TimerEvent = FALSE ; // Использование события Timer

string IndicatorName;

string GetBetweenString( string &SourceString, const string BeginString, const string EndString = "" )
{
   string Str = SourceString;
   int Pos1 = 0 ;
   int Pos2 = 0 ;

   if (BeginString != "" )
    Pos1 = StringFind (SourceString, BeginString);

   if (Pos1 >= 0 )
  {
    Pos1 += StringLen (BeginString);

    Pos2 = StringFind (SourceString, EndString, Pos1);

     if (Pos2 != Pos1)
      Str = StringSubstr (SourceString, Pos1, Pos2 - Pos1);
     else
      Str = "" ;
  }

  SourceString = StringSubstr (SourceString, Pos2 + StringLen (EndString));

   return (Str);
}

string FileToString( const string FileName )
{
   string Res = "" ;

   const int handle = FileOpen (FileName, :: FILE_READ |:: FILE_BIN );

   if (handle != INVALID_HANDLE )
  {
     uchar Array[];

     FileReadArray (handle, Array);

    Res = CharArrayToString (Array);

     FileClose (handle);
  }

   return (Res);
}

string GetIndicatorName( const long Chart_ID = 0 )
{
   string Res = "" ;

   const string FileName = :: WindowExpertName () + ".tpl" ;

   if ( ChartSaveTemplate (Chart_ID, "..\\MQL4\\Files\\" + FileName))
  {
     string Str = FileToString(FileName);

     if ( StringFind (Str, "name=Custom Indicator" ) > 0 )
      Res = GetBetweenString(Str, "<indicator>\r\nname=Custom Indicator\r\n<expert>\r\nname=" , "\r\n" );
  }

   return (Res);
}

string GetIndicatorString( const int Pos = - 1 )
{
   static int PrevPos = 0 ;

   if (Pos != - 1 )
    PrevPos = Pos;

   const string Str = ((PrevPos < 0 ) || (IndicatorName == "" )) ? "" : IndicatorName + "[" + ( string )BufferIndex + "][" + ( string )PrevPos + " - " + ( string ) Time [PrevPos] +
                                                                     "] = " + ( string ) iCustom ( Symbol (), Period (), IndicatorName, BufferIndex, Pos) ;
   return (Str);
}

void OnInit ( void )
{
  IndicatorName = GetIndicatorName();

   ChartSetInteger ( 0 , CHART_EVENT_MOUSE_MOVE , TRUE );

   if (TimerEvent)
     EventSetMillisecondTimer (PAUSE);

   return ;
}

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

   Comment ( "" );

   return ;
}

void OnTimer ( void )
{
   Comment (GetIndicatorString());

   return ;
}

void OnChartEvent ( const int id, const long & lparam, const double & dparam, const string & sparam )
{
   if (id == CHARTEVENT_MOUSE_MOVE )
  {
     datetime time;
     double price;
     int SubWindow;

     ChartXYToTimePrice ( 0 , ( int )lparam, ( int )dparam, SubWindow, time, price);
     const int Pos = iBarShift ( Symbol (), Period (), time, TRUE );

     Comment (GetIndicatorString(Pos));
  }

   return ;
}

표시기 버퍼(CTRL+D)의 값이 iCustom의 값(EA의 차트 해설에 표시됨)과 일치하지 않는 것을 관찰했습니다.

테스트 대상의 경우 iCustom은 EMPTY_VALUE 또는 0을 발행합니다.

 

확인했습니다. 일치하지 않는 것이 아니라 전혀 존재하지 않습니다. 시원한.

 
comp :

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

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

문제는 작업 설정에 있습니다.

당신은 그것을 위해 지표를 사용하지 않습니다. 타이머에서 작동하고 이벤트에 반응하도록 설계되지 않았으며, 시계열을 경제적으로 삽질하도록 설계되었습니다.

다른 측면에서 작업에 접근하면 아름답고 경제적인 솔루션을 찾을 수 있습니다.

 
요점은 버퍼를 읽는 것이 아니라 iCustom()을 통해 호출된 표시기에 타이머와 차트 이벤트가 없다는 사실입니다.
 
Dmitry Fedoseev :
요점은 버퍼를 읽는 것이 아니라 iCustom()을 통해 호출된 표시기에 타이머와 차트 이벤트가 없다는 사실입니다.

왜 그래야 합니까?

글쎄요, 왜요?

 
Andrey Khatimlianskii :

왜 그래야 합니까?

글쎄요, 왜요?

난 필요 없어. 그러나 여기 누군가가 그것을 필요로 했다는 것이 밝혀졌습니다.
 
Andrey Khatimlianskii :

문제는 작업 설정에 있습니다.

당신은 그것을 위해 지표를 사용하지 않습니다. 타이머에서 작동하고 이벤트에 반응하도록 설계되지 않았으며, 시계열을 경제적으로 삽질하도록 설계되었습니다.

다른 측면에서 작업에 접근하면 아름답고 경제적인 솔루션을 찾을 수 있습니다.

그런 말은 머리에 얼마나 큰 타격을 입혔습니까? 코드베이스에서 지표를 찾기로 결정했습니다. 나는 내가 익숙한 것을 사용하는 사람을 찾지 못했습니다: 이벤트 모델 + OOP.

이 상황에 대한 좌절감이나 실망감이 더 크다고 말하기는 어렵습니다. 표시기는 원시적으로 작성되어야 합니다.

지표에서 이벤트 모델 + OOP를 사용하는 사람이 있습니까?

글쎄, 이것은 내가 차트에서 내 눈으로 보는 것을 프로그래밍 방식으로 얻는 것이 불가능하다는 당혹감을 여전히 취소하지 않습니다!

 
iCustom으로 테스트 EA 를 작성할 때 해결할 수 없는 MQL 문제에 봉착했습니다. 표시기의 파일 이름(코드 참조)과 입력 매개변수 값을 찾는 것은 문제가 되지 않습니다. 그러나 그 후에는 표시기의 이러한 입력 매개변수를 iCustom에 삽입할 방법이 없습니다. iCustom 호출은 모든 지표에 대한 범용 솔루션이 기본 입력 매개변수의 경우에만 적합하도록 배열됩니다. 그렇지 않으면 코드를 입력해야 합니다. 바보 같은 결정입니다. 해당 문자열 필드가 있는 구조로 표시기 입력을 전달할 수도 있습니다. 그러나 그들은 호출의 모든 보편성을 죽인 줄임표 를 통해 이를 수행했습니다. 이해할 수 없는 또 다른 한계!
 
comp :

그런 말은 머리에 얼마나 큰 타격을 입혔습니까? 코드 베이스에서 지표를 찾기로 결정했습니다. 나는 내가 익숙한 것을 사용하는 사람을 찾지 못했습니다: 이벤트 모델 + OOP.

이 상황에 대한 좌절감이나 실망감이 더 크다고 말하기는 어렵습니다. 표시기는 원시적으로 작성되어야 합니다.

지표에서 이벤트 모델 + OOP를 사용하는 사람이 있습니까?

글쎄, 이것은 내가 차트에서 내 눈으로 보는 것을 프로그래밍 방식으로 얻는 것이 불가능하다는 당혹감을 여전히 취소하지 않습니다!

무엇 때문에? 모든 것이 이미 우리보다 먼저 도난당했습니다. OnCalculate 기능이 있습니다 - 다가오는 진드기의 이벤트. OOP를 사용 하고 싶습니다. 사용하지만 왜 거기에 어디에 넣어야합니까?
사유: