MT5の機能をさらに拡張したいと考えていませんか?本記事では、.NET FrameworkとC#を活用して、MT5のエキスパートアドバイザーや指標のためのカスタムGUIを開発する方法を詳しく解説します。以下の内容を学べます:
- Visual Studioのセットアップと基本的な使用方法
- GuiController.dllの役割と使用方法
- MQLプログラムとの効果的な統合技術
これらの知識を身につけることで、より直感的で効果的な取引ツールの開発が可能になります。初心者から上級者まで、MT5の可能性を最大限に引き出すための重要なスキルを習得しましょう。
EAのオブジェクトで作成できないボタンやウィンドウを表示できる方法だよ
裁量EAとか販売されてる操作パネルで採用されてるのをみかけるよ
.NET GUIとは
.NETは、Microsoftが開発した共通言語プラットフォームで、C#が主要なプログラミング言語です。本プロジェクトでは、.NETを使用してフォームを開発します。システムは以下の3つの独立したオブジェクトで構成されます:
- MQLプログラム
- .NET動的ライブラリ
- C#で開発されたグラフィカルウィンドウ
これらのオブジェクトは、メッセージシステムを介して相互にやり取りします。
Visual Studioのインストールと構成
Visual Studioは、.NET開発に必要な統合開発環境です。本記事では、無料のCommunity Editionの使用を前提としています。
インストール手順は以下の通りです:
- Microsoft公式サイトからVisual Studio Community Editionをダウンロードします。
- ダウンロードしたインストーラーを実行し、「.NET デスクトップ開発」ワークロードを選択します。
- インストールが完了したら、Visual Studioを起動し、Microsoftアカウントでサインインします。
- 初回起動時に、開発設定とカラーテーマを選択します。
これらの手順により、初心者でも簡単にVisual Studioをセットアップできます。
Windows Formsアプリケーションの作成
Visual Studioを使用して最初のWindows Formsアプリケーションを作成する手順を説明します:
- プロジェクトの作成
- Visual Studioを起動し、「新しいプロジェクトの作成」を選択します。
- 「Windows フォーム アプリケーション (.NET Framework)」を選択します。
- プロジェクト名と保存場所を指定します。
- フォームのデザイン
- ソリューションエクスプローラーでForm1.csをダブルクリックしてデザイナーを開きます。
- フォームのプロパティ(サイズ、タイトルなど)を設定します。
- ボタンの追加
- ツールボックスからボタンコントロールをフォームにドラッグ&ドロップします。
- ボタンのプロパティ(テキスト、サイズなど)を設定します。
- コンパイルと実行
- F5キーを押すか、「デバッグ」メニューから「デバッグの開始」を選択します。
- アプリケーションがコンパイルされ、新しいウィンドウで実行されます。
GuiController.dllの最新バージョン
GuiController.dllは、MQLプログラムと.NETアプリケーション間の橋渡しをする重要なコンポーネントです。GitHubを使用して最新バージョンを取得する方法は以下の通りです:
- GitHubのリポジトリ(https://github.com/PublicMqlProjects/MtGuiController)にアクセスします。
- 「Code」ボタンをクリックし、「Download ZIP」を選択してプロジェクトをダウンロードします。
- ダウンロードしたZIPファイルを解凍します。
- Visual Studioでプロジェクトを開き、ソリューションをビルドします。
- ビルドされたGuiController.dllファイルをMetaTrader 5の「MQL5\Libraries」フォルダにコピーします。
バージョン管理の重要性
- 常に最新版を使用することで、バグ修正や新機能を利用できます。
- プロジェクトの変更履歴を追跡し、必要に応じて以前のバージョンに戻ることができます。
- 他の開発者と協力する際に、コードの同期や変更の管理が容易になります。
この程度は使い方を一回覚えるだけ(‘ω’)
問題はこの後だね
アプリケーションをMetaTrader 5と統合する
開発したGUIアプリケーションをMT5と統合する方法を詳細に解説します。MQLプログラムでGuiController.dllを使用してフォームを表示し、イベントを処理する方法を示しています。
MQLプログラムとGuiController
GuiControllerのイベントモデルは、MT5のOnChartEventモデルに類似しており、ユーザーが容易に理解できるように設計されています。
イベントの種類
/// <概要>
/// GUIイベントの種類
/// </概要>
public enum GuiEventType
{
Exception,
ClickOnElement,
TextChange,
ScrollChange
}
このコードは、GuiControllerで定義されているイベントの種類を示しています。
イベントパラメータ
public static void GetEvent(int event_n, ref string el_name, ref int id, ref long lparam, ref double dparam, ref string sparam)
GetEventメソッドのプロトタイプです。各パラメータの意味は以下の通りです:
- event_n: イベントのシリアル番号
- el_name: イベントを生成した要素の名前
- id: イベントの種類
- lparam: イベントの整数値
- dparam: イベントの実数値
- sparam: イベントの文字列値
イベント処理方法
for(static int i = 0; i < GuiController::EventsTotal(); i++)
{
int id;
string el_name;
long lparam;
double dparam;
string sparam;
GuiController::GetEvent(i, el_name, id, lparam, dparam, sparam);
if(id == ClickOnElement)
printf("Click on element " + el_name);
}
このコードは、OnTimer関数内でイベントを処理する方法を示しています。
GuiControllerの舞台裏
C#に精通したユーザー向けに、GuiControllerの内部動作について説明します。
リフレクションを使用した.NETアセンブリへのアクセス
GuiControllerは.NETのリフレクション機能を使用して、動的に.NETアセンブリにアクセスします。これにより、コンパイル時に具体的な型情報がなくても、実行時にアセンブリの内容を調べ、必要なクラスやメソッドを呼び出すことができます。
private static Form FindForm(Assembly assembly, string form_name)
{
Type[] types = assembly.GetTypes();
foreach (Type type in types)
{
//assembly.CreateInstance()
if (type.BaseType == typeof(Form) && type.Name == form_name)
{
object obj_form = type.Assembly.CreateInstance(type.FullName);
return (Form)obj_form;
}
}
throw new Exception("Form with name " + form_name + " in assembly " + assembly.FullName + " not find");
}
このコードは、指定されたアセンブリから特定の名前を持つFormクラスを見つけ、そのインスタンスを作成します。
フォームの検索と作成
GuiControllerは、アセンブリ内で指定された名前のフォームを検索し、そのインスタンスを作成します。これにより、MQLプログラムから指定されたフォームを動的に生成することができます。
イベントの処理
GuiControllerは、作成されたフォームのイベントをサブスクライブし、それらをMQLプログラムに伝達します。これにより、MQLプログラムはC#で作成されたGUIと対話することができます。
/// <概要>
/// 利用できるイベントにサブスクライブする
/// </概要>
/// <param name="form">Windows Forms</param>
private void SubscribeOnElements(Form form)
{
Dictionary<Type, List<HandlerControl>> types_and_events = new Dictionary<Type, List<HandlerControl>>();
types_and_events.Add(typeof(VScrollBar), new List<HandlerControl>() { vscrol => ((VScrollBar)vscrol).Scroll += OnScroll });
types_and_events.Add(typeof(Button), new List<HandlerControl>() { button => ((Button)button).Click += OnClick });
types_and_events.Add(typeof(Label), new List<HandlerControl>());
types_and_events.Add(typeof(TextBox), new List<HandlerControl>() { text_box => text_box.LostFocus += OnLostFocus, text_box => text_box.KeyDown += OnKeyDown });
foreach (Control control in form.Controls)
{
if (types_and_events.ContainsKey(control.GetType()))
{
types_and_events[control.GetType()].ForEach(el => el.Invoke(control));
m_controls.Add(control.Name, control);
}
}
}
このコードは、フォーム上の各コントロールに対して適切なイベントハンドラをサブスクライブします。
詳細な方法は参考記事を見てね!
ここではざっくり工程を紹介するだけ
GUIに基づいた取引パネル
実践的な例として、取引パネルの開発プロセスを説明します。
- Visual Studioでの取引パネルのデザイン:
- 新しいWindows Formsプロジェクトを作成します。
- フォームに必要なコントロール(ボタン、テキストボックス、ラベルなど)を配置します。
- 各コントロールに意味のある名前を付けます(例:ButtonBuy, TextBoxVolume)。
- C#コードの生成:
- Visual Studioは自動的にフォームのC#コードを生成します。
- 必要に応じて、イベントハンドラを追加します(例:ボタンクリックイベント)。
- MQLプログラムとの統合:
- GuiControllerを使用して、MQLプログラムからC#フォームを表示し、操作します。
この手順により、メタトレーダーの機能を拡張する、カスタマイズされた取引インターフェースを作成することができます。
グラフィックウィンドウとEAコードの統合
開発した取引パネルをMetaTrader 5のEAと統合する方法を詳細に説明します。
MQLコードでのイベント処理
void OnTimer()
{
//--- タイマーで新しいイベントを取得する
for(static int i = 0; i < GuiController::EventsTotal(); i++)
{
int id;
string el_name;
long lparam;
double dparam;
string sparam;
GuiController::GetEvent(i, el_name, id, lparam, dparam, sparam);
if(id == TextChange && el_name == "CurrentVolume")
TrySetNewVolume(sparam);
else if(id == ScrollChange && el_name == "IncrementVol")
OnIncrementVolume(lparam, dparam, sparam);
else if(id == ClickOnElement)
TryTradeOnClick(el_name);
}
//---
}
このコードは、OnTimer関数内でGUIイベントを処理する方法を示しています。
取引ロジックの実装
bool TryTradeOnClick(string el_name)
{
if(el_name == "ButtonBuy")
return Trade.Buy(current_volume);
if(el_name == "ButtonSell")
return Trade.Sell(current_volume);
return false;
}
このコードは、ボタンクリックに応じて取引を実行する方法を示しています。
数量の検証
double ValidateVolume(double n_vol)
{
double min_vol = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);
double max_vol = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX);
//-- 下限を確認する
if(n_vol < min_vol)
return min_vol;
//-- 上限を確認する
if(n_vol > max_vol)
return max_vol;
//-- 数量を正規化する
double vol_step = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP);
double steps = MathRound(n_vol / vol_step);
double corr_vol = NormalizeDouble(vol_step * steps, 2);
return corr_vol;
}
このコードは、入力された取引量を検証し、適切な範囲内に収める方法を示しています。
ストラテジーテスターでのGUI操作
MT5のストラテジーテスターでGUIを使用する際の特徴と注意点について説明します。
- OnChartEvent関数の制限:ストラテジーテスターではOnChartEvent関数が呼び出されないため、GUIイベントの処理に注意が必要です。
- 代替手段:OnTick関数やOnTimer関数を使用して、定期的にGUIイベントをチェックします。
- パフォーマンスの考慮:GUIの更新頻度が高すぎると、バックテストのスピードに影響を与える可能性があります。
- データの同期:リアルタイムでのGUI更新とバックテストのデータ処理のバランスを取ることが重要です。
これらの点に注意することで、ストラテジーテスター環境でもGUIを効果的に活用することができます。
まとめ
本アプローチの主な利点は以下の通りです:
- 3つの独立した部分に分割されることによる高い柔軟性
- Visual Studioのツールを利用して、容易に開発ができる
- MT5本体とストラテジーテスター両方での汎用性
- MQL5基本知識のみでのカスタムフォームが開発できる
一方で、市場での運用制限やセキュリティ上の懸念など、いくつかの制限事項も存在します。
上級者向けの内容ですが、一歩進んだ内容を取り入れることでプログラミングスキルのレベルアップに繋がります。興味のある方は、積極的に取り組んで身に着けてみましょう。
オンラインコミュニティ
こちらのコミュニティで、AIや機械学習をトレードに活かすために日々探求しています。
興味のある方は覗いてみてください。
参考記事
記事本文のコードは下記の記事の内容を引用しています。