Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 156

 

1) por que não inicializar imediatamente ao declarar int err=0 ?

2) não verificou, mas de acordo com a documentação o erro é armazenado em alguma variável, que é autozerada ao usar a função GetLastError(),

e também sempre muda ao usar algumas funções (na maioria terminais)

3) É por isso que GetLastError() deu um valor 0 após se referir a um número de bilhete inexistente na OrderSelect:

"As outras funções não alteram o valor da última variável de erro sob nenhuma condição. ................., OrderSelect, ...................."

 
hoz:

Muitas vezes eu declararia uma variável como esta dentro das funções:

Mais para dentro, em alguma condição eu já o chamo para ver se há um erro. Bem, não sou apenas eu, mas muitos outros lugares no código que encontrei. Por assim dizer, é uma situação típica. Hoje pensei que não é lógico declarar a mesma variável cada vez em cada função onde se quer controlar os erros. Pensei nisso e cheguei à conclusão de que é mais fácil declarar globalmente uma vez e inicializá-lo no init. É assim:

E ainda, quando você precisa chamar a variável errada nas funções do usuário, sabendo que ela já tem um valor. De fato, GetLastError() emite o código do último erro, então se esta variável errar é chamada em cada função no final de todos os cálculos, que é responsável pela emissão do código de erro, e chama GetLastError(), então tudo estará correto, certo?

Mas se você não chamar esta variável no final de alguma função (seguindo a cadeia de execução do código), ela não será reinicializada, e pode ser uma execução errada caso tenha havido um erro na execução anterior, mas não na atual, mas o código de erro é devolvido por último... E para redefini-lo, você precisa chamar esta função GetLastError(). Ou seja, aqui tudo depende se foi chamado ou não. Se você não tem certeza de que estará em todos os lugares, é mais fácil fazer um novo seguro e reinicializá-lo toda vez, certo?

Você pode declará-lo globalmente, depois no início() antes de chamar GetLastError() redefini-lo, por exemplo

int err;
//------------------
int init() 
{
  // ...
  return(0);
}
//------------------
int start() 
{ 
  // ...
  RefreshRates();
  OrderClose(...);
  err=0;     // обнуление
  err=GetLastError();
  SomeErrFunction(err);
  // ...
return(0);
}
 
ALXIMIKS:

1) por que não inicializar imediatamente ao declarar int err=0 ?


Experimente!:) Não funcionou para mim. Como entendi, a inicialização por funções especiais em variáveis globais não é permitida. Embora a documentação não pareça dizer nada sobre isso.
ALXIMIKS:

2) não verificou, mas de acordo com a documentação o erro é armazenado em alguma variável, que é autozerada ao usar a função GetLastError(),

e também sempre muda ao usar algumas funções (na maioria terminais)

Sobre zeragem e escrito acima, mas lá vai, se após o valor entrar na variável LastError(), então, para reiniciá-lo, precisamos chamar a função GetLastError() para retornar o código do último erro e reiniciar a variável LastError . Caso contrário, o código do último erro será armazenado permanentemente até que você chame GetLastError() e, consequentemente, pode devolver o código do último erro onde ele não existe mais. (ou seja, em outra função para dificultar a leitura do registro ou a impressão).
ALXIMIKS:

3) É por isso que GetLastError() deu um valor 0 após se referir a um número de bilhete inexistente na OrderSelect:

"As outras funções não alteram o valor da última variável de erro sob nenhuma condição. ................., OrderSelect, ...................."

Isto provavelmente não se deve ao OrderSelect(), mas algo mais está errado (próximo na mesma função). Especialmente é freqüentemente afetada por muitas outras coisas.
 
paladin80:

Você pode declarar o erro globalmente, depois zerá-lo no início() antes de chamar GetLastError(), por exemplo

Se você o declarar no início e depois mais de 1 erro no código, então a lógica já está fora de moda. A menos que GetLastError() seja constantemente chamado (teoricamente no final de cada função do usuário).
 
hoz:
então já existe um problema lógico. A menos que GetLastError() seja constantemente chamado(teoricamente no final de cada função do usuário).

Às vezes você tem que chamá-lo com mais freqüência
 

Victor (hoz), não entendo seu alarido com o último erro.

Declare a função de tratamento de erros e chame-a onde for necessário. Tudo será local e pode ser usado em qualquer lugar.

// Объявление:
void CommentError(int nLastCodeError, string sComment)
 {
  if (nLastCodeError != 0) Print(sComment, "  ", ErrorDescription(nLastCodeError));
 }

// Вызов:
void start()
 {
  CommentError(GetLastError(), "Ошибка в функции start()!");
 }
 
Zhunko:

Victor (hoz), não entendo seu alarido com o último erro.

Declare a função de tratamento de erros e chame-a onde for necessário. Tudo será local e pode ser usado em qualquer lugar.


É compreensível. Mas esta função será chamada quando eu precisar dela, ou seja, quando eu quiser verificar se há um erro. Mas se antes houve um erro em algum lugar e não há erro neste momento, ele retornará o erro anterior... Porque em sua função Vadim, a variável LastError não é zerada , chamando GetLastError(). A questão é a seguinte...
 
hoz:

É compreensível. Mas esta função será chamada quando eu precisar dela, ou seja, quando eu quiser verificar se há um erro. Mas se houve um erro em algum lugar antes, e neste momento não há erro, ele retornará o erro anterior... Porque em sua função Vadim, a variável LastError não é zerada , chamando GetLastError(). Essa é a questão...

Não deve ser reposto a zero. Deve haver o hábito de verificar a existência de erros em todos os lugares após as funções. Você também deve fazer com que a chamada seja desativada. Para que não abrande no modo de combate. Isto é, é um depurador.

A exceção, é claro, é para erros que precisam ser analisados, para se tomar uma decisão.

 
hoz:

Isso é compreensível. Mas esta função será chamada quando eu precisar dela, ou seja, quando eu quiser verificar se há um erro. Mas se antes houve um erro em algum lugar e não há erro neste momento, ele retornará o erro anterior... Porque em sua função Vadim, a variável LastError não é zerada , chamando GetLastError(). A questão é a seguinte...
O que o impede de primeiro zerar (err=0;), depois chamar a ação, depois atribuir err=GetLastError(), manuseá-lo, e err=0 novamente.
 
Como calcular o fator de lucro com diferentes t/p e s/l. É claro, se tomar e parar são 20 pips cada um, vamos calcular o número de negócios lucrativos e deficitários e dividi-los. Como faço para calcular se eu tomar um TP de 40 pips e o stop 30 pips? Vamos usá-lo da mesma forma que o usamos no mesmo lugar.