Longitud máxima de un nombre de símbolo en FOREX - página 2

 

En realidad quería hacer algo bonito para FORES, pero supongo que no estaba previsto.

Hace mucho tiempo escribí un archivo plug-in para el Magic automático, y ahora lo he retocado

Decidí hacerlo por forex, pero no estaba previsto.

Si alguien le añade la funciónGetForexName, también funcionará para 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);
}
//+------------------------------------------------------------------+

Los últimos 2 bytes se utilizan para usar muchos asistentes en un EA.

chart_id - se utiliza para identificar el gráfico (puede abrir tantos símbolos idénticos como desee)

Antes de cualquier trabajo con Magic, llame a la funciónIsMyMagic, que comprobará si el mago pertenece al EA dado

 
prostotrader:

No está claro cómo analizar un símbolo si puede tener cualquier cosa delante :(

Crear una matriz de monedas utilizadas, por ejemplo "EUR" "USD" "JPY"
A continuación, utilice esta función para emparejar todas las combinaciones posibles, por ejemplo "EURUSD" "EURJPY" "USDEUR" "USDJPY" "JPYEUR" "JPYUSD".
Y cada vez comprueba si hay una ocurrencia de esta combinación en el nombre del símbolo que está analizando. Si hay una ocurrencia - se encuentra el nombre de seis letras.

 
Andrei Fandeev:

Crear una matriz de monedas utilizadas, por ejemplo "EUR" "USD" "JPY".
A continuación, utilice esta función para emparejar todas las combinaciones posibles, por ejemplo "EURUSD" "EURJPY" "USDEUR" "USDJPY" "JPYEUR" "JPYUSD".
Y cada vez comprueba si hay una ocurrencia de esta combinación en el nombre del símbolo que está analizando. Si hay una ocurrencia - se encuentra el nombre de seis letras.

Haz un favor a todos, añade la funciónGetForexName

 
prostotrader:

Gracias, pero sólo necesito obtener el nombre "desnudo" de la pareja (6 caracteres).

¿Quizás alguien tenga una solución preparada?

Añadido

No está claro cómo analizar un símbolo si puede tener algo delante del propio par :(

los copiadores suelen utilizar 2 parámetros prefijo y sufijo (un símbolo adicional antes de EURUSD o después)

 
prostotrader:

Gracias, pero sólo necesito obtener el nombre "desnudo" de la pareja (6 caracteres).

¿Quizás alguien tenga una solución preparada?

Añadido

No está claro cómo analizar un símbolo si puede tener algo delante del propio par :(

StringFind

 

depende del corredor Recuerdo una situación que me hizo caer en una especie de estupor - el cliente tenía un error, que realmente me asustó y me imaginé que tendría que escribir kits crudos para el reconocimiento de símbolos

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

2016.10.16 13:08:51.633 2016.08.25 04:40 Experto EURUSD(€),M15: nombre de símbolo desconocido EURUSD(ˆ) para la función OrderSend

 
prostotrader:

En forex hay símbolos en su mayoría con sufijos, con prefijos muy raramente, pero siempre la base (par) se escribe en mayúsculas y todos los prefijos en minúsculas, por lo que se puede construir sobre eso.

 
Vitaly Muzichenko:

En forex hay símbolos con sufijos en su mayoría, prefijos muy raramente, pero siempre la base (par) se escribe en mayúsculas y todos los prefijos en minúsculas, así que este es un buen punto de partida.

Es más fiable, sobre todo si se trata de un parámetro de entrada para reducir todo a un solo caso StringToLower o StringToUpper y buscar StringFind. Entonces no importa dónde o qué se añada.

 

si sólo se utilizan pares de divisas:

Para SymbolInfoString()

ENUM_SYMBOL_INFO_STRING

Identificador

Descripción

Tipo de propiedad

SYMBOL_BASIS

Nombre del activo subyacente del derivado

cadena

SÍMBOLO_DIVISA_BASE

Moneda base del instrumento

cadena

SÍMBOLO_DIVISA_GANANCIA

Divisa de los beneficios

cadena

SÍMBOLO_MARGEN_DIVISA

Moneda en la que se calcula el margen

cadena

SYMBOL_BANK

Fuente de cotización actual

cadena

DESCRIPCIÓN_DEL_SÍMBOLO

Cadena de descripción del símbolo

cadena

SYMBOL_FORMULA

Fórmula para construir el precio de un símbolo personalizado

cadena

SYMBOL_ISIN

Nombre de un símbolo comercial en el sistema del Número Internacional de Identificación de Valores (ISIN). El Número Internacional de Identificación de Valores es un código alfanumérico de 12 dígitos que identifica de forma exclusiva un valor. La presencia de esta característica se define en el lado del servidor comercial.

cadena

PÁGINA_SÍMBOLO

Dirección de la página web que contiene información sobre el símbolo. Esta dirección se mostrará como un enlace al ver las propiedades del símbolo en el terminal

cadena

SYMBOL_PATH

Ruta en el árbol de símbolos

cadena

 
Konstantin Nikitin:

Es más fiable, sobre todo si se trata de un parámetro de entrada, reducir todo a un solo caso StringToLower o StringToUpper y buscar StringFind. Entonces no importa dónde o qué se añada.

Pero no entiendo el problema, por qué un carácter no puede ser sustituido allí inmediatamente, independientemente de su longitud