如何在 MQL4/MQL5 调用 C# dll

mql4/mql5 调用 dll,有以下的情况。

1. 直接调用系统 dll,如果熟悉 win32 api 直接调用系统 dll 就可以达成许多功能,这样就不需要另外再写外部的 dll。

2. 外部 dll,尽量用 C 来写,毕竟 MT4/MT5 是用 C/C++ 写,调用外部 C 写的 dll,MetaQuotes 官网也提供教程范本代码。

3. 如果真的要用 C# 来写,需要先考虑的是,C# 编译后的执行档或 dll 相当容易被 decompile,保护力远低于 ex4 ex5,原本要把特殊功能放在外部 dll 结果是更容易被破解。

但如果要达成的是一个复杂的功能,例如使用 CefSharp 这样复杂的 embed chrome 生成一个复杂的界面窗口,那靠 C# 来写一个 dll 也就只能这样作了。

下面记述如何生成一个可以被 MT4/MT5 直接调用的 C# dll,关键就是 C# 原生的 dll 是 managed codes, 需要转成 MT4/MT5 可以调用的 unmanaged export 的接口 (注: 新版的 MT5 看 release note 是可以直接调用 C# dll,但 MT4 是确定没有办法直接调用原生的 C# dll)

用 Visual Studio 建立一个 C# dll project (Class Library)

输出改为 x86,因 MT4 是 x86 版,用 default 的 any cpu 会有问题

在 Nuget package 选择添加下面这个 package:UnmanagedExports.Repack.Upgrade

C# 的范例如下(简单的对参数作 square 和 square root)

using System;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;

namespace MathDll
{
class MathDll
{
[DllExport("Square", CallingConvention = CallingConvention.StdCall)]
public static double Square(double a)
{
return a * a;
}

[DllExport("SquareRoot", CallingConvention = CallingConvention.StdCall)]
public static double SquareRoot(double a)
{
return Math.Sqrt(a);
}
}
}

把生成的 dll 放在 /mql4/libraries/ 文件夹内,在 mql4 端的调用代码如下:

#import "MathDll.dll"
double Square(double);
double SquareRoot(double);
#import
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
double a=9;
Print("Square ",a," = ",Square(a));
Print("SquareRoot ",a," = ",SquareRoot(a));
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
}

输出结果在日志如下:

个人提供 MT4/MT5 EA 或 指标定制编程代写服务,有兴趣可扫描下方二维码,添加晓辉编程微信进行详细沟通。

 

 

 

 

本文原创,作者:晓辉编程,其版权均为晓辉编程所有。
如需转载,请注明出处:https://www.eafxtech.com/2336.html