基于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
相关产品推荐
相关产品推荐

