Preguntas sobre POO en MQL5 - página 21

 
Alexey Navoykov:
¿Es una clase puramente de prueba o realmente la vas a utilizar?
Si es esto último, no deberías hacerlo. Las variables estáticas no se reinicializan cuando un personaje cambia, que yo recuerde.
Y en general, no es una buena idea inicializar las constantes estáticas con valores externos, que no están necesariamente disponibles en el momento de la inicialización.

Elsegundo, estoy escribiendo de todos modos bajo MT4, incluso para mí - no funciona en el probador para algunos símbolos, si veo algo útil en MT4, voy a cambiar a MT5 utilizando MT4Orders - He comprobado mi "trabajo creativo" sin problemas con esta biblioteca

primero, quiero ver la idea de un OOP adecuado - es por eso que estoy probando, para ver lo que va a salir, hasta ahora va bastante desordenado.... ya veremos, tengo tiempo, aquí está el cargador que decidí hacer yo mismo ))))


Sé que no es la mejor manera de inicializar antes del inicio del código principal, o más bien yo solía pensar que sí, pero nunca lo he comprobado, no importa cuántas nuevas construcciones he tenido - en MQL todo está siempre disponible, incluso en el nivel de visibilidad global, vi a la gente de las fuentes ir directamente a la parte superior y escribirlo de esa manera:

#property strict
int    dig = _Digits;
double point = _Point;
double startbalance = AccountBalance();

y estas inicializaciones inválidas han estado funcionando durante años de compilación a compilación. Así que, los desarrolladores mimaron a la gente hasta el hueso ))))




SZZY: aquí en general, como siempre cuando se utiliza OOP - lo principal es dividir correctamente el problema en elementos complejos y no heredar de todo a la mano. No sé dónde "poner" la salida de texto de los errores - que necesita en todas partes, en cualquier clase y en cualquier lugar del programa, lo más probable es que usted tendrá que crear una clase base como@Vladimir Simakov mostró por encima de su código

 
Igor Makanu:

pp 1-3 todo solucionable, PERO... OK, aquí con la estática ayudada, que sea así porque hay una ayuda, al menos algo que justifique su decisión, ahora el código es el siguiente:

creó 3 instancias de Cdeal, se metió en el registro:

...

¡hasta ahora todo funciona como está previsto!

Aunque funcione, no es fiable. Dado que la función se implementa fuera de la clase, es difícil controlar el orden de los campos en la propia clase. Al menos deberías escribir un comentario en negrita en la clase diciendo que tales o cuales campos no deben ser reordenados). Pero su variante inicial era mejor de todos modos. No hay que sacrificar la seguridad para ahorrar una línea de código )
 
Alexey Navoykov:
Pero de todos modos, su versión original era mejor. No sacrifique la fiabilidad para ahorrar una línea de código )

¿Cuál? - Tengo la mitad del tema en mis variaciones ))))

pero sí, ¡tienes razón al cien por cien!

SZY:

la forma más sencilla y fiable - crear una instancia de la clase a través de new en OnInit() - y copiar todas las variables de entorno del terminal inmediatamente, pero no es la mejor manera - si planeo abrir una orden inmediatamente al inicio del constructor en este ejemplo, entonces esta instancia de la clase probablemente se borrará y luego posiblemente se volverá a crear - esto ya trae algunos problemas debido a las llamadas repetidas - empiezo a cargar el terminal de nuevo, de nuevo desperdiciando memoria.... en general, no se puede resolver de esta manera


ZZZY: tal vez otro día de experimentos, y eventualmente tomar el ejemplo de @Vladimir Simakov- todo está muy claro allí

 
Igor Makanu:

He dibujado mi clase, que debería inicializar los campos una vez con valores constantes, y parece que funciona como se pretende:

No me gustan dos cosas:

1. Repito la llamada a SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) - porque el orden de inicialización no está definido, es decir, no es seguro que primero se inicialice VolumeSTEP y sólo después se llame a GetDigitsInVolumeStep()

2. Quiero deshacerme del método estático static int GetDigitsInVolumeStep() - He visto un video en youtube diciendo que en la POO pura no se deben usar métodos estáticos, y ahora estoy luchando contra molinos de viento

el enlace al video, es esencialmente el mismohttps://youtu.be/lfdAwl3-X_c yhttps://youtu.be/zME4SOCHT0I


¿cómo puedo reescribir estos 2 puntos que no me gustan?

1. No hay nada malo en llamar a esta función dos veces.

2. ¿No te confunde que los que están en contra del uso de funciones estáticas no den el más mínimo argumento?

Es mejor que no veas vídeos de cualquiera, sino que leas libros.

 
Koldun Zloy:

2. ¿no te confunde que los que están en contra del uso de las funciones estáticas no den el más mínimo argumento?

Y eres el primero que me apoya en que el vídeo no se corresponde con nada de la práctica, ya escribí en otro hilo mi opinión sobre el vídeo - el ponente ni siquiera pudo responder a las preguntas de los alumnos

 
Igor Makanu:

y eres el primero que me apoya en que el vídeo no se corresponde con nada de la práctica, escribí en otro hilo mi opinión sobre el vídeo - el reportero ni siquiera pudo responder a las preguntas de los estudiantes

No creo que la OOP consista en recortar las propias capacidades en aras de seguir ciegamente los postulados infundados de algunos bocachanclas de Internet, donde cada uno barre a su manera.

 
Artyom Trishkin:

No creo que la OOP sea la reducción de las propias capacidades en aras de seguir ciegamente los postulados infundados de algunos bocazas de Internet, donde cada uno barre a su manera.

si has visto el vídeo, deberías entender que el objetivo es .... bueno, en general, tampoco entiendes nada y no eres lo suficientemente maduro - al menos así me lo explicó A100

SZZ: Experimentaré un poco más tarde con las interfaces, quizá aparezca alguna "entidad-belleza" ))))

 

He visto su vídeo sobre la estática, todo por escribir así:

new Type0(new Type1(new Type2(...))); 

Bueno, escribir un wrapper sobre una estática es un problema, ¿no?

class Stateless_with_state {
        Stateless q;
        Data d;
        call() {q::call(d);}
};

Y a través de las plantillas es claramente más eficiente. Me ha gustado la pregunta del público https://www.youtube.com/watch?v=75U9eefFYoU#t=33m25s

 
Igor Makanu:

ZS: Experimentaré con las interfaces un poco más tarde, quizá aparezca alguna "entidad-belleza" ))))

Comprobado si "Patrón OOP - Patrones de comportamiento - Estrategia" funcionará

interface IStrategy
  {
   void Algorithm();
  };
//+------------------------------------------------------------------+
class Strategy_1 : public IStrategy
  {
public:
                     Strategy_1()   {Print(__FUNCTION__);}
   void              Algorithm()    {Print(__FUNCTION__);}
  };
//+------------------------------------------------------------------+
class Strategy_2 : public IStrategy
  {
public:
                     Strategy_2()   {Print(__FUNCTION__);}
   void              Algorithm()    {Print(__FUNCTION__);}
  };
//+------------------------------------------------------------------+
class Context
  {
private:
   IStrategy         *s;
public:
                     Context(IStrategy &_strategy) {Print(__FUNCTION__); s = GetPointer(_strategy); s.Algorithm();}
                    ~Context() {delete s;}
  };
//+------------------------------------------------------------------+
void OnStart()
  {
   Context c1(new Strategy_1);
   Context c2(new Strategy_2);
  }
//+------------------------------------------------------------------+

2019.08.31 21:04:40.441 tst (EURUSD,H1) Estrategia_1::Estrategia_1

2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_1::Algorithm

2019.08.31 21:04:40.442 tst (EURUSD,H1) Estrategia_2::Estrategia_2

2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context

2019.08.31 21:04:40.442 tst (EURUSD,H1) Estrategia_2::Algoritmo


Funciona sin problemas en mi opinión

 
Igor Makanu:

comprobado si el "Patrón OOP - Patrones de comportamiento - Estrategia (Strategy)" funcionará

2019.08.31 21:04:40.441 tst (EURUSD,H1) Estrategia_1::Estrategia_1

2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_1::Algorithm

2019.08.31 21:04:40.442 tst (EURUSD,H1) Estrategia_2::Estrategia_2

2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context

2019.08.31 21:04:40.442 tst (EURUSD,H1) Estrategia_2::Algoritmo


me funciona sin problemas

Context(IStrategy* _strategy):s(_strategy){Print(__FUNCTION__); s.Algorithm();}

El operador new devuelve un puntero. Por supuesto, los desarrolladores metieron la pata con la desreferenciación implícita y por eso tu versión funciona, pero prefiero no colgarme de cosas indocumentadas.

2. Ciertamente no es C++, pero es muy similar, así que las listas de inicialización (no sé si de eficiencia) son kosher.