Lettura dei buffer degli indicatori impostati sul grafico - pagina 2

 
Yuriy Asaulenko:
È strano. Ho letto da qualche parte nell'aiuto che se l'indicatore è già in esecuzione, non viene creata alcuna copia. Non lo capisco.

Devo aver capito male qualcosa. Ho controllato tutte queste ipotesi, ho fatto un indicatore con due buffer, uno è riempito da OnCalculate() e un altro da OnTimer(), script, Expert Advisor... Ho usato iCustom() per stampare il valore del buffer riempito in OnCalculate() e il valore vuoto è dedotto da OnTimer(). Allo stesso tempo l'indicatore si trova nel grafico dove posiziono lo script o l'EA.

Conclusione: quando si chiama l'indicatore tramite iCustom(), l'evento OnTimer() non viene eseguito nell'indicatore.

Forse questo è il motivo per cui è scritto nella documentazione

La funzione OnTimer() viene chiamata quando si verifica un evento Timer, che è generato dal timer di sistema solo per Expert Advisors e indicatori - non è possibile utilizzarlo negli script.

E non menziona in alcun modo gli indicatori.

Apparentemente, ci sono alcune utili caratteristiche non documentate in mql, così come complicazioni non documentate...

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

Un indicatore viene posizionato sul grafico. Viene ridisegnato dagli eventi Timer, ChartEvent e Calculate.

Ho bisogno di uno script per leggere i valori attuali dei suoi buffer di indicatori(INDICATOR_DATA) che possono essere visti da CTRL+D. È possibile farlo in MT4?

Può essere letto e scritto e la DLL non è necessaria.
 
pako:
Legge e scrive e non ha bisogno di una DLL
Beh, dov'è un esempio?
 
Alexey Viktorov:
Beh, dov'è l'esempio?
Dov'è l'indicatore?
 
comp:

Purtroppo, in questo caso

non sarà d'aiuto.

Perché non aiuta?
 
pako:
Dov'è l'indicatore?
Dmitry Fedoseev:
Perché non aiuta?

Soggetto:

#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:
Strano. Ho letto da qualche parte nell'aiuto che se l'indicatore è già in esecuzione, una copia non viene creata. Forse mi manca qualcosa.

Recentemente ho pubblicato un indicatore, che visualizza solo una stringa di testo. E quando lo si chiama attraverso iCustom le linee dell'indicatore sul grafico e iCustom interferiscono tra loro, ho dovuto fare un solo output programmaticamente.

Forse, una copia del codice non viene creata nella memoria, ma il ricalcolo va con i suoi parametri

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

 
comp:

Soggetto:

E allora?
 
Alexey Volchanskiy:

Recentemente ho pubblicato un indicatore, che visualizza solo una stringa di testo. E quando lo si chiama attraverso iCustom le linee dell'indicatore sul grafico e iCustom interferiscono tra loro, ho dovuto fare un solo output programmaticamente.

Forse, una copia del codice non viene creata nella memoria, ma il ricalcolo va con i suoi parametriCopy

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

Una copia del codice non può essere creata perché è un carico dinamico.
 
Алексей Тарабанов:
La copia del codice non può non essere creata, perché è un carico dinamico.

Affermazione verbale o sei uno sviluppatore di MQ? :))

Anche se io stesso lo penso, per analogia con le DLL, dove il codice del programma è in un'istanza, e le istanze di dati sono create per i clienti.

In breve, il punto pratico è che se c'è un indice su un grafico, iCustom prende i dati non da esso, ma da un'istanza creata separatamente.