Mi enfoque. El núcleo es el motor. - página 97

 
Vasiliy Sokolov:

Peter, ¿qué demonios son las cuerdas? Tienes un montón de parámetros como double, int, color los conviertes en una cadena para escribirlos en el objeto del gráfico. Pero no necesitas ninguna cuerda cuando trabajas con la unión. Vuelve a mirar el ejemplo, ahí estás trabajando directamente con double, sin ninguna cadena, y los datos se pasan muy bien.

Vasiliy, además de los datos numéricos, los EAs personalizados establecen muchos datos de cadena en el motor. Nombres, mensajes, etc. Por lo tanto, es imposible hacerlo sólo con números.

Por ejemplo, el Asesor Experto de Oleg Papkov pasará textos como "La tendencia subió, la tendencia bajó..." en sus ventanas. Otros querrán pasar textos en las celdas de la tabla. En los campos de entrada.

No hay manera de hacerlo sólo con números... ((

 

Si necesitas pasar texto, entonces traduce la cadena en un array de bytes:

StringToCharArray("text", u.char);

donde u es la unión y u.char array char[] respectivamente. El array de la unión tendrá un tamaño fijo, por lo que si la cadena no cabe, se puede aumentar u.char o pasar la cadena en partes.

 
Vasiliy Sokolov:

Si necesitas pasar texto, entonces traduce la cadena en un array de bytes:

donde u es la unión y u.char array char[] respectivamente. El array de unión tendrá un tamaño fijo, por lo que si la cadena no cabe, hay que ampliar u.char o pasar la cadena por partes.

Ya veo. Gracias. Lo probaré ahora. (Aunque podría hacerlo todo a través de la descripción del objeto ). Pero quiero entender completamente los recursos. También puede ser útil.

Las funciones adicionales siempre son útiles. Y un poco de conocimiento nuevo tampoco vendrá mal...

En definitiva, muchas gracias por tu ayuda personal y la de todos los demás.

 
Реter Konow:

Ya veo. Gracias. Lo intentaré. (Aunque se podría hacer todo a través de la descripción de objetos ), pero quiero llegar al fondo de los recursos. También puede ser útil.

Las funciones adicionales siempre son útiles. Y un poco de conocimiento nuevo tampoco vendrá mal...

En definitiva, muchas gracias por tu ayuda personal y la de todos los demás.

Si quieres una comunicación rápida, no puedes hacer nada más rápido. La cadena con parámetros la pasarás a través de los objetos muy rápidamente, tal vez incluso más rápido que ResourceCreate, pero el análisis sintáctico de esta cadena matará toda su velocidad. Pero MQL es un lenguaje muy rápido, e incluso el análisis sintáctico lento es relativamente rápido aquí.

 
Vasiliy Sokolov:

Si quieres una comunicación rápida, no puedes hacer nada más rápido que la unión. Puedes pasar una cadena con parámetros a través de los objetos realmente rápido, tal vez incluso más rápido que ResourceCreate, pero el análisis de esta cadena matará tu velocidad. Pero MQL es un lenguaje muy rápido, e incluso el análisis sintáctico lento es relativamente rápido aquí.

El problema es que, en cualquier caso, será necesario el análisis sintáctico. Al fin y al cabo, incluso después de escribir la cadena en el recurso, hay que extraerla de allí, recogerla y dividirla en partes"número de parámetro/valor de parámetro".

Es decir, apenas se pueden sacar las cadenas rotas del recurso de una vez. Y por lo tanto, el parsing sigue siendo necesario...((

 
Реter Konow:

El problema es que, en cualquier caso, será necesario el análisis sintáctico. Al fin y al cabo, incluso después de escribir una cadena en el recurso, hay que extraerla de allí, recogerla y dividirla en partes"número de parámetro / valor de parámetro".

Es decir, apenas se pueden sacar las cadenas rotas del recurso de una vez. Así que todavía hay que analizar...((

Peter, lo estás haciendo de nuevo. ¿Cuántas veces ha pasado? Ya se ha dicho muchas veces: se pasan valores y números de parámetros sin usar cadenas. En tu ejemplo pasaste y obtuviste doble sin ningún tipo de análisis de cadena. Entonces, ¿por qué estás tratando de poner este doble en una cadena de nuevo? Si necesitas pasar un mensaje a un usuario - lo pasas como texto sin ningún tipo de análisis. Eso es todo.

 
Vasiliy Sokolov:

Peter, estás en ello de nuevo. ¿Cuántas veces se ha dicho? Se ha dicho muchas veces: se pasan y reciben valores de parámetros y números SIN usar cadenas. En tu ejemplo pasaste y obtuviste doble sin ningún tipo de análisis de cadena. Entonces, ¿por qué estás tratando de poner este doble en una cadena de nuevo? Si necesitas pasar un mensaje a un usuario - lo pasas como texto sin ningún tipo de análisis. Eso es todo.

Vasily, déjame intentar explicarte.

Los valores de los parámetros no son sólo números. El valor de un parámetro puede ser un texto. Por ejemplo, un usuario ha introducido un texto en el campo de entrada. Este texto se transfiere del motor al Asesor Experto. O bien, el Asesor Experto envía un texto a la interfaz gráfica de usuario en un evento específico, con el mensaje "¡Se ha iniciado una sesión de negociación!

Dado que en cada evento, el Asesor Experto o el motor necesita pasar datos de ida y vuelta de TODOS los tipos (int, double, long, string...), es más conveniente pasar todo de una sola manera, a través de una cadena, y luego fundir al tipo deseado.

Por lo demás, una forma de pasar unos datos, y otra forma de pasar otros datos.

Nadie sabe qué datos va a transferir o recibir el usuario más. Tal vez sean los textos los datos principales. Desde todos los puntos de vista, resulta que la cuerda, es un medio universal para transmitir y recibir información.

 
Vasiliy Sokolov:


Por cierto, comprueba el paso que he dado gracias a nuestras soluciones de ayer (y a tu ayuda):

En este ejemplo concreto, todo pasa por un recurso.



Y todo se hace a través de este código en el EA:

void OnTimer()
  { 
   static int q1,q2,q3,a,b,c,d; 
   //------------------------------------
   LOAD_CANVAS_Last_10_bars();
   //---------------------------------
   if(!a) { q1++;}
   if(q1 == 200)a = 1;
   if(a)q1--;
   if(!q1)a = 0;
   //------------------------------------  
   CIRCLE(q1,q2,q3,clrGreen);  
   TRIANGLE(q1,q1,q1 + 100,q1 + 10,q1 + 50,q1 + 200,clrRed);  
   ELLIPSE(q1,q1,q1 + q1*2,q1 +  q1,clrBlue);  
   FILLED_CIRCLE(q1,20,20,clrBlue); 
   TRIANGLE(q1 + 10,q1,q1 + 10,q1 + 100,q1 + 50,q1 + 200,clrAqua);  
   ELLIPSE(q1 + 50,q1,q1 + q1*2,q1 * q1-30,clrBlack);  
   ELLIPSE(q1 + 52,q1,q1 + q1*3,q1 * q1-32,clrMagenta); 
   ELLIPSE(q1 + 54,q1,q1 + q1*4,q1 * q1-34,clrOrange); 
   FILLED_CIRCLE(q1 + 70,q1+20,20,clrDarkCyan);        
   FILLED_CIRCLE(q3,q2,40,clrGreen); 
   //------------------------------------
   REDRAW_CANVAS();
  }
 
Реter Konow:

Por cierto, comprueba el paso que he dado gracias a nuestras soluciones de ayer (y a tu ayuda):

En este ejemplo concreto, todo se transfiere a través de un recurso.

Sí, se ve espectacular.

 
Реter Konow:

Desde todos los puntos de vista, parece que la cuerda es un medio universal para transmitir y recibir información.

No estoy de acuerdo contigo. El caballo de batalla universal para la transferencia de información es la matriz de bytes.

Estoy de acuerdo en que el texto debe ser transferido también. Y también estoy de acuerdo en que es mejor pasar el texto como una cadena. Pero, de hecho, una cadena es sólo una abstracción. Cuando se pasaban textos a través de objetos en el gráfico, la longitud de este texto estaba limitada a 64 caracteres. Esto significa que detrás de las escenas en realidad estabas pasando un array de 64 bytes (MQL hizo todo el trabajo de convertir una cadena en un array y de vuelta por ti, no explícitamente). Si estás haciendo un proyecto en el que el intercambio de información entre programas MQL es un punto crítico y fundamental del proyecto, está fuera de lugar dejar esta función a una solución generalizada. Si yo fuera usted, desarrollaría un sistema de transferencia generalizado para tipos arbitrarios, incluidas las cadenas, con un estricto control de la conversión. Esto podría hacerse sobre la base de recursos de análisis y lectura. Pero en el análisis de cadenas esto es problemático, porque no hay garantía de que la cadena analizada sea válida.

Razón de la queja: