
안녕하세요 여러분, 최근 친구들로부터 워크플로우 사용에 대한 피드백을 많이 받았는데, 가장 자주 묻는 질문은 다음과 같습니다…지분 비율그리고정지 손실설정 문제와 관련하여 많은 분들이 이렇게 질문합니다. “위험을 관리해야 한다는 건 알지만, 계좌 잔액을 기준으로 주문 수량을 정확히 어떻게 계산하나요? 또한, 포지션을 개설한 후 시스템이 위험을 관리할 수 있도록 손절매 주문과 이익실현 주문을 자동으로 설정하려면 어떻게 해야 하나요?”
오늘은 이러한 실질적인 요구 사항을 해결하고 Inventors Quantification Platform의 실제 코드를 사용하여 이 두 가지 핵심 기능을 구현하는 방법을 자세히 설명하겠습니다.

지분 비율즉, 주문 수는 고정되어 있지 않고 계좌 총 자금의 고정된 비율을 기준으로 계산됩니다.
예를 들어:
핵심 장점:
// 1. 获取账户信息
const accountInfo = exchange.GetAccount();
if (!accountInfo) {
return [{
json: {
success: false,
error: "获取账户信息失败"
}
}];
}
const availBalance = accountInfo.Balance; // 可用余额
Log("账户可用余额:", availBalance);
핵심 포인트:Balance이 필드는 계산의 기준이 되는 사용 가능한 잔액을 나타냅니다.
// 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}`
}
}];
}
핵심 매개변수 설명:
CtVal계약 액면가(예: ETH 영구 계약의 액면가는 0.01 ETH)MinQty최소 주문 수량MaxQty최대 주문 수량AmountPrecision수량 정밀도PricePrecision가격 정확도특별한 주의거래하고자 하는 통화가 거래소에서 사용 가능한지 확인하세요.
// 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);
계산식 요약:
合约张数 = (账户余额 × 风险比例 ÷ 当前价格) ÷ 合约面值
// 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);
초보자가 흔히 저지르는 실수:
위 설정이 올바르지 않을 경우 주문 실패 알림이 표시됩니다. 초보자는 이 부분에 특히 주의해야 합니다.

많은 사람들이 이익실현과 손절매의 방향에 대해 혼란스러워합니다. 명확히 설명해 드리겠습니다.
| 보유 유형 | 이익 실현 활동 | 손절매 작업 |
|---|---|---|
| 다중 주문 | 가격이 상승하면 포지션을 정리하기 위해 매도하세요 | 가격이 하락하면 매도하여 포지션을 청산하세요. |
| 단기 포지션 | 가격이 하락하면 포지션을 청산하기 위해 매수하세요 | 가격이 상승하면 포지션을 종료하려면 매수하세요 |
핵심 포인트이익 실현과 손절매는 모두마감 작업방향은 위치 방향과 반대여야 합니다.
Inventor 플랫폼에서 사용하세요CreateConditionOrder손절매 및 이익실현 수준을 설정하는 기능:
현재 FMZ 플랫폼은 실시간 거래에서 CreateConditionOrder 조건부 주문을 지원하지만 백테스팅에서는 아직 지원하지 않습니다.
exchange.CreateConditionOrder(
symbol, // 交易对
closeDirection, // 平仓方向:closebuy 或 closesell
positionSize, // 平仓数量
{
"ConditionType": ORDER_CONDITION_TYPE_SL, // 止损类型
"SlTriggerPrice": stopLossPrice, // 触发价格
"SlOrderPrice": executionPrice // 执行价格
},
"止损单" // 订单备注
);
매개변수 설명:
작업 유형(closeDirection):
closebuyclosesellConditionType:
ORDER_CONDITION_TYPE_SL손절매ORDER_CONDITION_TYPE_TP이익 실현트리거 가격이 가격에 도달하면 주문을 활성화합니다.
주문 가격(실행 가격)활성화 후 이 가격으로 거래가 완료됩니다.
알아채다:현재 조건부 주문은 실시간 거래에서만 지원되며, 보관인을 업데이트해야 합니다.
코드에서는 열리는 방향에 따라 동적으로 계산합니다.
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);
조건문을 설정한 후에는 이를 관리하고 모니터링해야 합니다.
// 查询条件单状态
const slOrder = exchange.GetConditionOrder(stopLossOrderId);
const tpOrder = exchange.GetConditionOrder(takeProfitOrderId);
Log("止损单状态:", slOrder.Status);
Log("止盈单状态:", tpOrder.Status);
Log("状态说明: 0=活跃, 1=已触发, -1=不存在");
상태 처리 논리:
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("⏳ 止盈止损单都活跃,继续监控");
}
핵심 기능:
GetConditionOrder이 기능을 사용하면 모든 조건부 주문의 현재 상태를 볼 수 있습니다.CancelConditionOrder이 함수는 주문 번호만 입력하면 됩니다.주의사항:
데모 워크플로에서는 상태 머신을 사용하여 전체 거래 주기를 관리합니다.
const savestatus = _G('status');
// 初始化状态
if (!savestatus) {
_G('status', 'unfinished');
}
세 개의 주:
주식 비율 주문을 손절매 주문과 이익실현 주문과 통합함으로써 우리는 완전한 거래 워크플로를 갖추게 되었습니다.
흐름도:
计算下单数量 → 执行开仓 → 设置止盈止损 → 监控持仓 → 交易完成
코드 구현:
// 状态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'); // 重置状态,准备下次交易
}
전체 프로세스의 장점:
위험 비율:
이익 실현 비율과 손절매 비율:
전체 테스트 체크리스트:
테스트 과정:
기억하다: 철저한 테스트를 거친 후에만 실제 거래에 적용해야 합니다. 이는 양적 거래의 기본 원칙입니다.
자, 오늘의 주식 비율 주문 및 손절매/수익실현 설정에 대한 논의는 여기까지입니다. 이 워크플로는 위험 관리와 자동 실행을 결합하여 거래를 더욱 표준화합니다. 하지만 모든 사람의 거래 스타일과 위험 감수 성향은 다르므로, 각자의 상황에 맞게 매개변수를 조정하는 것을 잊지 마세요. 사용 중 문제가 발생하거나 퀀트 거래에 대해 궁금한 점이 있으시면 언제든지 문의해 주세요. 함께 고민하고 개선해 나가겠습니다.
소스 코드 참조: https://www.fmz.com/strategy/516459