記事"MQL5 クックブック: インジケーターサブウィンドウコンソールーボタン"についてのディスカッション - ページ 6

 
tol64:

必ずしも毎秒というわけではなく、別のイベントでの代替案がある(すでに議論済み)。ここで 私がどのように行ったか例を挙げてください。エキスパート・アドバイザーはこのイベントを必要とするが、インジケーターは必要としないという条件から)。その方がわかりやすいでしょう。

追伸: 訂正します。間違えました。))あなたの変形はもっと正しくありません。全く合っていません。ですから、上記の条件に基づいた例を示す方がよいでしょう。

インジケータがこのイベントを必要としない場合、単に処理しません。また、Expert Advisorは必要のないイベントを無効にすべきではありません。イベントをオンにすることはできますが、オフにすることはできません。どのようなイベントが自分のウィンドウを通過し、誰がそれを必要とするかは、自分には関係ないからです。

 
C-4:

インジケータがこのイベントを必要としない場合は、単に処理しません。また、Expert Advisorは必要のないイベントを無効にすべきではありません。イベントをオンにすることはできますが、オフにすることはできません。どのようなイベントが自分のウィンドウを通過し、誰がそれを必要とするかは、自分には関係ないからだ。

重要なのは、このイベントを処理しない(ただ忘れる)ことができるということである。しかし、これはOnChartEvent()関数のイベント・キューが、ある瞬間に必要のないもので埋め尽くされないことを意味しない。

そしてこれは、1分間に何千もの不要なイベントが発生することを意味する。チャート上に複数の番組がある場合は?議論にならない?

イベントが有効になっているかどうかを1秒ごとにチェックし、現在は有効になっていないが必要であれば有効にするようにすれば、リソースの浪費はずっと少なくなる。それも違うか?それなら、あなたのやり方でやればいい。

もう反論はない。私の考えを変えるようなことは何も聞いていないので、私は私の意見を支持する。

よろしい。では、このイベントを有効にしたプログラムが無効にする必要はないと考えている人たちに質問がある。

なぜですか?)

それは

1.なぜ必要のないもの(1分間に何千ものイベント)を残すのか?

2.(別の言い方をすれば)より少ないリソースで済むのに、なぜより多くのリソースを使うのか?

イベントが不要なら処理しなければいい」というようなオプションは、個人的にはまったく好きではない。一方を無効にしても、もう一方も無効にはできないし、それで何が得られるというのか?

 

この記事の著者へ、あなたが「初心者」に教えようとしている製品の内部矛盾を説明しないのは無駄なことです。

著者は、自分のインジケータの正しい動作を狂わせる可能性のある、滑りやすい瞬間を示したわけです。これで、「初心者」にも明らかでしょう:

  1. チャートからプログラムを削除するときは、他のプログラムに害を与えないように考えるべきである。
  2. どのような場合でも、相反するプログラムを1つのチャートに置くべきではありませんが、問題のシンボルのチャートの他のウィンドウに置く方がよいでしょう。もしこのことを知らない人がいるとすれば、一つのシンボルは十分な数のチャート・ウィンドウを 開くことができる。
  3. それぞれのチャートには固有のプロパティがあります。したがって、それを変更することは、他のプログラムの正しい動作を妨げることになります。どのような場合でも、このようなことはしてはならない!
  4. フールプルーフ」でなければならない。つまり、インジケーターや他のプログラムの形をしたウイルスが、あなたのプログラムで使用しているチャートのプロパティを変更しようとしたら、それをチェックしなければなりません。そして、それが定期的に発生する場合は、ウイルスを削除してください!
  5. 金融市場用のプログラムにおけるエラーは、莫大な損失につながることがほとんどです。覚えておいてください!
 
tol64:

1.なぜ必要のないもの(1分間に何千ものイベント)を残すのか?

2.(別の言い方をすれば)より少ないリソースで済むのに、なぜより多くのリソースを使うのか?

イベントが不要なら処理しなければいい」というようなオプションは、個人的にはまったく好きではない。一方を無効にすることはできないし、もう一方を無効にすることもできない。

完全に制御されたコードを得ることになる。

あなたはパフォーマンスを重視しているようですが、このイベントを有効にした場合、パフォーマンスはそれほど落ちるのでしょうか?この質問に答えるために、私は特別にこのイベントをテストする簡単なExpert Advisorを書きました。さまざまな組み合わせをテストした結果、以下のような表になりました:

モード
CPU負荷
EVENT_MOVE_MOUSEが有効で、Expert Advisorのこのイベントの処理が有効。9%
EVENT_MOVE_MOUSE が有効で、Expert Advisor でのこのイベントの処理が無効。
6%
EVENT_MOVE_MOUSE がオフの場合、Expert Advisor でのこのイベントの処理がオフになる。
5-6%
Expert Advisorがオフ。チャートは閉じられます。MetaTrader ウィンドウの上にマウスを移動します。
5-6%

ご覧のように、実際の負荷が増加するのは、このイベントの実際の処理が行われるときだけです。CPU負荷から判断すると、このイベントへのサブスクリプションが有効かどうかにかかわらず、MetaTraderがマウス位置を追跡していることは注目に値する。そして一般的に、マウスのトラッキングはどのような場合でも実行されるため、仮定のリソースを節約することは無意味であることがわかります。

Expert Advisorのコードをテストする:

//+------------------------------------------------------------------+
//|テストmq5
//| Copyright 2013, MetaQuotes Software Corp.
//|http://mql5.commql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ObjectCreate(0, "Edit", OBJ_EDIT, 0, 0, 0);
   ObjectSetInteger(0, "Edit", OBJPROP_XSIZE, 400);
   //イベントのオン/オフは自由自在
   ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, false);
   
//---
   return(INIT_SUCCEEDED);
  }
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   //着信イベントを処理する必要がない場合は、このブロックにコメントする。
   if(id == CHARTEVENT_MOUSE_MOVE)
   {
      string label = (string)lparam + " " + (string)dparam + " " + sparam;
      //printf(sparam);
      ObjectSetString(0, "Edit", OBJPROP_TEXT, label);
      ChartRedraw(0);
   }
}
Знакомство с MQL5: написание простого советника и индикатора
Знакомство с MQL5: написание простого советника и индикатора
  • 2010.03.16
  • Denis Zyatkevich
  • www.mql5.com
В этой статье проведен краткий обзор языка MQL5, приведен пример написания советника и индикатора. Данная статья ориентирована как на читателей, знакомых с программированием на языке MQL4, так и на тех, кто только начинает знакомство с программированием торговых систем и индикаторов.
 

1.スタック上でイベントが見逃された場合を常に考慮すべきである。イベントが見逃された場合に何か重大なことが起こり得るとしたら、それは非常にまずい。

2.チャートを自分勝手にカスタマイズするのは良くない。自動売買マシーンでマジックを使わずにトレードするのと同じことだ。

 
DC2008:

この記事の著者へ、あなたが「初心者」に教えようとしている製品の内部矛盾を説明しないのは無駄なことです。

著者は、自分のインジケータの正しい動作を狂わせる可能性のある、滑りやすい瞬間を示したのです。素晴らしい、これで「初心者」にも明らかだ:

...

あなたは、自分の自己重要感を正当化するために、さらに20のルールを考え出すことができますが、そうすれば、あなたは間違いなく自分自身を混乱させ、初心者を「助ける」ことになるでしょう。この場合の矛盾と誤解は、あなたによって観察された。)

C-4:

あなたは完全にコントロールされたコードを得るだろう。

...

あなたがそれをコントロールするとき、それはコントロールされる。この場合、あなたはすべてをチェックなしにすることを提案しています。つまり、今必要でなく、頻繁に再現される可能性のあるイベントを残すことを提案しています。単純な例では、それは目立たないかもしれません。おそらく、より複雑なプログラムでは、必要のないものすべてを無効にする必要性がわかるでしょう。

 
TheXpert:

1.スタック上でイベントが見逃された場合を常に考慮すべきである。イベントが見逃された場合に何か重大なことが起こり得るとしたら、それは非常にまずい。

...

例えば、イベント・キューがオーバーフローした場合とか?
 

tol64:

失礼ですが、ひょっとして別のチュートリアルやレシピを書くのを邪魔しているのでしょうか?

もしそうでなければ、インジケータのサブウィンドウのコントロールに関するあなたの記事について議論を続けましょう。 つまり、あなたはインジケータに便利なメニューを作るための大量の解決策(またはアイデア)を提供しているのですね。記事の趣旨はとても価値がある!しかし、「初心者」のプログラマーは、このすべての武器をどのように使うことができるのでしょうか?カスタム関数をどこに配置すればいいのか?例によってそれを実証してください。そして同時に、例えば5つのボタンを使うためにコードで何を修正する必要があるのかを説明してください。初心者の質問だと思ってください。

 
tol64:
イベントキューがオーバーフローしたときとか?
そうだね。
 
DC2008:
記事に書かれていることがすべて完璧だと確信しているのか?