Questions des débutants MQL5 MT5 MetaTrader 5 - page 1445

 
Evgeny Dyuka #:
répondre à la question, s'il vous plaît

Je pense que fxsaber a posté un bootloader et une description de son utilisation, mais je ne me souviens plus où et comment.

Si je ne me trompe pas, vous devez le placer dans le dossier du terminal C:\Users\username\AppData\Roaming\MetaQuotes\Terminal\E98C5173D8A802F9B8F133E800FDDE2B.

Et lancez le botnick à chaque fois avant de démarrer le terminal.

La solution n'est pas particulièrement pratique, mais s'il n'y en a pas d'autre, alors ...

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:


Merde. D'abord je l'ai posté, puis j'ai vu que le botnik sert à interdire les logs dans le testeur.

Désolé, je ne peux pas vous aider.

 
Aleksandr Slavskii #:

Je crois que fxsaber a posté un bootnik et une description de son utilisation, mais je ne me souviens plus où et comment.

Si je ne me trompe pas, vous devez placer le bootstrap dans le dossier du terminal C:\Users\username\AppData\Roaming\MetaQuotes\Terminal\E98C5173D8A802F9B8F133E800FDDE2B.

Et lancez le botnick à chaque fois avant de démarrer le terminal.

La solution n'est pas particulièrement pratique, mais s'il n'y en a pas d'autre, alors ...


Merde. D'abord je l'ai posté, puis j'ai vu que le bootnik interdit les logs dans le testeur.

Je suis désolé, je ne peux pas vous aider.

N'est-il pas plus facile de lancer le bootloader que de supprimer les logs manuellement ?


Que se passe-t-il sur le site ? Je colle une image, je vois celle qui devrait être là, mais quand je colle un message, je vois une autre image....

Ooh ! J'ai compris...

Dossiers :
01.png  23 kb
 
Aleksandr Slavskii #:

Je crois que fxsaber a posté un bootnik et une description de son utilisation, mais je ne me souviens plus où et comment.

Si je ne me trompe pas, vous devez placer le bootstrap dans le dossier du terminal C:\Users\username\AppData\Roaming\MetaQuotes\Terminal\E98C5173D8A802F9B8F133E800FDDE2B.

Et lancez le botnick à chaque fois avant de démarrer le terminal.

La solution n'est pas particulièrement pratique, mais s'il n'y en a pas d'autre, alors ...


Merde. D'abord je l'ai posté, puis j'ai vu que le bootnik interdit les logs dans le testeur.

Je suis désolé, je ne peux pas vous aider.

J'ai pensé à cocher une case quelque part et c'est tout ))
bon, je dois m'en accommoder,
merci pour la réponse.
 
Evgeny Dyuka #:
Je pensais cocher une case quelque part et c'est tout ))
Quoi qu'il en soit, je vais devoir m'en accommoder,
Merci pour la réponse.

Avez-vous écrit ce code vous-même ? Peut-être pouvez-vous montrer un morceau de code montrant comment db est appelé et quelques lignes après l'appel. Il me semble qu'il est écrit print error.....

 
Alexey Viktorov #:

Avez-vous écrit ce code vous-même ? Vous pouvez peut-être montrer un morceau de code montrant comment db est appelé et quelques lignes après l'appel. Il me semble qu'il est indiqué d'imprimer une erreur....

La tâche consiste à écrire l'heure actuelle dans la base de données toutes les 10 secondes. C'est fait par le même Expert Advisor, mais sur 4 graphiques.
Pour les séparer par temps, j'ai ajouté une béquille sous la forme de Sleep() temps aléatoire - de 0 à 3 secondes.
Et 10 tentatives de connexion.
Le journal a montré qu'au plus à la deuxième tentative tout fonctionne, c'est-à-dire qu'en général cela fonctionne de manière fiable.

.
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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 #:
La tâche est d'écrire l'heure actuelle dans la base de données toutes les 10 secondes. Cela est fait par le même Expert Advisor, mais sur 4 graphiques.
Pour les séparer par le temps, j'ai ajouté une béquille sous la forme de Sleep() temps aléatoire - de 0 à 3 secondes.
Et 10 tentatives de connexion.
Le journal a montré qu'au plus à la deuxième tentative tout fonctionne, c'est-à-dire qu'en général cela fonctionne de manière fiable.

.

Voici donc la ligne qui est imprimée dans le journal.

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

Il suffit de la commenter en mettant // devant ou de la supprimer complètement et toutes les questions seront supprimées s'il n'y a pas d'autre Print() ailleurs ;

 
Alexey Viktorov #:

Voici donc la ligne qui s'imprime dans le magazine

Il suffit de la commenter en mettant // devant ou de l'effacer complètement et toutes les questions seront supprimées, s'il n'y a pas d'autre Print() ailleurs ;

Cette ligne sera imprimée en cas d'échec après 10 tentatives.
La fonction elle-même imprime l'erreur.


 
Evgeny Dyuka #:

Cette ligne sera imprimée si la fonction échoue après 10 tentatives.
L'erreur est imprimée par la fonction elle-même.


Je vois. Elle s'affiche lorsque l'on essaie de travailler avec la base de données. Nous devons voir s'il y a un contrôle de validité de la poignée db avant d'utiliser la base de données.

Ici, vous avez appelé la fonction

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);
  }

Vous avez essayé d'ouvrir la base de données, vous avez obtenu une erreur et vous avez envoyé un message à telegram.....

Et lorsque vous utilisez la variable dbmt, vérifiez-vous sa valeur à cet endroit ?

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

ou comme ceci

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

Je vois. Ce message s'affiche lorsque l'on essaie d'utiliser la base de données. Nous devons voir s'il y a une vérification de la validité de la poignée db avant d'utiliser la base de données.

Ici, vous avez appelé la fonction

Vous avez essayé d'ouvrir la base de données, vous avez obtenu une erreur, vous avez envoyé un message au télégramme...

Et lorsque vous utilisez la variable dbmt, vérifiez-vous sa valeur ?

ou comme ceci

Oui, je la vérifie dans db_exe() et je l'envoie à retry. Et db_exe() renverra False si elle échoue 10 fois (elle ne l'a jamais renvoyé).
if(dbmt == INVALID_HANDLE)
        {
         DatabaseClose(dbmt);
         continue;
        }
Je pense que la bibliothèque de travail avec la base envoie une erreur et, semble-t-il, ne gère pas la situation lorsque la base est verrouillée.
En Python, un tel problème ne se produit pas, apparemment il est intégré dans la file d'attente et l'attente.

Merci pour vos réponses.
 
Evgeny Dyuka #:
Oui, je vérifie dans db_exe() et je l'envoie réessayer. Mais db_exe() renvoie False s'il échoue 10 fois (jamais retourné).
Je pense que la bibliothèque de travail avec la base envoie une erreur et il semble qu'elle ne gère pas la situation lorsque la base est verrouillée.
En Python, un tel problème ne se produit pas, apparemment il y a des files d'attente et de l'attente.

Merci pour vos réponses.

1. Si la poignée de la base n'est pas récupérée, il n'est pas nécessaire de fermer la base.

2. Si INVALID_HANDLE est reçu, pourquoi poursuivre l'exécution du programme ? Je pense que dans ce cas, il est préférable d'interrompre l'exécution et de retourner à la base.

J'essaie maintenant à plusieurs reprises d'ouvrir et de fermer une base inexistante et je n'arrive pas à obtenir une impression d'erreur. Je pense que cette impression survient au moment de la création de requêtes vers la base qui n'a pas pu être ouverte.

Raison: