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

 
khorosh:

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

A maneira correta é esta:


Errado novamente! O EA apitará novamente a cada toque, porque a Fun_New_Bar() sempre retornará verdadeiro. A questão é por que precisamos da Fun_New_Bar() se ela sempre retorna verdadeiro?
 
drknn:


E não vai funcionar - você deve ter escrito o programa de forma incorreta. E isso porque você não tem idéia de como seu próprio código vai funcionar. Vamos quebrar isso. O corpo do Consultor Especialista:

Um novo tick chega e a função Fun_New_Bar() é chamada. Se ele retornar ao programa principal, aparecerá um alerta. Caso contrário, a EA encerra seu trabalho retornando 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.

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?


Tente este código. Parece funcionar, mas veja se está certo ou errado. Se algo estiver errado, corrija:

//--------------------------------------------------------------------
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("Сформировался новый бар"); // Вывод на экран
}
}
//--------------------------------------------------------------------

 
kolyango:


Tente este código. Parece funcionar, basta ver se está certo ou errado:

Não, não é - eu tenho tudo escrito para você. Você não entende nada?
 

kolyango: Eu lhe mostrarei o código certo. Veja.

//+------------------------------------------------------------------+
//|                                                            0.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""

int MyChandle;// количество свеч на графике
//+------------------------------------------------------------------+
//|                  Блок инициализации                                |
//+------------------------------------------------------------------+
int init(){
  MyChandle=0;// ну или можно вот так : MyChandle=Bars;

  return(0);
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                              |
//+------------------------------------------------------------------+
int deinit(){
  if (!IsTesting()){
    Comment("");
    Print("Советник деинициализирован (выключен совсем)");
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                            |
//+------------------------------------------------------------------+
int start(){
  if(MyChandle<Bars){
   Alert("Было свеч = ", MyChandle," Стало свеч = ",Bars);

   MyChandle=Bars;
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                       |
//+------------------------------------------------------------------+
 
drknn:
Não, isso não está certo - eu tenho o código todo escrito para você. Você não entende nada?


Mas veja, parece estar funcionando corretamente! Eu verifiquei no cronograma M1:

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

 
kolyango:


Mas veja, parece estar funcionando corretamente! Verifiquei isso no cronograma M1:



Olhe, você pode ler ou não - disse-lhe acima - não o código certo - ele sinalizará a cada tique, não uma vez em uma vela nova. Veja acima - Eu lhe dei o código certo. O que mais você não precisa para ser feliz? Para saber por que seu código não está correto? Eu já expliquei, é errado porque o tempo todo a subrotina retorna verdadeira e somente verdadeira. O alerta irá aparecer a cada tique! Programação não é um jogo de adivinhação - você tem que pensar.
 
drknn:

Errado novamente! O EA apitará novamente a cada toque, já que a Fun_New_Bar() sempre retornará verdadeiro. A questão é por que diabos precisamos da Fun_New_Bar() se ela sempre retorna verdadeiro?
Funciona corretamente - eu verifiquei na tabela. Quando
New_Time=Time[0]

функция Fun_New_Bar() не будет возвращать истину
 
drknn:

kolyango: Eu lhe mostrarei o código certo. Veja.

E a variante que utiliza Barras é menos preferível, porque o valor das Barras pode mudar não apenas devido ao aparecimento de uma nova barra.
 

drknn:
... Программирование - это не игра в угадайки - тут думать надо...

... Bem, pelo menos às vezes ... :-)))

 
khorosh:
E a variante que utiliza Barras é menos preferível, porque o valor das Barras pode mudar não só devido ao aparecimento de uma nova barra.


Então, me esclareça - o número de velas no gráfico pode mudar em relação a qualquer outra coisa, exceto o aparecimento de uma nova barra? :)))))

Ah, sim, isso mesmo - carga histórica. :) De qualquer forma, sua função apitará a cada tique - não se lembra corretamente do tempo.