Questions d'un "mannequin - page 62

 
x100intraday:
Un exemple serait...

Comme ceci (pas la structure, mais la classe, bien sûr) :

class TBuffer
{
public:
  double  MABuffer[ ];
};

//---------------------------------------------------------------------
TBuffer*  Buffer_Array[ ];
//---------------------------------------------------------------------

//---------------------------------------------------------------------
  ArrayResize( Buffer_Array, NUMBER );
  for( int i = 0; i < NUMBER; i++ )
  {
    Buffer_Array[ i ] = new TBuffer;
    SetIndexBuffer( i, Buffer_Array[ i ].MABuffer, INDICATOR_DATA );
  }

Ce qu'il faut mettre où, je pense, est clair.

N'oubliez pas la fin :

  for( int i = 0; i < NUMBER; i++ )
  {
    delete( Buffer_Array[ i ] );
  }
 
Yedelkin:

Laissez-moi reformuler. Vous vous demandez s'il est possible, en définissant une fonction

ne spécifie qu'une variable du type de la structure comme paramètre formel, en ignorant le nom de la structure elle-même ? C'est-à-dire spécifier, par exemple, non pas void funcName(MqlTradeRequest & req), mais juste void funcName(& req) ?

Oui. Vous avez besoin d'une fonction universelle pour toute structure simple --- Pas de méthodes, de din. de tableaux. etc. --- purement une séquence de types de données spécifiques.

Comme la composition du scénario est prédéterminée par moi, je peux spécifier explicitement le nombre de structures à traiter.

struct Data1
  {
   double param[1000000];
  };
struct Data2
  {
   int    temp;
   double k;
  };
struct Data3
  {
   int    temp;
   double k;
  };

Mais pour passer n'importe laquelle de ces structures dans unefonction avec un seul nom, je dois utiliser la surcharge.

void funWrite(Data1 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }
void funWrite(Data2 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }
void funWrite(Data3 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }

Il y a quelques difficultés ici.

1. le nombre de structures est limité, car la surcharge ralentira si vous avez plus d'éléments.

2. Je peux moi-même faire une erreur en copiant des fonctions de surcharge.

PS// La fonctionfunWrite() effectue certains calculs et exécuteFileWriteArray() avec une certaine séquence et des paramètres calculés (quel indice pour écrire, combien pour lire).

 
rlx:

Oui. Vous avez besoin d'une fonction universelle pour toute structure simple --- Pas de méthodes, de din. de tableaux. etc. --- purement une séquence de types de données spécifiques.

Comme la composition du script est prédéfinie par moi, je peux spécifier explicitement le nombre de structures à traiter.

Mais pour passer n'importe laquelle de ces structures à une fonction portant un nom, je dois utiliser la surcharge.

Je vois. Il y a quelque temps, j'ai posé une question similaire pour savoir s'il était possible de ne pas spécifier le type des tableaux lors de la définition d'une fonction. Juste en dessous, Roche a conseillé la surcharge.

Je suis donc arrivé à la conclusion que les fonctions "intégrées" commeFileWriteArray(), dont certains paramètres sont spécifiés avec le type void, sont elles-mêmes des fonctions surchargées. Nous ne voyons simplement pas leur mise en œuvre.

 
Yedelkin:

Je vois. J'ai déjà posé une question similaire, à savoir s'il était possible de ne pas spécifier le type des tableaux lors de la définition d'une fonction. Juste en dessous, Roche a conseillé la surcharge.

Je suis donc arrivé à la conclusion que les fonctions "intégrées" commeFileWriteArray(), dont certains paramètres sont spécifiés avec le type void, sont elles-mêmes des fonctions surchargées. Nous ne pouvons simplement pas voir leur mise en œuvre.

Les fonctions intégrées sont écrites dans un langage de programmation complet.

En C, par exemple, vous pouvez passer un nombre quelconque de variables et, déjà dans la fonction, obtenir une liste des paramètres passés et les examiner.

void fun(...)
  {
}

Dans MQL5, cette possibilité n'existe pas. En particulier, il manque des liens et des pointeurs vers des types de données et des structures simples...

 

Cela doit avoir un rapport avec la sécurité. L'accès aux données. Sortir du bac à sable.

Mais je souhaite toujours que ces fonctionnalités soient implémentées dans MQL5.

 
rlx:

Cela doit avoir un rapport avec la sécurité. L'accès aux données. Sortir du bac à sable.

Mais je souhaite toujours que ces fonctionnalités soient implémentées dans MQL5.

Il serait préférable d'écrire votre demande au Service Desk. Sinon, elle sera rapidement perdue dans le forum.
 
Dima_S:

Comme ceci (pas la structure, mais la classe, bien sûr) :

Je pense que c'est clair ce qu'il faut mettre où.

A la fin, n'oubliez pas :

C'est ce que j'appelle de l'aide : réelle et bien concrète. Merci. Où est le signe plus ?

D'ailleurs... Je me suis dit que c'était suffisant pour moi. Mais je ne veux pas être un formaliste... ... alors, par curiosité, j'ai décidé que ça ne ferait pas de mal d'essayer d'organiser un tableau à deux dimensions. MQL me rappelle quelque chose du C/C++, que j'ai oublié au cours des douze dernières années environ. Maintenant j'ai essayé de le faire de cette façon (sans boucle - j'ai intentionnellement simplifié) :

class TBuffer
{
public:
  double MABuffer[][1];
};

//---------------------------------------------------------------------
TBuffer* Buffer_Array[][1];
//---------------------------------------------------------------------
int OnInit()
  {
   ArrayResize(Buffer_Array,1);
   Buffer_Array[0][0] = new TBuffer;
   SetIndexBuffer(0,Buffer_Array[0][0].MABuffer,INDICATOR_DATA);
// --- [...]
   delete(Buffer_Array[0][0]);
   return(0);
  }

Le compilateur génère l'erreur suivante : "'MABuffer' - la conversion des paramètres n'est pas autorisée".

Je me demande ce que je fais de mal. Si je ne me trompe pas, lors de la déclaration d'une classe avec un tableau multidimensionnel, il est nécessaire de spécifier numériquement l'une des dimensions, ce qui la rend statique...ArrayResize, quant à lui, définit unenouvelle taille pour la première dimension.

 

x100intraday:

Je me demande ce que je fais de mal ?

1) SetIndexBuffer fonctionne avec un tableau de doubles de même dimension.

2) La raison pour laquelle vous utilisez TBuffer* n'est pas claire, c'est-à-dire que vous utilisez la dynamique là où elle n'est pas nécessaire ?

3) (TIP) Dans l'exemple, vous auriez pu utiliser une structure au lieu d'une classe, pour économiser un peu de mémoire et quelques centaines de cycles d'horloge.

 

mql5:

3) (TIP) Dans l'exemple, vous auriez pu utiliser une structure plutôt qu'une classe, pour économiser un peu de mémoire et quelques centaines de cycles d'horloge.

Cela a-t-il été vérifié ?
 

Le conseiller expert utilise l'indicateur sur une période différente. Lors des tests, l'EA montre des données incorrectes de l'indicateur.

L'EA lui-même fonctionne sur M5, et l'indicateur sur H4. Les indicateurs qui sont appelés sur le même cadre temporel (M5) renvoient les valeurs correctes.

Les valeurs renvoyées sont similaires aux valeurs de l'indicateur, mais sont différentes des valeurs réelles qui sont visibles lorsque l'indicateur est appliqué à la fenêtre du graphique des prix.

Quel est le problème ?

Exemple de code d'appel de l'indicateur:

int W_handle;
int OnInit()
  {
   W_handle=iCustom(NULL, PERIOD_H4, "WW");
  }

void OnNewBar() // моя функция
{
 double wave[10];
 ArraySetAsSeries(wave, true);

 CopyBuffer(W_handle,0,0,2,wave);
 if (wave[1] > 0) Buy(); 
// по замыслу в wave[1] должно лежать значение индикатора на предыдущем баре H4
// но так получается только на нескольких первых обращениях, потом результат начинает расходиться с реальностью
}
Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • 2010.03.09
  • KlimMalgin
  • www.mql5.com
C появлением новой версии языка MQL, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.