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

 
comp:

Sujet :

Epelle-le bien et tu seras heureux.
 
Dmitry Fedoseev:
Et alors ?

Lancez l'indicateur, puis - le conseiller expert

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

Vous remarquez que les valeurs de la mémoire tampon de l'indicateur (CTRL+D) ne coïncident pas avec les valeurs iCustom (elles sont imprimées dans le commentaire du graphique du conseiller expert).

Dans le cas de notre test, iCustom donnera soit EMPTY_VALUE soit zéro.

 

Vérifié. Ce n'est pas qu'il ne correspond pas, il n'est pas là du tout. Plutôt cool.

 
comp:

A en juger par le silence, plus de sept ans depuis que ce problème a été annoncé publiquement dans le quatrième forum (google se souvient), les développeurs n'ont pas créé de fonctionnalité.

Pour une raison quelconque, ils ne peuvent toujours pas faire une lecture humaine des données de l'indicateur à partir du graphique ! Ça semble fou, mais ça l'est.

Le problème est dans l'énoncé du problème.

Vous utilisez juste les indicateurs dans le mauvais but. Ils ne sont pas conçus pour être chronométrés et réagir aux événements, ils sont conçus pour retravailler économiquement les séries chronologiques.

Abordez votre tâche sous un autre angle et vous trouverez une solution agréable et économique.

 
Il ne s'agit pas de la lecture des tampons, mais du fait que l'indicateur appelé via iCustom() n'a pas de minuterie ni d'événements graphiques.
 
Dmitry Fedoseev:
Il ne s'agit pas de la lecture des tampons, mais du fait que l'indicateur appelé via iCustom() n'a pas de minuterie ni d'événements graphiques.

A quoi servent-ils ?

Eh bien, sérieusement, pour quoi faire ?

 
Andrey Khatimlianskii:

A quoi servent-ils ?

Eh bien, sérieusement, pourquoi ?

Je n'en ai pas besoin. Mais ici, quelqu'un en avait besoin, il s'avère.
 
Andrey Khatimlianskii:

Le problème est dans l'énoncé du problème.

Vous utilisez simplement les indicateurs dans le mauvais but. Ils ne sont pas conçus pour être chronométrés et réagir aux événements, ils sont conçus pour retravailler économiquement les séries chronologiques.

Abordez votre tâche sous un autre angle et vous trouverez une solution agréable et économique.

C'est comme un coup de marteau sur la tête que de faire une telle déclaration. J'ai décidé de chercher des indicateurs dans kodobase. Je n'en ai trouvé aucun qui utilise ce à quoi je suis habitué : modèle piloté par les événements + POO.

Il est difficile de dire ce qui est le plus important : la frustration ou la déception face à cet état de fait. Il s'avère que les indicateurs DOIVENT être écrits de manière primitive.

Quelqu'un utilise-t-il le modèle d'événement + la POO dans les indicateurs ?

Cela n'enlève rien à la perplexité que suscite le fait que l'on ne puisse pas obtenir par programme ce que l'on voit avec les yeux sur un graphique !

 
En écrivant un Expert Advisor de test avec iCustom, j'ai été confronté à un problème MQL insoluble. Pour connaître le nom du fichier (voir le code) de l'indicateur et les valeurs des paramètres d'entrée - aucun problème. Mais après cela, il est impossible d'insérer les paramètres d'entrée de l'indicateur dans iCustom. La façon dont iCustom est appelé est qu'une solution universelle pour n'importe quel indicateur ne convient que dans le cas des paramètres d'entrée par défaut. Sinon, nous devons aller dans le code. Cette solution n'est pas pratique. Nous pourrions passer les entrées de l'indicateur comme une structure avec les champs de chaîne appropriés. Mais nous avons utilisé l'ellipse, ce qui a tué l'universalité de l'appel. Une autre restriction étrange !
 
comp:

C'est comme un coup de pied dans la tête de faire une déclaration comme celle-là. J'ai décidé de chercher des indicateurs dans kodobase. Je n'en ai trouvé aucun qui utilise ce à quoi je suis habitué : modèle piloté par les événements + POO.

Il est difficile de dire ce qui est le plus important : la frustration ou la déception face à cet état de fait. Il s'avère que les indicateurs DOIVENT être écrits de manière primitive.

Quelqu'un utilise-t-il le modèle d'événement + la POO dans les indicateurs ?

Cela n'enlève rien à la perplexité que suscite le fait que l'on ne puisse pas obtenir par programme ce que l'on voit avec les yeux sur un graphique !

Pourquoi ? Tout a déjà été volé là avant nous, il y a la fonction OnCalculate - événement tick. Si vous voulez utiliser la POO - utilisez-la, mais à quoi sert-elle, où la mettre ?
Raison: