Erros, bugs, perguntas - página 101

 
Urain:

Seja como for.

if(a==0){expressão} significa que se a é 0 então é verdade, então execute {expressão}.

if(a=0){expressão} é equivalente a if(a){a=0;expressão} se a for verdade, {a=0;expressão}.

A segunda está errada, deveria ser escrita assim

se(a=x) { expressão } atribuir o valor de x à variável a, e se a não for 0 depois disso, então executar a expressão

se(a=0) { } após a optimização haverá apenas a=0

 
mql5:

A segunda está errada. A forma correcta de a escrever é

se(a=x) { expressão } atribuir o valor de x à variável a, e se a não for 0 depois disso, executar a expressão

se(a=0) { } após a optimização haverá apenas a=0

Desculpe, isso é verdade, as expressões são executadas da esquerda para a direita.

É por isso que começamos com a tarefa, e depois verificamos a verdade.

 
Renat:

Este é, grosso modo, o caso:

Este código não só calcula o volume máximo como também o enquadra exactamente nas limitações das definições do símbolo.

Calcula-o mas esquece-se porque o calcula quando o insere:

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

O valor do lote por este ponto é calculado de modo a consumir toda a margem disponível com uma margem mínima.

Se este valor for aumentado em pelo menos um passo de volume, não haverá dinheiro suficiente para abrir uma posição.

Mas a segunda linha do código citado MAQUISA o valor do lote no caso da condição sob se cumprir, e pode aumentá-lo num valor muito maior do que o valor do passo de volume, porque na realidade há volume min = 0,1 e passo de volume = 0,01.

E neste código abaixo, pode ocorrer uma divisão por zero, contra a qual não existe protecção:

   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

Se SymbolInfoDouble() devolver 0, é tudo. Os programas MQL5 terminam na divisão por 0, certo? Não pode regressar 0? As pessoas aqui queixam-se de que as funções informativas regressam muitas vezes a 0. Não se pode cair "não regressa a 0" porque, em primeiro lugar, pode, e em segundo lugar, a divisão por 0 é fatal.

Há algumas observações menores sobre a "precisão da entrada", mas não são realmente muito significativas, ou seja, não têm consequências tão graves, pode ignorá-las.

Antecipando possíveis argumentos de que o código é "aproximado", reparo: quantos utilizadores do produto são capazes de encontrar e reparar competentemente tais "maus lugares"?

Para eles, isto é "código dos criadores". Um exemplo a ter em conta.

 

Porque é que o botão "Next" não está activo quando todos os campos obrigatórios são preenchidos?

 
EvgeTrofi:

Porque é que o botão "Next" não está activo quando todos os campos obrigatórios são preenchidos?

Tem de dar a sua permissão para receber o boletim por correio.
 
simpleton:

Calcula, mas depois esquece para que estava a calcular:

Antecipando possíveis argumentos de que o código é "aproximado", gostaria de salientar: quantos utilizadores do produto podem corrigir correctamente tais "sítios maus"?

O código era aproximado (copiado de duas peças), mas os seus comentários estão correctos.

Aqui está a versão corrigida:

double CalculateMaxVolume(string symbol)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,price))                return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,symbol,1.0,price,margin)) return(0.0);
   if(margin<=0.0)                                            return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)/margin,2);
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   if(stepvol>0.0)
     {
      double newlot=stepvol*NormalizeDouble(lot/stepvol,0);
      if(newlot>lot) lot=NormalizeDouble(newlot-stepvol,2);
      else           lot=newlot;
     }

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=0.0;   // 

   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;
//--- return trading volume
   return(lot);
  }
 
gumgum:

E porquê session_index++; quando session_index=1 já é falso:

Não podemos saber com antecedência qual é o número de sessões por ferramenta. Por isso, consultamos cada sessão por número. Se for verdade

session_exist=SymbolInfoSessionQuote(symbol,day,session_index,start,finish);

estamos interessados no tempo do seu início e fim. Se formos enganados - é isso, não há sessão com este número.

 
Rosh:

Não podemos saber com antecedência qual é o número de sessões de um instrumento. Por conseguinte, solicitamos cada sessão por número. Se for verdade

analisamos o tempo do seu início e fim. Se formos enganados - é isso, não há sessão com este número.

A...... Porquê então na sexta-feira tudo acaba às 24:00, mas na realidade às 23:00?
 
gumgum:
A...... então porque é que tudo acaba na sexta-feira às 24:00 e na realidade às 23:00?
Porque é isso que o servidor diz. Vamos verificar isso, obrigado.
 
Compreendo que agora pode alterar o seu e-mail no seu perfil? No campo E-mail pode agora fazer alterações, mas elas não são guardadas!