
等级: 新手上路
- 注册:
- 2025-5-14
- 曾用名:
|

楼主 |
发表于 2025-5-14 17:56
|
显示全部楼层
//★☆★ 海龟多因子动态过滤 ★☆★
// 本模型在传统海龟策略基础上引入动态通道与波动率过滤
// 核心改进:动态通道宽度调节+波动环境识别
Setting
AddTimes:11;
Review_Data:Auto;
NoCheck:True;
Params
Numeric RiskRatio(3);
Numeric ATRLength(15); // 修改为14日ATR标准周期
Numeric boLength(17);
Numeric fsLength(25);
Numeric teLength(7);
Numeric VolLookback(23); // 新增波动率观测周期
Vars
NumericSeries AvgTR;
Numeric AN;
Numeric TotalEquity;
Numeric TurtleUnits;
NumericSeries DonchianHi;
NumericSeries DonchianLo;
NumericSeries fsDonchianHi;
NumericSeries fsDonchianLo;
Numeric ExitHighestPrice;
Numeric ExitLowestPrice;
NumericSeries PreBreakoutFailure;
Numeric ATR_Ratio; // 新增波动率比率
Numeric VOLATILITY_FILTER; // 使用 Numeric 类型替代 Bool 类型
Numeric VOL_5; // 5日成交量均值
Numeric VOL_20; // 20日成交量均值
NumericSeries RSI_14; // 14日RSI
Numeric DynamicStopLoss; // 将 DynamicStopLoss 定义移到 Vars 块
Begin
//==================== 新增指标计算 ====================//
// 波动率过滤核心指标
AvgTR = XAverage(TrueRange, ATRLength);
ATR_Ratio = AvgTR / MA(AvgTR, VolLookback);
VOLATILITY_FILTER = ATR_Ratio > 0.8; // 若条件成立,VOLATILITY_FILTER 为 1,否则为 0
// 量价共振因子计算
VOL_5 = MA(VOL, 5);
VOL_20 = MA(VOL, 20);
// RSI动量缓冲因子,手动计算RSI值
RSI_14 = Sma(Max(Close - Ref(Close, 1), 0), 14, 1) / Sma(Abs(Close - Ref(Close, 1)), 14, 1) * 100;
//==================== 动态通道重构 ====================//
// 短周期动态通道(20日)
DonchianHi = Highest(High[1], boLength) + 0.7 * AvgTR[1] * (AvgTR[1] / MA(AvgTR, 60));
DonchianLo = Lowest(Low[1], boLength) - 0.5 * AvgTR[1] * (AvgTR[1] / MA(AvgTR, 60));
// 长周期双因子动态通道(55日)
fsDonchianHi = Highest(High[1], fsLength) + 1.2 * AvgTR[1] * (1 + VOL_5 / VOL_20);
fsDonchianLo = Lowest(Low[1], fsLength) - 0.8 * AvgTR[1] * (1 - RSI_14 / 100);
//==================== 资金管理模块 ====================//
AN = AvgTR[1];
TotalEquity = MoneyTot;
TurtleUnits = (TotalEquity * RiskRatio / 100) / (AN * ContractUnit());
TurtleUnits = IntPart(TurtleUnits);
//==================== 交易信号模块 ====================//
// 做多主信号(增加波动率过滤)
If(BKVol == 0 && SKVol == 0 && PreBreakoutFailure == 0 && VOLATILITY_FILTER == 1)
{
If(High > DonchianHi && TurtleUnits >= 1)
{
BK(TurtleUnits);
}
}
// 长周期做多后备信号
If(BKVol == 0 && SKVol == 0 && VOLATILITY_FILTER == 1)
{
If(High > fsDonchianHi && TurtleUnits >= 1)
{
BK(TurtleUnits);
}
}
// 做空主信号(增加波动率过滤)
If(BKVol == 0 && SKVol == 0 && PreBreakoutFailure == 0 && VOLATILITY_FILTER == 1)
{
If(Low < DonchianLo && TurtleUnits >= 1)
{
SK(TurtleUnits);
}
}
// 长周期做空后备信号
If(BKVol == 0 && SKVol == 0 && VOLATILITY_FILTER == 1)
{
If(Low < fsDonchianLo && TurtleUnits >= 1)
{
SK(TurtleUnits);
}
}
//==================== 完整持仓管理 ====================//
// 多头持仓管理
If(BKVol > 0)
{
// 动态计算离场阈值
ExitLowestPrice = Lowest(Low[1], teLength);
// 趋势跟随离场
If(Low < ExitLowestPrice)
{
SP(BKVol);
}
Else
{
// 金字塔加仓逻辑
If(IsNull(BKPrice) == 0 && TurtleUnits >= 1)
{
If(High >= BKPrice + 0.5 * AN)
{
BK(TurtleUnits);
}
}
// 动态止损(波动率补偿)
DynamicStopLoss = 2 * AN * (1 + ATR_Ratio);
If(Low <= BKPrice - DynamicStopLoss)
{
SP(BKVol);
}
}
}
// 空头持仓管理
If(SKVol > 0)
{
// 动态计算离场阈值
ExitHighestPrice = Highest(High[1], teLength);
// 趋势跟随离场
If(High > ExitHighestPrice)
{
BP(SKVol);
}
Else
{
// 金字塔加仓逻辑
If(IsNull(SKPrice) == 0 && TurtleUnits >= 1)
{
If(Low <= SKPrice - 0.5 * AN)
{
SK(TurtleUnits);
}
}
// 动态止损(波动率补偿)
DynamicStopLoss = 2 * AN * (1 + ATR_Ratio);
If(High >= SKPrice + DynamicStopLoss)
{
BP(SKVol);
}
}
}
End |
|