
Bonjour à tous, j’ai récemment reçu de nombreux retours d’amis concernant l’utilisation des flux de travail, et la question la plus fréquemment posée est…Pourcentage des droits et intérêtsetArrêt de l’arrêtConcernant les problèmes de configuration, beaucoup se demandent : « Je sais que je dois maîtriser les risques, mais comment calculer précisément la quantité de l’ordre en fonction des fonds disponibles sur mon compte ? De plus, comment paramétrer automatiquement les ordres stop-loss et take-profit après l’ouverture d’une position afin que le système gère les risques pour nous ? »
Aujourd’hui, nous allons aborder ces besoins pratiques et, en utilisant le code réel de la plateforme de quantification des inventeurs, expliquer en détail comment mettre en œuvre ces deux fonctions essentielles.

Pourcentage des droits et intérêtsCela signifie que le nombre d’ordres n’est pas fixe, mais calculé en fonction d’un pourcentage fixe du solde total du compte.
Par exemple:
Avantages fondamentaux:
// 1. 获取账户信息
const accountInfo = exchange.GetAccount();
if (!accountInfo) {
return [{
json: {
success: false,
error: "获取账户信息失败"
}
}];
}
const availBalance = accountInfo.Balance; // 可用余额
Log("账户可用余额:", availBalance);
Points clés:BalanceCe champ représente le solde disponible, qui sert de base au calcul.
// 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}`
}
}];
}
Description des paramètres principaux:
CtValValeur nominale du contrat (par exemple, la valeur nominale d’un contrat perpétuel ETH est de 0,01 ETH)MinQtyquantité minimale de commandeMaxQtyQuantité maximale de commandeAmountPrecisionPrécision quantitativePricePrecisionPrécision des prixAttention particulièreAssurez-vous de vérifier si la devise que vous souhaitez échanger est disponible sur la plateforme.
// 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);
Résumé des formules de calcul:
合约张数 = (账户余额 × 风险比例 ÷ 当前价格) ÷ 合约面值
// 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);
Erreurs courantes commises par les débutants:
Si les paramètres ci-dessus sont incorrects, une notification d’échec de commande s’affichera. Les débutants doivent y prêter une attention particulière.

Beaucoup de personnes sont confuses quant à la signification des ordres de prise de bénéfices et des ordres stop-loss. Clarifions cela :
| Type de participations | Opération de prise de bénéfices | Opération stop loss |
|---|---|---|
| Commandes multiples | Vendre pour clôturer les positions lorsque les prix augmentent | Vendre pour clôturer les positions lorsque les prix baissent. |
| Position courte | Achetez pour clôturer vos positions lorsque les prix baissent. | Achetez pour clôturer la position lorsque les prix augmentent. |
Points clésLes prises de bénéfices et les ordres stop-loss sont tous deuxOpération de fermetureLa direction doit être opposée à celle de la position.
Sur la plateforme Inventor, utilisezCreateConditionOrderFonctions permettant de définir les niveaux de stop-loss et de take-profit :
Actuellement, la plateforme FMZ prend en charge les ordres conditionnels CreateConditionOrder en trading réel, mais les tests rétrospectifs ne les prennent pas encore en charge.
exchange.CreateConditionOrder(
symbol, // 交易对
closeDirection, // 平仓方向:closebuy 或 closesell
positionSize, // 平仓数量
{
"ConditionType": ORDER_CONDITION_TYPE_SL, // 止损类型
"SlTriggerPrice": stopLossPrice, // 触发价格
"SlOrderPrice": executionPrice // 执行价格
},
"止损单" // 订单备注
);
Description des paramètres:
Type d’opération(closeDirection):
closebuyclosesellConditionType:
ORDER_CONDITION_TYPE_SLStop LossORDER_CONDITION_TYPE_TPPrenez vos bénéficesPrix de déclenchementActivez l’ordre lorsque ce prix sera atteint.
Prix de l’ordre (Prix d’exécution)La transaction sera effectuée à ce prix après activation.
Avis:Actuellement, les ordres conditionnels ne sont pris en charge qu’en conditions de négociation réelles, et le dépositaire doit être mis à jour.
Dans le code, nous effectuons des calculs dynamiques en fonction de la direction d’ouverture :
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);
Après avoir défini les instructions conditionnelles, nous devons également les gérer et les surveiller :
// 查询条件单状态
const slOrder = exchange.GetConditionOrder(stopLossOrderId);
const tpOrder = exchange.GetConditionOrder(takeProfitOrderId);
Log("止损单状态:", slOrder.Status);
Log("止盈单状态:", tpOrder.Status);
Log("状态说明: 0=活跃, 1=已触发, -1=不存在");
logique de gestion d’état:
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("⏳ 止盈止损单都活跃,继续监控");
}
Fonctions clés:
GetConditionOrderCette fonction vous permet de consulter l’état actuel de toutes les commandes conditionnelles.CancelConditionOrderCette fonction ne nécessite que le numéro de commande en entrée.À noter:
Dans le flux de travail de démonstration, nous utilisons une machine à états pour gérer l’ensemble du cycle de transaction :
const savestatus = _G('status');
// 初始化状态
if (!savestatus) {
_G('status', 'unfinished');
}
Trois États:
En intégrant les ordres de pourcentage de capitalisation aux ordres stop-loss et take-profit, nous obtenons un flux de travail de trading complet :
organigramme:
计算下单数量 → 执行开仓 → 设置止盈止损 → 监控持仓 → 交易完成
Implémentation du code:
// 状态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'); // 重置状态,准备下次交易
}
Avantages de l’ensemble du processus:
Rapport de risque:
Ratio de prise de bénéfices et de stop-loss:
Liste complète des tests:
Processus de test:
souviens-toiCe n’est qu’après des tests approfondis qu’il convient de le mettre en pratique en conditions réelles de trading ; il s’agit d’un principe fondamental du trading quantitatif.
Voilà qui conclut notre discussion d’aujourd’hui sur le placement d’ordres en pourcentage de capital et la configuration des stops et take-profits. Ce processus combine la maîtrise des risques et l’exécution automatisée, ce qui standardise nos transactions. Cependant, chaque trader a son propre style et sa propre tolérance au risque ; n’oubliez donc pas d’adapter les paramètres à votre situation. Si vous rencontrez des difficultés lors de l’utilisation ou si vous avez des questions sur le trading quantitatif, n’hésitez pas à nous contacter pour obtenir des conseils et en discuter. Approfondissons ensemble nos connaissances.
Référence du code source : https://www.fmz.com/strategy/516459