Errores, fallos, preguntas - página 1439

 
George Merts:

Según mi experiencia, si el programador escribe algo en un array que contiene 10 elementos con índice 20, lo más probable es que haya cometido un error y el programa debería generar un error en lugar de aumentar el tamaño del array, ocultando así una acción cuestionable.

Todas esas "matrices que ajustan el tamaño" son mucho más problemáticas en términos de ocultar posibles errores que de conveniencia. Es más, no tener que llevar la cuenta del tamaño de un array es también una práctica potencialmente peligrosa, que conduce a errores difíciles de solucionar.

¿Soy yo o no has trabajado con las lenguas en cuestión? No es necesario especificar ningún índice para añadirlo: se asigna automáticamente y también se aumenta el tamaño del array. El programador no tiene la posibilidad de equivocarse con el índice durante esta operación.

Puedes implementar un comportamiento similar con clases, añadir las funciones relacionadas pop, shift, unshift, etc. Y arrastra un vagón de clases de código a código, con cada código usando %10...20 funciones de él. ¿Le parece una buena solución? Un ejemplo de solución correcta en mi opinión es añadir a la función ObjectsDeleteAll la capacidad de borrar por prefijo - esto es otra micra hacia la programación de nivel superior - y la mayoría de los codificadores volaron a la papelera de reciclaje así que la función se hizo a sí misma. Por desgracia, difícilmente veremos eso con las matrices...

 

И таскать телегу классов из кода в код, при том что в каждом коде из неё используются %10..20 функций.

¿No has oído hablar de incluir archivos mqh?
 

No es necesario escribir clases "smart array", ya están en la biblioteca estándar de MetaQuotes, véase la familia de clases Arry

 
Hola.Estoy tratando de utilizar MT5 para trabajar con los futuros a través de broker "Otkritie".
Al acceder a la función SymbolInfoTick resultó que los dos últimos parámetros de la estructura MqlTick
- time_msc, flag no están. ¿Es posible resolver este problema? Por ejemplo, tome MT5 de este sitio web,
Intenta conectarlo con el servidor del corredor. O es posible obtener la información requerida de otra manera.
Me interesa: ¿quién inició la transacción, el vendedor o el comprador?
 
Alexander Puzanov:

¿Soy yo, o no has trabajado con las lenguas en cuestión? No es necesario especificar un índice para el elemento añadido, se asigna automáticamente y el tamaño de la matriz también se incrementa. El programador no tiene la posibilidad de equivocarse con el índice durante esta operación

Awwwww... ¿Qué posibilidades tiene el programador de equivocarse? Se equivoca al pensar que puede tener en cuenta todas las variantes de cualquier programa complejo.

Todas esas "acciones por defecto" deben ser propiedades de objetos complejos. Los objetos simples, como las variables, las matrices y las estructuras simples, deben tener el menor número posible de propiedades "por defecto".

Por ejemplo, en la creación - deben almacenar un valor indefinido, no cero.

Se puede implementar un comportamiento similar con clases, añadir funciones relacionadas pop, shift, unshift etc. Y arrastra un vagón de clases de código a código, con cada código usando %10...20 funciones de él. ¿Le parece que esta es la solución adecuada?

Es la solución correcta en términos de lógica. Cuando se trabaja con estas clases, su comportamiento es transparente.

Y qué decir de "arrastrar un carro de clases": cuando se codifica no se arrastra, sólo se conecta la biblioteca. Y al compilar, un enlazador normal no debería poner en un ejecutable todos los métodos de la biblioteca, sino sólo los que se utilizan.

Ejemplo de la solución correcta en mi opinión - añadir a la función ObjectsDeleteAll eliminar por el prefijo - esto es otra micra hacia la programación de nivel superior - y la mayoría de los codificadores han conseguido voló en la basura esta función de creación propia. Por desgracia, es poco probable que esto ocurra con las matrices...

En mi opinión, este es también un enfoque equivocado, por la misma razón. La función está cargada de tareas que no son propias de ella y no siguen la lógica de su aplicación.

La solución correcta, me parece, es tener un gestor de objetos de clase en el gráfico que mantenga una lista de ellos, y elimine los necesarios a medida que se llaman las funciones. Los prefijos de los nombres, me parece, deben servir únicamente para aclarar a una persona alguna información sobre el objeto. Y la eliminación - no debe basarse en el nombre del objeto de ninguna manera, sino en guardar ese nombre en un array.

 
Demal:
Hola.Estoy tratando de utilizar MT5 para trabajar con los futuros a través de broker "Otkritie".
Al acceder a la función SymbolInfoTick resultó que los dos últimos parámetros de la estructura MqlTick
- time_msc, flag no están. ¿Es posible resolver este problema? Por ejemplo, tome MT5 de este sitio web,
Intenta conectarlo con el servidor del corredor. O es posible obtener la información requerida de otra manera.
Me interesa: ¿quién inició la transacción, el vendedor o el comprador?
  1. ¿Qué versión del terminal tienes ahora?
  2. ¿Te conectas a un servidor de demostración o real?
 
versión 5.0 build 1150, demo
 
Demal:
versión 5.0 build 1150, demo

Actualice su terminal (necesita conectarse al servidor de MetaQuotes-Demo). Construcción actual:

Terminal        MetaTrader 5 build 1210 started (MetaQuotes Software Corp.)

Este es el guión:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2015, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   MqlTick last_tick;
//--- 
   if(SymbolInfoTick(Symbol(),last_tick))
     {
      Print("time = ",last_tick.time,"; bid = ",last_tick.bid,
            "; ask = ",last_tick.ask,"; volume = ",last_tick.volume,
            "; time_msc = ",last_tick.time_msc,"; flag = ",last_tick.flags);
     }
   else Print("SymbolInfoTick() failed, error = ",GetLastError());
  }
//+------------------------------------------------------------------+

Da este resultado:

Test (RTS-12.15,H1)     time = 2015.11.26 09:42:57; bid = 88360.0; ask = 88400.0; volume = 2; time_msc = 1448530977000; flag = 0

Archivos adjuntos:
Test.mq5  2 kb
 
Karputov Vladimir:

Actualice su terminal (debe conectarse al servidor de MetaQuotes-Demo). Construcción actual:

Este es el guión:

Da este resultado:

Gracias, ¿sabes por qué la bandera tiene un valor de 0, como si nada hubiera cambiado?
 
Demal:
Gracias, ¿sabes por qué la bandera tiene un valor de 0, como si nada ha cambiado
UtilizaCopyTicks y serás feliz. YSymbolInfoTick probablemente no sabe cómo trabajar con la nueva estructura de ticks todavía.
Archivos adjuntos:
CopyTicks.mq5  4 kb
Razón de la queja: