Número mágico automático - página 4

 
cloudbreaker:

Me hizo pensar que sería útil documentar (de forma muy concisa)

1. Criterios para decidir la aplicación de los números mágicos

2. Criterios para decidir utilizar la generación automatizada de números mágicos

3. Criterios para decidir implementar una capa de persistencia

4. Criterios para decidir sobre el acceso a globales o a archivos para la persistencia

Respuestas breves y totalmente personales...


(2) depende de varios factores, incluyendo si el usuario quiere ser capaz de controlar los números mágicos para poder utilizarlos como una forma de agrupar los resultados de diferentes estrategias.

(3) es algo que evitaría si pudiera, pero casi nunca puedo (ver 'variables externas y cambio de marco temporal'). Estaría bien que MT4 proporcionara ayuda para persistir y recuperar el estado de los EAs. Pero no lo hace.

(4) lleva a una preferencia personal bastante fuerte: No me gustan los globales. Los usuarios pueden borrarlos; el almacenamiento está limitado a números; y el formato de gvariables.dat es oscuro. Prefiero los archivos que, como último recurso si es necesario, se pueden modificar con un editor de texto.


- Sólo me quedan 8 posts antes de tomarme un descanso por un tiempo.

Veo que has llegado al número mágico. Al menos va a hacer calor donde estás...

 

He estado trabajando en esta idea de vez en cuando, y finalmente conseguí que hiciera lo que quería. Aquí hay un generador de números mágicos que toma el código ASCII del símbolo, y lo añade al marco de tiempo y un código personalizado para generar un número mágico que es único para el marco de tiempo, el símbolo y el EA. Si supiera una forma de que el EA leyera su propio nombre, utilizaría el ASCII de éste en lugar del código personalizado. Con esa debilidad, creo que se ajusta a los criterios anteriores, sin embargo - que estaría bien con un fallo del sistema, ya que elegiría el mismo número que eligió anteriormente en el reinicio del sistema. La debilidad que podría ver es que elegiría números mágicos duplicados si el comercio de más de una instancia de la misma EA en el mismo marco de tiempo y símbolo.

Esto es lo que tengo:

string GetSymbol=Symbol();
int MNSymbol,MNSymbolCalc,MagicNumber;
for(int a=0;a<6;a++)//convertir el Symbol() en una cadena ASCII y añadir cada carácter en MNSymbol
{
MNSymbolCalc=StringGetChar(GetSymbol, a);
MNSymbolCalc=((MNSymbolCalc-64)*(MathPow(10,(a))));/resta 64 b/c los caracteres ASCII empiezan en 65, multiplica el resultado por la potencia a-ésima para mayor claridad (aunque no es necesario)
MNSymbol = MNSymbol+MNSymbolCalc;
}
int MNPeriod=Periodo();

intMNEACode=100000;//Haga este número diferente para cada EA para evitar que dos tipos diferentes de EAs elijan el mismo Número Mágico
MagicNumber=MNSymbol+MNPeriod+MNEACode;

 

JT, sí... los "problemas" de duplicación son materia de pesadilla ;)


¡Al igual que tú y sospecho que muchos, la cuestión de la unicidad es un tema recurrente que se ataca como y cuando, sin embargo, de alguna manera nunca parece correcto!

Mi código publicado anteriormente en este hilo ha sido sustituido por el siguiente que puede ser de utilidad (si no por otra razón que para una buena risa :).

***Nota la cadena de nombre de EA disponible a través de la llamada al builtin.

En los esfuerzos para hacer multi ccy,per se utilizan funciones locales. es decir, se hartó de codificar siempre el mismo código de cabecera de la función para comprobar los reales vacíos: ccy,per

de ahí mi uso de _Symbol() y _Period(). Consideraciones de velocidad/tamaño imho, incluso en el intérprete MT4 no vale la pena las energías para preocuparse por ...

De todos modos, tal vez esto da alimento para el pensamiento ...


