コンテンツにスキップ

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

MT5から.NET DLLの加算・乗算関数を呼び出した実行画面

この記事の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と受け渡しできる単純な数値型だけにしています。

C#
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#コンパイラが使える場合は、ダウンロードしたソースがあるフォルダで次のようにビルドできます。出力先のファイル名は変えないでください。

PowerShell
csc /target:library /out:DotNetFunctionDemo.dll 108_DotNet_Function_Bridge_v1_00.cs

MQL5から呼び出す

MQL5側ではDLLだけを#importし、C#クラス名とメソッド名を指定して呼び出します。対応する.NET DLLではMetaEditorが利用可能な公開static関数を読み取るため、ネイティブDLLのような関数プロトタイプをここへ列挙しません。

MQL
#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は注文やファイル書き込みをしません。

試すときの設定

  1. C#ソースを.NETクラスライブラリとしてビルドし、DLL名をDotNetFunctionDemo.dllにします。
  2. DLLを対象MT5のMQL5\Librariesへ配置し、MQ5ファイルをコンパイルします。
  3. そのDLLのソースと配布元を確認したうえで、端末とこのEAのDLL使用を許可します。
  4. EAをチャートへ適用し、Add=42、Scale=5.00、Result=PASSを確認します。
  5. 確認後は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を記録しました。画像はその端末で実際に関数を呼んだ画面です。許可状態はこの検証用端末だけで一時的に変更し、終了後に無効へ戻しました。

参考資料

前: 【移植#107】DLLの許可状態を点検する — MT5の端末設定とプログラム設定を分けて見る

— SPONSORED —