MT5 图上交易面板开发(三):按风险额度自动计算手数的 MQL5 实现

本文是「MT5 图上交易面板开发」系列第 3 篇,讨论手数的三种模式与"按风险额度反推手数"的完整实现。系列总览见第一篇。

免责声明:本文内容仅用于技术交流与学习参考,不构成任何投资建议。金融市场存在不确定性,过往表现不代表未来结果。请读者独立判断、审慎决策,自行承担投资风险。


1. 问题:固定手数掩盖了风险差异

常见的手数习惯是统一值:小账户一律 0.01,资金多些改 0.1。问题在点值差异------不同品种每点价值不同,同样 0.1 手在两个品种上的单笔风险可能相差数倍。

手数与风险的关系:

text 复制代码
单笔风险 ≈ 止损点数 × 每点价值 × 手数

把这个关系反推,就是风险手数模式的思路:先固定"这一单最多亏多少",再解出对应手数。

2. 三种手数模式

主面板手数输入框支持三种模式,在设置窗 → 显示中切换:

模式 输入含义 行为
手数 固定手数 填多少下多少
余额风险% 余额的百分比 如 1%,按当前余额换算风险额度
风险金额 绝对金额 如 20 美元,直接作为单笔风险上限

后两种模式下,手数框的语义反转:不是用户填手数,而是面板算手数。

3. MQL5 实现:换算函数

这是本篇的核心(实现思路示意,基于 MQL5 公开 API):

mql5 复制代码
// 按风险金额反推手数;返回 0 表示低于最小手数,拒绝下单
double CalcLotByRisk(double riskMoney, int slPoints, string symbol)
{
   double tickValue = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE);
   double tickSize  = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
   double point     = SymbolInfoDouble(symbol, SYMBOL_POINT);
   double lotStep   = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
   double lotMin    = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
   double lotMax    = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);

   // 每 1 手、价格波动 1 点的亏损额(点值口径统一)
   double lossPerPointPerLot = tickValue * point / tickSize;

   // 止损打掉时,每 1 手的亏损额
   double lossPerLot = slPoints * lossPerPointPerLot;
   if(lossPerLot <= 0) return 0;

   double lot = riskMoney / lossPerLot;
   lot = MathFloor(lot / lotStep) * lotStep;    // 对齐步长,向下取整
   if(lot < lotMin) return 0;                    // 低于最小手数:拒绝
   return MathMin(lot, lotMax);
}

四个实现要点:

  1. 点值口径 :SYMBOL_TRADE_TICK_VALUE 是"每 tick、每手"的价值,与 point/tickSize 相乘才换算成"每点、每手"------直接用 tickValue 当点值是这类代码最常见的 bug;
  2. 向下取整对齐步长 :MathFloor 而不是四舍五入,保证实际风险不超设定额度;
  3. 最小手数兜底返回 0 :换算结果低于 lotMin 时拒绝下单,而不是抬到最小手数------后者会偷偷放大风险;
  4. 风险% 模式只是额度来源不同:
mql5 复制代码
double riskMoney = AccountInfoDouble(ACCOUNT_BALANCE) * riskPercent / 100.0;

4. 换算结果的动态特性

交给面板两个输入------SL 点数与风险值------之后:

  • 止损距离设远 → 手数自动变小;
  • 止损距离设近 → 手数自动变大;
  • 无论伸缩,打掉止损时的亏损被约束在设定额度附近。

5. 两道内置保护的设计逻辑

保护一:风险模式强制止损。 风险% 与风险金额模式要求面板 SL 已填写------没有止损距离,风险无从计算(slPoints <= 0 直接返回 0)。这是逻辑必然,不是功能限制。

保护二:最小手数兜底。 即第 3 节代码中的 if(lot < lotMin) return 0------面板弹 Alert 提示,用户可缩小止损距离或提高风险额度后重试。宁可拒绝下单,不放大风险。

下单确认窗提供可视化核对:风险模式下手数标签显示为"手数(按风险%)"或"手数(按风险$)",区分"算出来的"与"手动填的"。

6. 边界说明

风险模式约束的是单笔风险额度,管理的是仓位大小这一个环节;它不改变行情的不确定性,与盈亏没有因果关系。

下一篇:持仓多了以后,批量平仓与订单管理的实现。

风险提示

  1. 杠杆交易(外汇、贵金属、差价合约等)具有高风险,可能导致损失全部本金,请充分了解相关风险后再参与交易;
  2. 本文介绍的是交易辅助工具的实现,仅提供操作与信息展示功能,不生成交易信号,不构成任何投资建议;所有交易决策由使用者自行做出;
  3. 手数换算结果与保本触发价等显示值均为测算参考值,实际成交与盈亏以经纪商服务器为准;
  4. 新工具请先在模拟账户(Demo)上充分测试,确认功能与预期一致后再考虑用于实盘;
  5. 过往表现不代表未来结果,任何参数设置都无法保证盈利。

版权声明:本文为原创内容,作者:超哥量化。

相关推荐
迈达量化1 天前
MT5 图上交易面板开发(二):图上快速下单的实现——事件流、坐标换价与挂单解析
ea·mt5·mql5·程序化交易·metatrader5
迈达量化2 天前
MT5 图上交易面板开发(一):整体架构与功能模块设计
ea·mt5·mql5·程序化交易·metatrader5
dingdingfish7 天前
系统架构概述
microsoft·系统架构·ea·architecture
郭泽斌之心3 个月前
让别人临时接管你的 AI 助手:分级授权的远程控制怎么设计
人工智能·深度学习·量化交易·ea·mt5·fay数字人·easydeal
郭泽斌之心3 个月前
不买 Trading Central,自己做一套交易信号引擎:MA/BB/Pivot/ATR + 集中采集架构
人工智能·深度学习·ea·mt5·fay数字人·easydeal
郭泽斌之心3 个月前
给 AI 交易助手做 LLM 网关:多通道负载均衡 + 静默失败自动切换
人工智能·经验分享·ea·mt5·fay数字人·easydeal
郭泽斌之心4 个月前
MQL5 EA 怎么和外部程序通信?文件三件套协议:参数热更新不重启、状态心跳、远程触发
人工智能·经验分享·深度学习·ea·fay数字人·easydeal
滚雪球~1 年前
okx欧易注册与量化设置
量化·程序化交易
博一波1 年前
【企业级架构】企业战略到技术落地的全流程【第一篇】
架构·ea