mi razonamiento para hacer a continuación [y doc'd en la función] es:

Esta es una forma práctica de asegurar que si un EA se detiene en un CCY,PER que al volver a ejecutarlo más tarde contra el mismo CCY,PER

generará un giExpertId idéntico (aka, Magic#). Esto significa que puede reanudar la gestión de las operaciones pendientes en el grupo...

Otro EA con nombre puede ejecutarse en el mismo entorno gráfico sin temor a duplicar valores.

Por lo tanto, los OrderPools tendrán tickets con un magic# específico del EA, permitiendo la asignación por EA de sus tickets solamente.


Tu comentario sobre >1 EA con el mismo nombre en el mismo ccy,per es realmente un problema. Al final decidí que HEY! ser realista... si cometo este error entonces me merezco una patada en el trasero por ser tan irreflexivo, lol

al final, como se ha demostrado en este hilo, hay millones de ideas/métodos, cada uno con sus puntos fuertes y débiles.

Todo se reduce a obtener [al menos] un dato único cada vez que se ejecuta un EA y eso [para mí] es el problema central.

Nunca pensé mucho en que la caída de la EA/CT condujera a un reinicio y en la lata de gusanos que supone retomar lo que se dejó. Eso es cuidado ahora, siempre y cuando el EA autogens es EAid / magia # con los datos que es único para su entorno gráfico R / T. Siempre generará el mismo número...

oh bien, ¡diviértete!


int iMakeExpertId (string sSymbol="",int iPeriod=EMPTY)
{

  return( iMakeHash(_Symbol( sSymbol), getPeriodStr(_Period( iPeriod)),WindowExpertName()) );

}//iMakeExpertId()
//
//
//


//+------------------------------------------------------------------+
//
int iMakeHash (string s1, string s2= EMPTYSTRING, string s3= EMPTYSTRING, string s4= EMPTYSTRING, string s5= EMPTYSTRING
			,string s6= EMPTYSTRING, string s7= EMPTYSTRING, string s8= EMPTYSTRING, string s9= EMPTYSTRING, string s10= EMPTYSTRING)
{
  /*
  Produce 32bit int hash code from  a string composed of up to TEN concatenated input strings.
  WebRef: http://www.cse.yorku.ca/~oz/hash.html
  KeyWrd: "djb2"
  FirstParaOnPage:
  "  Hash Functions
  A comprehensive collection of hash functions, a hash visualiser and some test results [see Mckenzie
  et al. Selecting a Hashing Algorithm, SP&E 20(2):209-224, Feb 1990] will be available someday. If
  you just want to have a good hash function, and cannot wait, djb2 is one of the best string hash
  functions i know. it has excellent distribution and speed on many different sets of keys and table
  sizes. you are not likely to do better with one of the "well known" functions such as PJW, K&R[1],
  etc. Also see tpop pp. 126 for graphing hash functions.
  "

  NOTES: 
  0. WARNING - mql4 strings maxlen=255 so... unless code changed to deal with up to 10 string parameters
     the total length of contactenated string must be <=255
  1. C source uses "unsigned [char|long]", not in MQL4 syntax
  2. When you hash a value, you cannot 'unhash' it. Hashing is a one-way process.
     Using traditional symetric encryption techniques (such as Triple-DES) provide the reversible encryption behaviour you require.
     Ref:http://forums.asp.net/t/886426.aspx subj:Unhash password when using NT Security poster:Participant
  //
  Downside?
  original code uses UNSIGNED - MQL4 not support this, presume could use type double and then cast back to type int.
*/
  string s = StringConcatenate( s1, s2, s3, s4, s5, s6, s7, s8, s9, s10);
  int iHash = 5381;
  int iLast = StringLen( s)-1;
  int iPos=0;

  while( iPos <= iLast )		//while (c = *str++)	[ consume str bytes until EOS hit {myWord! isn't C concise! Pity MQL4 is"!"} ]
  {
    //original C code: hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
    iHash = (( iHash << 5) + iHash) + StringGetChar( s, iPos);		//StringGetChar() returns int
    iPos++;
  }
  return(MathAbs( iHash));
}//iMakeHash()
 
fbj:
  NOTES: 
  0. WARNING - mql4 strings maxlen=255 so... unless code changed to deal with up to 10 string parameters
     the total length of contactenated string must be <=255

Aunque personalmente prefiero la configuración manual del número mágico, tu solución es bastante elegante. Buen código.


Una corrección - las constantes de cadena tienen una longitud máxima de 255, las variables de cadena pueden ser mucho más grandes, ver -> https://www.mql5.com/en/forum/123551.

 

Gracias Gordon, el código parece funcionar bien, pero al final no es ciertamente a prueba de balas si ejecuto el mismo EA en el mismo entorno gráfico - así que sí... la configuración manual de magic# es el último método a prueba de tontos - ¡sin duda!


Para mí las cadenas siempre han sido un dolor de cabeza. Sin embargo, casi todo es posible a través de, digamos, la construcción gradual de un conjunto de herramientas, cada una utilizando las funcionalidades de las herramientas de nivel inferior.

Además, recuerdo que irusoh1 dijo/recordó que "esto es todo" así que vive con ello... Bueno, para mí, siempre recuerdo ese primer párrafo en su contenido del post y es *siempre* en mi mente cada vez que llegar a punto con MT donde suelta la voluntad de vivir :))


El MQL4 online/offline habla de los tipos de datos básicos. El enlace de cadena en ambos va a las constantes de cadena y todos sabemos lo que dice esa página de doc... es decir, 255bytes.

Entiendo completamente lo que estás diciendo, pero el hilo 29373 es, al igual que el manejo de cadenas en tiempo de ejecución MQL4, no concluyente y como jjc y sin duda muchos otros han experimentado - algo dudoso

No se puede localizar ninguna documentación para apoyar la plena utilización del formato de la estructura de 8 bytes, si hay documentación para apoyar las cadenas más largas, sería de interés.

De todos modos, en el pasado he tenido problemas irresolubles utilizando cadenas, así que prefiero ceñirme a lo que dicen los documentos y trabajar en torno a ello, si es necesario.

 
fbj:

El MQL4 online/offline habla de los tipos de datos básicos. El enlace de la cadena en ambos va a las constantes de la cadena y todos sabemos lo que esa página doc dice ... es decir, 255bytes.

Entiendo completamente lo que estás diciendo, sin embargo, el hilo 29373 es, como es el manejo en tiempo de ejecución MQL4 de cadenas, no concluyente y como jjc y sin duda muchos otros han experimentado - algo dudoso

No se puede localizar ninguna documentación para apoyar la plena utilización de la estructura de 8 bytes de formato, si hay documentación para apoyar las cadenas más largas, sería de interés.

De todos modos, en el pasado he tenido problemas irresolubles utilizando cadenas, así que prefiero ceñirme a lo que dicen los documentos y trabajar en torno a ello, si es necesario.

Apegarse a un máximo de 255 es obviamente la solución segura, aunque tengo bastante código que ignora este límite y nunca me he encontrado con ningún problema. Pero, de nuevo, este código es en su mayoría no crítico.

Sé que la documentación es un poco confusa sobre este tema, pero si tratas de navegar por los foros rusos (con Google translate) recuerdo haber leído un comentario oficial de uno de los moderadores de que las variables de cadena soportan más de 255bytes, pero no puedo encontrarlo ahora... Oh, bueno, supongo que "esto es todo" y tenemos que vivir con ello :)

 
fbj:

No puedo localizar ninguna documentación que apoye la utilización completa del formato de la estructura de 8 bytes, si hay documentación para apoyar cadenas más largas, sería de interés.

De todos modos, en el pasado he tenido problemas irresolubles utilizando cadenas, así que prefiero ceñirme a lo que dicen los documentos y trabajar en torno a ello, si es necesario.

"La longitud de una constante de cadena está comprendida entre 0 y 255 caracteres. Si la constante de cadena es más larga, los caracteres superfluos a la derecha serán rechazados, y el compilador alertará en consecuencia.

Su representación interna es una estructura de 8 bytes. El primer elemento de la estructura es un entero largo que contiene el tamaño del buffer distribuido para la línea. El segundo elemento de la estructura es la dirección de orden 32 del buffer que contiene la línea".

Citado del diccionario del MetaEditor Tipos de datos - Constantes de cadena

cosas fascinantes chicos...

 

Sé que este hilo es viejo, pero veo que todo el mundo tiene su propia manera de obtener un "número mágico" o como quieras llamarlo. También he visto que alguien quería que su EA fuera capaz de leer su propio nombre... bueno, esto es lo que yo uso para obtener el nombre de mi EA

Coloca esto en la parte superior del EA:

#define EAName "Poner el nombre del EA aquí"

Cuando su comprobación de las órdenes abiertas colocar esto:

if (OrderType() <= OP_SELL && OrderSymbol() == Symbol() && OrderComment() == EAName && OrderMagicNumber() == MagicNumber)

Para cuando su comercio es colocado asegúrese de tenerlo para que coloque el EAName para un comentario como este:

Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, EAName, MagicNumber, 0, Blue);

Entonces, si desea un número mágico que lo haría si desea ejecutar el EA en el mismo par pero diferentes TFs en el mismo tiempo..........just utilizar el esto:

int MagicNumber = Period();