给 EA 上锁:MQL5 代码保护的五种套路(密码/密钥/账户/时限/远程许可)
开发者辛辛苦苦写的 EA/指标,一旦发出去就可能被随意复制。MQL5 提供多层防护,从最朴素的密码框到远程许可服务器,强度递增。本文按“由浅入深”的顺序拆了五种:密码保护、密钥生成器、账户绑定、时间限制、远程许可证,并给出用 XML-RPC(承接前文 MQL5-RPC 框架)实现服务器校验的思路,最后用 base64 与 PGP 进一步加固。
一、密码保护:最朴素的门禁
最常用也最简单的是密码/序列号保护:首次运行时弹一个输入框(CChartObjectEdit),用户输入与内置 allowed_passwords 数组匹配的代码才放行。密码在 OnChartEvent 收到 CHARTEVENT_OBJECT_ENDEDIT 后校验。这种方案适合“一人一码”的轻量分发,但密码写死在代码里、逆向极易提取,只能挡住普通用户。
// 密码保护存根(节选)
#include <ChartObjects/ChartObjectsTxtControls.mqh>
CChartObjectEdit password_edit;
const string allowed_passwords[] = {
"863H-6738725-JG76364",
"145G-8927523-JG76364",
"263H-7663233-JG76364"
};
int password_status = -1;
// 在 OnChartEvent 收到 CHARTEVENT_OBJECT_ENDEDIT 时校验输入
二、密钥生成器:按规则批量发码
与其维护一长串写死密码,不如用“规则”生成合法密钥。示例规则:密钥格式 XXXXX-XXXXX-XXXXX(三组数字用连字符分隔),第一组必须被 3 整除、第二组被 4 整除、第三组被 5 整除——于是 3-4-5、18000-20000-20000 都是合法码。这样你只需分发“生成器逻辑”或按规则批量造码,校验时按规则判断即可,比穷举密码优雅。
三、账户绑定:锁死经纪商与账号
更高一档是绑定运行环境:用 AccountInfoString/AccountInfoInteger 读取经纪商名和账户号,只有匹配 allowed_broker / 允许的 account_number 才运行。这样即使密钥泄露,换台账户也跑不起来。它适合“卖给指定客户、按账户授权”的商业场景,配合密码使用更稳。
- 密码保护:输入框 + allowed_passwords 数组,挡普通用户
- 密钥生成器:按可整除规则批量造码,比穷举优雅
- 账户绑定:校验 AccountInfo 经纪商/账号,换账户即失效
- 时间限制:比对 TimeCurrent 与到期时间,过期即停
- 远程许可:EA 启动时向许可服务器问“我合法吗”
四、时间限制:给授权设有效期
时间限制让试用版/租赁版可控:在 EA 里记录一个到期时间(或起始时间 + 时长),每次运行用 TimeCurrent 比对,超期就禁止交易。它常和账户绑定组合,做成“某账户某时间段内有效”的租赁授权。注意客户端时间可被用户改,严肃场景应改为向服务器取当前时间。
五、远程许可证:XML-RPC 许可服务器
最强方案是把“是否合法”的判断放到你控制的服务器。EA 用前文 MQL5-RPC 框架向远程 XML-RPC 服务器发请求(如 isValid(ea_name, broker, account)),服务器查 licenses 字典决定是否放行。Python 端用 SimpleXMLRPCServer 几行就能起一个许可服务。好处是密钥可随时吊销、可统计活跃授权,且核心逻辑不在客户端。
# 远程许可服务器(Python 侧,节选)
from SimpleXMLRPCServer import SimpleXMLRPCServer
class RemoteLicenseExample(SimpleXMLRPCServer):
def __init__(self):
SimpleXMLRPCServer.__init__(self, ("192.168.2.103", 9099))
self.register_function(self.xmlrpc_isValid, "isValid")
self.licenses = {}
def addLicense(self, ea_name, broker_name, account_number):
... # 把授权写入 self.licenses
六、再加一层:base64 与 PGP 加固
文章还演示用 base64 对敏感字符串编码(Base64.mqh),以及建议引入 PGP 做非对称加密签名,让 EA 与指标获得“超安全”保护。base64 只是编码不是加密,适合隐藏明文;PGP 才是真加密,配合远程许可能抵御大部分破解。作者也提醒:MQL5.com 市场自带官方授权机制,和本文思路不冲突,两者结合防护更牢。
七、小结
MQL5 代码保护是一条强度递增的光谱:密码框挡小白、密钥生成器批量发码、账户绑定锁环境、时间限制控租期、远程许可把裁决权收回服务器,再用 base64/PGP 加固传输与签名。选哪层取决于你分发的风险等级——但永远记住:客户端能跑的代码就能被看,重要的授权判断尽量放在你控制的服务器端。把它当 EA 商品化的安全清单。