Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1374

 
Alexey Viktorov #:

Alguém lhe ensinou mal. A variável _LastError armazenará o valor até que ocorra o próximo erro.


Bem, olha, no início do código principal ocorre o seguinte erro

ERR_INVALID_DATETIME

4010

Valor incorrecto da data e/ou hora


E então um objecto é criado pelo código e _LastError é reescrito para

ERR_OBJECT_NOT_FOUND

4202

Objecto gráfico não encontrado


Se a verificação _LastError estiver no fim do código, como costumo fazer, receberei 4202 e simplesmente ignorá-lo-ei. Ou seja, o erro 4010 permanecerá despercebido. Onde é que estou errado?

Alexey Viktorov #:


É um requisito do mercado que não sejam recebidos erros de execução do servidor do corretor\dc.

Obrigado, não sabia disso, pensava que todos os erros eram proibidos.

 
leon_17 #:

Veja, no início do código principal, por exemplo, ocorre o seguinte erro:

ERR_INVALID_DATETIME

4010

Valor incorrecto da data e/ou hora


E então um objecto é criado pelo código e _LastError é reescrito para

ERR_OBJECT_NOT_FOUND

4202

Objecto gráfico não encontrado


Se a verificação _LastError estiver no fim do código, como costumo fazer, receberei 4202 e simplesmente ignorá-lo-ei. Ou seja, o erro 4010 permanecerá despercebido. Onde é que eu estou a ir errado?

Obrigado, não sabia disso, pensava que todos os erros eram proibidos.

Exactamente. Não está enganado...

 

Olá, alguém me pode dar uma dica?

Estou a escrever os valores de tempo de cada barra especificamente numa matriz. Há um limite de 3000 barras no gráfico.

A tarefa:

- Deslocar o conjunto de valores em cada nova barra.

void CNewBar::PriceHL2()
  {
   int start= 0;
   ArrayResize(this.m_tim_pr_hl2,this.m_rt);
  
   if(this.m_pc!=0)
     {
      start= this.m_pc;
      ArrayCopy(this.m_tim_pr_hl2, this.m_tim_pr_hl2, 0, this.m_rt-this.m_pc);
     }  
   for(int b= start; b < this.m_rt; b++)
     {
      this.m_tim_pr_hl2[b]= iTime(this.m_symbol, this.m_timeframe, this.m_rt-b);
     }
  }

Não consigo ajustá-lo para funcionar correctamente.

Estou a mudar correctamente a matriz numa nova barra se (this.m_rt-this.m_pc)=1?

ArrayCopy(this.m_tim_pr_hl2, this.m_tim_pr_hl2, 0, this.m_rt-this.m_pc); // this.m_rt-this.m_pc=1
 
Mikhail Toptunov #:

Olá, alguém me pode dar uma dica?

Estou a escrever os valores de tempo de cada barra especificamente numa matriz. Há um limite de 3000 barras no gráfico.

A tarefa:

- Deslocar o conjunto de valores em cada nova barra.

Não consigo ajustá-lo para funcionar correctamente.

Estou certo em mudar a matriz num novo bar se (this.m_rt-this.m_pc)=1?

Ou seja, o tamanho da matriz deve ser exactamente 3000 e na formação de uma nova barra o índice zero deve ser sobrescrito primeiro ......... e no final escrever um novo valor?

Se entendi correctamente, qual é o objectivo do laço? Basta copiar a própria matriz no índice nulo a partir do primeiro, e depois escrever o novo valor no último índice.

 
Alexey Viktorov #:

Se nenhum objecto for encontrado, este é o erro de pesquisa do objecto.

ERR_OBJECT_NOT_FOUND

4202

Objecto gráfico não encontrado


Não há necessidade de alertar...

Fez alguns testes... Eis o que tenho em mente. Na MQL5, não é necessário utilizar ObjectFind() ao criar objectos.
O objecto pode ser criado sem qualquer verificação preliminar da sua existência (usando apenas o ObjectCreate). Mesmo dentro do OnTick tal código não causará quaisquer erros de _LastError.

