Preguntas sobre POO en MQL5 - página 29

 
Dmitry Fedoseev:

Sí, esta es otra pregunta que sigue surgiendo y no tiene una respuesta clara. Cuando necesites heredar tu propia clase - qué es mejor hacer, heredarla o escribir una nueva versión extendida de tu clase.

Todo depende de la idea general de lo que quieres al final, imho

si se planea utilizar la clase en otro lugar, es necesario hacerla completa sin herencia

en mi ejemplo, la clase CError puede obtener GetLastError(), desmarcarse con una descripción y devolver el valor (int) del error. pienso usarlo en todas partes, de todos modos, sólo hay un constructor que define el lenguaje en una variable estática y el caso que devuelve el texto del error

Pero hay otro método útil - bool ServerDisable(); - define la disponibilidad del servidor (código MT4/МТ5 multiplataforma), muy buena función, parece que se necesita en algún otro lugar en el código, pero pensé, que voy a utilizarlo para las operaciones comerciales de todos modos - lo puse en la clase COrder

.....

y si quiero utilizarlo para el arrastre? .... - mucho espacio para la imaginación, pero al final se utilizará como un objeto en COrder - ¿dónde más se podría utilizar?


en mi opinión, todo parece engorroso, es más fácil incluir la biblioteca de funciones de servicio con el enlazador, y el compilador no incluirá las partes no utilizadas en el ejecutable por sí mismo

toda la clase sería bastante compacta en el estilo de procedimiento, mostré un ejemplo para una función para abrir una orden que puede almacenar en constantes estáticas el volumen de la ordenhttps://www.mql5.com/ru/forum/85652/page17#comment_12805083

 
Dmitry Fedoseev:

¿Es realmente importante mantenerse dentro de los límites? Si es importante mantenerse dentro de los límites, también puedes escribir funciones.

Estaba respondiendo en el contexto de tu mensaje de que si no usas clases, tendrás que molestarte con firmas de llamadas incómodas. Demostré que no tienes que molestarte.

 
Alexey Navoykov:
¿Qué me impide enviar el nombre del símbolo al constructor, haciendo que la clase sea flexible y versátil? ¿No considera la posibilidad de comerciar con la cartera como una cuestión de principio?

considerando todo,

Pero hasta ahora me he quedado con la investigación - ahora estoy casi listo para investigar 1000 y 1 formas de MM y todo tipo de trucos con los sistemas de orden )))

Pero sigo pensando que al final no sería demasiado flexible, ya he escrito 2 veces más arriba que sería mejor un estilo procedimental + pequeñas clases con funciones bien afinadas de manejo de órdenes.

Voy a pasar a probar mis ideas por ahora y luego veré lo que edito a menudo en el código y lo que dejo sin tocar

 
Igor Makanu:

.....

¿Y si quiero utilizarlo para el arrastre? .... Hay más espacio para la imaginación, pero al final se seguirá utilizando como un objeto en el COrder - ¿dónde más se podría utilizar?


Las barras de arrastre están separadas porque no tienen nada que ver con la lógica principal. Pueden existir o no.

***

Las barras de arrastre y otras funciones de mantenimiento similares deben hacerse como descendientes de una clase, y sus instancias deben crearse en un array. Si se activa una función, se añade una instancia al array y se ejecuta. Si todas las funciones están desactivadas, la matriz está vacía y no se ejecutan los ifs innecesarios. Puede insertar al menos 100 barras de arrastre en el EA, y no afectará a la velocidad de su ejecución.

 
Alexey Navoykov:
Esa no es la manera de hacerlo. Al menos tienes que llamar tanto a Bid() como a Ask(). Tu código parece sólo una variable, haciendo parecer que su valor permanece inalterado, cuando en realidad no es así.

por desgracia, siempre se ha hecho así, en MT4 sigue siendo Bid y Ask y no hay caprichos del Creador para arruinar este simple uso y obtener los precios actuales ;)

fxsaber:

