
Hallo zusammen, ich habe in letzter Zeit viel Feedback von Freunden zur Workflow-Nutzung erhalten, und die am häufigsten gestellte Frage lautet…Prozentsatz der AnsprücheUndStopp-Stopp-VerlustViele fragen sich bezüglich der Einrichtung: „Ich weiß, dass ich das Risiko kontrollieren muss, aber wie genau berechne ich die Ordermenge basierend auf dem Kontoguthaben? Und wie kann ich nach dem Eröffnen einer Position automatisch Stop-Loss- und Take-Profit-Orders setzen, damit das System das Risiko für uns managen kann?“
Heute werden wir auf diese praktischen Anforderungen eingehen und anhand des tatsächlichen Codes der Inventors Quantification Platform detailliert erklären, wie diese beiden Kernfunktionen implementiert werden können.

Prozentsatz der AnsprücheDies bedeutet, dass die Anzahl der Aufträge nicht festgelegt ist, sondern auf Basis eines festen Prozentsatzes des Gesamtguthabens auf dem Konto berechnet wird.
Zum Beispiel:
Kernvorteile:
// 1. 获取账户信息
const accountInfo = exchange.GetAccount();
if (!accountInfo) {
return [{
json: {
success: false,
error: "获取账户信息失败"
}
}];
}
const availBalance = accountInfo.Balance; // 可用余额
Log("账户可用余额:", availBalance);
Wichtigste Punkte:BalanceDas Feld stellt das verfügbare Guthaben dar, das die Grundlage für die Berechnung bildet.
// 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}`
}
}];
}
Kernparameterbeschreibung:
CtValNominalwert des Kontrakts (z. B. beträgt der Nominalwert eines ETH-Perpetual-Kontrakts 0,01 ETH)MinQtyMindestbestellmengeMaxQtyMaximale BestellmengeAmountPrecisionMengengenauigkeitPricePrecisionPreisgenauigkeitBesondere AufmerksamkeitPrüfen Sie unbedingt, ob die Währung, die Sie handeln möchten, an der Börse verfügbar ist.
// 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);
Zusammenfassung der Berechnungsformeln:
合约张数 = (账户余额 × 风险比例 ÷ 当前价格) ÷ 合约面值
// 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);
Häufige Fehler von Anfängern:
Sind die oben genannten Einstellungen fehlerhaft, erscheint eine Benachrichtigung über einen fehlgeschlagenen Auftrag. Anfänger sollten dies besonders beachten.

Viele Anleger sind bezüglich der Richtung von Gewinnmitnahmen und Stop-Loss-Orders verunsichert. Lassen Sie uns das klären:
| Art der Beteiligungen | Gewinnmitnahme | Stop-Loss-Operation |
|---|---|---|
| Mehrere Bestellungen | Verkaufen Sie, um Positionen zu schließen, wenn die Kurse steigen. | Verkaufen Sie, um Positionen zu schließen, wenn die Kurse fallen. |
| Short-Position | Kaufen Sie, um Positionen zu schließen, wenn die Kurse fallen. | Kaufen Sie, um die Position zu schließen, wenn die Kurse steigen. |
Wichtigste PunkteSowohl Gewinnmitnahmen als auch Stop-Loss-Orders sindSchließvorgangDie Richtung sollte der Richtung der Position entgegengesetzt sein.
Auf der Erfinderplattform verwendenCreateConditionOrderFunktionen zum Festlegen von Stop-Loss- und Take-Profit-Niveaus:
Aktuell unterstützt die FMZ-Plattform bedingte Aufträge vom Typ CreateConditionOrder im Live-Handel, jedoch noch nicht im Backtesting.
exchange.CreateConditionOrder(
symbol, // 交易对
closeDirection, // 平仓方向:closebuy 或 closesell
positionSize, // 平仓数量
{
"ConditionType": ORDER_CONDITION_TYPE_SL, // 止损类型
"SlTriggerPrice": stopLossPrice, // 触发价格
"SlOrderPrice": executionPrice // 执行价格
},
"止损单" // 订单备注
);
Parameterbeschreibung:
Operationsart(closeDirection):
closebuyclosesellConditionType:
ORDER_CONDITION_TYPE_SLStop-LossORDER_CONDITION_TYPE_TPGewinnmitnahmeAuslöserpreisAktivieren Sie den Auftrag, sobald dieser Preis erreicht ist.
Orderpreis (Ausführungspreis)Die Transaktion wird nach der Aktivierung zu diesem Preis abgeschlossen.
Beachten:Derzeit werden bedingte Aufträge nur im Live-Handel unterstützt, und der Depotverwalter muss aktualisiert werden.
Im Code berechnen wir dynamisch basierend auf der Öffnungsrichtung:
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);
Nachdem die bedingten Anweisungen eingerichtet sind, müssen wir sie auch verwalten und überwachen:
// 查询条件单状态
const slOrder = exchange.GetConditionOrder(stopLossOrderId);
const tpOrder = exchange.GetConditionOrder(takeProfitOrderId);
Log("止损单状态:", slOrder.Status);
Log("止盈单状态:", tpOrder.Status);
Log("状态说明: 0=活跃, 1=已触发, -1=不存在");
Logik zur Zustandsverwaltung:
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("⏳ 止盈止损单都活跃,继续监控");
}
Wichtige Funktionen:
GetConditionOrderDiese Funktion ermöglicht es Ihnen, den aktuellen Status aller bedingten Aufträge einzusehen.CancelConditionOrderDie Funktion benötigt lediglich die Bestellnummer als Eingabe.Hinweise:
Im Demonstrationsablauf verwenden wir einen Zustandsautomaten, um den gesamten Transaktionszyklus zu verwalten:
const savestatus = _G('status');
// 初始化状态
if (!savestatus) {
_G('status', 'unfinished');
}
Drei Staaten:
Durch die Integration von Equity-Prozent-Orders mit Stop-Loss- und Take-Profit-Orders verfügen wir über einen vollständigen Handelsworkflow:
Flussdiagramm:
计算下单数量 → 执行开仓 → 设置止盈止损 → 监控持仓 → 交易完成
Code-Implementierung:
// 状态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'); // 重置状态,准备下次交易
}
Vorteile des gesamten Prozesses:
Risikoverhältnis:
Gewinnmitnahme- und Stop-Loss-Verhältnis:
Checkliste für den vollständigen Test:
Testprozess:
erinnernErst nach gründlichen Tests sollte es im Live-Handel eingesetzt werden; dies ist ein Grundprinzip des quantitativen Handels.
Okay, damit ist unsere heutige Diskussion über die Platzierung von Equity-Prozent-Orders und die Einstellungen für Stop-Loss und Take-Profit abgeschlossen. Dieser Workflow kombiniert Risikokontrolle mit automatisierter Ausführung und standardisiert so unser Trading. Da jedoch jeder Trader einen anderen Stil und eine andere Risikotoleranz hat, denken Sie bitte daran, die Parameter an Ihre individuellen Gegebenheiten anzupassen. Sollten Sie während der Anwendung auf Probleme stoßen oder weitere Fragen zum quantitativen Trading haben, kontaktieren Sie uns gerne für eine Beratung. Lassen Sie uns gemeinsam Neues entdecken und uns verbessern.
Quellcode-Referenz: https://www.fmz.com/strategy/516459