Type/to search
2
Follow
480
Followers
工作流实战:轻松搞定权益百分比下单和自动止盈止损
Original
Created 2025-11-12 10:58:07  Updated 2025-11-15 12:45:08
 0
 734

img

一、前言

大家好,最近收到很多朋友关于工作流使用的反馈,其中问得最多的就是权益百分比下单止盈止损的设置问题。很多朋友说:"我知道要控制风险,但具体怎么根据账户资金来计算下单数量呢?还有就是开仓后怎么自动设置止盈止损,让系统帮我们管理风险?"

今天我们就针对这些实际需求,结合发明者量化平台的实际代码,来详细讲解如何实现这两个核心功能。


二、权益百分比下单详解

img

2.1 什么是权益百分比下单

权益百分比下单是指不固定下单张数,而是根据账户总资金的固定比例来计算下单数量。

举例说明

  • 账户有 10,000 USDT
  • 设置风险比例为 5%(riskRatio = 0.05)
  • 系统会用 500 USDT 的额度来开仓

核心优势

  1. 风险可控:每次交易风险都是固定比例,不管账户资金多少
  2. 资金利用率高:账户资金变化时,下单量自动调整——资金增加时下单量增加,资金减少时下单量也会相应减少
  3. 适应性强:适合不同资金规模的账户

2.2 完整计算逻辑与代码实现

第一步:获取账户信息

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

关键点Balance 字段代表可用余额,这是计算的基础。


第二步:获取市场信息

javascript
// 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:价格精度

特别注意:务必检查要交易的币种是否存在于交易所。


第三步:获取当前价格

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

第四步:计算合约张数

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

计算公式总结

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

第五步:检查限制

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

新手常见错误

  • ❌ 未检查最小下单量,导致下单失败
  • ❌ 精度处理不当,交易所拒绝订单
  • ❌ 未考虑合约面值,计算错误

当上述设置有误时,就会出现下单失败的提醒,这是新手需要特别注意的地方。


三、止盈止损设置详解

img

3.1 止盈止损的核心逻辑

很多朋友对止盈止损的方向容易混淆,我们来理清楚:

持仓类型止盈操作止损操作
多单价格上涨时卖出平仓价格下跌时卖出平仓
空单价格下跌时买入平仓价格上涨时买入平仓

关键点:止盈止损都是平仓操作,方向要跟持仓方向相反。


3.2 条件单参数详解

在发明者平台上,使用 CreateConditionOrder 函数来设置止盈止损:

目前FMZ平台实盘已支持CreateConditionOrder条件单,回测暂时没有支持。

  • CreateConditionOrder(symbol, side, amount, condition)
  • GetConditionOrder(id)
  • GetConditionOrders(symbol)
  • CancelConditionOrder(id)
  • GetHistoryConditionOrders(symbol, since, limit)
javascript
exchange.CreateConditionOrder( symbol, // 交易对 closeDirection, // 平仓方向:closebuy 或 closesell positionSize, // 平仓数量 { "ConditionType": ORDER_CONDITION_TYPE_SL, // 止损类型 "SlTriggerPrice": stopLossPrice, // 触发价格 "SlOrderPrice": executionPrice // 执行价格 }, "止损单" // 订单备注 );

参数说明

  • 操作类型(closeDirection):

    • 多单平仓用 closebuy
    • 空单平仓用 closesell
  • ConditionType

    • ORDER_CONDITION_TYPE_SL:止损(Stop Loss)
    • ORDER_CONDITION_TYPE_TP:止盈(Take Profit)
  • TriggerPrice(触发价格):达到这个价格时激活订单

  • OrderPrice(执行价格):激活后以此价格成交

注意: 目前仅实盘支持条件单,并且需要更新托管者。


3.3 止盈止损价格计算

在代码中,我们根据开仓方向动态计算:

javascript
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 条件单的管理和监控

设置好条件单后,我们还需要管理和监控它们:

javascript
// 查询条件单状态 const slOrder = exchange.GetConditionOrder(stopLossOrderId); const tpOrder = exchange.GetConditionOrder(takeProfitOrderId); Log("止损单状态:", slOrder.Status); Log("止盈单状态:", tpOrder.Status); Log("状态说明: 0=活跃, 1=已触发, -1=不存在");

状态处理逻辑

javascript
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 函数,传入订单编号即可

注意事项

  • 建议定期检查条件单状态,确保它们正常工作
  • 有时候市场波动太快,条件单可能没有及时执行,这时候就需要手动处理

四、完整工作流整合

4.1 交易状态管理

在示范的工作流中,我们使用状态机来管理完整的交易周期:

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

三种状态

  1. unfinished:未开仓,需要执行开仓流程
  2. monitor:已开仓并设置好止盈止损,进入监控阶段
  3. finished:交易完成,准备重置状态

4.2 完整交易流程

把权益百分比下单和止盈止损整合起来,我们就有了一个完整的交易工作流:

流程图

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

代码实现

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

整个过程的优势

  • 既控制了单笔交易的风险(通过权益百分比)
  • 又通过自动化止盈止损来保护利润和限制损失
  • 整个过程都是程序化执行,减少了人为干预,提高了交易的一致性

五、风险控制最佳实践

5.1 参数设置建议

风险比例

  • 新手建议:2-3%
  • 有经验者:5-10%
  • 不要贪心设置太高,根据自己的风险承受能力来设定

止盈止损比例

  • 止损:1-3%(根据币种波动性调整)
  • 止盈:2-6%(通常是止损的 1.5-2 倍)
  • 需要根据不同币种特性进行合理设置

5.2 测试与验证

完整测试清单

  • ✅ 计算数量是否正确
  • ✅ 止盈止损价格是否合理
  • ✅ 条件单是否正常触发
  • ✅ 状态切换是否正确
  • ✅ 异常情况处理是否完善

测试流程

  1. 先在测试环境中验证所有逻辑
  2. 使用小额资金进行实盘测试
  3. 确保没问题后再投入正式资金

记住:测试充分后再上实盘,这是量化交易的基本原则。


六、总结

好了,今天关于权益百分比下单和止盈止损的设置就讲到这里。这套工作流把风险控制和自动化执行结合起来,让我们的交易更加规范化。不过每个人的交易风格和风险承受能力都不一样,大家在使用时记得根据自己的实际情况来调整参数。如果在使用过程中遇到任何问题,或者有其他关于量化交易的疑问,都欢迎大家过来咨询交流。我们一起探讨,一起进步。

源码参考: https://www.fmz.com/strategy/516459

Comment
All comments (0)
No data
No data
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)