本文是「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);
}
四个实现要点:
- 点值口径 :
SYMBOL_TRADE_TICK_VALUE是"每 tick、每手"的价值,与point/tickSize相乘才换算成"每点、每手"------直接用 tickValue 当点值是这类代码最常见的 bug; - 向下取整对齐步长 :
MathFloor而不是四舍五入,保证实际风险不超设定额度; - 最小手数兜底返回 0 :换算结果低于
lotMin时拒绝下单,而不是抬到最小手数------后者会偷偷放大风险; - 风险% 模式只是额度来源不同:
mql5
double riskMoney = AccountInfoDouble(ACCOUNT_BALANCE) * riskPercent / 100.0;
4. 换算结果的动态特性
交给面板两个输入------SL 点数与风险值------之后:
- 止损距离设远 → 手数自动变小;
- 止损距离设近 → 手数自动变大;
- 无论伸缩,打掉止损时的亏损被约束在设定额度附近。
5. 两道内置保护的设计逻辑
保护一:风险模式强制止损。 风险% 与风险金额模式要求面板 SL 已填写------没有止损距离,风险无从计算(slPoints <= 0 直接返回 0)。这是逻辑必然,不是功能限制。
保护二:最小手数兜底。 即第 3 节代码中的 if(lot < lotMin) return 0------面板弹 Alert 提示,用户可缩小止损距离或提高风险额度后重试。宁可拒绝下单,不放大风险。
下单确认窗提供可视化核对:风险模式下手数标签显示为"手数(按风险%)"或"手数(按风险$)",区分"算出来的"与"手动填的"。
6. 边界说明
风险模式约束的是单笔风险额度,管理的是仓位大小这一个环节;它不改变行情的不确定性,与盈亏没有因果关系。
下一篇:持仓多了以后,批量平仓与订单管理的实现。
风险提示
- 杠杆交易(外汇、贵金属、差价合约等)具有高风险,可能导致损失全部本金,请充分了解相关风险后再参与交易;
- 本文介绍的是交易辅助工具的实现,仅提供操作与信息展示功能,不生成交易信号,不构成任何投资建议;所有交易决策由使用者自行做出;
- 手数换算结果与保本触发价等显示值均为测算参考值,实际成交与盈亏以经纪商服务器为准;
- 新工具请先在模拟账户(Demo)上充分测试,确认功能与预期一致后再考虑用于实盘;
- 过往表现不代表未来结果,任何参数设置都无法保证盈利。
版权声明:本文为原创内容,作者:超哥量化。