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

 
Maksim Emeliashin tableaux statiques de noms de chaque valeur possible et une recherche de chaîne dans ce tableau.

Pour MQL, cette fonction ne fonctionnera pas correctement

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

https://www.mql5.com/ru/docs/strings/stringcompare

Paramètres

Chaîne 1

[in] La première chaîne de caractères.

chaîne2

[in] Deuxième corde.

case_sensitive=true

[en] Mode sensible à la casse. Si c'est vrai, alors "A">"a". Si elle est fausse, alors "A"="a". La valeur par défaut est true.

S'il y aura deux constantes dans l'enum, par exemple ENUM1 et enum1, alors à i_str : la fonction"enum1" peut retourner la valeur de la constanteENUM1. Pourquoi StringCompare? Si cela peut être fait de la manière suivante :

template<typename T>
bool StringToEnum(const string i_str, T &o_val)
{
   for(int i = INT_MIN; i <= INT_MAX && !IsStopped(); i++) // перебор всех возможных значений int
      {
         o_val = (T)i;
         if(i_str == EnumToString(o_val))
            return(true);
      }
   o_val = WRONG_VALUE;
   return(false);
}
 
Amon1953 de la fermeture d'une position par SL.

J'en ai besoin pour prendre une décision sur ce qu'il faut faire ensuite.

Dans la fenêtre de l'historique du terminal MT5, vous pouvez sélectionner une transaction, un ordre ou une position.

Dans l'historique des transactions, vous devez rechercher une transaction avec DEAL_REASON égale à DEAL_REASON_SL.


Ajouté : Cela peut être simplifié - dans OnTradeTransaction, il suffit d'attraper la transaction TRADE_TRANSACTION_DEAL_ADD et d'appeler l'historique des transactions pour rechercher la DEAL qui a créé cette transaction. Et ensuite la même recette : ... DEAL_REASON égale DEAL_REASON_SL

 
Mihail Matkovskij #:

La fonction ne fonctionnera pas correctement pour MQL

https://www.mql5.com/ru/docs/strings/stringcompare

S'il y a deux constantes dans enum, par exemple ENUM1 et enum1, alors avec i_str :"enum1" la fonction peut retourner la valeur de la constanteENUM1. Pourquoi avons-nous besoin de StringCompare de toute façon? Si cela peut être fait de la manière suivante :

Et une variante plus rapide :

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

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

A quoi sert tout cela ? Voulez-vous remplacer les valeurs numériques de ENUM_TIMEFRAMES par les vôtres ? Ou quoi ?

Pour l'instant, je dois écrire les paramètres des indicateurs et de l'EA dans la base de données. En même temps, je voudrais avoir :

1. les enregistrements lisibles par l'homme

2. les enregistrements lisibles par machine

3. la stabilité pour ajouter de nouvelles valeurs dans l'enum personnalisé, pas nécessairement à la fin.

Il n'y a pas de problème avec record - EnumToString, mais les développeurs n'ont pas fait de fonction inverse, contrairement à tous les autres types.

 
Mihail Matkovskij #:

Et une version plus rapide :

Je suis d'accord sur la comparaison insensible à la casse, j'ai écrit un vélo plus généralisé pour moi-même, pour mon propre enum, où je n'utilise pas les minuscules.

Mais si pour ENUM_TIMEFRAMES on utilise cette variante :

bool StringToEnum(const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN, INT_MAX); } // медленный вариант
vous pouvez avoir le temps de prendre un café pendant qu'il reprend, par exemple pour PERIOD_MN1 :)
 
Valeriy Yastremskiy #:

Obtenez les prix des lignes droites sur chaque barre et comparez ou trouvez la différence, aux endroits où les signes des différences de croisement changent) Il se peut qu'il n'y ait pas d'égalités sur la barre, d'ailleurs.

Quelle fonction est utilisée pour cela ? MqlRates ? Et si j'utilise ObjectGet alors je dois spécifier la propriété de l'objet, si je prends OBJPROP_PRICE alors comment puis-je faire pour qu'il obtienne le prix avant la barre actuelle.
 
12345678902003 #:
Aidez-moi s'il vous plaît, j'ai dessiné deux lignes de Gunn et elles se croisent à un certain point, j'ai besoin de connaître les coordonnées du point d'intersection de ces lignes.
Si vous pouvez déterminer le prix du deuxième point de la ligne de Gann, alors KimIV peut vous aider davantage.
 
Maksim Emeliashin #:

Je suis d'accord sur la comparaison avec l'ignorance de la casse, j'ai écrit un vélo plus généralisé pour moi-même, pour mon propre enum, où je n'utilise pas les minuscules.

Mais si pour ENUM_TIMEFRAMES cette variante est exécutée :

vous pouvez avoir le temps de boire un café pendant qu'il reprend, par exemple, pour PERIOD_MN1 :)

Eh bien, dans ENUM_TIMEFRAMES, les valeurs minimale et maximale sont connues. C'est pourquoi ils peuvent être spécifiés explicitement.

Pour le reste de l'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 qui s'y trouvent sont généralement de 0. i_max_enum peut être spécifié par n'importe quel nombre à deux ou trois chiffres : 50, 100, 255.

 
Maksim Emeliashin #:

Pour l'instant, j'ai besoin d'écrire les paramètres des indicateurs et de l'EA dans la base de données. En même temps, je voudrais avoir :

1. les enregistrements lisibles par l'homme

2. les enregistrements lisibles par machine

3. stabilité pour ajouter de nouvelles valeurs dans son enum personnalisé, pas nécessairement à la fin.

Il n'y a pas de problème avec record - EnumToString, mais les développeurs n'ont pas fait une fonction inverse, contrairement à tous les autres types.

Avez-vous déjà essayé d'imprimer une énumération ?

Print(PERIOD_M5);

A votre avis, qu'est-ce qui sera imprimé ?


Mais créer une énumération de façon programmatique... oui. Ce serait intéressant.

 
x572intraday #:
Pourquoi ne pouvons-nous pas passer en boucle les paramètres d'entrée? Pourquoi nous punissez-vous comme ça ?
Il s'agit bien sûr d'une béquille, mais je l'utilise : entrez toutes les données requises dans une variable d'entrée de type chaîne de caractères via un séparateur donné, puis utilisez StringSplit pour les déborder dans un tableau.
Raison: