[ ... función hash ... ]
Para que conste, fbj hizo una vez algo similar utilizando la conocida función hash djb2: https://www.mql5.com/en/forum/120034/page2
el djb2 mencionado en tu enlace anterior podría escribirse sin todos los cientos de líneas que lo rodean simplemente como:
int djb2(string key){ int i, h, k; for (i=0; i<StringLen(key); i++){ k = StringGetChar(key, i); h = (h << 5) + h + k; } return(h); }
el djb2 mencionado en tu enlace anterior podría escribirse sin todos los cientos de líneas que lo rodean simplemente como: [...]
No soy un experto en algoritmos hash, y mucho menos en djb2 en particular, pero creo recordar que la inicialización del valor hash (la variable h en tu versión) a 5381 se considera significativa, aunque nadie sabe exactamente por qué.
* magic = makeMagicNumber(name+ Symbol() + Period());No quiero ser puntilloso, pero esto también debería poder usarse:
* magic = makeMagicNumber(WindowExpertName() + Symbol() + Period());Gracias por publicar el código (y el artículo de hash).
Pregunta - Estoy trabajando en un método para abrir y cerrar múltiples órdenes en el mismo gráfico, el mismo algoritmo, etc.
Estoy abordando en 2 pasos -
1) generar una base MN (que es lo que el código anterior parece hacer) como un número entero. La base sería siempre la misma para cada gráfico/símbolo/marco de tiempo
2) generar un sufijo específico expresado como un punto decimal para cada fin de orden específico, una vez que un sufijo queda sin usar, haciéndolo disponible de nuevo
Así, el MN sería XXXXXX.YYY donde X es la base e Y es el sufijo específico. Los sufijos comenzarían en 0,001 y se incrementarían en 0,001 para cada nuevo envío. En cada envío de órdenes, se asignaría el sufijo más bajo no utilizado actualmente. De esta manera, puedo recuperar el MN más tarde regenerando el MN base y recorriendo los sufijos
Parece un poco complicado. ¿Hay alguna forma mejor de hacer esto?
Voy a publicar lo que tengo cuando esté terminado.
Sólo uso los primeros 5 números para la versión del EA # y los últimos 4 para el número de minutos que se está negociando en.
Como NuB no estoy seguro de por qué querrías o necesitarías un MagicNumber 'encriptado' ?
Yo sólo uso los primeros 5 números para la versión del EA # y los últimos 4 para el número de minutos en que se está negociando.
¿Cómo es que en su ejemplo el Symbol() forma parte del MN? Usted tiene un número de EA y un número de Timeframe, pero ¿qué pasa con el símbolo?
Yo identifico mis órdenes sólo por MN, mis bucles sobre la lista de órdenes comparan sólo OrderMagicNumber(), el tuyo tendría que comprobar también el nombre del símbolo. Tengo algunos otros scripts independientes que hacen cosas con la lista de órdenes, por ejemplo trazar gráficos de equidad de los EAs o copiar las operaciones a otra plataforma, todos ellos necesitan sólo el número mágico para identificar las operaciones de un EA específico en un par específico y un marco de tiempo específico.
Yo no uso números de serie para mis diferentes EAs en absoluto, uso nombres cortos de 4 o 5 letras para todos mis EAs. Un EA llamado snowball.mq4, por ejemplo, tendría el nombre "snow". Este nombre está grabado en el código y nunca se cambia. También utilizo este nombre corto para los comentarios de las órdenes.
Así que tengo 3 cosas: nombre corto, Symbol y timeframe. La forma más conveniente de convertir esto en un MN es un hash. Podría dar números para mis EAs en lugar de nombres, pero todavía no habría una manera fácil de convertir el nombre del símbolo en un número. Un Hash simplemente resuelve todos estos problemas a la vez.
Como NuB no estoy seguro de por qué querrías o necesitarías un MagicNumber 'encriptado' ?
Yo sólo uso los primeros 5 números para la versión del EA # y los últimos 4 para el número de minutos que se está negociando en.
También debería ver esto -> https://www.mql5.com/en/forum/120034
El problema que tengo con todo este enfoque es que a veces tengo idéntico experto/símbolo/marco de tiempo corriendo en la misma cuenta. Así que eventualmente todavía tendría que cambiar algo manualmente, por lo que prefiero sólo establecer la magia en sí manualmente.
El problema que tengo con todo este enfoque es que a veces tengo idéntico experto/símbolo/marco de tiempo corriendo en la misma cuenta. Así que eventualmente todavía tendría que cambiar algo manualmente, por lo que prefiero sólo establecer la magia en sí manualmente.
¿Qué tal si utilizamos los segundos? TimeCurrent() devuelve un número que siempre será único - bueno, al menos fuera de ese lapso de segundos..
- Asigne un número de identificación GlobalVariable para su Experto. Devuélvalo con WindowExpertName().
- Concatene ese ID con un contador de incrementos (si adjunta el mismo experto) y TimeCurrent()
- Si el número devuelto por TimeCurrent() excede el tamaño permitido. Entonces descarta la cantidad de años y meses hasta que tengamos el módulo de días, horas, minutos y segundos.
¿Qué tal si utilizamos los segundos? TimeCurrent() devuelve un número que siempre será único - bueno, al menos fuera de ese lapso de segundos.
- Asigna un número de identificación para tu experto. Devuélvalo con WindowExpertName().
- Concatenar ese ID con un contador de incremento y TimeCurrent ()
- Si el número devuelto por TimeCurrent() excede el tamaño permitido. Entonces descarte la cantidad de años y meses hasta tener el módulo de días, horas, minutos y segundos.
Porque entonces tienes que mantener un nivel de persistencia para esa magia. ¿Qué pasa si tu Terminal se reinicia? La magia sería diferente...
Porque entonces tienes que mantener un nivel de persistencia para esa magia. ¿Qué pasa si tu Terminal se reinicia? La magia sería diferente...
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso