Les tampons de l'indicateur de lecture sont réglés sur le graphique - page 2

 
Yuriy Asaulenko:
C'est étrange. J'ai lu quelque part dans l'aide que si l'indicateur est déjà en cours d'exécution, aucune copie n'est créée. Je ne le comprends pas.

J'ai dû mal comprendre quelque chose. J'ai vérifié toutes ces hypothèses, j'ai fait un indicateur avec deux buffers, l'un est rempli depuis OnCalculate() et l'autre depuis OnTimer(), script, Expert Advisor... J'ai utilisé iCustom() pour imprimer la valeur du tampon rempli dans OnCalculate() et la valeur vide est déduite de OnTimer(). En même temps, l'indicateur est dans le graphique où je place le script ou l'EA.

Conclusion : quand on appelle l'indicateur par iCustom(), l'événement OnTimer() n'est pas exécuté dans l'indicateur.

C'est peut-être la raison pour laquelle il est écrit dans la documentation

La fonction OnTimer() est appelée lorsqu'un événement se produit Timer, qui est généré par le timer du système uniquement pour les Expert Advisors et les indicateurs - vous ne pouvez pas l'utiliser dans les scripts.

Et il ne mentionne en aucun cas les indicateurs.

Apparemment, il existe des fonctionnalités utiles non documentées dans mql, ainsi que des conséquences non documentées...

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

Un indicateur est placé sur le graphique. Il est redessiné par les événements Timer, ChartEvent et Calculate.

J'ai besoin d'un script pour lire les valeurs actuelles de ses tampons d'indicateurs(INDICATOR_DATA) qui peuvent être vus par CTRL+D. Est-il possible de faire cela dans MT4 ?

Il peut être lu et écrit et la DLL n'est pas nécessaire.
 
pako:
Lit et écrit et ne nécessite pas de DLL.
Eh bien, où y a-t-il un exemple ?
 
Alexey Viktorov:
Eh bien, où est l'exemple ?
Où se trouve l'indicateur ?
 
comp:

Malheureusement, dans ce cas

ne va pas aider.

Pourquoi ça n'aide pas ?
 
pako:
Où se trouve l'indicateur ?
Dmitry Fedoseev:
Pourquoi ça n'aide pas ?

Sujet :

#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:
Étrange. J'ai lu quelque part dans l'aide que si l'indicateur est déjà en cours d'exécution, une copie n'est pas créée. Peut-être que je rate quelque chose.

J'ai récemment mis en ligne un indicateur, qui ne fait qu'afficher une chaîne de texte. Et en l'appelant par iCustom, les lignes de l'indicateur sur le graphique et iCustom interféraient les unes avec les autres, j'ai dû faire une seule sortie programmatiquement.

Peut-être qu'une copie du code n'est pas créée dans la mémoire, mais le recalcul se fait avec ses paramètres.

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

 
comp:

Sujet :

Et alors ?
 
Alexey Volchanskiy:

J'ai récemment mis en ligne un indicateur, qui ne fait qu'afficher une chaîne de texte. Et en l'appelant par iCustom, les lignes de l'indicateur sur le graphique et iCustom interféraient les unes avec les autres, j'ai dû faire une seule sortie programmatiquement.

Peut-être, une copie du code n'est pas créée dans la mémoire, mais le recalcul va avec ses paramètresCopy

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

Une copie du code ne peut pas être créée car il s'agit d'une charge dynamique.
 
Алексей Тарабанов:
La copie de code ne peut pas ne pas être créée, car il s'agit d'une charge dynamique.

Affirmation verbale, ou êtes-vous un développeur MQ ? :))

Bien que je le pense moi-même, par analogie avec les DLL, où le code du programme est dans une instance, et les instances de données sont créées pour les clients.

En bref, le point pratique est que s'il y a un index sur un graphique, iCustom ne prend pas les données de celui-ci, mais d'une instance créée séparément.