
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.

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:
Principais vantagens:
// 1. 获取账户信息
const accountInfo = exchange.GetAccount();
if (!accountInfo) {
return [{
json: {
success: false,
error: "获取账户信息失败"
}
}];
}
const availBalance = accountInfo.Balance; // 可用余额
Log("账户可用余额:", availBalance);
Pontos principais:BalanceO campo representa o saldo disponível, que serve de base para o 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}`
}
}];
}
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 encomendaMaxQtyQuantidade máxima de pedidoAmountPrecisionPrecisão quantitativaPricePrecisionPrecisão de preçosAtenção especialVerifique se a moeda que deseja negociar está disponível na corretora.
// 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);
Resumo das 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);
Erros comuns cometidos por iniciantes:
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.

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.
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.
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):
closebuyclosesellConditionType:
ORDER_CONDITION_TYPE_SLStop LossORDER_CONDITION_TYPE_TPRealizar LucroPreç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.
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);
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:
GetConditionOrderEsta função permite visualizar o estado atual de todas as ordens condicionais.CancelConditionOrderA função requer apenas o número do pedido como entrada.Atençã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:
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:
Relação de risco:
Índice de realização de lucros e stop-loss:
Lista completa de testes:
Processo de teste:
lembrarSomente após testes rigorosos é que deve ser implementado em negociações reais; este é um princípio fundamental da negociação quantitativa.
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