crear un número mágico - página 4

 
7bit:

No, pueden ser lo que quieras. al igual que el comentario. verlos como una especie de comentario numérico. Todas las operaciones manuales abiertas con la interfaz de usuario normal de MT4 tendrán el número mágico 0, por lo que puede, por ejemplo, hacer un bucle sobre todas las órdenes y cerrar/borrar todas las operaciones y órdenes manuales, dejando todas las operaciones EA intactas.

Para identificar de forma única una determinada orden existe el número de ticket.

gracias por aclararlo y por compartir sus puntos de vista. Por cierto, he aprendido mucho..

 
7bit:
/**
* Rotate a 32 bit integer value bit-wise 
* the specified number of bits to the right.
* This function is needed for calculations
* in the hash function makeMacicNumber()
*/
int bitRotate(int value, int count){
   int i, tmp, mask;
   mask = MathPow(2, count) - 1;
   tmp = value & mask;
   value = value >> count;
   value = value | (tmp << (32 - count));
   return(value);
}

No necesito MathPow(), ¿por qué nadie vio esto?
/**
* Rotate a 32 bit integer value bit-wise 
* the specified number of bits to the right.
* This function is needed for calculations
* in the hash function makeMacicNumber()
*/
int bitRotate(int value, int count){
   int i, tmp, mask;
   mask = (0x00000001 << count) - 1;
   tmp = value & mask;
   value = value >> count;
   value = value | (tmp << (32 - count));
   return(value);
}
actualizando el primer post ahora.
 
7bit:
No necesito MathPow(), ¿por qué nadie vio esto?

Se me ocurren tres razones principales:

  • Cualquiera que ya esté utilizando una función hash es poco probable que la sustituya por tu código, y por lo tanto no se preocupará por los detalles de tu código.
  • Cualquiera que no esté usando actualmente una función hash, pero que piense que podría ser una buena idea, probablemente se fiará de un código como el suyo, y sólo se preocupará de si funciona o no, y no de lo elegante u optimizado que sea.
  • Tu sustitución de MathPow() por una operación bitwise ahorrará sustancialmente menos de un milisegundo por llamada a makeMagicNumber(). Estás sugiriendo que makeMagicNumber() se llama una vez durante la vida de un EA, en init(). Por lo tanto, tu cambio ahorra menos de un milisegundo por vida del EA. Es un cambio totalmente trivial (y podría decirse que reduce la claridad del código).
 
jjc: podría decirse que reduce la claridad del código

Yo no diría que reduce la claridad. Mi intención principal es la claridad, la elegancia y la precisión, no el rendimiento.

También podría utilizar la potencia, la multiplicación, la división (y el módulo) para hacer el cambio de bits real sin utilizar ningún operador a nivel de bits. Pero en aras de la elegancia (y también de la claridad) debería hacerlo exclusivamente con uno u otro, pero no mezclado. Y como el significado de la función es desplazar bits, sólo ofuscaría el código si hiciera desplazamientos de bits con multiplicaciones.

Además mientras que la suma y la multiplicación se pueden hacer con enteros la función MathPow( ) internamente usa logaritmos, huele a aproximación y es increíblemente compleja comparada con lo que necesito, usa y devuelve un valor doble y esto no tiene nada que ver en una función de enteros que sólo debe desplazar n bits.

Tal vez debería haber hecho la pregunta de por qué no vi esto. ¿Por qué usé MathPow() en primer lugar? No lo sé. La última vez que hice algo de ensamblador fue hace 15 años, hoy estoy acostumbrado a pensar en problemas en abstracciones más altas. Tal vez esta fue la razón. En algún lugar de mi cerebro hay una fuerte conexión con que el enésimo bit sea 2^n, simplemente escribí esto sin pensar un segundo en ello. Un programador de ensamblador nunca habría hecho esto. Desplazar a la izquierda es multiplicar por 2, multiplicar por 2 es desplazar a la izquierda.

 
Hola chicos, sólo curiosidad por qué se necesita más de un experto que ejecuta el mismo tf, y el símbolo con la misma configuración?

Mi solución para la persistencia es utilizar los 32 bits de la int para mantener el tf que utilizo (10 de ellos), la versión de expertos o método de comercio que abrió la orden (tengo 4 de ellos). Todavía hay muchos bits de sobra si los necesito. Yo utilizo las operaciones bitwise y algunas funciones de conversión para manejar esto. Sé que otros hacen esto o algo similar, pero como esto no parece ser suficiente para sus situaciones, todavía estoy tratando de envolver mi cabeza alrededor de la pregunta que hice.
 
7bit:

¿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?

