Preguntas sobre POO en MQL5 - página 40

 
Dmitry Fedoseev:

const - si es necesario prohibir la asignación de variables (excepto una vez durante la inicialización). Si una variable se declara como const, entonces al pasarla a una función por referencia, el argumento de la función también debe ser const, pero el compilador lo forzará, no hay que pensar en ello. Si una variable no está siendo asignada, también puede ser marcada como const - funcionará más rápido, esto se aplica a los argumentos de la función. Sin embargo, en cualquier momento, puede necesitar modificarlo...

static - si es una variable en una clase, es un caso raro, incluso el más raro. Si se trata de un método de la clase, entonces si el método maneja sólo los argumentos de este método y las variables estáticas de la clase, también es un caso raro (sin embargo, no es tan raro, si usted acaba de recoger las funciones en la clase por conveniencia).

Todavía no he podido probar la DLL de C# para MQL5. Solía utilizar envolturas de C++ y creaba una instancia de clase en C#. Tengo la sospecha de que esta DLL utilizará ahora una clase estática, lo que limita mucho las opciones. ¿Alguien sabe si ahora se está creando una clase estática o dinámica?

 
Alexey Volchanskiy:

Todavía no he podido probar la DLL de C# para MQL5. Yo lo hacía con wrappers de C++, en el lado positivo se creaba una instancia de la clase en C#. Tengo la sospecha de que ahora la DLL utilizará una clase estática, lo que limita mucho sus posibilidades. ¿Alguien sabe si ahora se crea una clase estática o dinámica?

Sólo he utilizado los estáticos para MQL5 - si tienes el modificador estático, la firma será visible directamente desde MU, muy práctico

sobre la restricción, podrías lanzar la tarea en un hilo separado y luego clavarla, se hace muy rápido en C#

o escribir llamadas dentro de la dll

no es un problema


UPD:

No estoy seguro de poder explicar mi reciente investigación sobre el fundamento del uso de la POO en las tareas de MQL, pero te diré lo que veo

En general, si utilizamos el estilo de la POO, respetando plenamente el control de acceso y asegurándonos de establecer todos los modificadores privados/protegidos/públicos y el uso obligatorio de const para cada definición de método y firma (puede ser eliminado más tarde si se utiliza para modificar los datos) y escribiendo todos los accesos a los datos protegidos con get / set, el resultado de utilizar la POO correctamente, es la detección de grandes bugs en lamodificación involuntariade datos durante el desarrollo.

Volví a escribir una clase de esa manera desde cero - inmediatamente compilador encontró incompatibilidad con mi problema, se metió en la clase base de la descendencia cuando la comprobación (prueba) de la idea, y como de costumbre se distrajo y se olvidó de eliminar - no el hecho de que habría encontrado este error en la prueba, podría haber pensado que se pretende)) .

Otra ventaja notable para mí es la ausencia de todas las variables descritas globalmente - trato de no utilizarlas, no se utilizan aquí en absoluto (bueno, excepto la bandera de optimización global - para adaptarse a mis necesidades y la bandera de error crítico cuando el comercio)

¡Una observación interesante es que al reescribir todas las llamadas a través de get / set, la clase fuente primero aumentó de tamaño y luego comenzó a reducirse significativamente, cuando empecé a sustituir en las llamadas de get / set - no digo que infla mucho el código de tamaño, pero de nuevo - esto proporcionará el control sobre la integridad de los datos!


SZY: bueno, si eres un perfeccionista de corazón y crees que una llamada extra vía get / set es un reloj extra en la CPU, entonces cuando la tarea está 100% hecha, no es difícil contar las llamadas a cada get / set vía búsqueda en el origen y aplicar una vieja regla - si llamas a una sección de código más de una vez, entonces debes hacer esta sección de código como una subrutina.... nadie prohíbe hacer lo contrario ---> sólo una llamada a get / set para asignar / leer el campo.... pero esto es por así decirlo "trucos sucios" con beneficios cuestionables

 
Igor Makanu:

Sólo he utilizado los estáticos para MQL5 - si usted tiene modificador estático, la firma será visible directamente desde MU, muy práctico

sobre la restricción, podría lanzar la tarea en un hilo separado y luego matarlo.

o escribir llamadas dentro de la dll

No creo que eso sea un problema.

No me refiero a miembros estáticos para Sharp, me refiero a esto

public static class ClassName {}

No se puede crear una instancia de clase estática mediante new y destruirla mediante delete, no tiene constructores ni destructores, todos los miembros y métodos son estáticos. En fin, hace mucho tiempo que no trabajo allí, pero recuerdo lo incómodo que era, como una cama de Procusto.

Suelen utilizarse como contenedor de funciones de biblioteca, como las funciones matemáticas.

 
Alexey Volchanskiy:

No me refería a los miembros estáticos para Sharp, pero esto

Creo que es una clase que no verá MQL sin el modificador static, pero sí lo hará si los métodos dentro de la clase tienen un modificador static.

puedes usar cualquier clase dentro de la dll localmente, tengo WinForm en una clase dll sin static. todo funciona bien, pero llamo a funciones declaradas con static, y donde estas funciones son declaradas dentro de la clase - no importa para la llamada a la dll desde MQL, incluso si toda la clase es estática o no.

No podré comprobarlo todavía, no he instalado el estudio en mi portátil después de haberlo sustituido por un SSD, no lo necesito todavía

 
Alexey Volchanskiy:

Todavía no he podido probar la DLL de C# para MQL5. Yo lo hacía con wrappers de C++, en el lado positivo se creaba una instancia de la clase en C#. Tengo la sospecha de que ahora la DLL utilizará una clase estática, lo que limita mucho sus posibilidades. ¿Alguien sabe si ahora se está creando una clase estática o dinámica?

La clase es regular, los métodos son estáticos. No he probado ninguna otra opción.

 
Igor, Dmitry, en fin, hay que probarlo uno mismo. Según entiendo, en cualquier caso, es necesario referirse al nombre de la clase, no al nombre del objeto de la clase. Lo probaré, gracias.
 
Hola, si tengo una pregunta sobre las señales, ¿dónde debo escribir? Me gustaría saber si es razonable suscribirse a las señales, si el depósito = 312 dólares ? ¿Y cómo evitar la dependencia del broker y trabajar eficazmente, si he empezado a operar hace un mes y medio? Empecé a comerciar hace un mes y medio. Gracias.
 
Alexey Volchanskiy:
Igor, Dmitry, en fin, hay que probarlo uno mismo. Por lo que entiendo, en cualquier caso, es necesario referirse por el nombre de la clase, y no por el nombre del objeto de la clase. Lo probaré, gracias.

Diríjase por el nombre de la clase.

 
Alexey Volchanskiy: Igor, Dmitry, en fin, tienes que probarlo tú mismo. Entiendo que en todo caso se debe hacer referencia al nombre de la clase, no al nombre del objeto de la clase. Lo probaré, gracias.

No puedo afirmar que esta sea la única forma de llamar a C# desde MQL5, he utilizado un ejemplo dehttps://www.mql5.com/ru/forum/285631 developers

#import "TestLib.dll"

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int x=41;
   TestClass::Inc(x);
   Print(x);
  }

public class TestClass
{
   public static void Inc(ref int x)
   {
    x++;
   }
}

He utilizado el ejemplo de los desarrolladores para obtener el punto de entrada en C#, no he utilizado otras formas, con algunos retoques el mismo código .dll puede ser compilado para MT4

artículo y mi investigación sobre por qué el código del artículo no funciona como se pretende https://www.mql5.com/ru/forum/3153/page4#comment_10366498 - todo funciona hasta ahora

 

miré los resultados de mi batalla con el código de estilo OOP - hmmm... ¡excelente! ))))


Tengo una pregunta, pero en mi código, bueno, tres veces exactamente, uso una construcción como:

private:
   COrder            *m_order;
.......

// использую так
return(CheckPointer(m_order)==POINTER_INVALID ? true : m_order.Orderclose());

//или так

if(CheckPointer(m_order)==POINTER_INVALID)

llama a todo en métodos privados, pero ¿hay un "método Jedi" para escapar en el código fuente deCheckPointer(m_order)==POINTER_INVALID

Pregunto por algún get / set

ningún problema especial, sino por así decirlo un capricho, o mientras que la sed de conocimiento de los métodos de POO en C++ aún no ha disminuido

Razón de la queja: