Erros, bugs, perguntas - página 1747

 

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

#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;  
}

O resultado (de baixo para cima)

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 por vezes devolve (tem de esperar) um tick com um tempo mais baixo do que o anterior!

Mas que raio é isso! Configuração

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 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

#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;  
}

O resultado (de baixo para cima)

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 por vezes devolve (tem de esperar) um tick com um tempo mais baixo do que o anterior!

Mas que raio é isso! Configuração

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.)
Sim, não é o único que precisa de ajuda aqui. Há já algumas semanas que tento enrolar as carraças normalmente numa vela. Por isso... as carraças ainda estão cruas. Oferta em SD#1598238
 

Linha mágica

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

Sequência de acções (estrita)

  1. Colocar os ficheiros anexos na mesma pasta. Depois com o rato no MetaEditor
  2. Ficheiro->Abrir->Seleccionar Teste.mqh->Botão Abrir
  3. Editar->Procurar e Substituir->Substituir->preencher nos campos Procurar: e 'Substituir por:' como mostrado abaixo->o botão 'Substituir tudo'.

Resultado:

Definições aqui: https://www.mql5.com/ru/forum/1111/page1127#comment_795376

Arquivos anexados:
Test.mqh  1 kb
key.mqh  1 kb
 
Alexey Kozitsyn:
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
Os tiques estão a enrolar-se na vela normalmente.
 
fxsaber:
O Tiki enrola-se normalmente na vela.
A sério? E os volumes coincidem? E já efectuou os controlos? E pode mesmo mostrar os registos?
 
Alexey Kozitsyn:
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

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
}

E se remover a linha (*), tudo está bem. Qual é o problema de B::f(uint)? Se olharmos para a situação do outro lado

class A {
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

 
A100:

Linha mágica

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

Sequência de acções (estrita)

  1. Colocar os ficheiros anexos na mesma pasta. Depois com o rato no MetaEditor
  2. Ficheiro->Abrir->Seleccionar Teste.mqh->Botão Abrir
  3. Editar->Procurar e Substituir->Substituir->Preencher nos campos Procurar: e 'Substituir por:' como mostrado abaixo->o botão 'Substituir tudo'.

Resultado:

Definições aqui: https://www.mql5.com/ru/forum/1111/page1127#comment_795376

Obrigado pelo post, o bug será corrigido na próxima actualização.
 
A100:

Erro de compilação

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
}

E se remover a linha (*), está tudo bem. Qual é o problema de B::f(uint)? Se olharmos para a situação do outro lado

class A {
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 );