You need to enable JavaScript to run this app. 基于MACD三变量正负组合设置差异化仓位的Pine Script策略求助
优惠活动
大模型
产品
解决方案
定价
更多

基于MACD三变量正负组合设置差异化仓位的Pine Script策略求助

现有代码核心问题排查
  • 语法不完整:所有if语句没有写对应的返回值,部分多条件判断漏了and连接符(如hist <= 0 and macdl > 0 signal > 0中signal判定前缺少连接符),会直接触发编译错误
  • 变量逻辑被覆盖:先后给s000、s011赋值了完全不同的判定条件,后写的逻辑会覆盖前面的逻辑,最终信号判定完全和预期不符
  • 缺少仓位映射逻辑:没有按不同信号匹配对应仓位比例,仅做了满仓开多/开空的逻辑
  • 无动态调仓机制:没有实现“任意MACD变量正负性变化即调整仓位”的要求,仅固定触发开单
  • 冗余代码:定义了enterLong、enterShort变量但从未在后续逻辑中使用,属于无效代码
修正后策略实现逻辑

严格匹配你提到的6种MACD变量正负组合,每种组合对应独立的目标仓位,其中你举例的仓位参数直接代入,剩余参数可按需调整:

  • ---(三变量全负):做空50%权益
  • --+(MACD负、信号线负、直方图正):做空25%权益
  • -++(MACD负、信号线正、直方图正):做空25%权益
  • +--(MACD正、信号线负、直方图负):做多50%权益
  • ++-(MACD正、信号线正、直方图负):做多75%权益
  • +++(三变量全正):做多100%权益

修正后的可运行代码如下:

strategy("MACD三变量仓位策略", overlay= false, initial_capital = 1, default_qty_type= strategy.percent_of_equity, default_qty_value= 100 )

// 回测时间输入
startDate = input(title="开始日期", type=input.integer, defval=1, minval=1, maxval=31)
startMonth = input(title="开始月份", type=input.integer, defval=1, minval=1, maxval=12)
startYear = input(title="开始年份", type=input.integer, defval=2014, minval=1800, maxval=2100)

endDate = input(title="结束日期", type=input.integer, defval=29, minval=1, maxval=31)
endMonth = input(title="结束月份", type=input.integer, defval=3, minval=1, maxval=12)
endYear = input(title="结束年份", type=input.integer, defval=2021, minval=1800, maxval=2100)

inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) and
     (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))

// MACD指标计算
ema26= ema(close,26)
ema12= ema(close,12 )
macdl= ema12-ema26
signal= ema(macdl, 9)
hist= macdl-signal

// 6种三变量正负信号判定
// --- 三全负:MACD<=0, 信号<=0, 直方图<=0
sig_s000 = (macdl <= 0) and (signal <=0) and (hist <=0)
// --+:MACD<=0, 信号<=0, 直方图>0
sig_s001 = (macdl <=0) and (signal <=0) and (hist >0)
// -++:MACD<=0, 信号>0, 直方图>0
sig_s011 = (macdl <=0) and (signal >0) and (hist >0)
// +++ 三全正:MACD>0, 信号>0, 直方图>0
sig_s111 = (macdl >0) and (signal >0) and (hist >0)
// ++-:MACD>0, 信号>0, 直方图<=0
sig_s110 = (macdl >0) and (signal >0) and (hist <=0)
// +--:MACD>0, 信号<=0, 直方图<=0
sig_s100 = (macdl >0) and (signal <=0) and (hist <=0)

// 按信号匹配目标仓位,每次信号变化自动调整到对应仓位
if inDateRange
    // --- 做空50%
    if sig_s000
        strategy.entry(id="pos", long=false, qty_percent=50)
    // --+ 做空25%
    if sig_s001
        strategy.entry(id="pos", long=false, qty_percent=25)
    // -++ 做空25%
    if sig_s011
        strategy.entry(id="pos", long=false, qty_percent=25)
    // +++ 做多100%
    if sig_s111
        strategy.entry(id="pos", long=true, qty_percent=100)
    // ++- 做多75%
    if sig_s110
        strategy.entry(id="pos", long=true, qty_percent=75)
    // +-- 做多50%
    if sig_s100
        strategy.entry(id="pos", long=true, qty_percent=50)

// 超出回测范围全平
if not inDateRange
    strategy.close_all()

代码运行机制说明:

  • 所有开单调用使用统一的订单ID,策略引擎会自动根据最新的信号判定结果,将当前仓位修正到对应目标方向、目标比例,无需手动编写平仓逻辑
  • 只要MACD线、信号线、直方图三者中任意一个的正负性发生变化,就会匹配到新的信号,自动触发仓位调整,完全满足动态调仓的需求
  • 所有剩余信号的仓位比例,可直接在代码块的qty_percent参数处按需求修改

内容的提问来源于stack exchange,提问作者captaincaanada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 20:06:01