Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 1087

 
rabanik:
Buenas tardes. Por favor, ayúdame a escribir el siguiente código, para un EA. Quiero hacer a través de una matriz (si tiene una mejor opción, por favor ayuda). En general, el EA envía mensajes, pero quiero que los envíe a través de un array (temporal). Es decir, cuando se inicia el envío del mensaje, el Asesor Experto comprueba si el mensaje ha sido enviado anteriormente (comprueba si el mensaje está almacenado en la matriz), si no, envía el mensaje, si el mensaje se encuentra, entonces se omite el envío. Espero que quede claro) ¡Muchas gracias!

¿Está seguro del planteamiento del problema?

Simplemente, hay opciones:

- No repetir el último mensaje

- para ignorar el obsoleto (se establece un cierto desfase), es decir, el mensaje debe repetirse.

P.D. La primera variante es un caso especial de la segunda, pero es mucho más fácil de aplicar. Su definición del problema es también un caso especial de la segunda variante con desfase infinito.

Si te interesa, aquí tienes la solución a tu problema.

Definimos dos matrices: una de texto, que almacena los mensajes, y otra de índices, para buscar los mensajes.

La matriz de índices es de tipo int. En la primera dimensión escribimos la suma de comprobación del mensaje de texto. En el segundo - el número de línea de la primera matriz. Un array de índices se ordena por la primera dimensión.

Recibimos un nuevo mensaje. Lee su suma de comprobación. Usando la función ArrayBsearch() encontrar dicho mensaje. Si no se encuentra, el mensaje es original. Añádelo al array de mensajes y, suma de comprobación con referencia al array de índices, recordando que hay que ordenarlo.

¿Cuáles son las opciones para la suma de comprobación? Yo me quedaría con esta: tener en cuenta el número de caracteres y la suma de comprobación del texto. La suma de comprobación del texto, por ejemplo, es la suma de los códigos de caracteres. Dados los cambios recientes, no puede superar los 65 536*256. Es decir, la suma de comprobación del mensaje puede tener el siguiente aspecto:

el número de caracteres multiplicado por 10 millones y añadir la suma de comprobación del texto.

 

¡Pro! Hay un problema con la línea del ángulo.

He construido unTRENDBYANGLE utilizando coordenadas.

ObjectCreate(0,"anglestok",OBJ_TRENDBYANGLE,0,0,0);
ObjectSet("anglestok",OBJPROP_TIME1,X1); ObjectSet("anglestok",OBJPROP_PRICE1,Y1);
ObjectSet("anglestok",OBJPROP_TIME2,X2); ObjectSet("anglestok",OBJPROP_PRICE2,Y2);

- Necesito un ángulo.

anglestok= ObjectGetDouble(0,"anglestok",OBJPROP_ANGLE);

La ayuda dice que la línea creada por el programa - el ángulo de CERO está bien.

He vuelto a ejecutar el mismo código en las mismas coordenadas sin tocar la línea - aparece el número correcto de grados, no cero. ¿por qué, cómo puedo hacerlo bien la primera vez?

o di una coordenada - pregunto por el ángulo - dice 0. doy otra enseguida - dice el ángulo de las coordenadas anteriores. tonterías

 
¿Para qué casos ponen const después de la descripción de la firma de la función? No encuentro ninguna información al respecto.
void qwe(int abc) const {...}
 
Parece que no puedo encontrar ninguna persona con conocimientos reales aquí, acaba de firmar para nada =/
 
K_i_r_i_t_o:
He movido este comentario al principio porque nadie ha contestado, pero realmente lo necesito =/
¿Es posible implementar esto:si pulso cualquier tecla, una parte del código del indicador se enciende (responsable de crear un objeto con un clic del ratón), entonces si se produce un evento (la segunda parte del código, el evento puede ser, la creación del mismo objeto, por ejemplo), entonces la primera parte del código se desactiva (y si no hace esto, el objeto se crea por cada clic), y también se ejecuta cuando se pulsa la tecla, y así sucesivamente alrededor del círculo)
Puedes hacerlo. Añadir el bloque OnChartEvent. En él, anote las presiones necesarias, las medidas y describa la reacción a las mismas según su idea.
 
