Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 495

 

Sul primo caso è risolto - messo tra parentesi per due confronti e non giura - c'era un errore logico - cioè i risultati del confronto potrebbero essere sostituiti a causa della "o"?

Rimane una questione aperta con la seconda espressione - cosa c'è di sbagliato lì - qualche idea?

 
-Aleks-:

Il primo caso è risolto - metti tra parentesi due confronti e non giura - c'era un errore logico - cioè i risultati del confronto potrebbero essere sostituiti a causa di "or"?

C'è ancora una questione aperta riguardo alla seconda espressione - cosa c'è di sbagliato lì - qualche idea?

Ricordate che il controllo di una condizione nel nuovo mql4 non viene eseguito completamente. Cioè nella condizione

if(Low[X]>PriceBuy && High[X]>PriceBuy ||
               Low[X]<PriceBuy && High[X]<PriceBuy)

Se Low[x] non è più grande di PriceBuy, allora non verrà eseguito alcun ulteriore controllo. Questo è ciò che ci dice la descrizione dell'errore. Corrispondentemente, se la prima coppia è racchiusa tra parentesi, la seconda coppia di condizioni sarà controllata se fallisce.

Seconda domanda.

for(calc_day;calc_day>0; calc_day--)

A cosa è uguale calc_day? Può essere meno di zero? Il compilatore non sa cosa c'è nella logica... Ecco perché avverte di un possibile loop inefficace.

 
Alexey Viktorov:

Ricordate che il controllo delle condizioni nel nuovo mql4 non viene eseguito completamente. Cioè, nella condizione

if(Low[X]>PriceBuy && High[X]>PriceBuy ||
               Low[X]<PriceBuy && High[X]<PriceBuy)

Se Low[x] non è maggiore di PriceBuy, non viene eseguito nessun altro controllo. Questo è ciò che ci dice la descrizione dell'errore. Corrispondentemente, se la prima coppia è racchiusa tra parentesi, la seconda coppia di condizioni sarà controllata se fallisce.

Grazie per la risposta!

Sorpreso - come visivamente la logica ha sempre funzionato correttamente, hmmm...


Alexey Viktorov:

Seconda domanda.

for(calc_day;calc_day>0; calc_day--)

A cosa è uguale calc_day? Può essere meno di zero? Il compilatore non sa cosa c'è nella logica... Ecco perché avverte di un possibile loop inefficace.

Il numero di calc_day è sempre maggiore di 0. Altri valori non chiamano il codice.
 
-Aleks-:

Grazie per la risposta!

Sorpreso - come visivamente la logica ha sempre funzionato correttamente, hmmm...

Prima delle build 6** era così, controllava l'intera catena di condizioni e tutto funzionava, ma ora tutto è cambiato. E nelle vecchie costruzioni in questo caso la condizione è ambigua. Come è progettato?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

O l'ha fatto?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

Un cervello umano può capirlo, ma cosa deve fare un compilatore? Non ha un cervello.

-Aleks-:

Il numero calc_day è sempre maggiore di 0. Altri valori non causano la chiamata del codice.

Dillo al compilatore...

 
Alexey Viktorov:

Fino alla build 6** era così, l'intera catena di condizioni era controllata e tutto funzionava, ma ora tutto è cambiato. E nelle vecchie costruzioni la condizione è ambigua anche in questo caso. Come è progettato?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

o è così?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

Un cervello umano può capirlo, ma cosa deve fare un compilatore? Non ha un cervello...


Dillo al compilatore...

Convincente - sarò più vigile.

Come faccio a dirlo al compilatore? Scrivilo, ma capirà?

if (calc_day<0)  calc_day=calc_day*(-1);

 
Alexey Viktorov:

Era così prima delle build 6**, l'intera catena di condizioni era controllata e tutto funzionava, ma ora tutto è cambiato. Sì e nelle vecchie costruzioni in questo caso condizione ambiguità. Come è progettato?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

o lo è?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

Un cervello umano può capirlo, ma cosa deve fare un compilatore? Non ha un cervello...


Dillo al compilatore...

controllare la precedenza dell'operatore per un possibile errore; usare le parentesi per chiarire la precedenza - questo non è un errore. È un avvertimento. Si verifica nei vecchi codici.

L'hanno aggiunto per l'utente piuttosto che per il compilatore. Il compilatore è guidato dalle priorità delle operazioni. Lì tutto è chiaro. La priorità di && è superiore a quella di |||. Ecco perché le parentesi dovrebbero essere disposte in questo modo

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

Aggiornamento: in questo caso sia per MT4 che per MT5 la priorità è la stessa.

 
-Aleks-:

Convincente - sarò più vigile.

Come faccio a dirlo al compilatore? Scrivilo, ma capirà?

if (calc_day<0)  calc_day=calc_day*(-1);

for( calc_day = 365; calc_day > 0; calc_day --)
Quindi provate.
 
Alexey Kozitsyn:

controllare la precedenza dell'operatore per un possibile errore; usare le parentesi per chiarire la precedenza - questo non è un errore. È un avvertimento. Si verifica nei vecchi codici.

L'abbiamo aggiunto per l'utente piuttosto che per il compilatore. Il compilatore è guidato dalle priorità delle operazioni. Lì tutto è chiaro. La priorità di && è superiore a quella di |||. Ecco perché le parentesi dovrebbero essere disposte in questo modo

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

Aggiornamento: in questo caso sia per MT4 che per MT5 la priorità è la stessa.

Beh, in sostanza, sì, l'avviso non è un errore. Ma come funzionerà la variante iniziale if( Low[X]>PriceBuy && High[X]>PriceBuy || Low[X]<PriceBuy && High[X]<PriceBuy )? O è una seccatura mettere un paio di staffe?

 
-Aleks-:

Convincente - sarò più vigile.

Come faccio a dirlo al compilatore? Scrivilo, ma capirà?

if (calc_day<0)  calc_day=calc_day*(-1);

for(int i=calc_day; i>0; i--) {}
 
Alexey Viktorov:

Beh, in sostanza, sì, l'avviso non è un errore. Ma come funzionerà la variante iniziale if( Low[X]>PriceBuy && High[X]>PriceBuy || Low[X]<PriceBuy && High[X]<PriceBuy )? O non riuscirà a mettere un paio di staffe?

Funzionerà come ho scritto sopra.

Il compilatore avverte l'utente di non essere pigro e di mettere le parentesi per evitare possibili errori non ovvi.