2
focar em
319
Seguidores

Fluxo de trabalho na prática: gerencie facilmente ordens de porcentagem de ações e medidas automatizadas de take-profit e stop-loss.

Criado em: 2025-11-12 10:58:07, atualizado em: 2025-11-15 12:45:08
comments   0
hits   219

Fluxo de trabalho na prática: gerencie facilmente ordens de porcentagem de ações e medidas automatizadas de take-profit e stop-loss.

1. Introdução

Olá a todos, recentemente recebi muitos comentários de amigos sobre o uso do workflow, e a pergunta mais frequente é…Percentagem de direitoseParar de perderEm relação a questões de configuração, muitas pessoas perguntam: “Sei que preciso controlar o risco, mas como calculo exatamente a quantidade de ordens com base nos fundos da conta? Além disso, como configuro automaticamente ordens de stop-loss e take-profit após abrir uma posição para que o sistema possa gerenciar o risco para nós?”

Hoje, abordaremos essas necessidades práticas e, usando o código real da Plataforma de Quantificação de Inventores, explicaremos em detalhes como implementar essas duas funções principais.


II. Explicação detalhada da colocação de ordens com base na porcentagem de capital próprio

Fluxo de trabalho na prática: gerencie facilmente ordens de porcentagem de ações e medidas automatizadas de take-profit e stop-loss.

2.1 O que é colocação de ordens com percentual de participação acionária?

Percentagem de direitosIsso significa que o número de ordens não é fixo, mas calculado com base em uma porcentagem fixa do total de fundos na conta.

Por exemplo

  • A conta possui 10.000 USDT.
  • Defina a taxa de risco em 5% (riskRatio = 0,05).
  • O sistema utilizará uma cota de 500 USDT para abrir uma posição.

Principais vantagens

  1. Riscos controladosO risco é uma porcentagem fixa para cada transação, independentemente do saldo da conta.
  2. Alta taxa de utilização de capitalQuando os fundos da conta mudam, a quantidade do pedido é ajustada automaticamente — a quantidade do pedido aumenta quando os fundos aumentam e diminui proporcionalmente quando os fundos diminuem.
  3. Altamente adaptávelContas adequadas para diferentes tamanhos de capital.

2.2 Lógica de Cálculo Completa e Implementação do Código

Etapa 1: Obtenha as informações da conta

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

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

Pontos principaisBalanceO campo representa o saldo disponível, que serve de base para o cálculo.


Etapa Dois: Obtenção de Informações 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}` 
        } 
    }];
}

Descrição dos parâmetros principais

  • CtValValor nominal do contrato (por exemplo, o valor nominal de um contrato perpétuo de ETH é 0,01 ETH)
  • MinQtyQuantidade mínima de encomenda
  • MaxQtyQuantidade máxima de pedido
  • AmountPrecisionPrecisão quantitativa
  • PricePrecisionPrecisão de preços

Atenção especialVerifique se a moeda que deseja negociar está disponível na corretora.


Passo 3: Obtenha o preço atual

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

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

Etapa 4: Calcule o 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);

Resumo das fórmulas de cálculo

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

Passo 5: Verificar restrições

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

Erros comuns cometidos por iniciantes

  • ❌ A não verificação da quantidade mínima de pedido resultou em falha do pedido.
  • ❌ O manuseio inadequado da precisão leva à rejeição do pedido pela bolsa de valores.
  • ❌ Valor nominal do contrato não considerado, erro de cálculo.

Se as configurações acima estiverem incorretas, uma notificação de falha no pedido será exibida. Isso é algo a que os iniciantes precisam prestar atenção especial.


III. Explicação detalhada das configurações de realização de lucros e stop loss

Fluxo de trabalho na prática: gerencie facilmente ordens de porcentagem de ações e medidas automatizadas de take-profit e stop-loss.

3.1 A lógica central da realização de lucros e do stop-loss

Muitas pessoas têm dúvidas sobre a direção correta para realizar lucros e definir stop-loss. Vamos esclarecer:

Tipo de participações Operação de obtenção de lucro Operação de stop loss
Vários pedidos Venda para fechar posições quando os preços subirem. Venda para fechar posições quando os preços caírem.
Posição curta Compre para fechar posições quando os preços caírem. Compre para fechar a posição quando os preços subirem.

Pontos principaisTanto a realização de lucros quanto o stop-loss sãoOperação de fechamentoA direção deve ser oposta à direção da posição.


3.2 Explicação detalhada de parâmetros únicos condicionais

Na plataforma do inventor, useCreateConditionOrderFunções para definir os níveis de stop-loss e take-profit:

Atualmente, a plataforma FMZ suporta ordens condicionais CreateConditionOrder em negociações reais, mas o backtesting ainda não as suporta.

  • 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             // 执行价格
    },
    "止损单"          // 订单备注
);

Descrição do parâmetro

  • Tipo de operação(closeDirection):

    • Utilizado para fechar posições compradas.closebuy
    • Utilizado para fechar posições vendidas.closesell
  • ConditionType

    • ORDER_CONDITION_TYPE_SLStop Loss
    • ORDER_CONDITION_TYPE_TPRealizar Lucro
  • Preço de ativaçãoAtive a ordem quando esse preço for atingido.

  • Preço da Ordem (Preço de Execução)A transação será concluída a este preço após a ativação.

Perceber:Atualmente, as ordens condicionais são suportadas apenas em negociações ao vivo, e o custodiante precisa ser atualizado.


3.3 Cálculo dos preços de Stop-Loss e Take-Profit

No código, calculamos dinamicamente com base na direção de abertura:

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 Gestão e Monitoramento de Declarações Condicionais

Após configurar as instruções condicionais, também precisamos gerenciá-las e monitorá-las:

// 查询条件单状态
const slOrder = exchange.GetConditionOrder(stopLossOrderId);
const tpOrder = exchange.GetConditionOrder(takeProfitOrderId);

Log("止损单状态:", slOrder.Status);
Log("止盈单状态:", tpOrder.Status);
Log("状态说明: 0=活跃, 1=已触发, -1=不存在");

lógica de gerenciamento de estado

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("⏳ 止盈止损单都活跃,继续监控");
}

Funções-chave

  • A plataforma para inventores forneceGetConditionOrderEsta função permite visualizar o estado atual de todas as ordens condicionais.
  • Se uma ordem de take-profit ou stop-loss for acionada em uma das direções, a ordem condicional na direção oposta deverá ser cancelada imediatamente.
  • Pode ser usadoCancelConditionOrderA função requer apenas o número do pedido como entrada.

Atenção!

  • Recomenda-se verificar regularmente o status das ordens condicionais para garantir que estejam funcionando corretamente.
  • Por vezes, as flutuações do mercado são demasiado rápidas e as ordens condicionais podem não ser executadas a tempo, sendo necessário, nesse caso, o processamento manual.

IV. Integração do Fluxo de Trabalho Completo

4.1 Gerenciamento do status da transação

No fluxo de trabalho de demonstração, utilizamos uma máquina de estados para gerenciar todo o ciclo de transação:

const savestatus = _G('status');

// 初始化状态
if (!savestatus) {
    _G('status', 'unfinished');
}

Três estados

  1. unfinishedAinda não há vagas disponíveis; o processo de abertura de vagas precisa ser concluído.
  2. monitorAs posições foram abertas e as ordens de stop-loss e take-profit foram definidas; agora está em fase de monitoramento.
  3. finishedTransação concluída, preparando para redefinir o status.

4.2 Processo de Transação Completo

Ao integrar ordens de percentual de capital com ordens de stop-loss e take-profit, obtemos um fluxo de trabalho de negociação completo:

fluxograma

计算下单数量 → 执行开仓 → 设置止盈止损 → 监控持仓 → 交易完成

Implementação 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'); // 重置状态,准备下次交易
}

Vantagens de todo o processo

  • Isso controla o risco de transações individuais (através da porcentagem de participação acionária).
  • Além disso, ordens automatizadas de stop-loss e take-profit são utilizadas para proteger os lucros e limitar as perdas.
  • Todo o processo é executado de forma programática, reduzindo a intervenção humana e melhorando a consistência das transações.

V. Melhores Práticas para o Controle de Riscos

5.1 Recomendações para Configuração de Parâmetros

Relação de risco

  • Sugestão para iniciantes: 2-3%
  • Experiência: 5-10%
  • Não seja ganancioso e não defina um valor muito alto.Ajuste de acordo com sua própria tolerância ao risco.

Índice de realização de lucros e stop-loss

  • Stop loss: 1-3% (ajustar de acordo com a volatilidade da moeda)
  • Objetivo de lucro: 2-6% (geralmente 1,5 a 2 vezes o stop loss).
  • É necessário configurá-lo adequadamente de acordo com as características das diferentes moedas.

5.2 Testes e Verificação

Lista completa de testes

  • ✅ A quantidade calculada está correta?
  • ✅ Os preços de stop-loss e take-profit são razoáveis?
  • ✅ A ordem condicional foi acionada corretamente?
  • ✅ A troca de estados está correta?
  • ✅ O gerenciamento de situações anormais é adequado?

Processo de teste

  1. Primeiro, verifique toda a lógica no ambiente de teste.
  2. Realize testes de negociação ao vivo utilizando um pequeno montante de capital.
  3. Só invista fundos formais depois de se certificar de que não há problemas.

lembrarSomente após testes rigorosos é que deve ser implementado em negociações reais; este é um princípio fundamental da negociação quantitativa.


VI. Conclusão

Bem, isso conclui a discussão de hoje sobre a colocação de ordens de percentual de capital e as configurações de stop-loss/take-profit. Este fluxo de trabalho combina controle de risco com execução automatizada, tornando nossas negociações mais padronizadas. No entanto, o estilo de negociação e a tolerância ao risco de cada pessoa são diferentes, portanto, lembre-se de ajustar os parâmetros de acordo com suas próprias circunstâncias. Se você encontrar algum problema durante o uso ou tiver outras dúvidas sobre negociação quantitativa, entre em contato conosco para consultoria e discussão. Vamos explorar e melhorar juntos.

Referência do código-fonte: https://www.fmz.com/strategy/516459