Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 1022

 

O lasciatemi fare una domanda più semplice:

Nella funzione OnCalculate() viene inserito un ciclo, quindi passa solo attraverso una iterazione, la successiva solo quando il grafico viene aggiornato....

 
ara66676:

O lasciatemi fare una domanda più semplice:

Nella funzione OnCalculate() viene inserito un ciclo, quindi passa solo attraverso una iterazione, la successiva solo quando il grafico viene aggiornato....

Sembra che tu abbia bisogno di un sensitivo o di un codice da studiare.
 
bistreevseh:
Grazie mille! Funziona stranamente ho i diritti di amministratore, in particolare per la cartella terminale ho dato tutte le distruzioni al proprietario, ha aiutato, ma poi ha smesso di funzionare. Poi ho provato a leggere il file di log usando il FileReadStrArrayW (se non mi sbaglio con il nome) leggere le righe vuote, lo script si blocca in modalità ansi. Solo FileReadCharArr era in grado di leggere i codici ansi. Forse hai qualche esempio su come analizzare il file di log con la tua libreria? Te ne sarei molto grato!

Sì, c'è un problema nella lettura del registro ora. Una volta era più facile.

Il fatto è che il file stesso è codificato ANSI, ma le stringhe sono ora UNICODE.

Ecco come funziona lo script:

#property strict
#property script_show_inputs

#include <FileFunctions.mqh>

input int NumLines = 10;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  string sName = TimeToString(TimeLocal(), TIME_DATE);
  StringReplace(sName, ".", "");
  string sPath = TerminalPath() + "\\MQL4\\Logs\\" + sName + ".log";
  Print(sPath);
  
  if (!FileCheckW(sPath))
   {
    Print("Файл отсутствует!");
    return;
   }
    
  int hFile = FileOpenExistingW(sPath, GENERIC_READ, SHARE_READ);
  if (hFile == NULL)
   {
    Print("Файл не открыт!");
    return;
   }

  string asArray[];
  ArrayResize(asArray, NumLines);
  Print("hFile = ", hFile);
  for (int i = 0; i < NumLines; i++) asArray[i] = string(i) + "                                                                                                                                                                                                                                                          ";
  FileReadStrArrayMW(hFile, asArray, ArraySize(asArray), 0, NumLines);
  FileCloseHandle(hFile);
  for (int i = 0; i < NumLines; i++) Alert(asArray[i]);
 }

Ma funzionerà solo se il file di log è salvato prima in UNICODE!

Cioè la libreria funziona correttamente. Dobbiamo pensare a un modo semplice per convertire dalla codifica ANSI del file all'array di stringhe UNICODE, oppure dovrei aggiungere alla libreria una funzione che converta la codifica delle stringhe durante la lettura del file.

=====================

Opzione 1: non avete a che fare con gli array. Leggere l'intero file come ANSI, convertirlo in UNICODE, e poi analizzarlo usando MQL.

Variante 2. Leggilo come ANSI, scrivilo nella directory corrente del terminale e leggilo usando le funzioni MQL per i file CSV.

Opzione 3. Creare un link simbolico al file di log nella sandbox usando la funzione della stessa libreria e leggerlo usando le funzioni MQL per lavorare con i file CSV:

#property strict
#include <FileFunctions.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  string sName = TimeToString(TimeLocal(), TIME_DATE);
  StringReplace(sName, ".", "");
  sName += ".log";
  
  string sPathLogs = TerminalPath() + "\\MQL4\\Logs\\" + sName;
  string sPathFiles = TerminalPath() + "\\MQL4\\Files\\" + sName;
  
  Print(sPathLogs);
  Print(sPathFiles);
  
  if (!FileCheckW(sPathLogs))
   {
    Print("Файл отсутствует!");
    return;
   }
  
  if (!FileCheckW(sPathFiles) && !FileSymbolicLinkW(sPathLogs, sPathFiles))
   {
    Print("Символьная ссылка не создана!");
    return;
   }
  
  int hFile = FileOpen(sName, FILE_READ|FILE_CSV|FILE_ANSI, '\t');
  if (hFile == INVALID_HANDLE)
   {
    Print("Файл не открыт!");
    return;
   }
  
  while (!FileIsEnding(hFile)) Alert(FileReadString(hFile));
  FileClose(hFile);
 }

Secondo me, questa è l'opzione più bella e più semplice.

 

Sto cercando di scrivere un indicatore di canale. Ho calcolato i valori per il disegno sul grafico e li ho messi negli array double tob[] e double tos[], ma quando provo a collegarli al buffer per il disegno sul grafico - nelle righe 25 e 26:

SetIndexBuffer(0, tob);
SetIndexBuffer(1, tos);

, questi array al posto dei valori richiesti, come ad esempio:

0/1.424/1.3679
1/1.42/1.3639

sono riempiti con il numero 2147483647, come questo:
0/2147483647/2147483647
1/2147483647/2147483647
2/2147483647/2147483647

Come si può curare questo?

File:
channel1.mq4  7 kb
 
Ci sono tasti di scelta rapida per passare rapidamente da un periodo all'altro?
Premendo D , H1 passa a M15 , e premendo U , passa a H1.
 

Aiutatemi a trovare un modello per MT4 per separare la notte e il giorno.

Diciamo che il grafico dalle 00:00 alle 8:00 è di un colore e dalle 8:00 alle 00:00 è di un colore diverso.

 

Saluti a tutti.

Di fronte a questo problema:

Un frammento di codice del robot:

int per=Periodo();
if(per = 60)
{

Print("Se il periodo non è H1, questa linea non dovrebbe essere nel log");

Commento (...);

... //entrambi i corpi del robot

...

...

}

implica che né il corpo del robot, né la linea Print(...), né il Comment(...) sullo schermo saranno eseguiti se un periodo diverso da H1 è attivato sul grafico.

Tuttavia, tutto viene eseguito su qualsiasi periodo. Perché?

Come scrivere correttamente, che se il periodo sul grafico non corrisponde a quello specificato - restituisce il controllo al terminale. (A proposito, ho provato RETURN (0) - non aiuta - stampa ancora tutto...)

 
Dikons:

Saluti a tutti.

Di fronte a questo problema:

Frammento di codice del robot:

int per=Periodo();
se(per = 60)
{

Print("Se il periodo non è H1 - questa linea non dovrebbe essere nel registro");

Commento (...);

... // poi il corpo del robot

...

...

}

implica che né il corpo del robot, né la stringa Print(...), né Comment(...) sullo schermo saranno eseguiti se un periodo diverso da H1 è attivato nel grafico.

Tuttavia, tutto viene eseguito su qualsiasi periodo. Perché?

Come registrare correttamente che se il timeframe non corrisponde a quello impostato - restituire il controllo al terminale. (A proposito, ho provato RETURN (0) - non funziona - stampa ancora tutto...)

State facendo un'assegnazione, avete bisogno di un confronto if(per == 60)
 
Trader76:
State facendo un'assegnazione, mentre avete bisogno di un confronto if(per == 60)

Grazie compagno... Ho il cervello tutto bollito... Ho avuto una pausa significativa nella programmazione - ho dimenticato molto del poco che so...

---

Un'altra domanda... Frammento di ricerca per max/mini prime 8 ore in un giorno per terminale:

int h=TimeHour(TimeCurrent()); // trova l'ora terminale corrente (0...23)
if (h<8) return(0); // se non c'è H1 delle prime 8 candele del giorno = lascia...

double Maxi=High[iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)]; // definisce le prime 8 candele massime del giorno.

double Mini=Low[iLowest(NULL,PERIOD_H1,MODE_LOW,8,h-7)];


Le ultime due righe non funzionano correttamente se il periodo del grafico è impostato su qualcosa di diverso da H1. Perché? Perché al robot è stato esplicitamente assegnato un periodo per i calcoli...

Se metti H4 sul grafico, per esempio, il robot lo riequilibrerà usando le candele H4 (lo stesso accade con altri timeframe).

 
Dikons:

Grazie compagno... Ho il cervello tutto bollito... Ho avuto una pausa significativa nella programmazione - ho dimenticato molto del poco che so...

---

Un'altra domanda... Frammento di ricerca per max/mini prime 8 ore in un giorno per terminale:

int h=TimeHour(TimeCurrent()); // trova l'ora terminale corrente (0...23)
if (h<8) return(0); // se non c'è H1 delle prime 8 candele del giorno = lascia...

double Maxi=High[iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)]; // determina le prime 8 candele massime del giorno.

double Mini=Low[iLowest(NULL,PERIOD_H1,MODE_LOW,8,h-7)];


Le ultime due righe non funzionano correttamente se il periodo del grafico è impostato su qualcosa di diverso da H1. Perché? Perché al robot è stato esplicitamente assegnato un periodo per i calcoli...

Se metti H4 sul grafico, per esempio, il robot lo riequilibrerà usando le candele H4 (lo stesso accade con altri timeframe).

Qui si ottiene il numero di barra max/min: iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)

E poi si inserisce per esempio la barra numero 2 e si ottiene:High[2] e su un altro timeframe si otterrà un valore che è diverso da H1. Leggi su High.

iHigh(NULL,PERIOD_H1, iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7))