[原创] 工作流实战:轻松搞定权益百分比下单和自动止盈止损

一、前言

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

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

二、权益百分比下单详解

2.1 什么是权益百分比下单

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

举例说明

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

核心优势

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

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

第一步:获取账户信息

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

新手常见错误

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

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

三、止盈止损设置详解

3.1 止盈止损的核心逻辑

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

 

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

3.2 条件单参数详解

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

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

  • CreateConditionOrder(symbol, side, amount, condition)
  • GetConditionOrder(id)
  • GetConditionOrders(symbol)
  • CancelConditionOrder(id)
  • GetHistoryConditionOrders(symbol, since, limit)
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 止盈止损价格计算

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

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

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

// 查询条件单状态
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 函数,传入订单编号即可

注意事项

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

四、完整工作流整合

4.1 交易状态管理

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

const savestatus = _G('status');

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

三种状态

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

4.2 完整交易流程

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

流程图

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

代码实现

// 状态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. 确保没问题后再投入正式资金

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

六、总结

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

免责声明:信息仅供参考,不构成投资及交易建议。投资者据此操作,风险自担。
如果觉得文章对你有用,请随意赞赏收藏
相关推荐
相关下载
登录后评论
Copyright © 2019 宽客在线