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

 
Igor Zakharov:

Questo non è un sostituto - MB non funziona negli indicatori in quanto ferma il flusso fino a quando il pulsante viene premuto!

L'ho inavvertitamente consigliato, ma non è affatto quello che dice la nota:

Nota

Questa funzione non è raccomandata per l'uso negli indicatori personalizzati, poiché la chiamata di MessageBox() ferma l'esecuzione del thread dell'indicatore per tutto il tempo di attesa della risposta dell'utente. E poiché tutti gli indicatori per ogni simbolo sono eseguiti in un unico thread, tutti i grafici per tutti i timeframe per questo simbolo saranno fermati.

Quando si lavora nel tester di strategia, la funzione MessageBox() non viene eseguita.

 
MakarFX:

Non sono un programmatore, modifico l'indicatore per mia comodità. Non l'ho controllato nel tester, ma in tempo reale.

A proposito, non ci sono telepati.

Se sai quali indicatori disponibili qui usano questa funzione, per favore dimmelo, forse allora lo capirò da solo.

Grazie

Abbiamo tutto.

Клуб Телепатов
Клуб Телепатов
  • 2011.05.08
  • www.mql5.com
Клуб телепатов Вас послали сюда? Тогда давайте знакомиться! Как же такое могло случиться со мной...
 
Artyom Trishkin:

Si dichiara una variabile con il tipo di struttura nello scope locale, ed è ciò che si invia alla funzione. Nello stesso ambito locale.

Il punto è che quando si crea una variabile per una struttura nel campo, la sua portata è sull'intera funzione e non su un'area locale. Ecco un esempio.

int OnInit()
  {
{int In=8;
 MyPoint qr;}
qr - видна здесь
In - здесь не видна
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason){}

struct MyPoint
{
    int x[5];
    int y;
};

Si scopre che non è più possibile lavorare localmente.

 

Cercando di leggere i dati da un file csv in uno script. Nessuna fortuna e non capisco affatto perché.

Uso una semplice procedura per leggerlo:

bool GetBiFromFile(string InFNam,int& alBars,double& xClose[],datetime& xTime[])
{  int  InHndl,nBars;
   bool fset;
   double aval;
   
   InHndl = FileOpen(InFNam+".csv",FILE_READ|FILE_CSV,",");
   if (InHndl==INVALID_HANDLE) {
       Print("File "+InFNam+" does not open. Error: ", GetLastError()); 
       return(false); 
   } else {
      fset = FileSeek(InHndl,0,SEEK_SET);
      ArrayResize(xClose,alBars);      
      ArrayInitialize(xClose,0.0);  
      ArrayResize(xTime,alBars);       
      ArrayInitialize(xTime,0);  
      nBars = 0;
      while (!FileIsEnding(InHndl)) {
         nBars++;
         xTime[nBars-1]  = FileReadDatetime(InHndl);;
         xClose[nBars-1] = FileReadDouble(InHndl);
         aval = FileReadDouble(InHndl);
         if (nBars>=alBars) break;
      }
   }
   Print("nBars = ",nBars,"   allBars = ",alBars);
   Print("Start: ",xClose[0],"   " + TimeToString(xTime[0],TIME_DATE|TIME_SECONDS));
   Print("End: ",xClose[nBars-1],"   " + TimeToString(xTime[nBars-1],TIME_DATE|TIME_SECONDS));
   return(true);
}

Il file con i dati ha la seguente forma:

2012.01.02 02:00:02,1.293240,1.293410

2012.01.02 02:00:52,1.293330,1.293500

2012.01.02 02:00:55,1.293810,1.293980

....

E il risultato delle istruzioni Print() della procedura è

nBars = 1000 alBars = 1000

Inizio: 0.0 2020.01.29 01:00:00

Fine: 0.0 2020.01.29 01:00:00

Cioè, tutte le linee sono processate nel ciclo di lettura, ma non viene letto nulla. E nessun messaggio di errore.

Qualcuno può spiegarmi questo?


 
Yurixx:

Qualcuno può spiegarmi questo?

Le funzioni binarie leggono un file di testo.

 
Alexey Viktorov:

Abbiamo tutto.

Sei cattivo!

 
MakarFX:

Sei cattivo!

Sto fingendo.

Se vuoi capire la programmazione, inizia a cercare di capirla. Se hai solo bisogno di farlo, vai al thread dove si offrono di scriverlo gratuitamente, posta lì il tuo indicatore e descrivi la tua richiesta.


ps: Ho controllato tutto. Alert() per qualche motivo anche se posto prima di PlaySound() non riproduce il suono selezionato. Forse la mia memoria è cattiva, ma non è questo il punto.

È possibile disattivare Alert() toccandolo due volte per ottenere una croce rossa


e in questo caso non importa cosa Alert() o PlaySound() sia scritto davanti ad esso

 
Alexey Viktorov:

Sto fingendo.


e in questo caso non fa differenza se si dice Alert() o PlaySound() davanti

In questo caso, la finestra di avviso non si apre.(

 
fxsaber:

Si legge un file di testo con funzioni binarie.

La funzioneFileReadDouble() dice che legge da un file binario.

Ma dice suFileReadDatetime(): "Legge dal file CSV una stringa di uno dei formati: "YYYY.MM.DD HH:MI:SS", "YYYY.MM.DD" o "HH:MI:SS" - e la converte in valore datetime".

Inoltre, la stessa immagine era quando ho usatoFileReadString() e poi ho convertito io stesso le stringhe altipo corretto.

Come pensi che dovrei fare?


 
Yurixx:

Come pensi che dovrebbe essere fatto?

void OnStart()
{
  datetime time;
  
  double PriceBid;
  double PriceAsk;
  
  string Str = "2012.01.02 02:00:02,1.293240,1.293410";
  string StrArray[];
  
  if (StringSplit(Str, ',', StrArray) > 2)
  {
    time = (datetime)StrArray[0];
    
    PriceBid = (double)StrArray[1];
    PriceAsk = (double)StrArray[2];
  }
}
Motivazione: