
等级: 新手上路
- 注册:
- 2025-5-14
- 曾用名:
|
如图片中所示,本来是盈利的,结果最后突然一下子负了那么多,止损都没有出现。是否是我的代码中有BUG的地方。能否请老师帮我看一下?感谢感谢
下面附上回测代码:
//《海龟多因子动态过滤V2》
// 多时间框架动态通道策略
// DESIGNED BY Julien
// 2025.5.19
//------策略参数------
INPUT: RiskRatio(3,1,5,0.1), //风险比率(%)
ATRLen(14,10,30,1), //ATR周期
ShortPeriod(17,10,30,1), //短周期通道
LongPeriod(25,20,50,1), //长周期通道
TrendPeriod(7,5,20,1), //趋势跟踪周期
VolPeriod(23,20,60,1), //波动率观察周期
ContractUnit(1,1,100,1); //合约单位
//------变量声明------
VARIABLE:
ATRVal=0, //单倍ATR值
VolRatio=1, //波动率比率
VolFilter=0, //波动过滤条件
ShortUpBand=0, //短周期上轨
ShortDnBand=0, //短周期下轨
LongUpBand=0, //长周期上轨
LongDnBand=0, //长周期下轨
Vol5=0,Vol20=0, //成交量均量
RSI14=50, //RSI动量
EntryPrice=0, //开仓均价
TrailStopPrice=0, //跟踪止损价
Position=0, //持仓方向
Units=0, //持仓单位
TrueRange=0, //修正:将TR重命名为TrueRange
LowestL=0, //预计算的周期最低价
HighestH=0; //预计算的周期最高价
//------初始化------
IF BARPOS=1 THEN BEGIN
Position := 0;
Units := 0;
ATRVal := 0;
VolRatio := 1;
END
//------指标计算模块------
//计算真实波幅(修正TR计算)
TrueRange := MAX(H-L, MAX(ABS(REF(C,1)-H), ABS(REF(C,1)-L))); // 修正变量名
ATRVal := EMA(TrueRange, ATRLen); // 更新引用
//波动率过滤条件
HistATR := EMA(ATRVal, 60);
VolRatio := ATRVal/HistATR;
VolFilter := IF(VolRatio>0.8, 1, 0);
//量价共振因子
Vol5 := MA(V, 5);
Vol20 := MA(V, 20);
//RSI动量因子
LC := REF(C, 1);
RSI14 := SMA(MAX(C-LC,0),14,1)/SMA(ABS(C-LC),14,1)*100;
//动态通道计算(短周期)
PrevHigh := REF(HHV(H, ShortPeriod), 1);
PrevLow := REF(LLV(L, ShortPeriod), 1);
ShortUpBand := PrevHigh + 0.7*ATRVal*(ATRVal/HistATR);
ShortDnBand := PrevLow - 0.5*ATRVal*(ATRVal/HistATR);
//动态通道计算(长周期)
LongUpBand := REF(HHV(H, LongPeriod), 1) + 1.2*ATRVal*(1+Vol5/MAX(Vol20,1));
LongDnBand := REF(LLV(L, LongPeriod), 1) - 0.8*ATRVal*(1-RSI14/100);
//------预计算序列函数值------
LowestL := LLV(L, TrendPeriod); // 预先计算周期最低价
HighestH := HHV(H, TrendPeriod); // 预先计算周期最高价
//------资金管理------
Equity := ASSET;
RiskAmount := Equity*RiskRatio/100;
Units := INTPART(RiskAmount/(ATRVal*ContractUnit));
Units := MAX(Units, 1); //确保最小交易单位
//------交易信号模块------
IF Position=0 AND VolFilter=1 THEN BEGIN
//多头主信号
IF C>ShortUpBand AND Units>=1 THEN BEGIN
EntryPrice := ShortUpBand;
BUY(1, Units, LIMIT, EntryPrice);
Position := 1;
TrailStopPrice := LowestL; // 使用预计算的值
END
//空头主信号
IF C<ShortDnBand AND Units>=1 THEN BEGIN
EntryPrice := ShortDnBand;
BUYSHORT(1, Units, LIMIT, EntryPrice);
Position := -1;
TrailStopPrice := HighestH; // 使用预计算的值
END
END
//长周期后备信号
IF Position=0 AND VolFilter=1 THEN BEGIN
//多头后备
IF C>LongUpBand AND Units>=1 THEN BEGIN
EntryPrice := LongUpBand;
BUY(1, INTPART(Units/2), LIMIT, EntryPrice);
Position := 1;
TrailStopPrice := LowestL; // 使用预计算的值
END
//空头后备
IF C<LongDnBand AND Units>=1 THEN BEGIN
EntryPrice := LongDnBand;
BUYSHORT(1, INTPART(Units/2), LIMIT, EntryPrice);
Position := -1;
TrailStopPrice := HighestH; // 使用预计算的值
END
END
//------持仓管理模块------
IF Position<>0 THEN BEGIN
//动态止损计算
StopLossRange := 2*ATRVal*(1+VolRatio);
//多头处理
IF Position=1 THEN BEGIN
TrailStopPrice := MAX(TrailStopPrice, LowestL); // 使用预计算的值
//趋势离场
IF L<TrailStopPrice THEN BEGIN
SELL(1, 0, MARKET);
Position := 0;
Units := 0;
END
//动态止损
IF L<EntryPrice-StopLossRange THEN BEGIN
SELL(1, 0, MARKET);
Position := 0;
Units := 0;
END
//金字塔加仓
IF C>EntryPrice+0.5*ATRVal AND Units>=1 THEN BEGIN
NEWUNITS := INTPART(Units*1.5);
BUY(1, NEWUNITS, LIMIT, EntryPrice+0.5*ATRVal);
EntryPrice := (EntryPrice*Units + (EntryPrice+0.5*ATRVal)*NEWUNITS)/(Units+NEWUNITS);
Units := Units + NEWUNITS;
END
END
//空头处理
IF Position=-1 THEN BEGIN
TrailStopPrice := MIN(TrailStopPrice, HighestH); // 使用预计算的值
//趋势离场
IF H>TrailStopPrice THEN BEGIN
SELLSHORT(1, 0, MARKET);
Position := 0;
Units := 0;
END
//动态止损
IF H>EntryPrice+StopLossRange THEN BEGIN
SELLSHORT(1, 0, MARKET);
Position := 0;
Units := 0;
END
//金字塔加仓
IF C<EntryPrice-0.5*ATRVal AND Units>=1 THEN BEGIN
NEWUNITS := INTPART(Units*1.5);
BUYSHORT(1, NEWUNITS, LIMIT, EntryPrice-0.5*ATRVal);
EntryPrice := (EntryPrice*Units + (EntryPrice-0.5*ATRVal)*NEWUNITS)/(Units+NEWUNITS);
Units := Units + NEWUNITS;
END
END
END
//------图表显示------
// 替代方案:使用DRAWICON密集绘制实现通道效果
DRAWICON(ShortUpBand, 1, COLORRED); // 绘制上轨线
DRAWICON(ShortDnBand, 1, COLORGREEN); // 绘制下轨线
DRAWICON(LongUpBand, 1, COLORMAGENTA); // 绘制上轨线
DRAWICON(LongDnBand, 1, COLORCYAN); // 绘制下轨线
// 标记多空状态
DRAWTEXT(Position=1, LOW, '↖多', COLORRED);
DRAWTEXT(Position=-1, HIGH, '↘空', COLORGREEN);
|
-
-
|