[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 285

 
gyfto:

Sí. Creo que he terminado. Aquí está el recolector de garrapatas reelaborado con su empaquetado en segundas velas.

Lo fue:

Se convirtió:

Comentarios sobre el código.

1. No se hizo el cambio de caso en la selección de velas virtuales para ahorrar tiempo de CPU, en su lugar se comentaron las secciones con la selección (ya que la selección se hace para necesidades específicas una vez antes de la compilación).

2. En el trabajo con la hora local (fuera de línea que es) no trajo a la mente. En el bucle"while(time==TimeLocal()){//hasta que haya pasado un segundo", sospecho que debe haberMarketInfo en FileWriteDouble (me suena a punta de idiota). Si me decís qué parecería más lógico ahí, os lo agradeceré.

3. Una construcción de autor

Lo he declarado al final de init().

4. Al principio de init() las matrices dinámicas

en lugar de las variables utilizadas.

5. Para la optimización, teóricamente puede utilizar las funciones de archivo WinAPI y escribir en el historial de una vez en el bloque 44 bytes (longitud de la estructura MarketInfo o lo que sea en .hst).

6. Se ha eliminado completamente el modelado de tiempo del autor para escribir en la celda Time[]. Por la misma razón, en el bucle head while no se comprueba TimeLocal(), sólo TimeCurrent().

7. ¿Qué más sugiere para optimizar el código?

Desde el punto 4 se debe entender que estabas haciendo un indicador, entonces esas acciones no son claras:

ArrayResize (bid, 1);//урезаем и обнуляем использованные массивы
ArrayResize (ask, 1);

¡ ArrayInitialize() es lo más adecuado?!

Y lo más probable es que se niegue a utilizar matrices de indicadores.

 
TarasBY:

Probablemente ArrayInitialize() funcione?

ArrayInitialize(ask, EMPTY_VALUE); ¿quieres decir? No lo hice. Por qué lo corté exactamente, tenía miedo de un caso así:

(a, b, c)//valores en ask después de tres ticks por segundo (fantástico, pero supongamos).

ArrayInitialize(ask, 0);//ser (0, 0, 0)

FileWriteDouble(hand1e, ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]

- La celda Close obtendrá 0. Por eso estoy redefiniendo el tamaño para evitar que esto ocurra. Comprobar ArrayInitialize(ask, EMPTY_VALUE);.

TarasBY:

Tienes que dejar de usar matrices de indicadores.

Son dinámicos, eso es lo que me ha gustado. Menos comandos, menos ciclos del procesador. Tienes que hacer 500 milisegundos de procesamiento en cualquier f... ...para conseguirlo.

 
sabes si es posible sustituir las órdenes de envío y cierre de un EA por una ventana manual y entrar en el mercado a través de esta ventana, es necesario para aquellos brokers que no permiten usar EAs
 
gyfto:

ArrayInitialize(ask, EMPTY_VALUE); ¿quieres decir? No lo hice. Tenía miedo de un caso así, por eso empecé a reducirlo:

(a, b, c)//valores en ask después de tres ticks por segundo (fantástico, pero supongamos).

ArrayInitialize(ask, 0);//ser (0, 0, 0)

FileWriteDouble(hand1e, ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]

- La celda Close obtendrá 0. Por eso estoy redefiniendo el tamaño para evitar que esto ocurra. ArrayInitialize(ask, EMPTY_VALUE);; comprobarlos.


Son dinámicos, eso es lo que me ha gustado. Menos comandos, menos ciclos del procesador. Tienes que gestionar 500 milisegundos de procesamiento en cualquier cuello de botella teóricamente posible... ...para conseguirlo.

No me refiero a eso: algo me dice que no conseguirás reducir la matriz de indicadores. Además, si hay celdas sin rellenar en dicho array, SIEMPRE hay algún valor ahí: 0 o VALOR_VACÍO, y qué se obtiene en estos cálculos:

bid[ArrayMaximum(bid)];
ask[ArrayMinimum(ask)];
Y por lógica general: ejecutaría toda la colección de ticks en un bucle y controlaría por separado el tiempo y, en cuanto pasara el tiempo de la "nueva barra", lo escribiría en el archivo, poniendo a cero y recortando las matrices de trabajo en el proceso.
 
ex_kalibur:
Si sé, es posible cambiar las órdenes de envío y cierre en el asesor para llamar a la ventana de comercio manualmente y entrar en el mercado a través de esta ventana, es necesario para aquellos corredores que no permiten el uso de asesores
Ventana "Propiedades" del asesor -> pestaña "General" -> "Comercio automático". -> Poner una casilla en "Confirmación manual" - No conozco otra forma.
 
TarasBY:

Y por lógica general: ejecutaría toda la colección de ticks en un bucle y controlaría por separado el tiempo y, una vez pasado el tiempo de la "nueva barra", lo escribiría en el archivo, poniendo a cero y recortando las matrices de trabajo en el proceso.


Extraño... Yo lo tengo así... Lo único es que el tiempo se controla en el propio bucle de recogida de ticks, y el array de trabajo no se recorta hasta que se haya dibujado una copia del tick tantas veces como no haya habido un tick menos un segundo. Pasado un segundo - se dibuja un nuevo tick, dos - una copia del tick anterior y un nuevo tick, tres - dos copias del tick anterior y un nuevo tick, etc. En lugar de copias del tick anterior es posible dibujar una raya por el nivel de Cierre, esta variante está comentada en el código.
 
gyfto:

Extraño... Lo tengo así... Lo único es que el tiempo se controla en el propio bucle, y el array de trabajo no se recorta hasta que se dibuja una copia del tick tantas veces como no había ticks menos una. Pasado un segundo - se dibuja un nuevo tick, dos - una copia del tick anterior y un nuevo tick, tres - dos copias del tick anterior y un nuevo tick, etc. En lugar de copias del tick anterior es posible dibujar una raya por el nivel de Cierre, esta variante está comentada en el código.

Tú y yo estamos hablando de ciclos diferentes. Me refiero a esto:

    while (!IsStopped() && IsExpertEnabled())
    {
        //---- Сбор тиков
    }
 
¿Alguien puede decirme cómo eliminar los ceros después del punto decimal? Por alguna razón tengo 4 decimales en mi código. Aquí está el código. string l_dbl2str_12 = DoubleToStr(g_ibuf_140[0] - g_ibuf_144[0],3);
 
Demon2057:
¿Alguien puede decirme cómo eliminar los ceros después del punto decimal? Por alguna razón tengo 4 decimales en mi código. Aquí está el código. string l_dbl2str_12 = DoubleToStr(g_ibuf_140[0] - g_ibuf_144[0],3);
https://docs.mql4.com/ru/strings/StringSubstr
 

¿Puedes decirme qué estoy haciendo mal...

Necesito una variable de tipo doble que contenga la fecha como 0,20130429164459 (lo que significa 2013.04.29 16:44:59)

Parte del código EA:

#include <stdlib.mqh>
bool once=false;
int start()
  {
  if (once==false)
     {
    double DTM; // дата и время в формате 0,20130429164459
    int YY=TimeYear(   TimeCurrent());   // Year
    int MN=TimeMonth(  TimeCurrent());   // Month         
    int DD=TimeDay(    TimeCurrent());   // Day
    int HH=TimeHour(   TimeCurrent());   // Hour         
    int MM=TimeMinute( TimeCurrent());   // Minute
    int SS=TimeSeconds(TimeCurrent());   // Second
    DTM = YY*0.0001+MN*0.000001+DD*0.00000001+HH*0.0000000001+MM*0.000000000001+SS;
    
   Alert ("Значение переменной DTM с 06 знаками равно ", DoubleToStrMorePrecision(DTM,6));
   Alert ("Значение переменной DTM с 07 знаками равно ", DoubleToStrMorePrecision(DTM,7));
   Alert ("Значение переменной DTM с 08 знаками равно ", DoubleToStrMorePrecision(DTM,8));
   Alert ("Значение переменной DTM с 09 знаками равно ", DoubleToStrMorePrecision(DTM,9));
   Alert ("Значение переменной DTM с 10 знаками равно ", DoubleToStrMorePrecision(DTM,10));
   Alert ("Значение переменной DTM с 11 знаками равно ", DoubleToStrMorePrecision(DTM,11));
   Alert ("Значение переменной DTM с 12 знаками равно ", DoubleToStrMorePrecision(DTM,12));
   Alert ("Значение переменной DTM с 13 знаками равно ", DoubleToStrMorePrecision(DTM,13));
   Alert ("Значение переменной DTM с 14 знаками равно ", DoubleToStrMorePrecision(DTM,14));
   Alert ("Значение переменной DTM с 15 знаками равно ", DoubleToStrMorePrecision(DTM,15));
   once=true;
      }
   return(0);
  }

El registro de eventos para Precision 12,13 y 14 da un resultado erróneo, ver imagen