記事"初心者のためのMQL5:グラフィックオブジェクトのアンチバンダルプロテクト"についてのディスカッション

 

新しい記事 初心者のためのMQL5:グラフィックオブジェクトのアンチバンダルプロテクト はパブリッシュされました:

グラフィックコントロールパネルが削除されたり、他の誰かによって変更されている場合、プログラムに対し、何をすべきか?この記事では、チャート上の「オーナーレス」オブジェクトを処理します。アプリケーションが削除された後に、プログラムで作成されたオブジェクトが残っている場合の処理を行います。

MQL5の利点は、既存のMQL5標準機能でさまざまなタスクを完了し、ターミナルを使用する際に別の目標を達成するコードを作ることができる点です。

シンプルな例によるこの記事では、コントロールパネルのグラフィックオブジェクトに対するプログラムの応答アクションが2種類実装されています。誰かが名前を変更してしまった場合、プログラムが削除された後に制御を失う可能性があります。

例として、オブジェクトのプロパティが手動で変更されました場合を考えます。

図1. 例として、オブジェクトのプロパティを手動で変更

例えば、第三者によるプログラムで、意図的なものでないにせよ、チャートの起動時にすべてを ObjectsDeleteAll()クリーンアップする可能性があります:

  • 手動または他のプログラムを使用して作成したオブジェクトと同じウィンドウ/サブウィンドウにあるすべてのグラフィックオブジェクトの完全な除去。
  • あるいはまた、プログラムのコントロールパネル内に存在するオブジェクトの種類を完全に除去。
  • または接頭辞による除去プログラムのオブジェクトのプレフィックスと一致。
これらは偶発的または意図的に起こりえます。 また、この記事では、シンプルに OnChartEvent()のイベント処理を学び始めた人に役立ちます。

作者: Dina Paches

 

とても良い記事です。私は、このような破壊行為からプログラムを守るために、少し違った方法をとっています.

CREATE_OBJECTS()のような特別な関数で、チャートの可視性の外に接頭辞を持つ必要なオブジェクトをすべて作成します、

そして、エラー4202 ERR_OBJECT_DOES_NOT_EXIST オブジェクトが存在しないことをチェックし、もしそのようなエラーがあれば、再度CREATE_OBJECTS()関数を呼び出します

残りのオブジェクト・プロパティは、チャート内で必要に応じて変更します。

 

よくやった。記事はいい。例も悪くない。

しかし、オブジェクトの存在をチェックする簡単な方法があるようだし、必要ならいつでも復元できる。

 
Victor Nikolaev:

しかし、オブジェクトの存在をチェックし、必要であればいつでも復元できる簡単な方法があるようだ。

そのコツは、切れ目のないチェックの代わりに、チェックの回数を最小限に減らすことである。この目的のために、それらは特定のイベントにバインドされている。私の理解が正しければ。このすべてが標準ライブラリに バインドされていないのは残念だ。
 

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

Victor Nikolaev:

よくやった。記事はいい。例も悪くない。

でも、オブジェクトの存在をチェックする簡単な方法があるようだし、必要ならいつでも復元できる。

ありがとう、ビクター!

念のために言っておくが、ここで紹介する方法は、通常の習慣的な方法(単純かそうでないか)と対立するものではない。

ただ、いつもの慣れ親しんだやり方(シンプルであろうとそうでなかろうと)が常に「タイムリー」であるとは限らないということだ。特に、同じように様々な「いたずらな手」がキャンセルされていないのだから。私たち自身やユーザーのものも含めて、場合によってはそうかもしれない。

つまり、例えば、プログラムのコントロールパネルのオブジェクトが誤ってシフトを介して他の選択と一緒に"オブジェクト リスト "を介して、またはサードパーティのプログラムによって削除された場合、オブジェクトを削除するための関数(ObjectsDeleteAll() または独立して作成された)を使用することができ、その中に設定されたパラメータに応じて実行されます:

  • 手動または他のプログラムの助けを借りて作成されたオブジェクトが配置されている同じウィンドウ/サブウィンドウ内のすべてのタイプのグラフィカルオブジェクトの完全削除;
  • または、プログラムのコントロールパネルにも存在するタイプのオブジェクトの全削除;
  • または、プログラム内のオブジェクトの接頭辞と一致する接頭辞による削除、

その場合、この記事で説明されているオプションが便利で、状況が発生したときに対応できます。場合によっては、あなた自身の不必要な「動き」から解放されることもある。これらのオプションは、普遍的に参照することができ、必要であれば、他のものと「痛みなく、衝突することなく」組み合わせることができると私は信じている。

なんとなく。

つまり、プログラム対象の「保護」のためには、もちろん、さまざまなオプション、方法、そしてそれらの組み合わせを適用することができる。

そして、この記事で説明されているものは、すべてのコードに必須というわけではなく、場合によっては不要でないものもある。

Alexander Puzanov:
コツは、区切りのないチェックの代わりに、チェックの数を最小限に減らすことだ。この目的のために、チェックは特定のイベントに結びつけられます。私の理解が正しければ。

はい、ありがとうございます。その通りです。チェック中の処理数を減らすことが、そこでのチップの1つです。

 

この記事は完全に時代遅れだ

1.初心者向けではない

2.これはMQL5ではなく、MQL4です!

3.3.コーディングの仕方が複雑で、MQL5から見ると、まったく間違っている。

他のEAやインジケーターがオブジェクトを破壊することを問題視するのであれば、もっと効率的でエレガントな方法があります:

- 標準のControlライブラリがすでに行っているように、各チャートオブジェクトに対して MQLオブジェクトを定義します。そのようなMQLオブジェクトはそれぞれチャートオブジェクトを表し、すべてのデータを保持します。

- すべてのオブジェクトをマスター・コンテナにまとめます。

- マスター・コンテナだけが、チャート・オブジェクトが削除されたかどうかをチェックします。削除された場合は、随時、またはOnChartEvent()中に対応するチャート・イベントが発生します。

- CWnd に .ReCreate() メンバ関数を追加し、この機能を実装するすべてのオブジェクトに OnRecreate() 仮想関数を追加する。

- マスター・コンテナが何らかの "破壊行為 "を検出した場合、すべての子オブジェクトに .ReCreate() を送信する。

完了。

 

私は英語がほとんど理解できない。 この記事の英語版は読んでいません

申し訳ありませんが...この記事を全部読みましたか?

ロシア語は話せますか?

もしロシア語が話せるのなら、この記事のロシア語版で もっと建設的な話ができるはずだ。


Doerk Hilger:

この記事は完全に時代遅れだ。

あなたは間違っている。

ドーク・ヒルガー

1.初心者向けではない

なぜそう思うのですか?もう少し詳しく教えてください。

ドーク・ヒルガー

2.MQL5ではなく、MQL4です!

あなたは間違って いる。

しかし、この記事で説明されているスキームはMQL5だけでなく、MQL4にも使えます。

ドーク・ヒルガー

3.コーディングの方法はまったく複雑で、MQL5から見れば、いずれにせよまったく間違っている。

MQL5 については "MQL5 для начинающих: MQL5 MQL5とMQL6を統合した新しいアプリケーションです。И пожалуйста не торопитесь с выводами.Если и после этого ваше мнение не изменится, то напишите более конкретно непонятные для вас моменты.

こちらの記事 初心者のためのMQL5」をお読みください :グラフィックオブジェクトのアンチバンダルプロテクション"をもう一度よくお読みください。そして結論を急がないでください。もしこの記事を読んでも意見が変わらないようであれば、あなたにとって特に難しい瞬間をもっと書いてください。


ドーク・ヒルガー

他のEAやインジケータがオブジェクトを破壊することを問題だと考えるのであれば、もっと効率的でエレガントな方法があります:

- 標準のControlライブラリがすでにやっているように、チャート・オブジェクト ごとにMQLオブジェクトを定義します。そのようなMQLオブジェクトはそれぞれチャートオブジェクトを表し、すべてのデータを保持します。

- すべてのオブジェクトをマスター・コンテナにまとめます。

- マスター・コンテナだけが、チャート・オブジェクトが削除されたかどうかをチェックします。削除された場合は、随時、またはOnChartEvent()中に対応するチャート・イベントが発生します。

- CWnd に .ReCreate() メンバ関数を追加し、この機能を実装するすべてのオブジェクトに OnRecreate() 仮想関数を追加する。

- マスター・コンテナが何らかの "破壊行為 "を検出した場合、すべての子オブジェクトに .ReCreate() を送信する。

完了です。

MQL5" を参照してください:"Антивандальная защита графических объектов" рассматриваются схемы только двух вариантов (способов) из множества возможных.Но различных вариантов (способов) конечно может быть много.
このような場合、"Применять схемы из этой статьи - это зависит только от ваших решений.


MQL5 は、"MQL5: MQL5 "と呼ばれています: MQL5 は MQL5 の最新バージョンです:

  • экономноиспользуютресурсыкомпьютера и торговоготерминала;
  • имеютвысокий уровень своевременности срабатывания (невсе другие обычные привычные способы могутбыть своевременными);
  • могутьбытьприменены со многими другими вариантами (способами).

Эти схемы из данной статьи сконструированы в процедурном стиле.В том числе, чтобы они были более понятны, наглядны и могли послужить идеями для каких-то других вариантов.

Если вам не нравятся эти схемы или они не подходят вам по каким-то другим причинам, вы конечно можете использовать другие схемы. И, естественно, в том стиле програмирования, что для вас привычен.

このような場合、このような批評は、批評家にとって非常に重要な意味を持ちます。


初心者のためのMQL5」の 記事でグラフィックオブジェクトのアンチバンダルプロテクション"では、多くの可能性の中から2つのオプションスキーム(メソッド)のみを検討しています。
この記事のスキームを使うか使わないかは、あなたの決断次第です。

MQL5 for beginners:グラフィック・オブジェクトのアンチ・ヴァンダル・プロテクション"には次のような利点があります:
  • コンピュータと取引端末のリソースを経済的に使用できる;
  • タイムリーな対応が可能である;
  • 他の多くの方法と組み合わせて使うことができる。

本稿では、これらのスキームを手続き的なスタイルで作成した。特に、より理解しやすく、目に見えるようにし、他の選択肢のアイデアとして役立つようにするためである。

もしこれらの図式が気に入らなかったり、他の理由で自分に合わなかったりした場合は、もちろん他の図式を使うことができる。もちろん、あなたの好きなスタイルのプログラミングで。

この記事のスキームを使うか使わないか、それはあなたの決断次第です。


英語で申し訳ない。


追伸 Пожалуйстапрочитайтеэту статью ещё раз внимательно.И пожалуйста не торопитесь с выводами. Если у вас затем будут конструктивные вопросы или предложения, то пишите, пожалуйста.Я смогу ответить вам скорее всего только после новогодних каникул.Это через пять дней.

この記事をもう一度よく読んでください。そして結論を急がないでください。具体的な質問や提案があれば、書いてください。お答えできるのは、おそらく年末年始の休暇明けになるでしょう。あと5日後です。

P./S: Сегодня у нас праздник Нового года.Поэтому и вас поздравляю с наступающим новым 2016-м годом!

今日はお正月休みです というわけで、 2016 年あけまして おめでとうござい ます

 

MetaEditor Version 5.00 build 1241でコンパイルすると、 記事に添付されているテストコードが以下のような名前になります:

  • test_count_click_0.mq5
  • test_count_click_1.mq5
  • test_count_click_2.mq5

以前のように、これらはアンチ・ヴァンダル機能に関しては正しく動作 します。しかし、新しいビルドでコンパイルすると、記事の破壊者対策に属さない関数に問題があることがわかりました。サービスデスク(#1379624) にリクエストしましたが、休日なので当然回答や解決策は期待できません。

以下は、問題の説明、解決方法、問題の解決方法が書かれたファイルです:

しかし、まず最初に、破壊行為に関連する関数が新しいビルドでコンパイルしたときに 正しく 動作したことを再度強調しておきたいと思います。

名前付きテストコードの不正確さは、これらのテストコードのコントロールパネルオブジェクトをクリックすると、最初のものを除いて、クリック数が表示されなくなるという事実に現れています。つまり、ボタンをいくつクリックしても、数値は同じになる:

しかし、 以前のバージョンでコンパイルされたこれらの 同じテストコードは、新しい 1241 ビルドでコンパイルされていなくても、 正しく動作し 続けます 。つまり、これらのテストコードのオブジェクトをクリックすると、クリック数が正常にカウントされます:

検出された 問題は、OnChartEvent()CHARTEVENT_OBJECT_CLICK イベント処理ブロックのArrayFill() 関数の適用に関連していることがわかりました

               count=countClick[index]+count;
               int summ=countClick[NUMBER_ALL]+1;
               //---
               ArrayFill(countClick,index,1,count);
               ArrayFill(countClick,NUMBER_ALL,1,summ)

しかし、この関数の前にデータprintoutまたはChartRedraw() を置くと、コンパイル後に記事にある名前のコードが正しく動作し始めます:

               count=countClick[index]+count;
               int summ=countClick[NUMBER_ALL]+1;
               //---
               //TEST_PRINT_TWO(count,sum);
               ChartRedraw();
               //---
               ArrayFill(countClick,index,1,count);
               ArrayFill(countClick,NUMBER_ALL,1,summ);

以下に添付した修正した3つのファイルと、記事に添付した同名のバージョンでは、これらのセクションと、以下のコードの問題の修正は同じです。つまり

  • test_count_click_0.mq5 - バンダル防止対策が適用されていない;
  • ファイル test_count_click_1.mq5 - チャート上のオブジェクトに無許可で干渉された場合、チャートからプログラムを "自己削除 "する;
  • ファイル test_count_click_2.mq5 - プログラム・オブジェクトが無許可で変更または削除された場合の「自己回復」のバリエーション。

P./S.: 以下の添付コードを正しく動作させるためには、 記事に 添付されているobjectcreateandset .mqhを"Include "フォルダに入れておく必要があります。 また、このファイルはCode Baseから ダウンロードできます。

 
ところで、せっかくなので、MQL5の OnChartEvent() 関数でのイベント処理を勉強し始めたばかりの人のために補足しておくと、記事で紹介されている保護バリアントのスキームは、コンピュータと取引端末のリソースを惜しみなく使っている。したがって、この記事を読んだら、そこで示されているスキームの例で、処理の回数を減らすために提供されているチェックフィルターに注意してください。

例えば、この記事のスキーム例の中で、StringFind() 関数に基づくチェックフィルターについて知っておくと役に立つかもしれない。なぜなら、この関数の助けを借りたフィルターは、必要であれば、チャート内のオブジェクトに関するあらゆるイベントに関する通知を、それが適用されたプログラムで受信したときに、オブジェクト名の検索回数を大幅に減らすことができるからです。つまり、必要に応じて、アンチ・ヴァンダル・バリアントを構築するときだけでなく、役に立つのです。 念のため付け加えますが、この関数に基づくチェック・フィルタの適用範囲は、必要に応じて、3番目の入力パラメータを 使用することで拡張できます。

 
Dina Paches:

私は英語がほとんど理解できない。 この記事の英語版は読んでいません

申し訳ありませんが...この記事を全部読みましたか?


+1

とても良い答えだ。

 
Doerk Hilger:

- 標準のControlライブラリがすでに行っているように、各チャート・オブジェクトに対して MQLオブジェクトを定義します。このようなMQLオブジェクトはそれぞれチャート・オブジェクトを表し、すべてのデータを保持します。

- すべてのオブジェクトをマスター・コンテナにまとめます。

- マスター・コンテナだけが、チャート・オブジェクトが削除されたかどうかをチェックします。削除された場合は、随時、またはOnChartEvent()中に対応するチャート・イベントが発生します。

- CWnd に .ReCreate() メンバ関数を追加し、この機能を実装するすべてのオブジェクトに OnRecreate() 仮想関数を追加する。

- マスター・コンテナが何らかの "破壊行為 "を検出した場合、すべての子オブジェクトに .ReCreate() を送信する。

この記事では、OOPでも手続き型でも、どんなソースコードでも実装できる既成のソリューションのサンプルを提供します。課題は、スーツに合うネクタイを見つけることです。

解決策:新しいOOPスーツを買いましょう。それと、新しいスーツに合うネクタイを買うこともお忘れなく。

PS 標準ライブラリについて:残念ながら、コントロール・ライブラリはこのライブラリの最悪の部分である。その結果、このライブラリが問題の元凶になることもある(チャート上のゴミ)。