[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 1084

 
khorosh:

Seria mais preciso colocá-lo desta forma:



Isso é ainda mais verdadeiro e agora funciona:

//--------------------------------------------------------------------
int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
return; // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
Alert("Сформировался новый бар"); // Вывод на экран
}
}
//--------------------------------------------------------------------

 
E, a propósito, por que destacar o código como código quando escrevo um comentário e é da mesma cor? Ou devo destacá-lo como o quê, para que pareça um código real em cores?
 
kolyango:

Experimentei na M1 e a mensagem não aparece depois que a próxima barra é formada. Isso significa que não funciona?


E não vai funcionar - você não escreveu o programa corretamente. Isso porque você não tem idéia de como seu próprio código vai funcionar. Vamos quebrar isso. Corpo de consultores especializados:

int start(){ // Спец. функция start
  if(Fun_New_Bar()){ //проверка наличия нового бара
    Alert("Сформировался новый бар"); // Вывод на экран
  }
  return(0); // Выход из start()
}

Um novo tick chega e a função Fun_New_Bar() é chamada. Se ele retornar ao programa principal, um Alerta irá aparecer. Caso contrário, a EA encerra seu trabalho com um retorno e espera por um novo tique. Tudo se repete em um novo tique.

Você diz que o código não funciona? Agora veja o que você tem em seu subprograma.

bool Fun_New_Bar(){ // Ф-ия обнаружения нового бара
  static datetime New_Time=0; // Время текущего бара
  bool New_Bar=false; // Нового бара нет
  if(New_Time!=Time[0]){ // Сравниваем время
    New_Time=Time[0]; // Теперь время такое
    New_Bar=true; // Поймался новый бар
  }
}

Uma função booleana é declarada. Como é uma função e não um procedimento, deve retornar algo ao programa principal do qual é chamado. Como a função é booleana, ela deve retornar um valor booleano. Onde você tem um fio que devolve alguma coisa ao programa principal? Isto significa que no início do programa, já que nada é retornado da função, os parênteses da expressão if(Fun_New_Bar()) serão sempre falsos e o alerta nunca irá aparecer.

Vamos mais longe. Por que você declarou data/hora New_Time=0; como estático? Qual é o seu raciocínio? Você declarou uma variável e a inicializou imediatamente com zero. No próximo tick, a mesma coisa acontecerá - a variável será declarada e inicializada por zero novamente. If(New_Time!=Time[0]){ Esta linha verifica se o valor da variável não é igual à hora atual. Bem, sim, a variável tem zero, mas o tempo atual não é zero. A condição é cumprida, o valor de tempo atual é escrito na variável, o parâmetro New_Bar se torna verdadeiro. No próximo tick , New_Time não será igual ao Time[0] novamente , ele verificará com sucesso a desigualdade novamente e as duas próximas operações serão executadas. Em outras palavras, ao verificar a condição se(New_Time!=Time[0]), a expressão entre parênteses será verdadeira a cada tick. SEMPRE. O que levanta a questão, se é sempre verdade, por que diabos este cheque deveria estar aqui? Talvez devêssemos simplesmente removê-lo? Por que devemos atribuir New_Time=Time[0] e New_Bar=true, se estas duas variáveis não são usadas em nenhum lugar? Por que diabos precisamos dessas duas tarefas? Você quer brincar? Ou você é preguiçoso demais para pensar?

 

Como disponibilizar uma variável global para um EA rodando em um segundo terminal MT4 que esteja rodando?

 
DhP:

Como disponibilizar uma variável global para um EA rodando em um segundo terminal MT4 que esteja rodando?


Através de uma api, ou através de um documento de texto.
 
drknn:

Através de uma api, ou através de um documento de texto.

Como?
 
DhP:

Como?

Através da api eu não sei como - li que é possível. Através de documento de texto - você precisa escrever uma dll em um idioma que não seja MQL4. Por exemplo, em Delphi ou C++. A dll tem que ser capaz de acessar o arquivo localizado fora do terminal. É bastante realizável. Mais adiante, tudo está claro - o Expert Advisor insere um novo valor da variável global em um documento de texto, e o outro Expert Advisor o lê a partir daí. A DLL dá acesso ao documento de texto aos dois consultores especialistas. Tais perguntas já foram feitas aqui antes. As pessoas têm perguntado algo como como fazer com que os EAs trabalhem juntos em dois canais diferentes.
 
kolyango:

Isso é ainda mais verdadeiro e funciona agora:

Não, não é assim - seu Alerta vai lhe enviar uma mensagem a cada tique, não uma vez no primeiro tique de uma vela nova.
 
kolyango:



Isto é ainda mais correto e agora funciona:

//--------------------------------------------------------------------
int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
return; // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
Alert("Сформировался новый бар"); // Вывод на экран
}
}
//--------------------------------------------------------------------


A função não é minha - eu a peguei on-line, mas não a usei. Agora, olhou com cuidado - falta um operador.

Esta é a maneira correta de fazer isso:

int start() // Спец. функция start
{
 if(Fun_New_Bar())//проверка наличия нового бара
   {
    Alert("Сформировался новый бар"); // Вывод на экран
   }
return(0); // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{                  // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
}
return(New_Bar);
}
 
drknn:

Através de uma api eu não sei como - eu li que é possível. Através de documento de texto - você precisa escrever uma dll em um idioma que não seja MQL4. Por exemplo, em Delphi ou C++. A dll tem que ser capaz de acessar o arquivo localizado fora do terminal. É bastante realizável. Mais adiante, tudo está claro - o Expert Advisor insere um novo valor da variável global em um documento de texto, e o outro Expert Advisor o lê a partir daí. A DLL dá acesso ao documento de texto aos dois consultores especialistas. Tais perguntas já foram feitas aqui antes. As pessoas perguntavam algo como como fazer com que os EAs funcionassem juntos em dois canais diferentes.

Obrigado, vou procurá-lo...
Razão: