初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1445

 
Evgeny Dyuka #:
質問に答えてください

fxsaberが ブートローダーとその使い方の説明を投稿したと思いますが、どこでどのようにかは覚えていません。

私の記憶が間違っていなければ、ターミナルフォルダC:¥Usersusername¥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:¥Usersusername¥AppData¥Roaming¥MetaQuotes¥Terminal¥E98C5173D8A802F9B8F133E800FDDE2Bに入れる必要があります。

そして、ターミナルを起動する前に毎回 botnickを 実行 する。

この解決策は特に便利というわけではないが、他に方法がないのであれば...。


くそ。最初に投稿して、それからブートニックがテスターでのログを禁止しているのを見た。

ごめんなさい、力になれません。

手動でログを削除するよりも、ブートローダを実行する方が簡単ではありませんか?


サイトでは何が起こっているのですか?ある写真を貼り付けると、そこにあるべき写真が表示されるんですが、メッセージを貼り付けると、違う写真が表示されるんです...。

おお!わかったぞ...。

ファイル:
01.png  23 kb
 
Aleksandr Slavskii #:

fxsaberが ブートニクと使い方の説明を投稿したと思うが、どこでどのようにかは覚えていない。

記憶違いでなければ、ブートストラップをターミナルフォルダC:¥Usersusername¥AppData¥Roaming¥MetaQuotes¥Terminal¥E98C5173D8A802F9B8F133E800FDDE2Bに入れる必要があります。

そして、ターミナルを起動する前に毎回 botnickを 実行 する。

この解決策は特に便利というわけではないが、他に方法がないのであれば...。


くそ。最初に投稿して、それからブートニックがテスターでのログを禁止しているのを見た。

ごめんなさい、力になれません。

どこかにチェックを入れようと思ったんだけど、それしかなかったんだ)
まあ、我慢するしかないね。
回答ありがとう。
 
Evgeny Dyuka #:
どこかのボックスにチェックを入れて、それで終わりだと思ったんだ) とにかく、我慢するしかないね。 返信ありがとう。

そのコードはご自分で書かれたのですか?多分、dbがどのように呼び出されるのか、そして呼び出された後の数行をコードの一部で示してもらえると思います。何か、print errorと書いてあるような気がするのですが......。

 
Alexey Viktorov #:

そのコードは自分で書いたのですか?多分、dbがどのように呼び出されるのか、そして呼び出された後の数行をコードの一部で示してくれるでしょう。エラーを表示すると書いてあるような気がするのですが・・・。

タスクは10秒ごとに現在時刻をデータベースに書き込むことです。これは同じExpert Advisorで行われますが、4つのチャートで行われます。
時間で区切るために、Sleep()というランダムな時間(0秒から3秒まで)を追加しました。
そして、接続を10回試みました。
ログによると、最大でも2回目の試行ですべてが機能することがわかりました。つまり、一般的には確実に機能します。

.
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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秒ごとに現在時刻をデータベースに書き込むこと。これは同じExpert Advisorによって行われるが、チャートは4つある。 時間で区切るために、Sleep()というランダムな時間(0秒から3秒まで)を追加した。 そして10回接続を試みた。 ログによると、最大でも2回目の接続ですべてが機能する。つまり、一般的には確実に機能する。 。




これがログに出力される行だ。

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

ー//をー行のー行のー行ー行ー行ー行ー行ー行ー行ー行ー行ー行ー行ー行ー行ー行ー行ー行ー行ー行ー行ー行ー行ー

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

dbを開こうとしてエラーになり、電報にメッセージを送りました。

また、dbmt変数を使用していますが、そこでその値をチェックしていますか?

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

それともこのように

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

なるほど。これはdbを操作しようとしたときに出力されます。データベースを使用する前に、dbハンドルの有効性チェックがあるかどうかを確認する必要があります。

ここでは

dbを開こうとしてエラーが発生し、telegramにメッセージを送った...

また、dbmt変数を使用していますが、その値をチェックしていますか?

それとも次のように

はい、db_exe()でチェックし、retryに送ります。そして、db_exe()は10回失敗したらFalseを返します(一度も返したことはありません)。
if(dbmt == INVALID_HANDLE)
        {
         DatabaseClose(dbmt);
         continue;
        }

Pythonではこのような問題は発生しません。どうやらキューイングと待機に組み込まれているようです。

ご回答ありがとうございました。
 
Evgeny Dyuka #:
はい、db_exe()でチェックして再試行に回します。しかし、db_exe()は10回失敗するとFalseを返します(一度も返されません)。 Pythonではこのような問題は発生せず、キューイングや待ち時間があるようです。 ご回答ありがとうございました。



1.ベースハンドルが取得されなければ、ベースを閉じる必要はありません。

2.2.INVALID_HANDLEを受信した場合、なぜプログラムの実行を続けるのですか?このような場合は、中止してreturnした方が良いと思います。

私は今、存在しないベースを開いたり閉じたりを繰り返していますが、エラー・プリントアウトを得ることができません。このプリントアウトは、オープンできなかったベースへのクエリを作成する瞬間に表示されるのだと思います。

理由: