Errores, fallos, preguntas - página 1747

 

¿Cómo puedo eliminar la adherencia visual de los objetos NOT LABEL a las coordenadas temporales de las barras?

Pongo la coordenada temporal del objeto en segundos, pero se visualiza como si lo pusiera en el marco temporal.

He cavado la pregunta

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Errores, fallos, preguntas

Andrew Petras, 2014.11.26 13:34

Me gusta mucho mover objetos como el triángulo, la elipse o el rectángulo, y los puntos de anclaje son desproporcionadamente "flotantes".

No depende de estos ajustes


Creo


arrastrar y soltar


El rectángulo tiene el segundo punto, el triángulo y la elipse tienen el tercer punto.

¿Se puede arreglar esto? Necesito "medidas" precisas.

Cuando selecciono "Escala de tiempo precisa", la mencionada vinculación desaparece y todo se muestra como debe ser. Sin embargo, no he encontrado en ninguna parte de MQL5 cómo activar/desactivar este parámetro. ¿No está previsto?

 

¡Realmente necesito ayuda! Llevo unas horas intentando averiguar la causa del extraño comportamiento. Al final escribí un EA con un resultado bastante inesperado

#define TOSTRING(A) #A + " = " + (string)A + "\n"

string TimeToString( const ulong Time )
{
  return(TimeToString(Time / 1000, TIME_DATE|TIME_SECONDS) + "." + ::IntegerToString(Time % 1000, 3, '0'));
}

void OnTick()
{
  static MqlTick PrevTick = {0};
  
  MqlTick NowTick;
  
  if (SymbolInfoTick(_Symbol, NowTick) && (PrevTick.time_msc > NowTick.time_msc))
    Alert(TOSTRING(TimeToString(PrevTick.time_msc)) + TOSTRING(TimeToString(NowTick.time_msc)));
    
  PrevTick = NowTick;  
}

El resultado (ascendente)

2016.10.31 11:55:51.031 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.698
2016.10.31 11:55:51.031 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.702
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.654
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.656
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:05.458
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:05.464
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:56:05.474
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:56:05.476

¡SymbolInfoTick a veces devuelve (hay que esperar) un tick con un tiempo inferior al anterior!

¿Qué diablos es todo esto? Configuración

Network 'xxx': authorized on BCS-MetaTrader5 through Access Server #2 (ping: 112.19 ms)
Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700K  @ 3.50GHz, RAM: 11327 / 16301 Mb, HDD: 4346 / 30000 Mb, GMT+02:00
Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
 
fxsaber:

¡Realmente necesito ayuda! Llevo unas horas intentando averiguar la causa del extraño comportamiento. Al final escribí un EA con un resultado bastante inesperado

#define TOSTRING(A) #A + " = " + (string)A + "\n"

string TimeToString( const ulong Time )
{
  return(TimeToString(Time / 1000, TIME_DATE|TIME_SECONDS) + "." + ::IntegerToString(Time % 1000, 3, '0'));
}

void OnTick()
{
  static MqlTick PrevTick = {0};
  
  MqlTick NowTick;
  
  if (SymbolInfoTick(_Symbol, NowTick) && (PrevTick.time_msc > NowTick.time_msc))
    Alert(TOSTRING(TimeToString(PrevTick.time_msc)) + TOSTRING(TimeToString(NowTick.time_msc)));
    
  PrevTick = NowTick;  
}

El resultado (ascendente)

2016.10.31 11:55:51.031 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.698
2016.10.31 11:55:51.031 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.702
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.654
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.656
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:05.458
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:05.464
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:56:05.474
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:56:05.476

¡SymbolInfoTick a veces devuelve (hay que esperar) un tick con un tiempo inferior al anterior!

¿Qué diablos es todo esto? Configuración

Network 'xxx': authorized on BCS-MetaTrader5 through Access Server #2 (ping: 112.19 ms)
Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700K  @ 3.50GHz, RAM: 11327 / 16301 Mb, HDD: 4346 / 30000 Mb, GMT+02:00
Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
Sí, no eres el único que necesita ayuda aquí. Llevo unas semanas intentando enrollar las garrapatas normalmente en una vela. Así que... las garrapatas aún están crudas. Oferta en SD#1598238
 

Línea mágica

#include "key.mqh"
virtual int f( const ABCDEFGHIJK ) const { return ABCDEFGHIJK; }

Secuencia de acciones (estricta)

  1. Coloque los archivos adjuntos en la misma carpeta. Luego con el ratón en el MetaEditor
  2. Archivo->Abrir->Seleccionar Test.mqh->Botón de apertura
  3. Edición->Buscar y reemplazar->Reemplazar-> rellenar los campos Buscar: y 'Reemplazar por:' como se muestra a continuación->el botón 'Reemplazar todo'

Resultado:

Ajustes aquí: https://www.mql5.com/ru/forum/1111/page1127#comment_795376

Archivos adjuntos:
Test.mqh  1 kb
key.mqh  1 kb
 
Alexey Kozitsyn:
Sí, no eres el único que necesita ayuda aquí. Llevo unas semanas intentando enrollar bien mis tics en una vela. Así que... los tics siguen siendo crudos. Oferta en SD#1598238
Los tics están rodando en la vela normalmente.
 
fxsaber:
Tiki rueda hacia la vela con normalidad.
¿De verdad? ¿Y los volúmenes coinciden? ¿Y has hecho los controles? ¿Y puedes mostrar los registros?
 
Alexey Kozitsyn:
¿De verdad? ¿Y los volúmenes son los mismos? ¿Y has hecho controles? ¿Y puedes mostrar los registros?

Hizo el control - ver la codobase. No te preocupes por el desajuste entre los volúmenes de las velas y los calculados, porque se trata de un tick de frontera, que puede caer en una barra o en otra. Esto no es principal. También publiqué en el foro el indicador de volumen de negocio. Así que no hay ningún problema.

En tu caso, si te pones muy friki, puedes meterte con el mecanismo de creación de barras, pero no con CopyTicks.

 

Error de compilación

class A {
protected:
        void f(  int ) {} //(*)
};
class B : public A {
public:
        void f( uint ) {}
};
void OnStart()
{
        B b;
        b.f( 1 ); //'A::f' - cannot call protected member function
}

Y si se elimina la línea (*), todo está bien. ¿Qué pasa con B::f(uint)? Si se mira la situación desde el otro lado

class A {
public:
        void f(  int ) {} //(**)
};
class B : public A {
public:
        void f( uint ) {}
};

podemos ver las desventajas fundamentales del algoritmo MQL de búsqueda de una función coincidente. En el segundo ejemplo, se llamará a B::f(uint) hasta que no haya ninguna cadena (**). En cuanto aparezca la línea (**), se llamará a A::f(int). Significa que los cambios en la clase base afectan al resultado final, mientras que en C++ se llamará siempre a B::f(uint) independientemente de los cambios en la clase base, lo que garantiza la estabilidad del resultado final.

En MQL, resulta que el desarrollador de la clase A acaba de inventar una nueva función pública\nprotegida\nprivada y por ello el usuario de la clase B ya no compila el código y/o lo que es más crítico - el resultado final cambia

 
A100:

Línea mágica

#include "key.mqh"
virtual int f( const ABCDEFGHIJK ) const { return ABCDEFGHIJK; }

Secuencia de acciones (estricta)

  1. Coloque los archivos adjuntos en la misma carpeta. Luego con el ratón en el MetaEditor
  2. Archivo->Abrir->Seleccionar Test.mqh->Botón de apertura
  3. Edición->Buscar y reemplazar->Reemplazar->Rellenar los campos Buscar: y 'Reemplazar por:' como se muestra a continuación->el botón 'Reemplazar todo'

Resultado:

Ajustes aquí: https://www.mql5.com/ru/forum/1111/page1127#comment_795376

Gracias por el post, el error será corregido en la próxima actualización.
 
A100:

Error de compilación

class A {
protected:
        void f(  int ) {} //(*)
};
class B : public A {
public:
        void f( uint ) {}
};
void OnStart()
{
        B b;
        b.f( 1 ); //'A::f' - cannot call protected member function
}

Y si se elimina la línea (*), todo está bien. ¿Qué pasa con B::f(uint)? Si se mira la situación desde el otro lado

class A {
public:
        void f(  int ) {} //(**)
};
class B : public A {
public:
        void f( uint ) {}
};

podemos ver las desventajas fundamentales del algoritmo MQL de búsqueda de una función coincidente. En el segundo ejemplo, se llamará a B::f(uint) hasta que no haya ninguna cadena (**). En cuanto aparezca la línea (**), se llamará a A::f(int). Significa que los cambios en la clase base afectan al resultado final, mientras que en C++ se llamará siempre a B::f(uint) independientemente de los cambios en la clase base, lo que garantiza la estabilidad del resultado final.

En MQL, resulta que el desarrollador de la clase A acaba de inventar una nueva función pública\nprotegida\nprivada y por ello el usuario de la clase B ha dejado de compilar el código y/o, lo que es más grave, el resultado final ha cambiado.

Sólo la constante "1" en la llamada b.f( 1 ) se interpreta como int. Haz una conversión explícita y todo funcionará:

b.f( (uint)1 );