私のアプローチコアはエンジンです。 - ページ 85

 

直感の話。面白い例を挙げたいと思います。このスレッドに印刷されている私の投稿 https://www.mql5.com/ru/forum/95632/page122年以上前の ものです。

Реter Konow:

1.グラフィックエンジンのコンセプト。

2.グラフィックコアのコンセプト。

3.MTプラットフォーム用ビジュアルスタジオの作成段階。

4.EAインタフェース作成機構の説明


グラフィカルエンジンは、インジケーターとして設計されたプログラム です。このプログラムは、ユーザーインターフェースの管理のみを目的としたものです。基本機能一式を実行する。

  • グラフィカルインターフェースのコアをファイルから読み込む。
  • インターフェースのカスタム設定の保存
  • インターフェースにおける全プロセスの統一的・協調的制御の実施。ウィンドウの開閉、ウィンドウのサイズ変更、ウィンドウの移動、ウィンドウの結合、拡大縮小、スクリプトの再生、オブジェクトの状態変更、オブジェクトの結合、コントロールのパラメータ値をその型とプロパティに応じて制御、グローバル変数の作成と破棄など、インターフェースの「仕組み」を実装しているのである。

グラフィックエンジンは、他の指標と同様にチャートに追加 されます。以下のウィンドウがセットになっています。

  • タスクバーの右側には、エンジン本体のサービス ウィンドウを呼び出すためのアイコンがいくつか追加されます。
  • 特別なフォルダにあるインターフェイスを持つファイルの リストからブートファイルを選択するために使用されるファイルナビゲータです。
  • オプションの設定画面。この段階では重要な役割を果たしません。

これで原則的に、グラフィカル・エンジンのコンセプトは終了です。重要なのは、これがないとインターフェースの操作ができないことです。



グラフィカルエンジンとは、インターフェースに含まれるすべてのオブジェクトとウィンドウのデータを配列で記録し、ファイルに保存した情報ブロックの ことである。

このブロックは、グラフィカルインターフェースをデジタルで表現した ものです。ユーザーの要求に応じてグラフィックエンジンが読み込む。 グラフィックエンジン自体は、独自のウィンドウを動作させるためのグラフィックカーネルを内部に持ち、このカーネルの内部には、ユーザーインターフェース(デジタル形式)を統合するための空き領域が用意されています。統合は、グラフィカルコアをファイルから読み込む過程で行われます。


3.MTプラットフォームでのビジュアルスタジオの作成は、私の理解では、2つの段階に分かれます。

  • 第一段階では、ファイルベースのインターフェースビルダーが作成されます。その中で、ユーザーはテーブル・テンプレートを使って作業することになります。テーブルには、インターフェース要素の型と名前を書き、そのパラメータのプロパティを設定することになります。ユーザーは、ウィンドウ内の要素の正しい位置について心配する必要がなく(エンジンがすべてを自動的に計算します)、必要な順序で要素を配置するだけで十分なので、作成が非常に簡単になります。
  • 第2段階では、ファイルコンストラクタと同じインターフェース構築方法を実装した、より簡単で便利なビジュアル環境を作成する予定です。また、コントロールの外観を変更する機能も追加される予定です。一般に、ユーザーはより多くのグラフィカルなオプションを持つことになります。


4.ここでは、インターフェース作成プロセスのメカニズムを概説し、その技術について少しベールを脱いでみたいと思います。ファイルによるインターフェイスの作りやすさはどこから来て いるのか、説明してください。

これは、エンジンが特殊な機能を持ち、最小限の読み込み情報で、1つのファイルをもとに完全なグラフィカルカーネルを作成 するものです。このファイルのブート情報は自明であり、人間が読むことができる。書きやすく、編集しやすい。例 えば、ウィンドウを作成 するには 「_CREATE_NEW_WINDOW 」と書き、チェックボックスの名前を「_CHECKBOX 」と書きます(エンジンは要素の名前を、要素自体の名前とそのパラメータの名前として自動的に認識します)。

この関数は "G_CORE_BUILDER() "と呼ばれ 、ユーザーによって作成された起動ファイルと、ウィンドウズやコントロールプラットフォームに含まれるすべての標準オブジェクト群を含む "CONTENT[]" 配列という二つの主要ソースからデータを取ってグラフィカルコアを構築する。"CONTENT[]" には、オブジェクトの状態やスクリプトも含まれる。すべてを1つの配列に。一般に、「CONTENT[]」のソース素材+ユーザーが作成したローダーファイルは、「G_CORE_BUILDER()」によって、エンジンが動作するグラフィックコアを構築するために使用されます。

Приход нового поколения торговых программ. Каким должен стать интерфейс советников?
Приход нового поколения торговых программ. Каким должен стать интерфейс советников?
  • 2016.09.19
  • www.mql5.com
Уважаемые разработчики, в преддверии скачка развития торговых программ, ожидается что создаваемые нами роботы преобретут массу новых возможностей...
 

2年間の努力の結果、用語や概念が変わっていないのはすごいことです。そして関数や配列、キーワードはここに書いてある通りです。このシナリオに沿って、すべてが実装されています。そして、この技術は、2年前にはマークアップ言語の開発経験が まったくなかったにもかかわらず、機能し、進化しているのです。

行き止まりになったわけでもなく、コンセプトを変えたわけでもなく、方向性を変えたわけでもない。エンジンもコアもマークアップ言語も、当初の 意図通りに作り続けました。そして、自分が選んだ道が正しかったことを、実践で確認する。

これが予言的直感でないとしたら、何が予言的直感なのか?

 

対戦相手の皆様へ。

以下は、そのスクリプトコードです。

  1. 文字列をChar配列に 転送し、リソース経由で他のプログラムに渡すための時間と、Char配列から文字列を取り出し、その後の情報の分割や取り出しにかかる時間を測定します。
  2. その後の情報の分割・検索のために、MTオブジェクト記述に文字列を書き込む時間、MTオブジェクト記述から文字列を取り出す時間を測定する。
//+------------------------------------------------------------------+
//|                        CharArrayToString и StringToCharArray.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
//--------------------------------------------

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   string qwerty = "qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj";   
   uchar Arr[];
   //---------------------------------
   //Создаем объект связи.
   //---------------------------------
   ObjectCreate(0,"button_1",OBJ_BUTTON,0,0,0);   
   //---------------------------------
   ulong t1 = GetMicrosecondCount();
   //---------------------------------
   //Переводим строку в тип Char
   //---------------------------------
   StringToCharArray(qwerty,Arr,0,WHOLE_ARRAY);
   //---------------------------------
   ulong t2 = GetMicrosecondCount();
   //---------------------------------
   //Переводим массив Char обратно в строку:
   //---------------------------------
   string str_1 = CharArrayToString(Arr,0,WHOLE_ARRAY);
   //---------------------------------
   ulong t3 = GetMicrosecondCount();
   //---------------------------------
   //Записываем строку в описании МТ-объекта.
   //---------------------------------
   ObjectSetString(0,"button_1",OBJPROP_TEXT,"qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj");
   ulong t4 = GetMicrosecondCount();
   //---------------------------------
   //Cчитываем строку из описания МТ-объекта.
   //---------------------------------
   string str_2 = ObjectGetString(0,"button_1",OBJPROP_TEXT);
   ulong t5 = GetMicrosecondCount();
   //---------------------------------   
   //Замеряем время исполнения.
   //----------------------------------------------
   Print("Time of execution StringToCharArray:   ",t2-t1);
   Print("Time of execution CharArrayToString:   ",t3-t2," строка от CharArrayToString:  ",str_1);
   //----------------------------------------------
   Print("Time of execution ObjectSetString:     ",t4-t3);
   Print("Time of execution ObjectGetString:     ",t5-t4," строка от ObjectGetString:  ",str_2);
   //----------------------------------------------
  }
//+------------------------------------------------------------------+

結果

2018.12.18 16:44:20.042 CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution StringToCharArray:   47
2018.12.18 16:44:20.042 CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution CharArrayToString:   35 строка от CharArrayToString:  qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj

2018.12.18 16:44:20.042 CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution ObjectSetString:     3
2018.12.18 16:44:20.042 CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution ObjectGetString:     3 строка от ObjectGetString:  qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj


 

私のソリューションでは、10倍以上速くなりました。

リソースを保存する時間と、ResourceReadImage() を使ってリソースを配列に取り込む時間を、ソリューションに追加してください。

私のソリューションでは、前者も後者も必要ありません。

 
Реter Konow:
私のソリューションでは、10倍以上速くなりました。

ピーター ストリングで作業すると、どうしたってパフォーマンスが落ちます。ですから、もともと文字列でメッセージを渡し、そのメッセージを解析するという不向きな解決策を選んだにもかかわらず、神話的な性能を追い求めるというのは驚きです。

 
Vasiliy Sokolov:

ピーター ストリングで作業すると、どうしたってパフォーマンスが落ちます。ですから、もともと文字列でメッセージを渡し、そのメッセージを解析するという不向きな解決策を選んだにもかかわらず、神話的なパフォーマンスを追い求めるというのは驚きですね。

バシリー 他にはどのようにして、プログラム間であらゆる種類のデータを転送しているのですか?

OnChartEvent() は部分的に適している。

  1. テスターでは動作しません。
  2. 大量の呼び出しがあると、イベントキューが詰まってしまう。


 
ちなみに、20ミリ秒以下の計測は、厳密に言えば、少なくともプリエンプティブなマルチスレッドシステムでは全く有効ではありません。しかし、自分の結果を受け入れても(一般的には認めている)、やはり何もわからない。重要なのは、フルサークルコストだからだ。そして、測定したものはその一部に過ぎません。
 
Vasiliy Sokolov:
ちなみに、20ミリ秒以下の計測は、厳密に言えば、少なくともプリエンプティブなマルチスレッドを持つシステムでは全く有効ではありません。しかし、自分の結果を受け入れても(一般的には認めている)、やはり何もわからない。重要なのは、フルサークルコストだからだ。そして、あなたが測定したものは、その一部に過ぎないのです。

普遍的で最速の方法が必要なのです。テスターで動作させ、OnChartEvent()イベントキューを迂回させるため。

テストでは、リソースを介した転送に10倍の速度がかかっていることがわかります。(リソースの保存と ResourceReadImage()によるデータ取得の時間を測定しない) .

私のソリューションは、初期条件下では最良の選択肢です。

 
Vasiliy Sokolov:
...しかし、自分の結果を受け入れても(一般的には認めている)、やはり何もわからない。重要なのはフルサークルコストだからだ。そして、測定したものはその一部に過ぎません。

しかし、より多くのラインとギアに外挿すると、やはり私のオプションが勝ります。

 
Реter Konow:

バジリ、プログラム間であらゆる種類のデータを転送するには、他にどのような方法があるのでしょうか?

構造体をユニオンを介してバイト配列に直接マッピングし、グローバルアクセスで共有する。技術的に可能かどうかは分かりませんが、もし可能なら、一切コピーする必要がないので、スピードは宇宙規模になりますね。