No lo haría, pero la gestión monetaria que estoy utilizando la basa en el MN. Así que en este caso necesito que todos sean iguales para que el MM esté teniendo en cuenta todas las operaciones abiertas. Siempre pongo el EA incluyendo la Versión y los ajustes de prioridad que estoy utilizando en el campo de Comentario de la Operación para saber qué versión y TimeFrame está utilizando el EA que estoy desarrollando y registrando en el MQL4 Strategy Tester y poder ordenarlos con el campo trade#, par de divisas o comentario. Cuando veo el diario me dice para qué moneda es la operación. Cuando los transfiero a Excel para su análisis puedo ordenarlos por el campo que quiera.
Puedo ver las ventajas de su enfoque y puede utilizarlo en algún momento en el futuro. Pero siendo un NuB estoy utilizando MM de la base de código en MQL4.Com. Así que en este punto de mi curva de aprendizaje de programación, MM no es mi prioridad. Aunque si puedo encontrar un método mejor que puedo empalmar en lo haré hasta el momento en que MM llega a la parte superior de mi lista de prioridades no me opongo a usarlo. ¡Nosotros los NuBs necesitamos toda la ayuda que podamos conseguir!
En cuanto al nombre y/o número de versión, el MN sólo permite números y no letras.
No he revisado tu código pero asumo que tu algoritmo está convirtiendo el nombre en parte de tu MN en cuyo caso no te diría inmediatamente de qué par de divisas te estás ocupando.
 
FourX:
su algoritmo está convirtiendo el nombre en parte de su MN en cuyo caso no le diría inmediatamente de qué par de divisas se está ocupando.

Convertirá de forma fiable cualquier cadena en un número entero único. Esta conversión es un camino de ida, pero nunca jamás necesito convertirlo de vuelta.

Todo lo que necesito saber es que estas operaciones con el mismo número están juntas. Es sólo un número de identificación para encontrar fácilmente todas las operaciones de esta combinación específica de EA/símbolo/TF con un solo if() en el bucle. Lo único que hay que saber sobre este número es que es único para cada combinación de EA/símbolo/marco de tiempo y que es determinista y no cambiará si mi PC decide fallar.

Todas las operaciones que lógicamente pertenecen juntas tendrán el mismo MN. Si alguna vez, en algún momento posterior, necesito saber en qué símbolo se realizaron (por ejemplo, para hacer algunas estadísticas a final de mes) puedo simplemente utilizar OrderSymbol() en estas órdenes.

 
circlesquares wrote >>
Hola chicos, solo tengo curiosidad por saber por qué se necesita más de un experto que ejecute el mismo tf, y símbolo con la misma configuración.

Mi solución para la persistencia es utilizar los 32 bits del int para mantener los tf's que utilizo (10 de ellos), la versión del experto o el método de comercio que abrió la orden (tengo 4 de ellos). Todavía hay muchos bits de sobra si los necesito. Yo utilizo las operaciones bitwise y algunas funciones de conversión para manejar esto. Sé que otros hacen esto o algo similar, pero como esto no parece ser suficiente para sus situaciones, todavía estoy tratando de envolver mi cabeza alrededor de la pregunta que hice.


No puedo hablar por nadie más, pero tengo un EA que puede tardar en cerrar una orden, y se pierde nuevos puntos de entrada porque todavía no está cerrado de la orden anterior. Me gustaría que manejara cada entrada de forma independiente y siguiera cada operación según las reglas de cada operación (sl móvil, cerrar la mitad cuando se alcance el tp, etc).
 
joetrader:


No puedo hablar por nadie más, pero tengo un EA que puede tardar en cerrar una orden, y se pierde nuevos puntos de entrada porque aún no se ha cerrado la orden anterior. Me gustaría que manejara cada entrada de forma independiente y siguiera cada operación según las reglas de cada operación (sl móvil, cerrar la mitad cuando se alcance el tp, etc).

Ya veo. ¿Así que está atado esperando la respuesta del servidor, y mientras tanto podrías estar abriendo otras órdenes?

Pero, ¿el contexto comercial que está ocupado no detiene cualquier acción relacionada con la orden?

Supongo que mientras funcione, eso es lo que realmente importa.

 

No tanto la respuesta del servidor, sino simplemente tener una orden abierta. Así que el EA puede recibir una señal de compra y comprar, y luego quedarse abierto. Unas horas más tarde llega otra señal de compra, pero como ya tiene una posición abierta, no compra porque está esperando a cerrar la primera orden. Pero no hay ninguna razón para suponer que la primera señal de compra sea más rentable que la segunda o que se gane algo esperando a que se cierre la primera antes de permitir que el EA abra órdenes adicionales. Pero todavía estoy trabajando en ello, así que para mí todavía es teoría :)

Razón de la queja: