Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1445

 
Evgeny Dyuka #:
rispondere alla domanda, per favore

Credo che fxsaber abbia pubblicato un bootloader e una descrizione di come usarlo, ma non ricordo dove e come.

Se non mi sbaglio, devi metterlo nella cartella del terminale C:\Users\username\AppData\Roaming\MetaQuotes\Terminal\E98C5173D8A802F9B8F133E800FDDE2B.

Ed eseguire il botnick ogni volta prima di avviare il terminale.

La soluzione non è particolarmente comoda, ma se non c'è altro, allora...

rem Создали RAM-Drive для Тестера.
imdisk -a -o awe -s 3 G -m Z: -p "/fs:ntfs /q /y /v:MT5Tester"

mkdir z:\Tester
mklink /j Tester z:\Tester

rem Кеш оптимизатора будет сохраняться на диске.
mkdir cache
mklink /j z:\Tester\cache cache

rem Временный RAM-Drive, чтобы на него можно было перенаправить log-папки.
imdisk -a -o awe -s 3 M -m Y: -p "/fs:ntfs /q /y /v:MT5Tester_Logs"

mkdir y:\logs
mklink /j Tester\logs y:\logs

mkdir y:\logs0
mkdir Tester\Agent-127.0.0.1-3000
mklink /j Tester\Agent-127.0.0.1-3000\logs y:\logs0

mkdir y:\logs1
mkdir Tester\Agent-127.0.0.1-3001
mklink /j Tester\Agent-127.0.0.1-3001\logs y:\logs1

mkdir y:\logs2
mkdir Tester\Agent-127.0.0.1-3002
mklink /j Tester\Agent-127.0.0.1-3002\logs y:\logs2

mkdir y:\logs3
mkdir Tester\Agent-127.0.0.1-3003
mklink /j Tester\Agent-127.0.0.1-3003\logs y:\logs3

mkdir y:\logs4
mkdir Tester\Agent-127.0.0.1-3004
mklink /j Tester\Agent-127.0.0.1-3004\logs y:\logs4

mkdir y:\logs5
mkdir Tester\Agent-127.0.0.1-3005
mklink /j Tester\Agent-127.0.0.1-3005\logs y:\logs5

mkdir y:\logs6
mkdir Tester\Agent-127.0.0.1-3006
mklink /j Tester\Agent-127.0.0.1-3006\logs y:\logs6

mkdir y:\logs7
mkdir Tester\Agent-127.0.0.1-3007
mklink /j Tester\Agent-127.0.0.1-3007\logs y:\logs7

mkdir y:\logs8
mkdir Tester\Agent-127.0.0.1-3008
mklink /j Tester\Agent-127.0.0.1-3008\logs y:\logs8

mkdir y:\logs9
mkdir Tester\Agent-127.0.0.1-3009
mklink /j Tester\Agent-127.0.0.1-3009\logs y:\logs9

mkdir y:\logs10
mkdir Tester\Agent-127.0.0.1-3010
mklink /j Tester\Agent-127.0.0.1-3010\logs y:\logs10

mkdir y:\logs11
mkdir Tester\Agent-127.0.0.1-3011
mklink /j Tester\Agent-127.0.0.1-3011\logs y:\logs11

mkdir y:\logs12
mkdir Tester\Agent-127.0.0.1-3012
mklink /j Tester\Agent-127.0.0.1-3012\logs y:\logs12

mkdir y:\logs13
mkdir Tester\Agent-127.0.0.1-3013
mklink /j Tester\Agent-127.0.0.1-3013\logs y:\logs13

mkdir y:\logs14
mkdir Tester\Agent-127.0.0.1-3014
mklink /j Tester\Agent-127.0.0.1-3014\logs y:\logs14

mkdir y:\logs15
mkdir Tester\Agent-127.0.0.1-3015
mklink /j Tester\Agent-127.0.0.1-3015\logs y:\logs15

mkdir y:\logs16
mkdir Tester\Agent-127.0.0.1-3016
mklink /j Tester\Agent-127.0.0.1-3016\logs y:\logs16

mkdir y:\logs17
mkdir Tester\Agent-127.0.0.1-3017
mklink /j Tester\Agent-127.0.0.1-3017\logs y:\logs17

mkdir y:\logs18
mkdir Tester\Agent-127.0.0.1-3018
mklink /j Tester\Agent-127.0.0.1-3018\logs y:\logs18

mkdir y:\logs19
mkdir Tester\Agent-127.0.0.1-3019
mklink /j Tester\Agent-127.0.0.1-3019\logs y:\logs19

mkdir y:\logs20
mkdir Tester\Agent-127.0.0.1-3020
mklink /j Tester\Agent-127.0.0.1-3020\logs y:\logs20

mkdir y:\logs21
mkdir Tester\Agent-127.0.0.1-3021
mklink /j Tester\Agent-127.0.0.1-3021\logs y:\logs21

mkdir y:\logs22
mkdir Tester\Agent-127.0.0.1-3022
mklink /j Tester\Agent-127.0.0.1-3022\logs y:\logs22

mkdir y:\logs23
mkdir Tester\Agent-127.0.0.1-3023
mklink /j Tester\Agent-127.0.0.1-3023\logs y:\logs23

mkdir y:\logs24
mkdir Tester\Agent-127.0.0.1-3024
mklink /j Tester\Agent-127.0.0.1-3024\logs y:\logs24
rem Убили временный RAM-Drive
imdisk -D -m Y:


Merda. Prima l'ho postato, poi ho visto che il botnik serve per vietare i log nel tester.

Mi dispiace, non posso aiutarti.

 
Aleksandr Slavskii #:

Credo che fxsaber abbia postato un bootnik e una descrizione di come usarlo, ma non ricordo dove e come.

Se non mi sbaglio, devi mettere il bootstrap nella cartella del terminale C:\Users\username\AppData\Roaming\MetaQuotes\Terminal\E98C5173D8A802F9B8F133E800FDDE2B.

Eseguire il botnick ogni volta prima di avviare il terminale.

La soluzione non è particolarmente comoda, ma se non c'è altro, allora...


Merda. Prima l'ho postato, poi ho visto che il bootnik vieta i log nel tester.

Mi dispiace, non posso aiutarti.

Non è più facile eseguire il bootloader che cancellare manualmente i log?


Cosa succede sul sito? Se incollo un'immagine, vedo quella che dovrebbe esserci, ma quando incollo un messaggio, vedo un'immagine diversa....

Ooh! Ho capito...

File:
01.png  23 kb
 
Aleksandr Slavskii #:

Credo che fxsaber abbia postato un bootnik e una descrizione di come usarlo, ma non ricordo dove e come.

Se non mi sbaglio, devi mettere il bootstrap nella cartella del terminale C:\Users\username\AppData\Roaming\MetaQuotes\Terminal\E98C5173D8A802F9B8F133E800FDDE2B.

Eseguire il botnick ogni volta prima di avviare il terminale.

La soluzione non è particolarmente comoda, ma se non c'è altro, allora...


Merda. Prima l'ho postato, poi ho visto che il bootnik vieta i log nel tester.

Mi dispiace, non posso aiutarti.

Ho pensato di spuntare una casella da qualche parte e basta ))
beh, devo sopportarlo,
grazie per la risposta.
 
Evgeny Dyuka #:
Pensavo di spuntare una casella da qualche parte e basta ))
comunque, dovrò sopportarlo,
grazie per la risposta.

Hai scritto tu stesso quel codice? Forse puoi mostrare un pezzo di codice in cui viene chiamato db e qualche riga dopo la chiamata. Mi sembra che ci sia scritto print error.....

 
Alexey Viktorov #:

Hai scritto tu stesso quel codice? Forse puoi mostrare un pezzo di codice in cui viene chiamato db e qualche riga dopo la chiamata. Mi sembra che ci sia scritto di stampare un errore....

Il compito è quello di scrivere l'ora corrente nel database ogni 10 secondi. Lo fa lo stesso Expert Advisor, ma su 4 grafici.
Per separarli in base al tempo, ho aggiunto una stampella sotto forma di Sleep() a tempo casuale - da 0 a 3 secondi.
E 10 tentativi di connessione.
Il log ha mostrato che al massimo al secondo tentativo tutto funziona, cioè in generale funziona in modo affidabile.

.
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void db_update_lastseen(string symbol)
  {
   string comm = "UPDATE LastSeen SET utime='" +
                 IntegerToString((int)TimeGMT()) +
                 "' WHERE who='mt5' AND symbol='" + symbol + "'";
   if(!db_exe("db_update_lastseen", comm))
      Telegram("⚠MT5 DB ERROR db_update_lastseen() " + symbol, DevChannel);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool db_exe(string who, string comm, bool readonly = false)
  {
   ResetLastError();
   int count = 0;
   bool repeat = true;
   int dbmt = INVALID_HANDLE;
   while(repeat)
     {
      count++;
      Sleep((int)((float)MathRand() / 10));
      if(count > 10)
        {
         Print("DB: " + who + " failed with code ", GetLastError(), " DatabaseOpen ", " count: ", count);
         return false;
        }
      if(readonly)
         dbmt = DatabaseOpen(path_to_db, DATABASE_OPEN_READONLY);
      else
         dbmt = DatabaseOpen(path_to_db, DATABASE_OPEN_READWRITE);
      if(dbmt == INVALID_HANDLE)
        {
         DatabaseClose(dbmt);
         continue;
        }
      else
        {
         if(!DatabaseExecute(dbmt, comm))
           {
            DatabaseClose(dbmt);
            continue;
           }
         else
           {
            DatabaseClose(dbmt);
            return true;
           }
        }
     }
   DatabaseClose(dbmt);
   return false;
  }
 
Evgeny Dyuka #:
Il compito è quello di scrivere l'ora corrente nel database ogni 10 secondi. Lo fa lo stesso Expert Advisor, ma su 4 grafici.
Per separarli in base al tempo ho aggiunto una stampella sotto forma di Sleep() a tempo casuale - da 0 a 3 secondi.
E 10 tentativi di connessione.
Il log ha mostrato che al massimo al secondo tentativo tutto funziona, cioè in generale funziona in modo affidabile.

.

Ecco la riga che viene stampata nel log.

         Print("DB: " + who + " failed with code ", GetLastError(), " DatabaseOpen ", " count: ", count);

È sufficiente commentarla mettendo // davanti a essa o rimuoverla del tutto e tutte le domande saranno rimosse se non ci sono altri Print() da qualche altra parte;

 
Alexey Viktorov #:

Ecco la riga che viene stampata sulla rivista

È sufficiente commentarla mettendo // davanti a essa o cancellarla completamente e tutte le domande saranno rimosse, se non ci sono altri Print() da qualche altra parte;

Questa riga verrà stampata se fallisce con 10 tentativi.
La funzione stessa stampa l'errore.


 
Evgeny Dyuka #:

Questa riga viene stampata se la funzione fallisce dopo 10 tentativi.
L'errore viene stampato dalla funzione stessa.


Vedo. Viene stampato quando si cerca di lavorare con il db. Dobbiamo verificare se c'è un controllo di validità dell'handle del db prima di usare il database.

Qui si è chiamata la funzione

void db_update_lastseen(string symbol)
  {
   string comm = "UPDATE LastSeen SET utime='" +
                 IntegerToString((int)TimeGMT()) +
                 "' WHERE who='mt5' AND symbol='" + symbol + "'";
   if(!db_exe("db_update_lastseen", comm))
      Telegram("⚠MT5 DB ERROR db_update_lastseen() " + symbol, DevChannel);
  }

Si è cercato di aprire il db, si è ottenuto un errore, si è inviato un messaggio a telegram....

E dove si usa la variabile dbmt, si controlla il suo valore?

if(dbmt < 0)
// ничего делать нельзя. База не открыта…

o in questo modo

if(dbmt >= 0)
 {
  // Базу можно использовать.
 }
 
Alexey Viktorov #:

Vedo. Questo viene stampato quando si cerca di lavorare con il db. Dobbiamo verificare se esiste un controllo di validità dell'handle del db prima di utilizzare il database.

Qui è stata chiamata la funzione

Si è cercato di aprire il db, si è verificato un errore, si è inviato un messaggio a telegram...

E dove si usa la variabile dbmt si controlla il suo valore?

o come questo

Sì, lo controllo in db_exe() e lo invio a retry. E db_exe() restituisce False se fallisce 10 volte (non l'ha mai restituito).
if(dbmt == INVALID_HANDLE)
        {
         DatabaseClose(dbmt);
         continue;
        }
Penso che la libreria di lavoro con la base invii un errore e, a quanto pare, non gestisca la situazione quando la base è bloccata.
In Python questo problema non si verifica, a quanto pare è integrato nell'accodamento e nell'attesa.

Grazie per le risposte.
 
Evgeny Dyuka #:
Sì, controllo in db_exe() e lo invio a riprovare. Ma db_exe() restituisce False se fallisce 10 volte (non è mai tornato).
Penso che la libreria di lavoro con la base invii un errore e sembra che non gestisca la situazione quando la base è bloccata.
In Python questo problema non si verifica, apparentemente ha accodamenti e attese.

Grazie per le risposte.

1. Se l'handle della base non viene recuperato, non è necessario chiudere la base.

2. Se viene ricevuto INVALID_HANDLE, perché continuare l'esecuzione del programma? Penso che in questo caso sia meglio interrompere, ritornare

Ora sto cercando ripetutamente di aprire e chiudere una base inesistente e non riesco a ottenere una stampa di errore. Penso che questa stampa arrivi al momento della creazione delle query alla base che non è stato possibile aprire.