
Hola a todos, últimamente he recibido muchos comentarios de amigos sobre el uso del flujo de trabajo, y la pregunta más frecuente es…Porcentaje de derechos y interesesyCancelación de pérdidasEn cuanto a la configuración, muchos preguntan: “Sé que debo controlar el riesgo, pero ¿cómo calculo exactamente la cantidad de la orden en función de los fondos de la cuenta? Además, ¿cómo configuro automáticamente las órdenes de stop-loss y take-profit después de abrir una posición para que el sistema gestione el riesgo por nosotros?”
Hoy abordaremos estas necesidades prácticas y, utilizando el código real de la Plataforma de Cuantificación de Inventores, explicaremos en detalle cómo implementar estas dos funciones básicas.

Porcentaje de derechos y interesesEsto significa que el número de órdenes no es fijo, sino que se calcula en función de un porcentaje fijo del total de fondos en la cuenta.
Por ejemplo:
ventajas principales:
// 1. 获取账户信息
const accountInfo = exchange.GetAccount();
if (!accountInfo) {
return [{
json: {
success: false,
error: "获取账户信息失败"
}
}];
}
const availBalance = accountInfo.Balance; // 可用余额
Log("账户可用余额:", availBalance);
Puntos clave:BalanceEste campo representa el saldo disponible, que es la base del cálculo.
// 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}`
}
}];
}
Descripción de los parámetros principales:
CtValValor nominal del contrato (por ejemplo, el valor nominal de un contrato perpetuo de ETH es 0,01 ETH)MinQtyCantidad mínima de pedidoMaxQtyCantidad máxima de pedidoAmountPrecisionPrecisión de cantidadPricePrecisionPrecisión de preciosAtención especialAsegúrese de comprobar si la divisa con la que desea operar está disponible en la plataforma de intercambio.
// 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);
Resumen de las fórmulas de cálculo:
合约张数 = (账户余额 × 风险比例 ÷ 当前价格) ÷ 合约面值
// 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);
Errores comunes que cometen los principiantes:
Si la configuración anterior es incorrecta, aparecerá una notificación de error en el pedido. Los principiantes deben prestar especial atención a esto.

Muchas personas se confunden sobre la dirección de la toma de ganancias y el stop-loss. Aclarémoslo:
| Tipos de participaciones | Operación de obtención de beneficios | Operación de stop loss |
|---|---|---|
| Pedidos múltiples | Vender para cerrar posiciones cuando suban los precios | Vender para cerrar posiciones cuando los precios bajen. |
| Posición corta | Compra para cerrar posiciones cuando los precios bajen. | Compre para cerrar la posición cuando suban los precios. |
Puntos claveTanto la toma de ganancias como el límite de pérdidas sonOperación de cierreLa dirección debe ser opuesta a la dirección de la posición.
En la plataforma Inventor, utiliceCreateConditionOrderFunciones para establecer los niveles de stop-loss y take-profit:
Actualmente, la plataforma FMZ admite órdenes condicionales CreateConditionOrder en operaciones en vivo, pero las pruebas retrospectivas aún no las admiten.
exchange.CreateConditionOrder(
symbol, // 交易对
closeDirection, // 平仓方向:closebuy 或 closesell
positionSize, // 平仓数量
{
"ConditionType": ORDER_CONDITION_TYPE_SL, // 止损类型
"SlTriggerPrice": stopLossPrice, // 触发价格
"SlOrderPrice": executionPrice // 执行价格
},
"止损单" // 订单备注
);
Descripción del parámetro:
Tipo de operación(closeDirection):
closebuyclosesellConditionType:
ORDER_CONDITION_TYPE_SLStop LossORDER_CONDITION_TYPE_TPToma de gananciasPrecio de activaciónActiva la orden cuando se alcance este precio.
Precio de la orden (Precio de ejecución)La transacción se completará a este precio después de la activación.
Aviso:Actualmente, las órdenes condicionales solo se admiten en operaciones en tiempo real y es necesario actualizar el sistema del custodio.
En el código, calculamos dinámicamente en función de la dirección de apertura:
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);
Tras configurar las hojas condicionales, también debemos gestionarlas y supervisarlas:
// 查询条件单状态
const slOrder = exchange.GetConditionOrder(stopLossOrderId);
const tpOrder = exchange.GetConditionOrder(takeProfitOrderId);
Log("止损单状态:", slOrder.Status);
Log("止盈单状态:", tpOrder.Status);
Log("状态说明: 0=活跃, 1=已触发, -1=不存在");
lógica de manejo de estados:
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("⏳ 止盈止损单都活跃,继续监控");
}
Funciones clave:
GetConditionOrderEsta función le permite ver el estado actual de todos los pedidos condicionales.CancelConditionOrderLa función solo requiere el número de pedido como entrada.Cuidado:
En el flujo de trabajo de demostración, utilizamos una máquina de estados para gestionar todo el ciclo de transacción:
const savestatus = _G('status');
// 初始化状态
if (!savestatus) {
_G('status', 'unfinished');
}
Tres estados:
Al integrar las órdenes de porcentaje de capital con las órdenes de stop-loss y take-profit, disponemos de un flujo de trabajo de negociación completo:
diagrama de flujo:
计算下单数量 → 执行开仓 → 设置止盈止损 → 监控持仓 → 交易完成
Implementación de código:
// 状态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'); // 重置状态,准备下次交易
}
Ventajas de todo el proceso:
razón de riesgo:
ratio de toma de ganancias y stop-loss:
Lista de verificación de prueba completa:
Proceso de prueba:
recordarSolo después de realizar pruebas exhaustivas se debe implementar en operaciones reales; este es un principio fundamental del trading cuantitativo.
Bien, con esto concluimos la sesión de hoy sobre la colocación de órdenes de porcentaje de capital y la configuración de stop-loss/take-profit. Este flujo de trabajo combina el control del riesgo con la ejecución automatizada, lo que estandariza nuestras operaciones. Sin embargo, el estilo de trading y la tolerancia al riesgo varían de una persona, así que recuerde ajustar los parámetros según sus circunstancias. Si encuentra algún problema durante el uso o tiene alguna otra pregunta sobre trading cuantitativo, no dude en contactarnos para una consulta. Exploremos y mejoremos juntos.
Referencia del código fuente: https://www.fmz.com/strategy/516459