Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 869

 
Artyom Trishkin:
La sezione di aiuto ti dice a cosa serve. E, sì, è corretto che un parametro inserito dall'utente non può essere cambiato programmaticamente. Almeno qualcosa può appartenere all'utente :)

Se vuoi davvero, puoi)

 
Vitaly Muzichenko:

Se vuoi davvero, puoi)

È possibile, naturalmente, se lo riassegnate. Ma il valore inserito dall'utente rimarrà invariato.
 

Incontro spesso un problema. Il compilatore giura con un errore "variabile già definita" sul codice:

if (n<10)
 {
  int a=10;
 }
else
 {
  int a=5;
 }

La guida di riferimento su https://docs.mql4.com/ru/basis/variables/local dice:

Levariabili dichiarate all'interno di un blocco (a livello interno) hanno lo scopo delblocco.

Se i blocchi sono annidati e l'identificatore nel blocco esterno ha lo stesso nome dell'identificatore nel blocco interno, l'identificatore del blocco esterno è "invisibile" (nascosto) fino al completamento del blocco interno.

Ma anche l'esempio dallo stesso libro di riferimento non compila con lo stesso errore "variabile già definita":

int i=5;      // локальная переменная функции
     {
      int i=10;  // переменная функции 
      Print("В блоке i = ",i); // результат  i = 10;
     }
   Print("Вне блока i = ",i);  // результат  i = 5;

Stesso problema con i cicli:

int i=10;
for (int i=1;i<10;i++) ...

Come possiamo aggirare questo problema e fare in modo che l'esempio di directory compili senza l'errore "variabile già definita"?

 
The_Sheikh:

Incontro spesso un problema. Il compilatore giura con un errore "variabile già definita" sul codice:

La guida di riferimento su https://docs.mql4.com/ru/basis/variables/local dice:

Levariabili dichiarate all'interno di un blocco (a livello interno) hanno lo scopo delblocco.

Se i blocchi sono annidati e l'identificatore nel blocco esterno ha lo stesso nome dell'identificatore nel blocco interno, l'identificatore del blocco esterno è "invisibile" (nascosto) fino al completamento del blocco interno.

Ma anche l'esempio dallo stesso libro di riferimento non compila con lo stesso errore "variabile già definita":

Stesso problema con i cicli:

Come possiamo aggirare questo problema e fare in modo che l'esempio di directory compili senza l'errore "variabile già definita"?

#proprietà rigorosa
 
The_Sheikh:

Come posso aggirare questo problema e far sì che l'esempio di directory venga compilato senza l'errore "variabile già definita"?

non tutti gli esempi nel libro di riferimento funzionano correttamente per molto tempo

per ambito nei vostri esempi - la visibilità all'interno di un singolo operatore è locale, dovrebbe sicuramente funzionare così:

void OnStart()
  {
   for(int i=0;i<10;i++)
     {
      double x=i;
     }

   for(int i=0;i<10;i++)
     {
      double x=i;
     }
  }

cioè la visibilità all'interno di un'istruzione for è locale, le variabili i e x saranno perse quando si esce da essa

 

Ho provato a cercare l'ultimo picco dell'indicatore Peak Repainter per essere elaborato dall'EA:

   GV_trendD1 = StringConcatenate(GVn," дневной тренд");
   if (!GlobalVariableCheck(GV_trendD1))
      {
      double   fUP,fDN;

      for (int f=0; f<=400 && !IsStopped(); f++)
         {
         fUP = iCustom(NULL,PERIOD_D1,"Used\\# Peak Repainter",0,f);
         if (fUP>=15) {GlobalVariableSet(GV_trendD1,1);break;}
         else {fDN = iCustom(NULL,PERIOD_D1,"Used\\# Peak Repainter",1,f); if (fDN>=15) {GlobalVariableSet(GV_trendD1,-1);break;}}
         }
      }

Il risultato è che 1 viene scritto nella variabile globale, anche se in realtà dovrebbe essere -1.

Cosa c'è che non va? Con il codice? Con l'indicatore?

L'indicatore viene utilizzato con l'impostazione predefinita.

 
Alexey G. Smolyakov:

Ho provato a cercare l'ultimo picco dell'indicatore Peak Repainter per essere elaborato dall'EA:

Il risultato è che 1 viene scritto nella variabile globale, anche se in realtà dovrebbe essere -1.

Cosa c'è che non va? Con il codice? Con l'indicatore?

L'indicatore viene utilizzato con un'impostazione predefinita.

Perché il nome dell'indicatore è così?

iCustom(NULL,PERIOD_D1,"Used\\# Peak Repainter",0,f);
 
Artyom Trishkin:

Perché il nome dell'indicatore?

È solo che tengo gli indicatori per diversi EA in diverse directory. E li rinomino leggermente in modo che siano raggruppati.

Il nome influisce su qualcosa?

 
Alexey G. Smolyakov:

Tengo solo gli indicatori per i diversi EA in diverse directory. E li rinomino leggermente in modo che siano raggruppati insieme.

Il nome influisce su qualcosa?

Lo fa, tutto l'accesso ai file in MT4 avviene all'interno della cartella MQL4, l'uscita da Expert Advisors/Scripts/Indicators fuori da questa cartella è esclusa per motivi di sicurezza

 
Igor Makanu:

colpisce, tutto l'accesso ai file in MT4 avviene all'interno della cartella MQL4, l'uscita da EAs/scripts/indicators al di fuori di questa cartella è esclusa per motivi di sicurezza

Percorso completo della cartella MQL4Indicators\Used. Sembra che non ci sia un'uscita fuori dalla cartella. Ma questa è un'anomalia - altri Expert Advisors lavorano con i loro indicatori in cartelle simili senza problemi. Ma qual è il problema con questo indicatore - non lo capisco. Ho dato un'occhiata al suo codice, ma non avevo abbastanza conoscenza ed esperienza per capirlo. Ho il sospetto che conti solo l'ultima barra o qualcosa del genere.