SunnYtheDreamer:
Puedes hacerlo. Añadir el bloque OnChartEvent. En él, anote las presiones necesarias, las medidas y describa la reacción a las mismas, según su idea.
Implementar la desactivación de una parte del código durante un periodo de tiempo antes de pulsar la tecla es imposible =/ Hay una variante más fácil, pero hay un problema,al pulsar la tecladebodevolver su valor al principio de la primera sentencia if
#define  VK_D 0x44
void OnChartEvent(const int id,         // идентификатор события   
                  const long& lparam,   // параметр события типа long 
                  const double& dparam, // параметр события типа double 
                  const string& sparam) // параметр события типа string 
{ 
 Comment(__FUNCTION__,": id=",id," lparam=",lparam," dparam=",dparam," sparam=",sparam);

int      y     =(int)dparam;
datetime dt    =0;
double   price =0;  
int      window=0;
int i;
int x=(int)lparam;

if (id==CHARTEVENT_CLICK)
{
ChartXYToTimePrice(0,x,y,window,dt,price);
ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);

if(id==CHARTEVENT_KEYDOWN) 
{ switch(int(lparam)) 
{ case VK_D:
i=rand();
}}}}
 
K_i_r_i_t_o:
No puedo implementar la desactivación de una parte del código para el período antes de la pulsación de latecla =/ Hay una manera más fácil, pero hay un problema:i necesita devolver su valor al principio de la primera declaración if cuando se pulsa la tecla.
if (id==CHARTEVENT_CLICK)
{
   ChartXYToTimePrice(0,x,y,window,dt,price);
   ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
   ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);

   if(id==CHARTEVENT_KEYDOWN) 
   {
      switch(int(lparam)) 
      {
         case VK_D: i=rand();
      }
   }
}
Este código se ejecutará sólo si se pulsa el ratón. En este caso, después de 3 líneas de código, se comprueba el evento de pulsar la tecla. Y estas 3 líneas de código se ejecutan en unos pocos milisegundos, e incluso si el id durante la llamada actual OnChartEvent es capaz de cambiar, la probabilidad de que durante la ejecución de 3 líneas de código, la tecla sea presionada = 0%. Obviamente, no tiene sentido comprobar el id, dentro de un bloque que se activa en un determinado valor de id, y esperar allí un valor diferente. Primero, comprueba la pulsación de la tecla, en un bloque separado, guarda en una variable el número de la tecla o simplemente el hecho de pulsar la tecla deseada. Y con esta variable, activar o desactivar el trozo de código situado en el bloque para el clic del ratón.
char key = -1; //эта переменная должна быть объявлена за пределами блока OnCharEvent
if(id==CHARTEVENT_KEYDOWN)
key = lparam;

if (id==CHARTEVENT_CLICK && key == 'D')
{
   ChartXYToTimePrice(0,x,y,window,dt,price);
   ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
   ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);
   i=rand();
   key = -1;
}
 
SunnYtheDreamer:
Este código sólo se ejecutará si se hace clic con el ratón, con 3 líneas de código que comprueban un evento de pulsación de teclas. Y estas 3 líneas de código se ejecutan en unos pocos milisegundos, e incluso si el id durante la llamada actual OnChartEvent es capaz de cambiar, la probabilidad de que durante el tiempo, la ejecución de 3 líneas de código, la tecla se presiona = 0%. Obviamente, no tiene sentido comprobar el id, dentro de un bloque que se activa en un determinado valor de id, y esperar allí un valor diferente. Primero, comprueba la pulsación de la tecla, en un bloque separado, guarda en una variable el número de la tecla o simplemente el hecho de pulsar la tecla deseada. Y con esta variable, activar o desactivar el trozo de código situado en el bloque para el clic del ratón.

Muchas gracias) Esta es la línea que estaba buscando if (id==CHARTEVENT_CLICK && key == 'D'), no podía conectar dos eventos, esto no funcionaba if (id==CHARTEVENT_CLICK & id==CHARTEVENT_KEYDOWN) Muchas gracias de nuevo)

 

Hola, tengo una función que calcula el tamaño medio de una vela a partir de las últimas n velas. a veces da como resultado los siguientes valores: "5e-05.0". no los necesito, para mi vergüenza no sé cuantitativamente cuántos y cómo cortarlos. NormalizeDouble() no ayuda. Por favor, dígame cómo calcular estos números de forma programada para cortarlos

 
pycha:

Hola, tengo una función que calcula el tamaño medio de una vela a partir de las últimas n velas. a veces da como resultado los siguientes valores: "5e-05.0". no los necesito, para mi vergüenza no sé cuánto son y cómo cortarlos. NormalizeDouble() no ayuda. Por favor, dígame cómo calcular estos números de forma programada para cortarlos


5e-05 (5*10 a -5ª potencia) = 0,00005.
Qué cortar, entonces:
if(val >= 0.00001)
Estas velas pequeñas, de 5 pips, sólo pueden ocurrir en latitudes bajas, en una cuenta de 5 dígitos, en marcos de tiempo bajos. Si no se trata de scalping, pero la media es a veces tan pequeña para n velas, entonces la implementación de la función debe ser sospechosa.