É possível evitar muitos "ors" (|||) em condições que causem a mesma ação? - página 7

 

Que noite frutífera eu tive esta noite! Tive tantas coisas interessantes jogadas em mim enquanto dormia, pelas quais sou eternamente grato! E suas manhãs foram mais sábias do que as tardes também!

Uma rápida olhada em todas as coisas sugeridas ainda levanta questões como sempre, mas por enquanto só quero descobrir se é possível fazer a última expressão com apenas uma Ação(), pois é bastante extensa:

if (!A) if (!B) if (!C) if (!D)
else Action();


Parece-me que poderia ser mais rápido. É verdade, não exclui a verificação de todas as condições se apenas a última for executada, ou eu estou errado, o que seria melhor para mim.

O que você acha?

 
FAQ:
Quem não gosta da "porra da MQL4" pode muito bem ir correr, correr. Porque não está claro o que ele está fazendo aqui, apesar de todos os méritos e antiguidade da conta.
Por favor, explique isso aos não-iniciados!
 
Meat:
Em geral, a opção mais rápida seria esta:

Entretanto,caso contrário, resultado=linha falsa deve ser melhor combinado com a primeira, não afetará a velocidade.Em geral, se A, B, C e D contiverem condições simples (com aritmética mínima, sem chamar todas as funções matemáticas e outras coisas), então você não terá muito ganho de desempenho com tal otimização (a menos que esta construção funcione dezenas de milhões de vezes, é claro). Mas a sobrecarga de código pode ser significativa.

Por alguma razão, parece-me que seu código está cheio de lugares mais importantes, cuja otimização realmente daria um enorme ganho de desempenho. Você deve começar com o algoritmo básico. A maioria dos novatos tem uma verificação idiota de todas as condições referentes a TS ou pedidos em aberto a cada tick. Mas na maioria dos casos, basta verificar apenas as condições de contorno, por exemplo, quando o lanço ou baixa atinge um determinado valor, ou quando aparece uma nova barra. Só depois disso é possível realizar outras verificações.

Bem, além disso, com cálculos intensivos em recursos você precisa pensar em mover estes cálculos para uma DLL. Caso contrário, sentar e esperar 13 minutos na porra do MQL4 (enquanto você pode obter o mesmo resultado por 2-3 minutos) parece ser uma infelicidade :)


embora eu concorde absolutamente com a primeira parte.
 
icas:

É ainda mais rápido desse modo.

Um conto me vem à mente:

"Houve duas perguntas em uma reunião de diretoria da empresa:

1. A decisão de construir o synchrophasotron.

2. A decisão de construir um estacionamento de bicicletas para os funcionários.

Na primeira edição, a discussão durou 1 minuto,

no dia 2, o debate durou mais de 2 horas".

Sim, certo... Sobre o parque de bicicletas...
 
borilunad:

Que noite frutífera eu tive esta noite! Tive tantas coisas interessantes jogadas em mim enquanto dormia, pelas quais sou eternamente grato! E suas manhãs foram mais sábias do que as tardes também!

Uma rápida olhada em todas as coisas sugeridas ainda levanta questões como sempre, mas por enquanto só quero descobrir se é possível fazer a última expressão com apenas uma Ação(), pois é bastante extensa:

Parece-me que poderia ser mais rápido. É verdade, não exclui a verificação de todas as condições se apenas a última for executada, ou eu estou errado, o que seria melhor para mim.

O que você acha?

Não, isso não funciona assim. Primeiramente, deve haver algo depois de se(), pelo menos um ponto-e-vírgula (ou seja, um operador vazio). Em segundo lugar, a qual dos if's seu outro operador pretende pertencer? Se se referir apenas à última (como você a escreveu), então a Ação só será executada se a condição D for verdadeira, desde que A, B e C sejam falsas. É sempre recomendável colocar suportes encaracolados para ver a lógica de forma clara.

 
FAQ:

Obrigado! Por enquanto estou evitando o uso de DLL e outras coisas pró-MCLogo.

Vou aproveitar esta oportunidade para responder a Alexey (Meat) que todas as vagas são feitas em um novo bar, embora na M1, mas tudo o resto funciona em cada carrapato. Eu também uso muitas funções necessárias (se eu verificar tudo na inicialização todas as vezes, então o código seria realmente pesado). Há até mesmo um MathPow(), que vou tentar substituir pelo expoente sugerido pelo Matemático. Quanto ao resto, todos os excessos necessários para modificações e fechamentos. Como passar sem ele?

 
Preste atenção ao monitoramento e recálculo das ordens. isto é o que os conselheiros geralmente fazem mais.
 
alsu:

Não, não funciona dessa forma. Primeiro, deve haver algo depois de se(), pelo menos um ponto-e-vírgula (ou seja, um operador vazio). Em segundo lugar, a qual dos "se" seu outro operador está destinado a pertencer? Se se referir apenas à última (como você a escreveu), então a Ação só será executada se a condição D for verdadeira, desde que A, B e C sejam falsas. É sempre desejável colocar suportes encaracolados para ver a lógica de forma clara.

Obrigado! Mas só preciso de uma Ação(); mas não sei como! Você pode me dar uma dica?

 
FAQ:
Preste atenção no controle e no recálculo de pedidos. isto é o que os conselheiros geralmente fazem mais.
Mas eles são inevitáveis, senão haverá erros!
 

Em meus programas, se houver muitos "se", eu uso esta construção, colocando condições que na maioria das vezes darão falso em primeiro lugar:

if (A>B)
{  if (C>=10)
   {  if (D<=5)
      {  if(E=1)
         Action:
      }
   }
}
E se for necessário verificar muitos "ses", então é assim
if (A>B || N<M)
{  if (C>=10 || P<100)
   {  if (D<=5 || R>1)
      {  if(E=1 || S!=0)
         Action:
      }
   }
}