Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1445

 
Evgeny Dyuka #:
responda à pergunta, por favor

Acho que o fxsaber postou um carregador de inicialização e uma descrição de como usá-lo, mas não me lembro onde e como.

Se não me engano, você precisa colocá-lo na pasta do terminal C:\Users\username\AppData\Roaming\MetaQuotes\Terminal\E98C5173D8A802F9B8F133E800FDDE2B.

E execute o botnick todas as vezes antes de iniciar o terminal.

A solução não é particularmente conveniente, mas se não houver outra, então ...

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:


Que merda. Primeiro eu postei e depois vi que o botnik serve para banir registros no testador.

Desculpe, não posso ajudá-lo.

 
Aleksandr Slavskii #:

Acho que o fxsaber postou um bootnik e uma descrição de como usá-lo, mas não me lembro onde e como.

Se não me engano, você precisa colocar o bootstrap na pasta do terminal C:\Users\username\AppData\Roaming\MetaQuotes\Terminal\E98C5173D8A802F9B8F133E800FDDE2B.

E execute o botnick todas as vezes antes de iniciar o terminal.

A solução não é particularmente conveniente, mas se não houver outra, então ...


Que merda. Primeiro eu postei e depois vi que o bootnik está proibindo registros no testador.

Sinto muito, não posso ajudá-lo.

Não é mais fácil executar o gerenciador de inicialização do que excluir os registros manualmente?


O que está acontecendo no site? Eu colo uma imagem e vejo a que deveria estar lá, mas quando eu colo uma mensagem, vejo uma imagem diferente....

Ooh! Entendi...

Arquivos anexados:
01.png  23 kb
 
Aleksandr Slavskii #:

Acho que o fxsaber postou um bootnik e uma descrição de como usá-lo, mas não me lembro onde e como.

Se não me engano, você precisa colocar o bootstrap na pasta do terminal C:\Users\username\AppData\Roaming\MetaQuotes\Terminal\E98C5173D8A802F9B8F133E800FDDE2B.

E execute o botnick todas as vezes antes de iniciar o terminal.

A solução não é particularmente conveniente, mas se não houver outra, então ...


Que merda. Primeiro eu postei e depois vi que o bootnik está proibindo registros no testador.

Sinto muito, não posso ajudá-lo.

Pensei em marcar uma caixa em algum lugar e foi isso ))
bem, tenho que aguentar isso,
obrigado pela resposta.
 
Evgeny Dyuka #:
Pensei em marcar uma caixa em algum lugar e foi isso ))
de qualquer forma, terei que aguentar isso,
obrigado pela resposta.

Você mesmo escreveu esse código? Talvez você possa mostrar um trecho de código de como o db é chamado e algumas linhas após a chamada. Parece-me que ele diz print error.....

 
Alexey Viktorov #:

Você mesmo escreveu esse código? Talvez você possa mostrar um trecho de código de como o db é chamado e algumas linhas após a chamada. Parece-me que ele diz para imprimir um erro....

A tarefa é gravar a hora atual no banco de dados a cada 10 segundos. Isso é feito pelo mesmo Expert Advisor, mas em 4 gráficos.
Para separá-los por tempo, adicionei uma muleta na forma de tempo aleatório Sleep() - de 0 a 3 segundos.
E 10 tentativas de conexão.
O registro mostrou que, no máximo, na segunda tentativa, tudo funciona, ou seja, em geral, funciona de forma confiável.

.
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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 #:
A tarefa é gravar a hora atual no banco de dados a cada 10 segundos. Isso é feito pelo mesmo Expert Advisor, mas em 4 gráficos.
Para separá-los por tempo, adicionei uma muleta na forma de tempo aleatório Sleep() - de 0 a 3 segundos.
E 10 tentativas de conexão.
O registro mostrou que, no máximo, na segunda tentativa, tudo funciona, ou seja, em geral, funciona de forma confiável.

.

Portanto, aqui está a linha que é impressa no registro.

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

Basta comentá-la colocando // na frente dela ou removê-la completamente e todas as perguntas serão removidas se não houver outro Print() em nenhum outro lugar;

 
Alexey Viktorov #:

Então, aqui está a linha que imprime na revista

Basta comentá-la colocando // na frente dela ou excluí-la completamente e todas as perguntas serão removidas, se não houver outro Print() em nenhum outro lugar;

Essa linha será impressa se falhar em 10 tentativas.
A própria função imprime o erro.


 
Evgeny Dyuka #:

Essa linha será impressa se a função falhar após 10 tentativas.
O erro é impresso pela própria função.


Estou vendo. Ele é impresso quando se tenta trabalhar com o banco de dados. Precisamos verificar se há uma verificação de validade do identificador db antes de usar o banco de dados.

Aqui você chamou a função

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

Você tentou abrir o banco de dados, obteve um erro e enviou uma mensagem para telegram....

E onde você usa a variável dbmt, você verifica seu valor lá?

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

ou assim

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

Estou vendo. Isso é impresso quando se tenta trabalhar com o banco de dados. Precisamos verificar se há uma verificação de validade do identificador db antes de usar o banco de dados.

Aqui você chamou a função

Você tentou abrir o banco de dados, obteve um erro e enviou uma mensagem para o telegrama...

E onde você usa a variável dbmt, você verifica seu valor?

ou assim

Sim, eu o verifico em db_exe() e o envio para retry. E o db_exe() retornará False se falhar 10 vezes (ele nunca retornou).
if(dbmt == INVALID_HANDLE)
        {
         DatabaseClose(dbmt);
         continue;
        }
Acho que a biblioteca de trabalho com a base envia um erro e, ao que parece, não lida com a situação quando a base está bloqueada.
No Python, esse problema não ocorre, aparentemente ele está embutido no enfileiramento e na espera.

Obrigado por suas respostas.
 
Evgeny Dyuka #:
Sim, eu verifico em db_exe() e o envio para tentar novamente. Mas db_exe() retornará False se falhar 10 vezes (nunca retornou).
Acho que a biblioteca de trabalho com a base envia um erro e parece que ela não lida com a situação quando a base está bloqueada.
No Python, esse problema não ocorre, aparentemente ele tem fila e espera.

Obrigado por suas respostas.

1. Se o identificador da base não for recuperado, você não precisará fechar a base.

2. Se INVALID_HANDLE for recebido, por que continuar a execução do programa? Acho que, nesse caso, é melhor abortar e retornar

Agora estou tentando repetidamente abrir e fechar uma base inexistente e não consigo obter uma impressão de erro. Acho que essa impressão ocorre no momento da criação de consultas à base que não pôde ser aberta.