Características del lenguaje mql5, sutilezas y técnicas - página 214

 
fxsaber #:

No me había encontrado con una entrada así antes.

Úsalo))

 
Vladimir Simakov #:

Utilízalo))))

Vladimir, ¿dónde se consiguen esquemas como este?, me ayudaron entonces, en mi tema sobre la búsqueda de barras, ciclo mínimo, ¿hay una imagen lista en algún lugar? Soy autodidacta, en un perfil diferente originalmente

sólo poner los circuitos lógicos así, sumando, recorriendo los ciclos...
 
Vladimir Simakov #:

Así que es un bicho feroz. Ejemplo:

Se asigna la memoria, se llama al destructor cuando se libera (lo que es una pista del comportamiento esperado según RAII), pero se olvida llamar al constructor cuando se crea el objeto))

Este es el segundo error {}.

Recordatorio: 1º con rondón, 3º con unión

 
Vladimir Simakov #:

Aprovecha))

Oh, esas laconicidades post-incrementales... )
 
Fast235 #:

Vladimir, ¿de dónde sacas esos esquemas?, me ayudó entonces, en mi tema de búsqueda de bares, un ciclo mínimo, ¿hay imágenes ya hechas en algún sitio? Soy autodidacta, en un perfil diferente originalmente

Sólo hay que juntar los circuitos lógicos, sumarlos, recorrer los ciclos...

No utilices algo así, fuera de lo establecido, sin entenderlo. Con estos registros, si necesitas algo más complicado que aquí, bichos, no siempre fáciles de encontrar, puedes rellenar en un santiamén))

 
Vladimir Simakov #:

No utilices algo así, fuera de serie, sin entenderlo. Con estos registros, si se necesita algo más complejo que aquí, se pueden hacer bugs, no siempre fáciles de encontrar, en un abrir y cerrar de ojos)))

sus búsquedas de bares, eran con enumeraciones y plantillas))

He pospuesto las plantillas para casi siempre, pero me he puesto con ellas en una hora.

las sacó del código, junto con las enumeraciones, probablemente tuvo una tarea más seria para utilizarlas

--

añadir

todo está en el foro, sólo gracias.

 
Vladimir Simakov #:

Así que es un bicho feroz. Ejemplo:

Se asigna la memoria, se llama al destructor cuando se libera (lo que indica el comportamiento esperado según RAII), pero se olvida llamar al constructor cuando se crea un objeto))

Gracias por la publicación.
Corregido.

Este código causará un error de compilación ya que las secuencias de inicialización en MQL están todavía incompletas.

En el caso de las estructuras, la inicialización por secuencia no se sustituye por la llamada al constructor con parámetros relacionados - estamos planeando añadir esto (se ha pospuesto indefinidamente, pero se ha "filtrado" algo de código nuevo en producción).



 

@A100

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Peculiaridades de mql5, consejos y trucos

A100, 2021.11.16 13:43

No tiene sentido porque:

struct X {
    int i;
};
void OnStart()
{
    X x[200000] = {};
}

F5 cuelga. Además, esta es una solución contradictoria.


Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Peculiaridades de mql5, consejos y trucos

fxsaber, 2021.11.17 02:07

struct MqlTick2 : private MqlTick {};

void OnStart()
{
  MqlTick2 Ticks[4] = {}; // OK
  
  ZeroMemory(Ticks); // 'Ticks' - not allowed for objects with protected members or inheritance
}

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Peculiaridades de mql5, consejos y trucos

A100, 2021.11.17 02:20

Tú mismo has cometido el cuarto error. ¿Por qué ZeroMemory es peor que {}? Es decir, tenemos algún mecanismo no sancionado de acceso a lo privado que el compilador no puede detectar por alguna razón.

¿Crees que los desarrolladores no lo arreglarán? Hace tiempo, el compilador tampocoreaccionaba aZeroMemory.


Si recuerdas que mql fue creado a partir de C++, ambos ejemplos (sus contrapartes) funcionan bien allí, porque estas clases no tienen constructores (es decir, un constructor implícito):

  • Al declarar ClassX x[n]={}; se produce una inicialización del valor de cada elemento de la matriz.
  • Si ClassX no tiene constructores personalizados (pero tiene un constructor por defecto no establecido), entonces se realiza la inicialización cero de los objetos de la clase - independientemente de si hay campos privados.
  • Pero si hay campos const, el constructor por defecto se eliminará implícitamente, por lo que el compilador dará un error.

Ejemplo en C++:

#include <iostream>
using namespace std;

class X
{
    int a;
    public:
    int get(){return a;}

    //X(){}   //так массив x не обнуляется
    //а если нет конструктора - то обнуляется
};

int main()
{
    X x[10]={};
    for (int i=0; i<10;i++)   cout<<x[i].get()<<endl;
}

Así que si no hay campos const en la estructura/clase, entonces la lógica es correcta.

 
Se me olvidó añadir que si una clase tiene campos (objetos) no triviales, su c-tor por defecto será llamado después del zero-init de todo el objeto para dichos campos.
 
fxsaber #:

No he visto un registro así antes.

Miré a mi investigación en MQL5, puede ser peor, incluso la bomba de la historia en el indicador por varios TFs:

void FindHighLow(THL &hl[], const ENUM_TIMEFRAMES tf, const datetime start_time, const int sz_buf = 1000)
{
   ZeroMemory(hl);//hl структура
   datetime st = start_time;
   MqlRates rates[];
   for(int i = 0, c = CopyRates(_Symbol, tf, st, sz_buf, rates); ArraySize(rates) > 0 && i < ArraySize(hl);
         st = rates[0].time - PeriodSeconds(tf), c = CopyRates(_Symbol, tf, st, sz_buf, rates))
   {
        for(int j  = ArraySize(rates) - 1; j >= 0 && i < ArraySize(hl); j--)
      	{
		....	
	}
   }


Puedo escribir muchas cosas en la declaración for ))))