【移植#108】MQL5からDLL関数を呼び出す — .NETの静的メソッドを小さく試す¶

この記事の3行まとめ
- 2010年の原記事は、GSLのウェーブレット関数を呼び出すためのDLL関数を作る導入です。
- ここではMQL5公式の.NET連携を使い、C#の静的メソッドへ数値を渡して結果を表示します。
- 動作確認用の例であり、DLLの許可は出所を確認したライブラリだけに限定してください。
元記事と今回の範囲¶
2010年6月14日の「初めてのDLL(2)/関数作成篇」は、C/C++で作ったDLLをMQL4から使う流れを紹介し、続く記事ではGSLのウェーブレット変換関数を扱っています。原文は「DLL作成の雰囲気をつかむ」ことが目的で、少し学べば高速なDLLが作れるわけではない、と注意しています。
今回は当時のC++コードやGSLの数値処理を再現せず、MQL5公式リファレンスに掲載されている.NET DLL連携を題材にします。C#で公開static関数を作り、MQL5から呼び出して引数と戻り値を照合する最小例です。これはWindowsのネイティブC/C++ DLLと同じ呼び出し規約ではありません。
ダウンロード¶
108_DotNet_Function_Bridge_v1_00.mq5 をダウンロード
108_DotNet_Function_Bridge_v1_00.cs をダウンロード
DLL側で関数を作る¶
C#側には、加算するAddと、値へ係数を掛けるScaleを用意します。公開staticメソッドの引数と戻り値は、MQL5と受け渡しできる単純な数値型だけにしています。
public static class DotNetFunctions
{
public static int Add(int left, int right)
{
checked
{
return left + right;
}
}
public static double Scale(double value, double factor)
{
return value * factor;
}
}
ソースをDotNetFunctionDemo.dllという名前の.NETクラスライブラリへビルドします。MQL5側の#importに書くDLL名と、生成物の名前を一致させてください。ビルドしたDLLを端末のMQL5\Librariesへ置きます。Visual Studioを使う場合は、クラスライブラリとしてビルドし、対象の.NET Frameworkを実行環境に合わせます。
.NET FrameworkのC#コンパイラが使える場合は、ダウンロードしたソースがあるフォルダで次のようにビルドできます。出力先のファイル名は変えないでください。
MQL5から呼び出す¶
MQL5側ではDLLだけを#importし、C#クラス名とメソッド名を指定して呼び出します。対応する.NET DLLではMetaEditorが利用可能な公開static関数を読み取るため、ネイティブDLLのような関数プロトタイプをここへ列挙しません。
#import "DotNetFunctionDemo.dll"
#import
int sum=DotNetFunctions::Add(17,25);
double scaled=DotNetFunctions::Scale(1.25,4.0);
サンプルEAはsum==42、scaled==5.00を確認し、チャートに結果を表示します。EAは注文やファイル書き込みをしません。
試すときの設定¶
- C#ソースを.NETクラスライブラリとしてビルドし、DLL名を
DotNetFunctionDemo.dllにします。 - DLLを対象MT5の
MQL5\Librariesへ配置し、MQ5ファイルをコンパイルします。 - そのDLLのソースと配布元を確認したうえで、端末とこのEAのDLL使用を許可します。
- EAをチャートへ適用し、
Add=42、Scale=5.00、Result=PASSを確認します。 - 確認後はEAを外し、必要がなければDLL許可を無効へ戻します。
DLLが見つからない、関数を認識できない、または許可されていない場合、EAは起動時に停止します。読み込みはEAの起動時に行われるため、DLLを入れ替えた後はEAを再初期化してください。
.NET DLLとネイティブDLLを混同しない¶
このサンプルはMetaTraderの.NET連携を使います。2010年の記事のようにC/C++でWindowsネイティブDLLを作る場合は、MQL5側に引数型を含む関数宣言が必要で、C/C++側は呼び出し規約を一致させなければなりません。配列を渡す場合も要素数を別引数で受け取るなど、メモリ境界を明示する必要があります。
ここで確認したのは、関数をDLLへ分けてMQL5から呼び出せることだけです。処理速度の優位性、ウェーブレット変換、移動平均などの指標互換性は検証していません。DLLへ処理を移すだけで高速化するとは限らず、測定対象、データの受け渡し量、呼び出し回数を含めて比較してください。
DLL使用の許可は、その中身が安全であることを保証しません。出所とコードを確認できないDLLは読み込まず、口座操作や外部通信などの権限を持つコードと一緒に使わないでください。
実機確認¶
専用MT5 Build 6230で.NET DLLをビルドし、EAを0 errors・0 warningsでコンパイルしました。DLL許可を有効にした専用端末で実行し、ログはsum=42、scaled=5.00、verified=trueを記録しました。画像はその端末で実際に関数を呼んだ画面です。許可状態はこの検証用端末だけで一時的に変更し、終了後に無効へ戻しました。
参考資料¶
- 原記事の2010年6月アーカイブ
- MQL5 Reference: Importing Functions (#import)
- MQL5 Reference: Call of Imported Functions
前: 【移植#107】DLLの許可状態を点検する — MT5の端末設定とプログラム設定を分けて見る