Tengo el siguiente esquema en el que no he experimentado ningún problema.

  1. Escribo TC sólo para Tester. No hay registros, manejadores de errores y otras cosas. El código es muy conciso, comprensible y susceptible de cambios, si se hace mediante POO (pero no es crucial). Ya he publicado el ejemplo en KB. La ventaja es la rápida optimización.
  2. Lo principal es que esté disponible para el probador y en bloques independientes. La generación de señales de trading - un bloque. Comercio de señales: otro bloque.
  3. La transferencia a la cuenta real se realiza siempre en varios movimientos. El ST se coloca en un entorno virtual sin necesidad de cambiar el código. Se pueden colocar varias TS en un entorno o cada TS en su propio entorno, entonces la OOP se vuelve especialmente conveniente. Entonces cogemos una copiadora (el Mercado está lleno de ellas, así que la gente es buena en la lógica de las copiadoras), que simplemente copia las ofertas/órdenes del entorno virtual al real.
  4. Con este esquema, escribir TS es rápido y fácil. La transferencia a real (que es rara en realidad) se hace siempre de manera uniforme, rápida y clara.

¿estamos hablando de este código?https://www.mql5.com/ru/code/22770

me gusta mucho la implementación. muy bueno para el probador y optimizador, probablemente lo usaré como base, el código es corto y legible, para ser honesto me sorprende leer tu código, tienes un estilo de escritura mucho más sofisticado, yo suelo enchufar y jugar, sé que no puedo entender la lógica

 
Igor Makanu:

por desgracia, siempre ha sido así, en MT4 sigue siendo Bid y Ask y ningún capricho del creador destruye este simple uso y obtener los precios actuales ;)

Pero sus valores son invariables dentro del procesamiento de eventos en curso (a menos que llames a RefreshRates forzosamente, por supuesto). Así que son variables, no funciones. Y sus funciones parecen variables

 

Dé a los FP una tarea real de gestión y procesamiento de matrices de cientos de megabytes o gigabytes de datos y todo su modelo de mensajes de cuento de hadas (los datos son inmutables) se irá al infierno.

Estos son teóricos, justo a tiempo para salir de las tareas del mundo real y emitir en su universo ficticio :) las historias de las telecomunicaciones son pases de datos tontos.

De hecho, la única posibilidad de combatir la complejidad es empaquetarla en objetos.
 
Alexey Navoykov:

Pero sus valores son inmutables dentro del procesamiento de eventos en curso (a menos que llame a RefreshRates forzosamente). Por lo tanto, son variables, no funciones. Y sus funciones parecen variables

No sé ni cómo explicar el problema que se comenta en tu ejemplo, intentaré explicarlo humanamente - a mí, como persona que tuvo el primer PC Pentium-90, me duele ver que para conseguir un uso conveniente, se añadirá una llamada a función extra, que implica poner valores de registros en la pila... y ...allá vamos.

Sé que ahora todo se almacena en caché repetidamente a nivel del procesador, y sospecho que los desarrolladores de compiladores harán más eficiente la "llamada a función desde la llamada a función"

entonces su ejemplo debería ser así:

#define  Ask(dummy) SymbolInfoDouble(_Symbol,SYMBOL_ASK)
#define  Bid(dummy) SymbolInfoDouble(_Symbol,SYMBOL_BID)

void OnStart()
  {
   Print("Ask = ",Ask());
   Print("Bid = ",Bid());
  }

O así:

#define  Ask(symbol_) SymbolInfoDouble(symbol_,SYMBOL_ASK)
#define  Bid(symbol_) SymbolInfoDouble(symbol_,SYMBOL_BID)

void OnStart()
  {
   Print("Ask = ",Ask(_Symbol));
   Print("Bid = ",Bid(_Symbol));
  }
 
Dmitry Fedoseev:

Vasiliy, este artículo te sería muy útil para no torturarte exprimiendo la POO por la POO.

Tengo una idea de marco funcional para la MT. Casi no habrá OOP allí. Sólo funciones, "mónadas" y otra funcionalidad pseudo FP. Estoy escribiendo todo entre comillas, ya que es imposible hacer FP en toda regla en MQL.

 
Dmitry Fedoseev:

Los comentarios son innecesarios.

no os gustáis tanto, o tal vez es lo contrario de 2 gays buscando una salida para vosotros mismos)

por cierto, me han gustado sus artículos, los del experto son flojos, débiles, pero él me gusta igual,

y no soy gay.