Longueur maximale d'un nom de symbole sur le FOREX - page 2

 

En fait, je voulais faire quelque chose de gentil pour FORES, mais je suppose que ça ne devait pas se faire.

Il y a longtemps, j'ai écrit un fichier plug-in pour la magie automatique, et maintenant je l'ai modifié.

J'ai décidé de le faire pour le forex, mais ça ne devait pas se faire.

Si quelqu'un y ajoute la fonctionGetForexName, cela fonctionnera aussi pour le FOREX.

//+------------------------------------------------------------------+
//|                                                    AutoMagic.mqh |
//|                                 Copyright 2017-2018 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//version   "1.01
#define  FORTS
//---
struct SYMBOL_MAGIC
{
  long ch_id;
  ulong magic;
};
SYMBOL_MAGIC symb_magic;
//-------------------------------------------------------------------+
// Split string function                                             |
//+------------------------------------------------------------------+
string SplitString(const string a_str,ulong &a_month,ulong &a_year)
  {
   int str_size=StringLen(a_str);
   int str_tire=StringFind(a_str, "-");
   int str_tochka=StringFind(a_str, ".", str_tire);
   if((str_tire>0) && (str_tochka>0) &&(str_size > 0))
     {
      a_month= ulong(StringToInteger(StringSubstr(a_str,str_tire+1,str_tochka-str_tire-1)));
      a_year = ulong(StringToInteger(StringSubstr(a_str,str_tochka+1,str_size-str_tochka-1)));
      if((a_month > 0) && (a_year > 0)) return(StringSubstr(a_str, 0, str_tire));
     }
   return("");
  }
//-------------------------------------------------------------------+
// Get FOREX symbol function                                       |
//+------------------------------------------------------------------+
string GetForexName(const string a_str)
{
  //??????? Из любого названия пары функция долна возвращать ТОЛЬКО саму пару (н-р UERUSD)
  return("");
}  
//-------------------------------------------------------------------+
// Get Magic function                                                |
//+------------------------------------------------------------------+
ulong GetMagic(const string a_symbol)
{
//--- Get ChartID
  symb_magic.ch_id = ChartID();
//---
  if(SymbolSelect(Symbol(), true) == false)
  {
    Print(__FUNCTION__, ": Нет такого символа!");
    return(0);
  }  
#ifdef  FORTS
//--- Test symdol
  if(StringLen(a_symbol)>10)
  {
    Print(__FUNCTION__, ": Не правильный символ!");
    return(0);
  }
  if(symb_magic.ch_id != 0)
  {
    ulong month = 0;
    ulong year = 0;
    string new_str=SplitString(a_symbol,month,year);
    if(StringLen(new_str)>0)
    {
      symb_magic.magic = 0;
      uchar char_array[];
      int result=StringToCharArray(new_str,char_array,0,WHOLE_ARRAY,CP_ACP);
      if(result>0)
      {
        ulong value;
        for(int i = 0; i < result - 1; i++)
        {
          value=ulong(char_array[i]);
          value<<=(56 -(i*8));
          symb_magic.magic += value;
        }
        month<<=24;
        symb_magic.magic += month;
        year<<=16;
        symb_magic.magic += year;
        ulong a_chid = ulong(symb_magic.ch_id);
        a_chid<<=16;
        return(symb_magic.magic&=symb_magic.ch_id);
      }
    }
  }
#else
  string in_str = GetForexName(a_symbol);
  if(in_str != "")
  { 
    symb_magic.magic = 0;
    uchar char_array[];
    int result=StringToCharArray(a_symbol,char_array,0,WHOLE_ARRAY,CP_ACP);
    if(result>0)
    {
      ulong value;
      for(int i = 0; i < 6; i++)
      {
        value=ulong(char_array[i]);
        value<<=(56 -(i*8));
        symb_magic.magic += value;
      }  
      ulong a_chid = ulong(symb_magic.ch_id);
      a_chid<<=16;
      return(symb_magic.magic&=symb_magic.ch_id);
    }
  }
#endif    
  return(0); 
}
//-------------------------------------------------------------------+
// Is my magic function                                              |
//+------------------------------------------------------------------+
bool IsMyMagic(const ulong m_magic, const long chart_id)
{
  if(symb_magic.ch_id == chart_id)
  {
    ulong stored_magic=symb_magic.magic;
    stored_magic>>=16;
    ulong in_magic = m_magic;
    in_magic>>=16;
    if(in_magic == stored_magic) return(true);
  }
  return(false);
}
//+------------------------------------------------------------------+

Les deux derniers octets sont utilisés pour utiliser un grand nombre d'assistants dans un seul EA.

chart_id - est utilisé pour identifier le graphique (vous pouvez ouvrir autant de symboles identiques que vous le souhaitez)

Avant tout travail avec la magie, appelez la fonctionIsMyMagic, qui vérifiera si le magicien appartient à l'EA donnée.

 
prostotrader:

C'est juste que ce n'est pas clair comment analyser un symbole s'il peut avoir n'importe quoi devant lui :(

Créez un tableau des devises utilisées, par exemple "EUR" "USD" "JPY".
Utilisez ensuite cette fonction pour apparier toutes les combinaisons possibles, par exemple "EURUSD" "EURJPY" "USDEUR" "USDJPY" "JPYEUR" "JPYUSD".
Et à chaque fois, vous vérifiez s'il y a une occurrence de cette combinaison dans le nom du symbole que vous analysez. S'il y a une occurrence - le nom à six lettres est trouvé.

 
Andrei Fandeev:

Créez un tableau des devises utilisées, par exemple "EUR" "USD" "JPY".
Utilisez ensuite cette fonction pour apparier toutes les combinaisons possibles, par exemple "EURUSD" "EURJPY" "USDEUR" "USDJPY" "JPYEUR" "JPYUSD".
Et à chaque fois, vous vérifiez s'il y a une occurrence de cette combinaison dans le nom du symbole que vous analysez. S'il y a une occurrence - le nom à six lettres est trouvé.

Faites une faveur à tout le monde, ajoutez la fonctionGetForexName

 
prostotrader:

Merci, mais j'ai seulement besoin d'obtenir le nom "nu" de la paire (6 caractères).

Peut-être que quelqu'un a une solution toute faite ?

Ajouté

Il n'est pas clair comment analyser un symbole s'il peut avoir n'importe quoi devant la paire elle-même :(

les copieurs utilisent souvent 2 paramètres : préfixe et suffixe (un symbole supplémentaire avant EURUSD ou après)

 
prostotrader:

Merci, mais j'ai seulement besoin d'obtenir le nom "nu" de la paire (6 caractères).

Peut-être que quelqu'un a une solution toute faite ?

Ajouté

Il n'est pas clair comment analyser un symbole s'il peut avoir n'importe quoi devant la paire elle-même :(

StringFind

 

cela dépend du courtier je me souviens d'une situation qui m'a plongé dans une sorte de stupeur - le client avait une erreur, ce qui m'a vraiment fait peur et je me suis dit que je devais écrire des kits grossiers pour la reconnaissance des symboles

2016.10.16 13:08:51.633 2016.08.25 04:39 Expert EURUSD(€),M15 : Erreur OrderSend 4106

2016.10.16 13:08:51.633 2016.08.25 04:40 Expert EURUSD(€),M15 : nom de symbole EURUSD(ˆ ) inconnu pour la fonction OrderSend

 
prostotrader:

En forex, les symboles sont principalement des suffixes, très rarement des préfixes, mais la base (paire) est toujours écrite en majuscules et tous les préfixes en minuscules, ce qui permet de s'appuyer sur cette base.

 
Vitaly Muzichenko:

En forex, il y a des symboles avec des suffixes la plupart du temps, des préfixes très rarement, mais la base (paire) est toujours écrite en lettres majuscules et tous les préfixes en lettres minuscules, c'est donc un bon point de départ.

C'est plus fiable, surtout s'il s'agit d'un paramètre d'entrée pour tout réduire en cas unique StringToLower ou StringToUpper et rechercher StringFind. Ensuite, peu importe où ou quoi est ajouté.

 

si seules les paires de devises sont utilisées :

Pour SymbolInfoString()

ENUM_SYMBOL_INFO_STRING

Identifiant

Description

Type de propriété

SYMBOL_BASIS

Nom de l'actif sous-jacent du produit dérivé

chaîne de caractères

SYMBOLE_BASE_DEVISE

Devise de base de l'instrument

chaîne de caractères

SYMBOLE_DEVISE_BÉNÉFICE

Devise du bénéfice

chaîne de caractères

MARGE_DE_LA_DEVISE_SYMBOLE

Devise dans laquelle la marge est calculée

chaîne de caractères

SYMBOL_BANK

Source de la citation actuelle

chaîne de caractères

SYMBOLE_DESCRIPTION

Description en chaîne du symbole

chaîne de caractères

SYMBOL_FORMULA

Formule pour construire le prix d'un symbole personnalisé

chaîne de caractères

SYMBOL_ISIN

Nom d'un symbole boursier dans le système du numéro international d'identification des valeurs mobilières (ISIN). Le numéro international d'identification des titres est un code alphanumérique à 12 chiffres qui identifie de manière unique un titre. La présence de cette caractéristique est définie du côté du serveur commercial.

chaîne de caractères

SYMBOL_PAGE

Adresse de la page web contenant des informations sur le symbole. Cette adresse sera affichée comme un lien lors de la visualisation des propriétés du symbole dans le terminal.

chaîne de caractères

SYMBOL_PATH

Chemin dans l'arbre des symboles

chaîne de caractères

 
Konstantin Nikitin:

Il est plus fiable, surtout s'il s'agit d'un paramètre d'entrée, de tout réduire à un seul cas StringToLower ou StringToUpper et de rechercher StringFind. Ensuite, peu importe où ou quoi est ajouté.

Mais je ne comprends pas le problème, à savoir pourquoi un caractère ne peut pas être substitué à cet endroit, quelle que soit sa longueur.