如何在Pine Script中基于账户价值计算仓位大小与止损?
Pine Script 按固定风险比例自动计算仓位的实现方法
Pine Script 没有直接实现该逻辑的内置函数,但可以通过手动计算完成按账户总价值1%风险确定仓位的需求,核心是基于固定百分比风险模型推导仓位大小。
核心计算逻辑
你的需求本质是让1.5倍ATR的止损亏损等于账户总价值的1%,计算公式拆解为:
- 单单位标的的风险金额 = 1.5倍ATR × 标的合约乘数(股票可忽略乘数,期货/外汇需对应设置)
- 允许的总亏损金额 = 账户总价值 × 1%
- 仓位大小 = 允许的总亏损金额 ÷ 单单位标的的风险金额
Pine Script 代码实现示例
//@version=5 strategy("RSI策略-固定风险仓位", overlay=true, initial_capital=10000) // 输入参数 rsiLength = input.int(14, "RSI周期") atrLength = input.int(14, "ATR周期") accountSize = input.float(10000.0, "账户总价值") riskPercent = input.float(1.0, "单次风险占账户比例(%)") atrMultiplier = input.float(1.5, "ATR止损倍数") contractMultiplier = input.float(1.0, "合约乘数(股票填1,期货填对应数值)") // 计算指标 rsiValue = ta.rsi(close, rsiLength) atrValue = ta.atr(atrLength) // 计算止损幅度与单单位风险 stopLossDistance = atrValue * atrMultiplier perUnitRisk = stopLossDistance * contractMultiplier // 计算仓位大小(取整避免小数仓位) positionSize = math.floor((accountSize * riskPercent / 100) / perUnitRisk) // 确保仓位不小于1(如果风险占比过小导致计算为0) positionSize := positionSize < 1 ? 1 : positionSize // 交易信号 longCondition = ta.crossover(rsiValue, 25) shortCondition = ta.crossunder(rsiValue, 75) // 下单(使用计算出的仓位大小) if (longCondition) strategy.entry("Long", strategy.long, qty=positionSize) if (shortCondition) strategy.entry("Short", strategy.short, qty=positionSize) // 止盈止损(示例:止盈2%,止损1.5倍ATR) strategy.exit("Exit Long", "Long", limit=close*1.02, stop=close-stopLossDistance) strategy.exit("Exit Short", "Short", limit=close*0.98, stop=close+stopLossDistance)
关键注意事项
- 实盘需根据标的调整
contractMultiplier:比如外汇EUR/USD的乘数是100000,原油期货乘数是1000,股票填1即可 - 代码中
initial_capital要和你输入的accountSize保持一致,回测结果才准确 - 可添加仓位上限限制,避免极端行情下仓位过大
- 回测时需考虑滑点、手续费对风险的影响,可在策略设置中开启相关参数
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

