Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1878

 
Mihail Matkovskij #:

Eh bien, dans ENUM_TIMEFRAMES, les valeurs minimale et maximale sont connues. Ils peuvent donc être définis explicitement.

Avec les autres enum, il suffit de connaître leur plage de valeurs approximative. Si les constantes ne sont pas spécifiées dans la déclaration de l'enum, les valeurs commencent généralement à 0. i_max_enum peut être défini par n'importe quel nombre à deux ou trois chiffres : 50, 100, 255.

Vous pouvez également obtenir expérimentalement les valeurs minimales et maximales de l'enum. Notez-les et spécifiez-les dans StringToEnum pour une vitesse optimale :

int nEnum;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T>
bool enumFindMinMax(const T _enum, int &__min, int &__max, int _minEnum, int _maxEnum) {
  T enum_;
  int min, max;
  min = INT_MAX; max = INT_MIN;
  nEnum = 0;
  for(int i = _minEnum; i <= _maxEnum && !IsStopped(); i++) {
    enum_ = (T)i;
    if(StringFind(EnumToString(enum_), "::", 0) >= 0)
      continue;
    if (i < min)
      min = i;
    if (i > max)
      max = i;
    nEnum++;
  }
  if (min != INT_MAX && max != INT_MIN) {
    __min = min;
    __max = max;
    return true;
  }
  return false;
}

template <typename T>
bool enumFindMinMax(const T _enum, int &__min, int &__max) { return enumFindMinMax(_enum, __min, __max, INT_MIN, INT_MAX); }

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart() {
  int min, max;
  if (enumFindMinMax((ENUM_ACCOUNT_INFO_DOUBLE)0, min, max, -500, 500))
    printf("enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: %d, max: %d, Count: %d", min, max, nEnum);
  else
    Print("enumFindMinMax Error!");
}

Résultat du script :

enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: 37, max: 52, Count: 14

Ouvrez ENUM_ACCOUNT_INFO_DOUBLE et voyez. Le nombre de constantes est compté (14). Ainsi au début de l'application vous pouvez manipuler tous les enum nécessaires, écrire leurs valeurs minimales et maximales et utiliser StringToEnum correspondant aux min et max avec la meilleure vitesse.

P.S. La deuxième variante de enumFindMinMax avec INT_MIN et INT_MAX est vraiment très lente. J'ai essayé au début. Puis j'en ai eu assez d'attendre que enumFindMinMax se termine et j'ai défini des valeurs de -500 à 500.

if (enumFindMinMax((ENUM_ACCOUNT_INFO_DOUBLE)0, min, max, -500, 500))

Je suis donc arrivé à la conclusion qu'il n'est pas nécessaire d'utiliser toute la gamme des int.

Dossiers :
 

Je suis confronté à un comportement étrange du terminal.

La situation est la suivante : un conseiller expert travaille sur un graphique, qui à un moment donné ouvre un autre graphique et définit un certain temple sur le nouveau graphique. Ce dernier modèle a été défini pour lancer le second EA sur le nouveau graphique.

Tout fonctionne bien en milieu de semaine, mais lorsque le marché est fermé, le week-end, le nouveau templet est lancé sur le nouveau graphique (comme on peut le voir en changeant l'apparence du graphique), mais le second EA n'y démarre pas. La seule façon de "pousser" le deuxième conseiller expert est de le lancer manuellement, sur n'importe quel graphique, n'importe quel script, même un script absolument vide. Ensuite, le deuxième expert commence à travailler sur un nouveau graphique.

J'ai écrit ce code dans le premier conseiller expert en utilisant les fonctions ChartOpen et ChartApplyTemplate et en utilisant la classe CChart - cela se passe toujours de la même façon, dans un marché fermé, le deuxième conseiller expert sur un nouveau graphique ne démarre pas jusqu'à ce que je "pousse" manuellement le terminal.

Qui a pu être confronté à une telle situation ? Comment y faire face, comment "creuser" ?

 
akskarabey ChartApplyTemplate et en utilisant la classe CChart - cela se passe toujours de la même façon, dans un marché fermé, le deuxième conseiller expert sur un nouveau graphique ne démarre pas jusqu'à ce que je "pousse" manuellement le terminal d'une manière ou d'une autre.

Qui a pu être confronté à une telle situation ? Comment y faire face, comment "creuser" ?

Comment savez-vous qu'elle ne démarre pas ?

P.S.

Essayez comme ceci

int OnInit()
{
....
....

 ChartRedraw();
  return(INIT_SUCCEEDED);
}
 
Mihail Matkovskij #:

Vous pouvez trouver la constante dans l'enum avec une fonction de force brute (même principe que), en la traduisant avec EnumToString et en la comparant avec la constante désirée. Il ne reste plus qu'à renvoyer le résultat.

Peut-on avoir un exemple (ou au moins une ligne clé), car rien ne me vient à l'esprit ? Devriez-vous également passer en revue une énorme liste de valeurs, en passant au crible tous les gauchers ou vous contenter de rechercher les valeurs utiles ? Pour l'instant, je pense qu'il n'y a rien à tamiser, il n'y a pas de gauchers dans la liste... mais je n'arrive pas à saisir l'idée.

 
x572intraday #:

Pouvez-vous me donner un exemple (ou au moins une ligne clé), car je n'arrive pas à trouver quoi que ce soit ? S'agirait-il également d'une énorme liste de valeurs avec un tri des bonnes parmi les valeurs de gauche, ou n'y aurait-il que des valeurs utiles ? Pour l'instant, je pense qu'il n'y a rien à tamiser, il n'y a pas de gauchers dans la liste... mais je n'arrive pas à saisir l'idée.

Pour éviter de passer par toutes les valeurs possibles de l'enum (parce que c'est vraiment long) les préparations suivantes devraient être faites(quelque chose comme la mise en cache). Ensuite, avec l'aide de cette fonction, vous pouvez facilement traduire les chaînes/rangs en enum en connaissant les plages de tous les enums nécessaires. Ou bien on peut chercher un enum dans une plage relativement petite.

template<typename T>
bool StringToEnum(const string i_str, T &o_val, int i_min_enum, int i_max_enum)
{
   for(int i = i_min_enum; i <= i_max_enum && !IsStopped(); i++) {
     o_val = (T)i;
     if(i_str == EnumToString(o_val))
       return(true);
   }
   o_val = WRONG_VALUE;
   return(false);
}


template<typename T>
bool StringToEnum(const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN, INT_MAX); } // медленный вариант
 
Vitaly Muzichenko #:

Comment avez-vous déterminé qu'elle ne démarrait pas, comment le savez-vous ?

P.S.

Essayez comme ceci

Le deuxième expert dans la section OnInit fait des conclusions dans le journal et il n'y a pas de messages de journal. Le journal ne contient même pas de message du terminal concernant le démarrage du conseiller expert. Et le nom du conseiller expert n'apparaît pas sur le graphique dans le coin supérieur droit.

 
12345678902003 #:
Et quelle fonction est utilisée à cette fin ? MqlRates ? Si j'utilise ObjectGet, je dois y spécifier la propriété de l'objet ; si j'utilise OBJPROP_PRICE, comment dois-je faire pour qu'il récupère le prix jusqu'à la barre actuelle.

Get est Get. Et il y a une fonction pour obtenir le prix ou le temps sur une barre à partir d'un objet par nom ou par type d'objet et le nom obtient une certaine propriété de l'objet. Ce n'est pas le numéro de la barre, mais le décalage par rapport au zéro qui est utilisé.

 
Valeriy Yastremskiy #:

Get est Get. Et il y a une fonction pour obtenir le prix ou le temps sur une barre à partir d'un objet par nom ou par type d'objet et le nom obtient une certaine propriété de l'objet. Ce n'est pas le numéro de la barre, mais le décalage par rapport au zéro qui est utilisé.

Cela peut être fait en utilisant la fonction ObjectGetValueByTime().

Exemple

double p = ObjectGetValueByTime( 0,"имя объекта...",Time[0]);
 
J'ai le problème suivant - le dossier Terminal MQL4\Indicators contient des indicateurs dans sa liste d'indicateurs, mais le terminal MQL4 lui-même ne contient pas ces indicateurs dans sa liste à partir de laquelle ces indicateurs sont glissés sur le graphique. Comment faire apparaître ces indicateurs dans la liste des terminaux, afin qu'ils puissent être utilisés dans le graphique du terminal MQL4 ? Dans la capture d'écran à droite, les indicateurs disponibles dans le terminal MQL4 et à gauche, les indicateurs du même terminal dans le dossierMQL4 4\Indicators (à titre d'exemple).
Dossiers :
 
Halina Okopna-Pecuch #:
J'ai le problème suivant - la liste des indicateurs dans le dossier Terminal\MQL4\Indicators contient des indicateurs, mais dans le terminal MQL4 dans sa liste à partir de laquelle ces indicateurs sont glissés sur le graphique, ils ne le sont pas. Comment faire apparaître ces indicateurs dans la liste des terminaux, afin qu'ils puissent être utilisés dans le graphique du terminal MQL4 ? Dans la capture d'écran à droite, les indicateurs disponibles dans le terminal MQL4 et à gauche, les indicateurs du même terminal dans le dossierMQL4 4\Indicators (à titre d'exemple ).

Ce ne sont probablement pas des indicateurs.