大家好,最近收到很多朋友关于工作流使用的反馈,其中问得最多的就是权益百分比下单和止盈止损的设置问题。很多朋友说:"我知道要控制风险,但具体怎么根据账户资金来计算下单数量呢?还有就是开仓后怎么自动设置止盈止损,让系统帮我们管理风险?"
今天我们就针对这些实际需求,结合发明者量化平台的实际代码,来详细讲解如何实现这两个核心功能。

权益百分比下单是指不固定下单张数,而是根据账户总资金的固定比例来计算下单数量。
举例说明:
核心优势:
第一步:获取账户信息
// 1. 获取账户信息
const accountInfo = exchange.GetAccount();
if (!accountInfo) {
return [{
json: {
success: false,
error: "获取账户信息失败"
}
}];
}
const availBalance = accountInfo.Balance; // 可用余额
Log("账户可用余额:", availBalance);
关键点:Balance 字段代表可用余额,这是计算的基础。
第二步:获取市场信息
// 2. 获取市场信息
const symbol = $vars.coin + '_USDT.swap' || 'ETH_USDT.swap';
const allMarkets = exchange.GetMarkets();
const marketsInfo = allMarkets[symbol];
if (!marketsInfo) {
return [{
json: {
success: false,
error: `未找到交易对信息: ${symbol}`
}
}];
}
核心参数说明:
CtVal:合约面值(例如 ETH 永续合约面值为 0.01 ETH)MinQty:最小下单量MaxQty:最大下单量AmountPrecision:数量精度PricePrecision:价格精度特别注意:务必检查要交易的币种是否存在于交易所。
第三步:获取当前价格
// 3. 获取当前价格
const ticker = exchange.GetTicker(symbol);
if (!ticker) {
return [{
json: {
success: false,
error: "获取价格信息失败"
}
}];
}
const currentPrice = ticker.Last; // 最新成交价
Log("当前价格:", currentPrice);
第四步:计算合约张数
// 4. 计算合约张数
const riskRatio = $vars.riskRatio || 0.05; // 默认 5% 风险比例
// 步骤 1:计算风险金额
const riskAmount = availBalance * riskRatio;
// 步骤 2:计算币种数量
let coinQuantity = riskAmount / currentPrice;
// 步骤 3:转换为合约张数(因为期货交易用的是合约张数)
let contractQuantity = coinQuantity / marketsInfo.CtVal;
// 步骤 4:精度处理(确保下单数量符合交易所要求)
contractQuantity = _N(contractQuantity, marketsInfo.AmountPrecision);
Log("计算步骤:");
Log("- 风险金额:", riskAmount);
Log("- 币种数量:", coinQuantity);
Log("- 合约面值:", marketsInfo.CtVal);
Log("- 原始合约张数:", coinQuantity / marketsInfo.CtVal);
Log("- 精度处理后:", contractQuantity);
计算公式总结:
合约张数 = (账户余额 × 风险比例 ÷ 当前价格) ÷ 合约面值
第五步:检查限制
// 5. 检查限制
if (contractQuantity < marketsInfo.MinQty) {
return [{
json: {
success: false,
error: `计算数量${contractQuantity}小于最小要求${marketsInfo.MinQty}`,
calculatedQuantity: contractQuantity,
minQty: marketsInfo.MinQty
}
}];
}
if (contractQuantity > marketsInfo.MaxQty) {
Log("数量超过最大限制,使用最大值:", marketsInfo.MaxQty);
contractQuantity = marketsInfo.MaxQty;
}
Log("最终下单数量:", contractQuantity);
新手常见错误:
当上述设置有误时,就会出现下单失败的提醒,这是新手需要特别注意的地方。

很多朋友对止盈止损的方向容易混淆,我们来理清楚:

关键点:止盈止损都是平仓操作,方向要跟持仓方向相反。
在发明者平台上,使用 CreateConditionOrder 函数来设置止盈止损:
目前FMZ平台实盘已支持CreateConditionOrder条件单,回测暂时没有支持。
exchange.CreateConditionOrder(
symbol, // 交易对
closeDirection, // 平仓方向:closebuy 或 closesell
positionSize, // 平仓数量
{
"ConditionType": ORDER_CONDITION_TYPE_SL, // 止损类型
"SlTriggerPrice": stopLossPrice, // 触发价格
"SlOrderPrice": executionPrice // 执行价格
},
"止损单" // 订单备注
);
参数说明:
多单平仓用 closebuy
空单平仓用 closesell
ORDER_CONDITION_TYPE_SL:止损(Stop Loss)
ORDER_CONDITION_TYPE_TP:止盈(Take Profit)
TriggerPrice(触发价格):达到这个价格时激活订单
OrderPrice(执行价格):激活后以此价格成交
注意: 目前仅实盘支持条件单,并且需要更新托管者。
在代码中,我们根据开仓方向动态计算:
const stopLossPercent = 0.02; // 2% 止损
const takeProfitPercent = 0.04; // 4% 止盈
if (openSide == 'openShort') {
// 空仓:止损价格上涨,止盈价格下跌
stopLossPrice = _N(entryPrice * (1 + stopLossPercent), pricePrecision);
takeProfitPrice = _N(entryPrice * (1 - takeProfitPercent), pricePrecision);
} else {
// 多仓:止损价格下跌,止盈价格上涨
stopLossPrice = _N(entryPrice * (1 - stopLossPercent), pricePrecision);
takeProfitPrice = _N(entryPrice * (1 + takeProfitPercent), pricePrecision);
}
Log("入场价格:", entryPrice);
Log("止损价格:", stopLossPrice);
Log("止盈价格:", takeProfitPrice);
设置好条件单后,我们还需要管理和监控它们:
// 查询条件单状态
const slOrder = exchange.GetConditionOrder(stopLossOrderId);
const tpOrder = exchange.GetConditionOrder(takeProfitOrderId);
Log("止损单状态:", slOrder.Status);
Log("止盈单状态:", tpOrder.Status);
Log("状态说明: 0=活跃, 1=已触发, -1=不存在");
状态处理逻辑:
if (slStatus == 1 && tpStatus == 0) {
// 止损被触发,取消止盈单
Log("止损单已触发,取消止盈单");
exchange.CancelConditionOrder(takeProfitOrderId);
_G('status', 'finished');
} else if (tpStatus == 1 && slStatus == 0) {
// 止盈被触发,取消止损单
Log("止盈单已触发,取消止损单");
exchange.CancelConditionOrder(stopLossOrderId);
_G('status', 'finished');
} else if (slStatus == 0 && tpStatus == 0) {
// 两个单都还活跃,继续监控
Log("止盈止损单都活跃,继续监控");
}
关键功能:
GetConditionOrder 函数,可以查看当前所有的条件单状态CancelConditionOrder 函数,传入订单编号即可注意事项:
在示范的工作流中,我们使用状态机来管理完整的交易周期:
const savestatus = _G('status');
// 初始化状态
if (!savestatus) {
_G('status', 'unfinished');
}
三种状态:
把权益百分比下单和止盈止损整合起来,我们就有了一个完整的交易工作流:
流程图:
计算下单数量 → 执行开仓 → 设置止盈止损 → 监控持仓 → 交易完成
代码实现:
// 状态1: 执行开仓
if (positionData.status == 'unfinished') {
// 1. 开仓下单
const openOrder = exchange.CreateOrder(symbol, dir, -1, positionSize);
// 2. 等待订单成交
Sleep(3000);
const openOrderInfo = exchange.GetOrder(openOrder);
// 3. 订单成交后设置止盈止损
if (openOrderInfo.Status == ORDER_STATE_CLOSED) {
const stopLossOrderId = exchange.CreateConditionOrder(...);
const takeProfitOrderId = exchange.CreateConditionOrder(...);
// 4. 保存订单ID并切换到监控状态
_G('stopLossOrderId', stopLossOrderId);
_G('takeProfitOrderId', takeProfitOrderId);
_G('status', 'monitor');
}
}
// 状态2: 监控止盈止损
if (positionData.status == 'monitor') {
// 检查条件单状态,处理触发情况
// ...
}
// 状态3: 交易完成
if (positionData.status == 'finished') {
_G('status', 'unfinished'); // 重置状态,准备下次交易
}
整个过程的优势:
风险比例:
止盈止损比例:
完整测试清单:
测试流程:
记住:测试充分后再上实盘,这是量化交易的基本原则。
好了,今天关于权益百分比下单和止盈止损的设置就讲到这里。这套工作流把风险控制和自动化执行结合起来,让我们的交易更加规范化。不过每个人的交易风格和风险承受能力都不一样,大家在使用时记得根据自己的实际情况来调整参数。如果在使用过程中遇到任何问题,或者有其他关于量化交易的疑问,都欢迎大家过来咨询交流。我们一起探讨,一起进步。