Não sei como é implementado nas profundezas do código do sistema MQL5, talvez já exista alguma verificação de que o objecto só será criado se ainda não estiver presente. Mas acontece que pelo menos quando se cria um objecto dentro da MQL5, ObjectFind() não é necessário. E todas as suas propriedades são invariavelmente actualizadas a cada tick.

Isto não pode ser dito sobre a MQL4. A criação de um objecto sobre um já existente causará um erro 4200 ("O objecto já existe"). Significa que o uso deObjectFind() é obrigatório para a sua criação.Isto deixa-me com uma simples possibilidade de fechar as suas propriedades a partir de actualizações constantes sem gerar erros de _LastError.

Por favor, confirme as minhas conclusões.

 
Alexey Viktorov #:

Ou seja, o tamanho da matriz deve ser exactamente 3000 e quando se forma uma nova barra, o índice zero deve ser sobrescrito primeiro ......... e o novo valor deve ser acrescentado ao final?

Se entendi correctamente, porque preciso de um laço? Simplesmente, a matriz em si deve ser copiada para o índice nulo a partir do primeiro, e depois o novo valor deve ser acrescentado ao último índice.

Bem, sim, é claro, mas se houver uma pausa, por exemplo, um atraso, duas barras apareceram, eu escrevo-as.

Muito obrigado, compreendo, vou tentar através do CopyTime.

 
leon_17 #:

Fez alguns testes... Eis o que acontece. Na MQL5, não é necessário utilizar ObjectFind() ao criar objectos.
O objecto pode ser criado sem qualquer verificação preliminar da sua existência (apenas usando ObjectCreate). Mesmo dentro do código OnTick, este código não causará quaisquer erros de _LastError.

Não sei como é implementado nas profundezas do código do sistema MQL5, talvez já exista alguma verificação de que o objecto só será criado se ainda não estiver presente. Mas acontece que pelo menos quando se cria um objecto dentro da MQL5, ObjectFind() não é necessário. E todas as suas propriedades são invariavelmente actualizadas a cada tick.

Isto não pode ser dito sobre a MQL4. A criação de um objecto sobre um já existente causará um erro 4200 ("O objecto já existe"). Significa que o uso deObjectFind() é obrigatório para a sua criação.Isto deixa-me com uma simples possibilidade de fechar as suas propriedades a partir de actualizações constantes sem gerar erros de _LastError.

Por favor, confirme as minhas conclusões.

Não se trata de erros de forma alguma. A questão é que quando um objecto é criado, certas propriedades são-lhe atribuídas e porquê desperdiçar tempo e recursos da máquina na redefinição de propriedades sem fazer alterações. É muito mais barato verificar se o objecto existe e depois atribuir novas propriedades apenas àquelas que precisam de ser alteradas. Por exemplo, uma etiqueta de texto ou Lable, muitas vezes apenas texto nestes objectos deve ser alterado. Todas as outras propriedades permanecem como estão...
 
Mikhail Toptunov #:

Bem, sim, parece claro, mas se houver uma pausa, por exemplo, atraso, apareceram duas barras, eu escrevo-as.

Obrigado, eu compreendo, vou tentar através do CopyTime.

Bem, se o fizer através do CopyTime, não há qualquer problema. Basta copiar a partir das actuais 3000 barras e pronto.

 

Como é que eu defino o nível da paragem regular no código do programa quando coloco uma ordem pendente ou abro uma posição a partir do mercado?

A forma como isto é feito manualmente é clara. Os programas para paragens não-padronizadas não são interessantes.

Obrigado de antemão.

 
   for (int symbols; symbols < SymbolsTotal(true); symbols++) 
      {
        Print(SymbolName(symbols ,true));
      }

Porque é que um tal desenho não funciona? Onde está o erro... (o tronco está vazio)


E o iene, também vazio.

enum c_mode
  {
   Auto,
   Manual,    
  };

input c_mode MODE         = Auto;

if (MODE==Auto) 
      {
      Print("MODE=Auto");
      }