2
Seguir
319
Seguidores

Flujo de trabajo en la práctica: Gestione fácilmente las órdenes de porcentaje de capital y las medidas automatizadas de toma de ganancias y límite de pérdidas.

Creado el: 2025-11-12 10:58:07, Actualizado el: 2025-11-15 12:45:08
comments   0
hits   219

Flujo de trabajo en la práctica: Gestione fácilmente las órdenes de porcentaje de capital y las medidas automatizadas de toma de ganancias y límite de pérdidas.

1. Introducción

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.


II. Explicación detallada de la colocación de órdenes en función del porcentaje de capital.

Flujo de trabajo en la práctica: Gestione fácilmente las órdenes de porcentaje de capital y las medidas automatizadas de toma de ganancias y límite de pérdidas.

2.1 ¿Qué es la colocación de órdenes con porcentaje de capital?

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

  • La cuenta tiene 10.000 USDT
  • Establezca la relación de riesgo en 5% (riesgoRatio = 0,05).
  • El sistema utilizará una cuota de 500 USDT para abrir una posición.

ventajas principales

  1. El riesgo está bajo controlEl riesgo es un porcentaje fijo para cada transacción, independientemente del saldo de la cuenta.
  2. Alta tasa de utilización de capitalCuando cambian los fondos de la cuenta, la cantidad del pedido se ajusta automáticamente: la cantidad del pedido aumenta cuando aumentan los fondos y disminuye en consecuencia cuando disminuyen.
  3. Altamente adaptableCuentas adecuadas para diferentes tamaños de capital

2.2 Lógica de cálculo completa e implementación del código

Paso 1: Obtener información de la cuenta

// 1. 获取账户信息
const accountInfo = exchange.GetAccount();
if (!accountInfo) {
    return [{ 
        json: { 
            success: false, 
            error: "获取账户信息失败" 
        } 
    }];
}

const availBalance = accountInfo.Balance; // 可用余额
Log("账户可用余额:", availBalance);

Puntos claveBalanceEste campo representa el saldo disponible, que es la base del cálculo.


Segundo paso: Obtención de información de mercado

// 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 pedido
  • MaxQtyCantidad máxima de pedido
  • AmountPrecisionPrecisión de cantidad
  • PricePrecisionPrecisión de precios

Atención especialAsegúrese de comprobar si la divisa con la que desea operar está disponible en la plataforma de intercambio.


Paso 3: Obtener el precio actual

// 3. 获取当前价格
const ticker = exchange.GetTicker(symbol);
if (!ticker) {
    return [{ 
        json: { 
            success: false, 
            error: "获取价格信息失败" 
        } 
    }];
}

const currentPrice = ticker.Last; // 最新成交价
Log("当前价格:", currentPrice);

Paso 4: Calcular el número de contratos

// 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

合约张数 = (账户余额 × 风险比例 ÷ 当前价格) ÷ 合约面值

Paso 5: Comprobar restricciones

// 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

  • ❌ No verificar la cantidad mínima de pedido resultó en un fallo del pedido.
  • ❌ Un manejo inadecuado de la precisión conlleva el rechazo de la orden por parte de la bolsa.
  • ❌ No se ha tenido en cuenta el valor nominal del contrato; error de cálculo.

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.


III. Explicación detallada de la toma de ganancias y la configuración de stop loss

Flujo de trabajo en la práctica: Gestione fácilmente las órdenes de porcentaje de capital y las medidas automatizadas de toma de ganancias y límite de pérdidas.

3.1 La lógica fundamental de la toma de ganancias y el límite de pérdidas

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.


3.2 Explicación detallada de los parámetros individuales condicionales

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.

  • CreateConditionOrder(symbol, side, amount, condition)
  • GetConditionOrder(id)
  • GetConditionOrders(symbol)
  • CancelConditionOrder(id)
  • GetHistoryConditionOrders(symbol, since, limit)
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):

    • Se utiliza para cerrar posiciones largas.closebuy
    • Se utiliza para cerrar posiciones cortas.closesell
  • ConditionType

    • ORDER_CONDITION_TYPE_SLStop Loss
    • ORDER_CONDITION_TYPE_TPToma de ganancias
  • Precio 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.


3.3 Cálculo de los precios de Stop-Loss y Take-Profit

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);

3.4 Gestión y seguimiento de las declaraciones condicionales

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

  • La plataforma Inventor proporcionaGetConditionOrderEsta función le permite ver el estado actual de todos los pedidos condicionales.
  • Si se activa una orden de toma de ganancias o de límite de pérdidas en un lado, la orden condicional en la dirección opuesta debe cancelarse de inmediato.
  • Se puede utilizarCancelConditionOrderLa función solo requiere el número de pedido como entrada.

Cuidado

  • Se recomienda comprobar periódicamente el estado de las órdenes condicionales para asegurarse de que funcionan correctamente.
  • En ocasiones, las fluctuaciones del mercado son demasiado rápidas y las órdenes condicionales pueden no ejecutarse a tiempo, en cuyo caso es necesario el procesamiento manual.

IV. Integración del flujo de trabajo completo

4.1 Gestión del estado de las transacciones

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

  1. unfinishedAún no hay ninguna vacante; el proceso de apertura de vacantes debe completarse.
  2. monitorSe han abierto posiciones y se han establecido órdenes de stop-loss y take-profit; ahora en fase de seguimiento.
  3. finishedTransacción completada, preparando el restablecimiento del estado.

4.2 Proceso de transacción completo

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

  • Esto controla el riesgo de las transacciones individuales (a través del porcentaje de capital).
  • Además, se utilizan órdenes automatizadas de stop-loss y take-profit para proteger las ganancias y limitar las pérdidas.
  • Todo el proceso se ejecuta de forma programática, lo que reduce la intervención humana y mejora la consistencia de las transacciones.

V. Mejores prácticas para el control de riesgos

5.1 Recomendaciones para la configuración de parámetros

razón de riesgo

  • Sugerencia para principiantes: 2-3%
  • Experiencia: 5-10%
  • No seas codicioso y no lo pongas demasiado alto.Ajusta la configuración según tu tolerancia al riesgo.

ratio de toma de ganancias y stop-loss

  • Stop loss: 1-3% (ajustar según la volatilidad de la divisa)
  • Toma de ganancias: 2-6% (generalmente 1,5-2 veces el stop loss).
  • Es necesario configurarlo adecuadamente según las características de las diferentes monedas.

5.2 Pruebas y verificación

Lista de verificación de prueba completa

  • ✅ ¿La cantidad calculada es correcta?
  • ✅ ¿Son razonables los precios de stop-loss y take-profit?
  • ✅ ¿Se ha activado correctamente la orden condicional?
  • ✅ ¿El cambio de estado es correcto?
  • ✅ ¿Es adecuada la gestión de situaciones anormales?

Proceso de prueba

  1. Primero, verifique toda la lógica en el entorno de prueba.
  2. Realice pruebas de trading en vivo utilizando una pequeña cantidad de capital.
  3. Solo invierta fondos formales después de asegurarse de que no haya problemas.

recordarSolo después de realizar pruebas exhaustivas se debe implementar en operaciones reales; este es un principio fundamental del trading cuantitativo.


VI. Conclusión

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