[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
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
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?
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("Сформировался новый бар"); // Вывод на экран
}
}
//--------------------------------------------------------------------
Tente este código. Parece funcionar, basta ver se está certo ou errado:
kolyango: Eu lhe mostrarei o código certo. Veja.
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);
}
Mas veja, parece estar funcionando corretamente! Verifiquei isso no cronograma M1:
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?
New_Time=Time[0] функция Fun_New_Bar() не будет возвращать истину
kolyango: Eu lhe mostrarei o código certo. Veja.
drknn:
... Программирование - это не игра в угадайки - тут думать надо...
... Bem, pelo menos às vezes ... :-)))
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.