初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1445

 
Evgeny Dyuka #:
请回答问题

我想fxsaber 已经发布了引导加载程序和使用说明,但我不记得在哪里和如何使用了。

如果我没记错的话,你需要把它放在终端文件夹 C:\Users\username\AppData\Roaming\MetaQuotes\Terminal\E98C5173D8A802F9B8F133E800FDDE2B 中。

每次启动终端前都运行 botnick

这个办法不是特别方便,但如果没有别的办法,那就......

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:


该死的我先是贴了出来,然后又看到 botnik 是用来禁止测试器中的日志的。

抱歉,我帮不上忙。

 
Aleksandr Slavskii #:

我想fxsaber 发布了一个引导尼克和如何使用它的说明,但我不记得在哪里以及如何使用的了。

如果我没记错的话,你需要把引导程序放在终端文件夹 C:\Users\username\AppData\Roaming\MetaQuotes\Terminal\E98C5173D8A802F9B8F133E800FDDE2B 中。

每次启动终端前都运行 botnick

这个办法不是特别方便,但如果没有其他办法,那就...


妈的我先是贴了出来,然后又看到引导者禁止在测试器中记录日志。

对不起,我帮不了你。

运行引导程序不是比手动删除日志更简单吗?


网站上发生了什么?我粘贴一张图片时,看到的是应该在那里的那张,但当我粘贴一条信息时,看到的却是另一张图片....。

哦!我明白了...

附加的文件:
01.png  23 kb
 
Aleksandr Slavskii #:

我想fxsaber 发布了一个引导尼克和如何使用它的说明,但我不记得在哪里以及如何使用的了。

如果我没记错的话,你需要把引导程序放在终端文件夹 C:\Users\username\AppData\Roaming\MetaQuotes\Terminal\E98C5173D8A802F9B8F133E800FDDE2B 中。

每次启动终端前都运行 botnick

这个办法不是特别方便,但如果没有其他办法,那就...


妈的我先是贴了出来,然后又看到引导者禁止在测试器中记录日志。

对不起,我帮不了你。

我以为要在某个地方打勾,结果就这样了 ))
好吧,我只能忍了,
谢谢你的回答。
 
Evgeny Dyuka #:
我以为我在某个地方打了个勾,就可以了 )) 不管怎样,我不得不忍受它, 谢谢你的答复。

代码是你自己写的吗?也许你可以显示一段如何调用 db 的代码以及调用后的几行代码。在我看来,它似乎在说打印错误.....

 
Alexey Viktorov #:

代码是你自己写的吗?也许你可以显示一段如何调用 db 的代码以及调用后的几行代码。在我看来,它似乎说要打印一个错误....

任务是每 10 秒向数据库写入当前时间。
为了将它们按时间分开,我添加了一个 Sleep() 随机时间形式的拐杖--从 0 秒到 3 秒。
并尝试连接了 10 次。
日志显示,最多在第二次尝试时一切正常,也就是说,总体上运行可靠。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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 #:
任务是每 10 秒将当前时间写入数据库。 为了按时间将它们分开,我添加了 Sleep() 随机时间形式的拐杖--从 0 秒到 3 秒。 并尝试连接了 10 次。 日志显示,最多在第二次尝试时一切正常,即一般情况下工作可靠。 。




下面是打印到日志中的一行。

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

只需在前面加上 // 或将其删除,如果其他地方没有其他 Print() 工具,所有问题都会被删除;

 
Alexey Viktorov #:

下面是打印到杂志上的一行字

如果其他地方没有其他 Print() 程序,只需在其前面加上 // 或将其完全删除,就可以将所有问题删除;


函数本身会打印错误信息。


 
Evgeny Dyuka #:

如果函数在尝试 10 次后失败,将打印此行。
错误由函数本身打印。


我明白了。它是在尝试使用 db 时打印出来的。在使用数据库之前,我们需要检查 db 句柄是否有效。

在这里,您调用了函数

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

你试图打开数据库,结果出错,并向 telegram.... 发送了消息。

在使用 dbmt 变量时,是否检查了其值?

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

或者像这样

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

我看到了。这是在尝试使用数据库时打印出来的。我们需要在使用数据库前检查 db 句柄是否有效。

在这里,您调用了函数

您试图打开数据库,但出现了错误,并向电报发送了信息...

在使用 dbmt 变量时,是否检查了其值?

或者像这样

是的,我在 db_exe() 中检查了它,并将其发送给重试。如果失败 10 次,db_exe() 将返回 False(从未返回过)。
if(dbmt == INVALID_HANDLE)
        {
         DatabaseClose(dbmt);
         continue;
        }

在 Python 中不会出现这样的问题,显然是内置了队列和等待功能。

感谢您的解答。
 
Evgeny Dyuka #:
是的,我在 db_exe() 中进行了检查,并将其发送给重试。但如果 db_exe() 失败了 10 次,就会返回 False(从未返回)。 在 Python 中不会出现这样的问题,显然它有队列和等待功能。 谢谢您的解答。



1.如果基础句柄没有被检索,就不需要关闭基础。

2.如果收到 INVALID_HANDLE,为什么还要继续执行程序?我认为在这种情况下最好中止程序,返回"......"。

我现在反复尝试打开和关闭一个不存在的数据库,却无法得到错误的打印输出。我认为在向无法打开的数据库创建查询时会出现错误输出。