Erros, bugs, perguntas - página 1747
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Como posso remover a colagem visual de objectos NÃO LABEL às coordenadas temporais das barras?
Eu defino a coordenada temporal do objecto em segundos, mas visualizo como se o tivesse definido para o período de tempo.
Cavei a questão
Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos
Erros, Erros, Perguntas
Andrew Petras, 2014.11.26 13:34
Sou muito bom a mover objectos como triângulos, elipses ou rectângulos, e os pontos de ancoragem são desproporcionadamente "flutuantes".
Não depende destas configurações
Eu crio
arrastar e largar
O rectângulo está "à deriva" o segundo ponto, o triângulo e a elipse têm o terceiro ponto.
Isto pode ser corrigido? Preciso de "medições" precisas.
Quando selecciono "Escala de tempo precisa", a ligação mencionada desaparece e tudo é mostrado como deve ser. No entanto, não encontrei em lado nenhum na MQL5 como activar/desactivar este parâmetro. Não está previsto?
Realmente preciso de ajuda! Há algumas horas que se tenta descobrir a causa do estranho comportamento. No final, escrevi um AE com um resultado bastante inesperado
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;
}
O resultado (de baixo para cima)
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 por vezes devolve (tem de esperar) um tick com um tempo mais baixo do que o anterior!
Mas que raio é isso! Configuração
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.)
Realmente preciso de ajuda! Há algumas horas que se tenta descobrir a causa do estranho comportamento. No final, escrevi um AE com um resultado bastante inesperado
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;
}
O resultado (de baixo para cima)
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 por vezes devolve (tem de esperar) um tick com um tempo mais baixo do que o anterior!
Mas que raio é isso! Configuração
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.)
Linha mágica
virtual int f( const ABCDEFGHIJK ) const { return ABCDEFGHIJK; }
Sequência de acções (estrita)
Resultado:![](https://c.mql5.com/3/108/replace__1.png)
Definições aqui: https://www.mql5.com/ru/forum/1111/page1127#comment_795376
Sim, não é o único que precisa de ajuda aqui. Há já algumas semanas que tento enrolar bem os meus tiques numa vela. Por isso... os tiques ainda estão crus. Oferta em SD#1598238
O Tiki enrola-se normalmente na vela.
A sério? E os volumes são os mesmos? E já efectuou os controlos? E pode mesmo mostrar os registos?
Fez o controlo - observe a codobase. Não se preocupe com o desencontro entre os volumes de castiçal e os calculados, porque se trata de um tique de limite, que pode cair numa ou noutra barra. Isto não é principal. Também afixei o indicador de volume de negócios no fórum. Portanto, não há qualquer problema.
No seu caso, se for muito tosco, pode escolher o mecanismo de criação de bares, mas não o CopyTicks.
Erro de compilação
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
}
E se remover a linha (*), tudo está bem. Qual é o problema de B::f(uint)? Se olharmos para a situação do outro lado
public:
void f( int ) {} //(**)
};
class B : public A {
public:
void f( uint ) {}
};
podemos ver as desvantagens fundamentais do algoritmo MQL da procura de uma função de correspondência. No 2º exemplo, B::f(uint) será chamado até que não haja cordel (**). Assim que a linha (**) aparecer, A::f(int) será chamada. Isto significa que as mudanças na classe base afectam o resultado final, enquanto em C++ B::f(uint) será sempre chamada independentemente das mudanças na classe base, o que garante a estabilidade do resultado final.
Na MQL, acontece que o desenvolvedor da classe A acaba de inventar uma nova função pública protegida e, por isso, o utilizador da classe B já não compila o código e/ou o que é mais crítico - o resultado final muda
Linha mágica
virtual int f( const ABCDEFGHIJK ) const { return ABCDEFGHIJK; }
Sequência de acções (estrita)
Resultado:
Definições aqui: https://www.mql5.com/ru/forum/1111/page1127#comment_795376
Erro de compilação
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
}
E se remover a linha (*), está tudo bem. Qual é o problema de B::f(uint)? Se olharmos para a situação do outro lado
public:
void f( int ) {} //(**)
};
class B : public A {
public:
void f( uint ) {}
};
podemos ver as desvantagens fundamentais do algoritmo MQL da procura de uma função de correspondência. No 2º exemplo, B::f(uint) será chamado até que não haja cordel (**). Assim que a linha (**) aparecer, A::f(int) será chamada. Isto significa que as mudanças na classe base afectam o resultado final, enquanto em C++ B::f(uint) será sempre chamada independentemente das mudanças na classe base, o que garante a estabilidade do resultado final.
Na MQL, acontece que o desenvolvedor da classe A acaba de inventar uma nova função pública protegida e, por isso, o utilizador da classe B deixou de compilar o código e/ou, o que é mais crítico, o resultado final mudou.
Apenas a constante "1" na chamada b.f( 1 ) é interpretada como uma int. Faça uma conversão explícita e tudo irá funcionar:
b.f( (uint)1 );