Erros, bugs, perguntas - página 1063

 
MetaDriver:
Experimente ObjSetInteger(id, Nome, OBJPROP_BACK, falso);
Experimentei-o. A forma cai, de facto, para trás, mas feitiçaria o mais feio possível, ou seja, cai mesmo atrás das grades. E a tarefa é um pouco diferente, só preciso que o texto seja exibido na forma, enquanto a própria forma estava em cima de gráficos e outras formas.
 
C-4:
Experimentei-o. A forma cai, de facto, para trás, mas feitiçaria o mais feio possível, ou seja, cai mesmo atrás das grades. E a tarefa é um pouco diferente, só preciso que o texto seja exibido na forma, com a própria forma a estar em cima do gráfico e outras formas.

Os objectos são exibidos na ordem em que foram criados, se quiser alterar a ordem, deve guardar os dados do objecto e recriá-los na ordem correcta.

Ou será que o insecto está mesmo nisto?

 
C-4:
Experimentei-o. A forma cai, de facto, para trás, mas feitiçaria o mais feio possível, ou seja, cai mesmo atrás das grades. E a tarefa é um pouco diferente, basta que o texto seja exibido no formulário, com o próprio formulário em cima do gráfico e outras formas.
Basta considerar a ordem em que os objectos gráficos são criados. Os que devem estar abaixo devem ser criados primeiro.
 
tol64:
Basta ter em conta a ordem em que os objectos gráficos são criados. Os que devem estar abaixo devem ser criados primeiro.

Sim, essa foi a primeira coisa em que pensei. Alterou a ordem - mesmo resultado. Mas não há milagres. Mas agora peguei num projecto de trabalho e tentei colocar lá OBJ_EDIT e funcionou bem, ou seja, é visível acima da forma. Por isso, no cômputo geral, tudo parece um inferno. Obviamente esqueci-me ou não levei algo em conta. Mas mesmo assim eu queria resolvê-lo para não cometer o mesmo erro da próxima vez. Aqui está o código do OnInit() para o teste:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
   ObjectCreate(0, "cell", OBJ_RECTANGLE_LABEL, 0, 0, 0);
   ObjectSetInteger(0, "cell", OBJPROP_XDISTANCE, 15);
   ObjectSetInteger(0, "cell", OBJPROP_YDISTANCE, 60);
   ObjectSetInteger(0, "cell", OBJPROP_BGCOLOR, clrWhite);
   ObjectSetInteger(0, "cell", OBJPROP_BORDER_TYPE, BORDER_FLAT);
   ObjectSetInteger(0, "cell", OBJPROP_BORDER_COLOR, clrBlack);
   ObjectSetInteger(0, "cell", OBJPROP_BACK, false);
   //ObjectSetInteger(0, "cell", OBJPROP_SELECTED, false);
   
   ObjectCreate(0, "edittext", OBJ_EDIT, 0, 30, 30);
   ObjectSetInteger(0, "edittext", OBJPROP_XDISTANCE, 40);
   ObjectSetInteger(0, "edittext", OBJPROP_YDISTANCE, 50);
   ObjectSetInteger(0, "edittext", OBJPROP_BGCOLOR, clrNONE);
   ObjectSetInteger(0, "edittext", OBJPROP_BORDER_COLOR, clrNONE);
   //ObjectSetInteger(0, "edittext", OBJPROP_WIDTH, 3);
   ObjectSetString(0, "edittext", OBJPROP_TEXT, "edit text");
   ObjectSetInteger(0, "edittext", OBJPROP_BACK, false);
   
   
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов - Документация по MQL5
 
C-4:

Sim, essa foi a primeira coisa em que pensei. Alterou a ordem - mesmo resultado. Mas não há milagres. Mas agora peguei num projecto de trabalho e tentei colocar lá OBJ_EDIT e funcionou bem, ou seja, é visível acima da forma. Por isso, no cômputo geral, tudo parece um inferno. Obviamente esqueci-me ou não levei algo em conta. Mas mesmo assim, gostaria de o fazer para não cometer este erro da próxima vez. Aqui está o código do OnInit() para o teste:

Neste caso, precisamos de um manipulador de objectos, para que a conta do que é criado e em que ordem estava num lugar, então não haverá sobreposição quando uma função cria esta segunda, e a mudança de chamada de função irá alterar a ordem.

É difícil apanhar este tipo de insecto e até mesmo prevê-lo.

 
Informação para MQ. No manual do OnTimer há "... a receber por EventSetTimer()...". Deve também acrescentar "... ou EventSetMillisecondTimer()...".
Документация по MQL5: Работа с событиями / EventSetTimer
Документация по MQL5: Работа с событиями / EventSetTimer
  • www.mql5.com
Работа с событиями / EventSetTimer - Документация по MQL5
 

Olá a todos!

Há um parágrafo como este na ajuda:

Все события обрабатываются одно за другим в порядке поступления. Если в очереди уже есть событие NewTick либо это событие находится в состоянии обработки, то новое событие NewTick в очередь mql5-программы не ставится. Аналогично, если в очереди mql5-программы уже находится событие ChartEvent или такое событие обрабатывается, то новое событие такого типа не ставится в очередь

Portanto, se houver um ChartEvent na fila de eventos, não deve ser enfileirado uma segunda vez. Tive um problema com isso :)

Chamei um consultor especializado para o verificar. Verificou-se que não importa se há ou não um evento ChartEvent na fila, o ChartEvent handler é chamado tantas vezes quantas eu o gerar.

Isto é óptimo, mas na minha opinião, preciso de corrigir a ajuda... Ou será que estou errado?

input int N= 50; //количество событий в очереди

void OnInit()
  {
   EventSetTimer(5);
  }

void OnDeinit(const int reason)
  {
   EventKillTimer();    
  }

void OnTimer()
  {
  for (ushort i=0; i<N; i++) EventChartCustom(0,1,i,0,(string)0);
  }


void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if (id>CHARTEVENT_CUSTOM) Print ("Обработано событие номер: ", lparam);
  }
 
MigVRN:

Olá a todos!

Há um parágrafo como este na ajuda:

Portanto, se houver um ChartEvent na fila de eventos, não deve ser enfileirado uma segunda vez. Tive um problema com isso :)

Chamei um consultor especializado para o verificar. Verificou-se que não importa se há ou não um evento ChartEvent na fila, o ChartEvent handler é chamado tantas vezes quantas eu o gerar.

Isto é óptimo, mas penso que precisamos de corrigir a ajuda... Ou estarei eu errado?

Isto só se aplica ao caso de transbordo da fila, se a fila estiver cheia então o tipo de evento que já se encontra na fila não é colocado.

Se a fila não estiver cheia (e o comprimento da fila for 1024), todos os eventos são tratados.

 
Urain:

Isto só se aplica se a fila estiver cheia, se a fila estiver cheia o tipo de evento já está na fila não será enfileirada.

Mas se a fila não estiver a transbordar (e o comprimento da fila penso que é 1024), então todos os eventos são tratados.

Já está. Obrigado :)

PS: O Conselheiro Especialista acima mencionado não conseguiu enfileirar mais de 1000.

 
paladin800:
Informação para MQ. No manual do OnTimer há "... a receber por EventSetTimer()...". Deve também acrescentar "... ou EventSetMillisecondTimer()...".
Depois todos definirão um temporizador de milissegundos, mesmo que não precisem dele.
Razão: