記事"Net Framework および C# に基づくグラフィカル インターフェイスの開発 (パート 2): その他のグラフィカル要素"についてのディスカッション

 

新しい記事 Net Framework および C# に基づくグラフィカル インターフェイスの開発 (パート 2): その他のグラフィカル要素 はパブリッシュされました:

この記事は、前回の記事".Net Framework と C#に基づいてEAとインジケータのグラフィカルインターフェイスを開発する"のフォローアップです。 グラフィカルインターフェイスを作成するための新しいグラフィカル要素を紹介します。

2 番目のバージョン以降、コントローラーはメッセージ ボックスをサポートしています。 これは、標準的なユーザー情報要素です。 また、ユーザーにオプションを提供し、選択したオプションの形式で応答を受け取ります。

メッセージ ウィンドウのデモンストレーションを開始するには、EAを起動するときに Windows フォーム要素タイプ パラメータの [ボタンとメッセージ ボックス] オプションを選択します。 EAを起動すると、次のいずれかのオプションを選択するように求めるフォームが表示されます。

図3. メッセージ ボックスを呼び出すサンプル フォーム 

このフォームは、一連のものと同様に、デモンストレーション形式であるため、トレードロジックは装備されていません。 ただし、いずれかのボタンを押すと、EAは選択したアクションの確認を求めるアラートメッセージを送信します。 たとえば、[(SELL)売り] をクリックすると、次のメッセージ ウィンドウが表示されます。


図4. トレーディングEAは、新しいショートポジションを開くために確認

作者: Vasiliy Sokolov

 
記事、GUI、C#の無限の可能性など、すべてが素晴らしい。何か問題があるのですか?
 
Реter Konow:
記事、GUI、C#の無限の可能性など、すべて素晴らしいのですが、なぜテーブルがないのですか?何か問題があるのですか?

資料の量が多すぎますし、C#のテーブルはとても複雑な要素です。三段跳びのようなものです。基本的な要素を実装して加速してから、複雑なテーブルに挑戦する必要があります。

 
Vasiliy Sokolov:

資料の量が多すぎるし、C#のテーブルは非常に複雑な要素だ。三段跳びのようなものだ。基本的な要素を実装して加速してから、複雑なテーブルに挑戦する必要があります。

なるほど。
 
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IO.FileNotFoundException: Не удается найти указанный файл. (Exception from HRESULT: 0x80070002)
   at System.Reflection.RuntimeAssembly.nLoadFile(String path, Evidence evidence)
   at System.Reflection.Assembly.LoadFile(String path)
   at MtGuiController.GuiController.GetGuiController(String assembly_path, String form_name)
   at MtGuiController.GuiController.ShowForm(String assembly_path, String form_name)
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Wrapper.Wrapper.Call(MethodInfo method, Int64 owner, Int64 parameters, Int64 result)
.Net runtime error

記事からExpert Advisorを起動するとエラーが発生する。

 
fxsaber:

記事のExpert Advisorを実行するとエラーが発生する。

プログラムファイルのパスが絶対パスになっているので、実際のパスに変更する必要がある。MTのようにユニバーサルカタログを作成することはできません。

 
Vasiliy Sokolov:

プログラムファイルへのパスは絶対パスなので、実際のパスに変更する必要がある。MTのようにユニバーサル・カタログを作ることはできない。

string assembly = "c:\\Users\\Bazil\\source\\repos\\DemoForm\\DemoForm\\bin\\Debug\\DemoForm.exe";

このファイルはどこにもありません。提供されたC#ソースからコンパイルすることはまだできません。

 
fxsaber:

このファイルはどこにも見当たりません。提供されたC#ソースからまだコンパイルできない。

奇妙なことに、アーカイブに添付するのを忘れてしまったようだ。数時間後に投稿します。

 
アーカイブに添付
ファイル:
DemoForm.zip  8 kb
 
Vasiliy Sokolov:
アーカイブに添付

ありがとう。

// DemoForm.exeをライブラリに入れた。
string assembly = TerminalInfoString(TERMINAL_PATH) + "\\MQL5\\Libraries\\DemoForm.exe";


C#-windowsでの作業で、非常に重大なエラーを発見しました。C#ウィンドウを動かし続けると、数秒後にターミナルが画面から消えてしまい、terminal64.exeのCPUコア負荷が100%を超えてしまいます。私は8コアなので、CPUのTaskManagerのフルコア負荷は12~13%です。C#ウィンドウが動いているときは19%です。


グラフィックカードはCPU内蔵で、ビデオカードはありません。問題はディスプレイにあると思った。そのため、このようなテスト・アドバイザーを走らせた。

int handle = INVALID_HANDLE;

void OnInit()
{
  if (EventSetTimer(1))
    handle = FileOpen(__FILE__, FILE_WRITE | FILE_TXT);
}

void OnDeinit( const int )
{
  if (handle != INVALID_HANDLE)
    FileClose(handle);
}

void OnTimer()
{
  if (handle != INVALID_HANDLE)
    FileWriteString(handle, (string)TimeCurrent() + "\n");
}

マーケット・ウォッチから1秒ごとに時間を書き込んでいる。これはC#ウィンドウを動かしたときに記録されたものだ。

2019.06.11 16:22:09
2019.06.11 16:22:11
2019.06.11 16:22:11
2019.06.11 16:22:19
2019.06.11 16:22:23
2019.06.11 16:22:24
2019.06.11 16:22:26
2019.06.11 16:22:28
2019.06.11 16:22:31
2019.06.11 16:22:33
2019.06.11 16:22:34
2019.06.11 16:22:36
2019.06.11 16:22:37
2019.06.11 16:22:45
2019.06.11 16:22:45
2019.06.11 16:22:48
2019.06.11 16:22:51
2019.06.11 16:23:07
2019.06.11 16:23:08
2019.06.11 16:23:10

OnTimerが数秒間実行されなかったことがよくわかる。つまり、C#ウィンドウを移動させると、ターミナルのExpert Advisorの実行が停止してしまうのです。


この問題はこの記事のC#ウィンドウだけではありません。

 
Vasiliy Sokolov:

ターミナルメニューから手動でGuiControllerElementsDemoを 削除すると、数秒間フリーズします。