Español (original): Me gustaría hacer una solicitud de característica de idioma MQL. Si este no es el hilo correcto, por favor hágamelo saber. La solicitud original está en el foro Inglés ...
Ruso (Google translate): Me gustaría hacer una solicitud de función de idioma MQL.Si este no es el hilo correcto, por favor hágamelo saber.La solicitud original está en el foro Inglés ...
Un truco más para los derechos de acceso: Si tienes un deseo irresistible de dar acceso a campos/funciones privadas de una clase a otra clase, puedes hacer lo siguiente usando herramientas MQL estándar:
Necesitamos: dar acceso a A::f1() desde B
//--------- как былоclass A
{
int m;
int f1() {return m;} // нужно дать к нему доступ классу Bpublic:
A(int a): m(a) {}
};
class B {};
Vamos a reescribirlo así
class A;
class B
{
private:
class AB
{
public:
virtualint CallAf1(A&) const = 0;
AB() {ABptr = &this;}
} static *ABptr;
// внутри B используем этот метод для получения доступа к A::f1()staticint CallAf1(A & obj)
{
return ABptr.CallAf1(obj);
}
public:
class AB2: AB {};
// вспомогательный метод - только для проверкиstaticvoid _f1_test(A & obj)
{
Print("test ", CallAf1(obj));
}
};
B::AB *B::ABptr = NULL;
class A
{
int m;
int f1() {return m;}
public:
A(int a): m(a) {}
//-- добавленоprivate:
class AB3: B::AB2
{
int CallAf1(A &obj) const {return obj.f1();}
} staticconst ABlink;
};
const A::AB3 A::ABlink;
Para llamar a (A)a.f1() dentro de B, llama a CallAf1(a). Si f1() tiene parámetros, los añadimos a CallAf1().
Prueba:
voidOnStart()
{
A f(2);
B::_f1_test(f);
}
Puedes hacer CallAf1() protegida, pero será un gran agujero en los derechos de acceso - en cualquier parte del código puedes crear un descendiente de la clase B y en él un método público para llamar a CallAf1() - es decir, todo el mundo tendrá acceso a A::f1().
P.D. La construcción es muy engorrosa (si quieres, puedes meterla en macros), pero tiene una ventaja sobre el amigo C++: no da acceso a todos los miembros de la clase, sino sólo a los seleccionados.
Otro truco para los derechos de acceso: Si tiene un deseo irresistible de conceder acceso a campos/funciones privados de una clase a otra clase, puede hacerlo utilizando las herramientas MQL estándar
Me llevó mucho tiempo ponerme a ello... buen movimiento con la virtualización, ¡gracias!
fxsaber #: Tardé mucho en ponerme a ello... Buen movimiento con la virtualización, ¡gracias!
Lo único que no escribí al principio es que no se pueden crear más objetos de la clase B::AB2 (y sus descendientes), de lo contrario todo se vendrá abajo :-)
Ejecutando este Asesor Experto en el Probador en el modo de todos los símbolos
inputint inTmp = 0; // https://www.mql5.com/ru/forum/321656/page90#comment_44727856bool Res = true;
// Проверяет, нормализована ли цена по алгоритму NormalizeDouble.bool IsNDPrice( constdouble &Price )
{
return(Price == NormalizeDouble(Price, 5));
}
// Проверяет, нормализована ли цена, как при парсинге или ручном вводе.bool IsNDPrice2( constdouble &Price )
{
return(Price == (double)DoubleToString(Price, 5));
}
voidOnTick()
{
MqlTick Tick;
if (SymbolInfoTick(_Symbol, Tick))
// Res &= IsNDPrice(Tick.bid) && IsNDPrice(Tick.ask); // OnTester == 1.
Res &= IsNDPrice2(Tick.bid) && IsNDPrice2(Tick.ask); // OnTester == 0.
}
doubleOnTester()
{
return(Res);
}
muestra que todos los precios se normalizan utilizando el algoritmo NormalizeDouble. Y que si se trabaja con precios obtenidos no del Terminal, sino por parseo o entrada manual, requieren normalización para su correcto funcionamiento. No hay que equivocarse.
REASON_ACCOUNT (aunque no se cambie la cuenta, sino que simplemente se vuelva a iniciar sesión) se descarga completamente el Asesor Experto y se carga una copia nueva.
Por esta razón ExpertRemove en OnDeinit no afecta a la nueva copia, porque toca a la descargada.
Después de Deinit, la nueva copia de EA espera más de un segundo (hasta dos segundos) para iniciarse. ¿Cuáles son las razones de una espera tan larga y es posible acelerarla?
SymbolInfoTick devolverá el último tick en cada una de esas tres llamadas. Es decir, la llamada colección de ticks sin saltar a través de indicadores es cuestionable, por decirlo suavemente.
Prueba de la imposibilidad de recoger ticks por un indicador (sin saltos).
Para iniciar sesión y usar el sitio web MQL5.com es necesario permitir el uso de Сookies.
Por favor, active este ajuste en su navegador, de lo contrario, no podrá iniciar sesión.
Ha iniciado sesión. La autenticación de dos factores se ha desactivado. Vuelva a configurarla y escanee un nuevo código QR, o continúe con la autenticación de dos factores desactivada.
Español (original): Me gustaría hacer una solicitud de característica de idioma MQL. Si este no es el hilo correcto, por favor hágamelo saber. La solicitud original está en el foro Inglés ...
Ruso (Google translate): Me gustaría hacer una solicitud de función de idioma MQL. Si este no es el hilo correcto, por favor hágamelo saber. La solicitud original está en el foro Inglés ...
¿cómo rellenar un array con una línea?
clr_struct clr[] = {{0x999999}, {0x999999}};Un truco más para los derechos de acceso: Si tienes un deseo irresistible de dar acceso a campos/funciones privadas de una clase a otra clase, puedes hacer lo siguiente usando herramientas MQL estándar:
Necesitamos: dar acceso a A::f1() desde B
Vamos a reescribirlo así
Para llamar a (A)a.f1() dentro de B, llama a CallAf1(a). Si f1() tiene parámetros, los añadimos a CallAf1().
Prueba:
Puedes hacer CallAf1() protegida, pero será un gran agujero en los derechos de acceso - en cualquier parte del código puedes crear un descendiente de la clase B y en él un método público para llamar a CallAf1() - es decir, todo el mundo tendrá acceso a A::f1().
P.D. La construcción es muy engorrosa (si quieres, puedes meterla en macros), pero tiene una ventaja sobre el amigo C++: no da acceso a todos los miembros de la clase, sino sólo a los seleccionados.
Otro truco para los derechos de acceso: Si tiene un deseo irresistible de conceder acceso a campos/funciones privados de una clase a otra clase, puede hacerlo utilizando las herramientas MQL estándar
Tardé mucho en ponerme a ello... Buen movimiento con la virtualización, ¡gracias!
REASON_ACCOUNT (aunque no se cambie la cuenta, sino que simplemente se vuelva a iniciar sesión) se descarga completamente el Asesor Experto y se carga una copia nueva.
Por esta razón ExpertRemove en OnDeinit no afecta a la nueva copia, porque toca a la descargada.
Resultado tras el reinicio.
Después de Deinit, la nueva copia de EA espera más de un segundo (hasta dos segundos) para iniciarse. ¿Cuáles son las razones de una espera tan larga y es posible acelerarla?
SymbolInfoTick devolverá el último tick en cada una de esas tres llamadas. Es decir, la llamada colección de ticks sin saltar a través de indicadores es cuestionable, por decirlo suavemente.
Prueba de la imposibilidad de recoger ticks por un indicador (sin saltos).
Resultado.
Foro sobre trading, sistemas de trading automatizados y prueba de estrategias de trading
Errores, bugs, preguntas
fxsaber, 2023.02.14 13:11
Desafortunadamente, MQL4 no tira de este tipo de trabajo todavía.