Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Variable estática, será la misma para todas las instancias sin herencia.
Comprobado, pues sí, resultó ser más sencillo que eso.
2019.08.29 15:14:09.847 tst__ EURUSD,M15: inicializado
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: MyTerminalInfoString
Veo que la variable Language sólo se ha inicializado una vez, es decir, esta es una solución más sencilla
Gracias.
Por favor, dígame, ¿en qué se diferencia?
Crear un objeto, o puntero, de esta manera
de la creación clásica
La diferencia es que en el primer caso, no es necesario especificar el identificador de claseCClass en C++.
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 aGetDigitsInVolumeStep()
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 de manera diferente?
1. Repito la llamada a SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) - porque no se especifica el orden de inicialización, es decir, no es seguro que primero se inicialice VolumeSTEP y sólo después se llame a GetDigitsInVolumeStep()
1. ¿Es decir, teme que el orden de inicialización de la estática sea indefinido? En realidad no lo es, los pluses se inicializan por orden de definición en el código. Así que no te preocupes, primero VolumeSTEP y luego VolumeDIGITS.
1. ¿Así que temes que el orden de inicialización de la estática sea indefinido? En realidad no es así, en los pluses la inicialización es por orden de definición en el código. Así que no te preocupes, primero VolumeSTEP y luego VolumeDIGITS.
Sí, no es que tenga miedo, digamos que estoy protegido, creo que el código debe tener al menos alguna garantía contra los cambios en el comportamiento de la compilación - en general SÍ
ZS: aquí, en general, ¿por qué el tema por primera vez un día - Quiero ver cómo realista para hacer algo como en el autor de vídeo Egor dice, mientras que dudo de que obtenemos algo efectivo - ahora estoy usando métodos estáticos, y con la inicialización son ya algunas dudas apareció
1. ¿Es decir, teme que el orden de inicialización de la estática sea indefinido? En realidad no lo es, los pluses se inicializan por orden de definición en el código. Así que no te preocupes, primero VolumeSTEP y luego VolumeDIGITS.
También en MQL.
https://www.mql5.com/ru/docs/basis/oop/staticmembers
Sí, no es que tenga miedo, digamos que estoy protegido, creo que el código debe tener al menos alguna garantía contra los cambios en el comportamiento de la compilación - en general SÍ
ZS: aquí, en general, ¿por qué el tema por primera vez un día - Quiero ver cómo realista para hacer algo como en el video autor Egor dice, mientras que dudo que vamos a conseguir algo efectivo - ahora estoy usando métodos estáticos, y con la inicialización son ya algunas dudas aparecieron
Para usarlo de esta manera:
Y en un código como este:
Utilícelo de la siguiente manera:
Y en el código así:
oops, un poco de desvío, eso es lo que puedo hacer
Esto es lo que quiero conseguir en general:
1. la clase CDeal es autónoma, abre/cierra/controlan su orden por una estrategia - las estrategias se enumeran, por lo que el optimizador se desplaza a través de la mezcla de estrategias
2. de acuerdo con el paso 1, no necesito en ningún otro lugar tener las variables de entorno del terminal SYMBOL_VOLUME_MAX, SYMBOL_VOLUME_MIN,SYMBOL_VOLUME_STEP y la cantidad de caracteres en SYMBOL_VOLUME_STEP - no cambia durante el funcionamiento del programa MQL
3. a partir de los puntos 1 y 2, puedo encapsular los métodos de apertura/cierre/operación de una orden y las propiedades de la orden en sí mismas en una clase CDeal - no voy a usar todo eso en ningún sitio después, ¿verdad? - es decir, puedo utilizarlos todos en una clase
pp 1-3 todo es solucionable, pero... OK, ahora me has ayudado con la estática, que sea así, porque tengo una referencia, al menos puedo fundamentar mi decisión de alguna manera, ahora el código es así
creé 3 instancias de Cdeal, lo tengo en el registro:
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: inicializado
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Cdeal::CdealVolumeMAX = 100000.0 , VolumeMIN = 0.01 , VolumeSTEP = 0.01 , VolumeDIGITS = 2
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Cdeal::CdealVolumeMAX = 100000.0 , VolumeMIN = 0.01 , VolumeSTEP = 0.01 , VolumeDIGITS = 2
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Cdeal::CdealVolumeMAX = 100000.0 , VolumeMIN = 0.01 , VolumeSTEP = 0.01 , VolumeDIGITS = 2
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Cdeal::GetDigitsInVolumeStep
Hasta ahora, todo ha funcionado según lo previsto.
Es decir, ahora no hay secciones de código repetido (llamadas) - es un código eficiente, pero cómo alejarse del uso de la función estática static int Cdeal::GetDigitsInVolumeStep() - en el video, el autor cree que es posible escribir código OOP sin funciones estáticas, veo que no sólo es inconveniente, pero no siempre es posible utilizar todo, sobre los métodos Get y Set - lo más probable es que prescindir de ellos, voy a ver más adelante
La opción del campo estático tiene una gran desventaja. No se pueden tener diferentes valores de este campo en diferentes instancias de la clase.
Sí, gracias, ya lo sé, el propósito es sólo conseguir un código eficiente sin exceso de variables y uso de memoria innecesario
Todavía no he resuelto la cuestión:cómo evitar el uso de la función estática static int Cdeal::GetDigitsInVolumeStep()
Aquí está un esquema de mi clase, que debe inicializar los campos una vez con valores constantes, parece que funciona como se pretende: