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

 
Aleksandr Slavskii #:

Expert Advisor で、Expert Advisor が削除されたときに注文を削除し、ポジションをクローズするように規定されている場合、

の場合、すべて削除され、決済されます。

小さな追加:2.5秒かかる場合。

Выполнение функции OnDeinit() ограничивается 2.5 секундами. Если за это время функция не закончила свою работу, то ее выполнение завершается принудительно.
 

やり方がわからないんだ。

マウスホイールのスクロールイベントが発生すると、コードが実行されます。

マウスホイールは一度に数クリックスクロールさせることができ、dparam = クリック数で1つのイベントではなく、dparam = +/-120 で複数のイベントが発生します。

コードが実行される時間は、マウス・ホイールをスクロールするときのクリック間隔よりずっと長い。

その結果、誰もマウスホイールをスクロールしなくなり、プログラムはさらに何時間も再計算を続けることになります。

//+------------------------------------------------------------------+
void OnInit()
  {
   ChartSetInteger(0, CHART_EVENT_MOUSE_WHEEL, 0, true);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   static double delta = 0;

   if(id == CHARTEVENT_MOUSE_WHEEL)
     {
      //--- какой то код
      delta += dparam / 120;
      Sleep(1000);
      //---
      Print(delta);
     }
  }
//+------------------------------------------------------------------+
15:12:22.820    test (EURUSD,H1)        0.0
15:12:23.821    test (EURUSD,H1)        1.0
15:12:24.811    test (EURUSD,H1)        2.0
15:12:25.823    test (EURUSD,H1)        3.0
15:12:26.817    test (EURUSD,H1)        4.0
15:12:27.814    test (EURUSD,H1)        5.0
マウスホイールは15:12:22.820にスクロールし、プログラムはさらに5回、丸5秒間実行された。


質問:プログラムのコードを何回も実行するのではなく、1回だけ実行するにはどうすればよいでしょうか。

つまり、ホイールが5回クリックされ、delta = dparam / 120 * 5.

 
Aleksandr Slavskii #:

やり方がわからないんだ。

マウスホイールのスクロールイベントが発生すると、コードが実行されます。

マウスホイールは一度に数クリックスクロールさせることができ、dparam = クリック数で1つのイベントではなく、dparam = +/-120 で複数のイベントが発生します。

コードが実行される時間は、マウス・ホイールをスクロールするときのクリック間隔よりずっと長い。

その結果、誰もマウスホイールをスクロールさせなくなり、プログラムはさらに時間をかけて再計算し続けることがわかった。

マウスホイールは15時12分22秒820にスクロールし、プログラムはさらに5回、丸5秒間実行された。


質問:プログラムのコードを何回も実行するのではなく、1回だけ実行するにはどうすればよいでしょうか。

つまり、ホイールが5回クリックされ、delta = dparam / 120 * 5.

これを試す

//+------------------------------------------------------------------+
void OnInit()
  {
   ChartSetInteger(0, CHART_EVENT_MOUSE_WHEEL, 0, true);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   static double delta = 0;
   bool flag = true;
   if(id == CHARTEVENT_MOUSE_WHEEL)
     {
      //--- какой то код
      delta += dparam / 120;
      Sleep(1000);
      //---
      if(flag)
       {
        Print(delta);
        flag = false;
       }
     }
  }
//+------------------------------------------------------------------+

チェックしてなかった、どちらかというと僕のせいじゃないんだけど...))))フラグをどうにかしないと...コードをカスタム関数に入れて、そこでフラグをいじらないといけないかも。

 
ありがとうございました!
 

6月3日にMT5(https://www.mql5.com/ru/code/44732) 用のスクリプトを公開しました。まだ「モデレーターがチェック中」の状態である。 チェックにどれくらい時間がかかるか、誰にもわからない

Скачать бесплатно скрипт 'Quick Change MA (method, period)' от 'NotBuffett' для MetaTrader 5 в MQL5 Code Base
  • www.mql5.com
Скачать бесплатно скрипт 'Quick Change MA (method, period)' от 'NotBuffett' для MetaTrader 5 в MQL5 Code Base
 
Alexey Viktorov #:

これを試してみよう

私のせいでないなら...))))))チェックしてなかった。どうにかしてフラグをいじらないと...多分、カスタム関数にコードを入れて、そこでフラグをいじらないといけないと思う。

問題は、カスタム関数はイベント関数の中だけで実行されることで、私のEAにはOnInitとOnChartEventの2つしかありません。

一般的には、エースとまではいきませんが、なんとかできました。

//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   static double delta = 0;
   static ulong timeWheel = 0;
   static bool mouse_wheel = false;

   if(id == CHARTEVENT_MOUSE_WHEEL)
     {
      delta += dparam / 120;
      mouse_wheel = true;
      timeWheel = GetMicrosecondCount();
     }

   if(mouse_wheel && GetMicrosecondCount() - timeWheel > 0)
     {
      Print(delta);
      //--- какой то код
      Sleep(1000);
      //---
      delta = 0;
      mouse_wheel = false;
     }
  }
//+------------------------------------------------------------------+
23:48:28.853    test (EURUSD,H1)        1.0
23:48:29.857    test (EURUSD,H1)        1.0
23:48:30.856    test (EURUSD,H1)        4.0
23:48:31.881    test (EURUSD,H1)        2.0
23:48:32.880    test (EURUSD,H1)        4.0
23:48:33.887    test (EURUSD,H1)        11.0
23:48:34.914    test (EURUSD,H1)        15.0
23:48:35.926    test (EURUSD,H1)        7.0
23:48:36.936    test (EURUSD,H1)        9.0
23:48:46.477    test (EURUSD,H1)        6.0
23:48:47.479    test (EURUSD,H1)        -1.0
 
Aleksandr Slavskii #:

ー問題点はーカスタム関数はーイベント関数のー関数のー関。

ったなとー。

OnChartEventからカスタム関数を呼び出すことも問題なく できます。

フラグはグローバル・レベルで宣言されます。度フラグを度リセットするためだけに度OnTickを度挿入することは度問題なく度フラグが度フラグ。

フラグが開いている場合、カスタム関数が呼び出されます。内部的には、フラグは閉じられている。度フラグが度OnTickで度フラグが度OnTickで度フラグが度OnTick、度フラグが度フラグ。

実行時間に引っかかるよりは簡単だと思う。

 
Alexey Viktorov #:

OnChartEventからカスタム関数を呼び出すこともできる

フラグはグローバル・レベルで宣言されます。フラグをリセットするためだけにOnTickを挿入しても問題ありませんし、コードの実行を遅らせることもありません。

フラグが開いている場合、カスタム関数が呼び出されます。内部的には、フラグは閉じられている。OnTickでフラグは再びオープンされ、ユーザー関数の次の実行を待ちます。

実行時間に縛られるよりは楽だと思う。

よくわからないというか、まったく理解できないんだけど......)

もしティックがなかったら、OnTickは ティックがないと動かないんだけど、どう すれば いいの?


実際、僕はOnChartEventから カスタム関数を呼び出して いる。 ホイールをスクロールさせるときに、最後にクリックしたマウスを追跡するのが問題だったんだ。

課題は、スクロール中のクリック数をカウントしながら、ホイールのスクロールを止める瞬間までカスタム関数の実行を遅らせることだった。

原理的にはうまくいった。

 
NotBuffett #:

6月3日にMT5(https://www.mql5.com/ru/code/44732) 用のスクリプトを公開しました。まだ「モデレーターがチェック中」の状態である。 チェックにどれくらい時間がかかるか、誰にもわからない

コードを公開した。検証は1分もかからなかった。

公開中にミスをした可能性が高い。

 
Aleksandr Slavskii #:

コードを公開したところだ。チェックには1分もかからなかった。

おそらく公開時にミスをしたのだろう。

もう一度公開してみた。同じことです:

5.テスト」の下に"テストはエラーなく完了しました" と表示され、公開しようとするが、"公開" ボタンをクリックするとエラーが発生する。

404.このページは存在しません。

サブセクション "My Codes "には現在2つのコードがあり、その両方に "checked by moderator "と表示されています。

一般的に、私は一般スレッドで質問します、多分モデレーターはまだ気づいているでしょう。

理由: