Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1877

 
Maksim Emeliashin matrices estáticas de nombres de cada valor posible y búsqueda de cadenas en esta matriz.

Para MQL esta función no funcionará correctamente

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

Parámetros

cadena1

[en] La primera cadena.

cadena2

[en] Segunda cadena.

case_sensitive=true

[en] el modo de distinguir entre mayúsculas y minúsculas. Si es cierto, entonces "A">"a". Si es falso, entonces "A"="a". El valor por defecto es verdadero.

Si hay dos constantes en el enum, por ejemplo ENUM1 y enum1, entonces en i_str: la función"enum1" puede devolver el valor de la constanteENUM1. ¿Por qué StringCompare? Si se puede hacer de la siguiente manera:

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 cierre de una posición por SL.

Lo necesito para tomar una decisión sobre qué hacer a continuación.

En la ventana del historial del terminal MT5 puede seleccionar una operación, orden o posición.

En el historial de operaciones hay que buscar una operación con DEAL_REASON igual a DEAL_REASON_SL.


Añadido: Se puede simplificar - en OnTradeTransaction simplemente coger la transacción TRADE_TRANSACTION_DEAL_ADD y llamando al historial de operaciones buscar la DEAL que creó esta transacción. Y luego la misma receta: ... DEAL_REASON es igual a DEAL_REASON_SL

 
Mihail Matkovskij #:

La función no funcionará correctamente para MQL

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

Si hay dos constantes en enum, por ejemplo ENUM1 y enum1, entonces con i_str:"enum1" la función puede devolver el valor de la constanteENUM1. ¿Por qué necesitamos StringCompare de todos modos? Si se puede hacer de la siguiente manera:

Y una variante más rápida:

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 #:

¿Para qué sirve todo esto? ¿Quiere sustituir los valores numéricos de ENUM_TIMEFRAMES por los suyos propios? ¿O qué?

Bueno, ahora necesito escribir la configuración de los indicadores y los parámetros del EA en la base de datos. Al mismo tiempo me gustaría tener:

1. registros legibles para el ser humano

2. registros legibles por máquina

3. La estabilidad para añadir nuevos valores en el enum personalizado, no necesariamente al final.

No hay ningún problema con record - EnumToString, pero los desarrolladores no hicieron la función inversa, a diferencia de los demás tipos.

 
Mihail Matkovskij #:

Y una versión más rápida:

Estoy de acuerdo sobre la comparación insensible a las mayúsculas y minúsculas, escribí una moto más generalizada para mí, para mi propio enum, donde no uso las minúsculas.

Pero si para ENUM_TIMEFRAMES ejecuta esta variante:

bool StringToEnum(const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN, INT_MAX); } // медленный вариант
puedes tener tiempo para un café mientras se recoge, por ejemplo, para PERIOD_MN1 :)
 
Valeriy Yastremskiy #:

Obtenga los precios de las líneas rectas en cada barra y compare o encuentre la diferencia, en los lugares donde los signos de las diferencias de cruce cambian) Puede que no haya igualdades en la barra, por cierto.

¿Qué función se utiliza para ello? ¿Ingresos Mql? Y si uso ObjectGet entonces tengo que especificar la propiedad del objeto allí, si tomo OBJPROP_PRICE entonces cómo puedo hacer que obtenga el precio antes de la barra actual.
 
12345678902003 #:
Ayuda por favor, dibujo dos líneas de Gunn y se cruzan en un punto determinado, necesito saber las coordenadas del punto de intersección de estas líneas.
Si puedes determinar el precio del segundo punto de la línea de Gann, entonces KimIV puede ayudarte más
 
Maksim Emeliashin #:

Estoy de acuerdo sobre la comparación con la ignorancia de mayúsculas y minúsculas, escribí una bicicleta más generalizada para mí, para mi propio enum, donde no uso las minúsculas.

Pero si para ENUM_TIMEFRAMES se ejecuta esta variante:

puede tener tiempo para beber café antes de que se recoja, por ejemplo, para PERIOD_MN1 :)

Pues bien, en ENUM_TIMEFRAMES se conocen los valores mínimo y máximo. Por eso se pueden especificar explícitamente.

Con el resto del enum, basta con conocer su rango de valores aproximado. Si no se especifican las constantes en la declaración del enum, los valores allí suelen ser a partir de 0. i_max_enum puede especificarse con cualquier número de dos o tres dígitos: 50, 100, 255.

 
Maksim Emeliashin #:

En este momento, necesito escribir la configuración de los indicadores y los parámetros del EA en la base de datos. Al mismo tiempo me gustaría tener:

1. registros legibles para el ser humano

2. registros legibles por máquina

3. estabilidad para añadir nuevos valores en su enum personalizado, no necesariamente al final.

No hay ningún problema con record - EnumToString, pero los desarrolladores no hicieron una función inversa, a diferencia de los demás tipos.

¿Ha intentado alguna vez imprimir una enumeración?

Print(PERIOD_M5);

¿Qué cree que se imprimirá?


Pero crear una enumeración de forma programada... sí. Eso sería interesante.

 
x572intraday #:
¿Por qué no podemos hacer un bucle con los parámetros de entrada? ¿Por qué nos castiga así?
Esto es, por supuesto, una muleta, pero la uso: introducir todos los datos necesarios en una variable de entrada de cadena a través de algún separador dado, y luego utilizar StringSplit para desbordar en una matriz.
Razón de la queja: