Buffers indicadores de leitura ajustados para tabela - página 3

 
comp:

Assunto:

Soletra bem e você ficará feliz.
 
Dmitry Fedoseev:
Então?

Iniciar o indicador, então - o Consultor Especialista

#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;
}

Você percebe que os valores do tampão indicador (CTRL+D) não coincidem com os valores iCustom (eles estão impressos no comentário do gráfico do Expert Advisor).

Em caso de nosso teste, iCustom dará ou VAZIO_VALOR ou zero.

 

Verificado. Não é que não corresponda, não está lá de forma alguma. Bastante legal.

 
comp:

A julgar pelo silêncio, mais de sete anos desde que este problema foi anunciado publicamente no quarto fórum (google lembra-se), os desenvolvedores não criaram uma funcionalidade.

Por alguma razão eles ainda não podem fazer uma leitura humana dos dados indicadores do gráfico! Parece uma loucura, mas é.

O problema está na declaração do problema.

Você só está usando os indicadores para o propósito errado. Eles não são projetados para ser cronometrados e reagir aos eventos, eles são projetados para retrabalhar economicamente séries temporais.

Aproxime-se de sua tarefa do outro lado e você encontrará uma solução agradável e econômica.

 
Não se trata de buffers de leitura, trata-se do fato de que o indicador chamado via iCustom() não tem temporizador e nenhum evento gráfico.
 
Dmitry Fedoseev:
Não se trata de buffers de leitura, trata-se do fato de que o indicador chamado via iCustom() não tem temporizador e nenhum evento gráfico.

Para que servem?

Bem, a sério, para quê?

 
Andrey Khatimlianskii:

Para que servem?

Bem, a sério, por quê?

Eu não preciso disso. Mas aqui alguém precisava disso, afinal de contas.
 
Andrey Khatimlianskii:

O problema está na declaração do problema.

Você está simplesmente usando os indicadores para o propósito errado. Eles não são projetados para serem cronometrados e reagirem aos eventos, eles são projetados para retrabalhar economicamente séries temporais.

Aproxime-se de sua tarefa do outro lado e você encontrará uma solução agradável e econômica.

É como um martelo na cabeça para fazer tal afirmação. Decidi procurar por indicadores em kodobase. Não encontrei NADA que use o que estou acostumado a usar: modelo orientado por eventos + OOP.

É difícil dizer o que é mais: frustração ou desapontamento com este estado de coisas. Os indicadores, afinal, devem ser escritos de forma primitiva.

Alguém usa o modelo de evento + OOP em indicadores?

Bem, isso ainda não nega a perplexidade de não se conseguir programar o que se vê com os olhos em um gráfico!

 
Ao escrever um teste de consultoria especializada com o iCustom, enfrentei um problema de MQL insolúvel. Para saber o nome do arquivo (ver o código) do indicador e os valores dos parâmetros de entrada - sem problemas. Mas depois disso, é impossível inserir os parâmetros de entrada do indicador no iCustom. A forma como o iCustom é chamado é que uma solução universal para qualquer indicador é adequada apenas no caso dos parâmetros de entrada padrão. Caso contrário, temos que entrar no código. Esta solução não é conveniente. Poderíamos passar as entradas do indicador como uma estrutura com os campos de tensão apropriados. Mas utilizamos a elipse, que matou a universalidade da chamada. Outra estranha restrição!
 
comp:

É como um chute na cabeça para fazer uma declaração como essa. Decidi procurar por indicadores em kodobase. Eu não encontrei NENHUM que use aquilo a que estou acostumado: modelo orientado por eventos + OOP.

É difícil dizer o que é mais: frustração ou desapontamento com este estado de coisas. Os indicadores, afinal, devem ser escritos de forma primitiva.

Alguém usa o modelo de evento + OOP em indicadores?

Bem, isso ainda não nega a perplexidade de não se conseguir programar o que se vê com os olhos em um gráfico!

Por quê? Tudo já foi roubado antes de nós, existe a função OnCalculate - tick event. Se você quiser usar o OOP - use-o, mas para que ele está lá, onde colocá-lo?