
等级: 新手上路
- 注册:
- 2025-5-14
- 曾用名:
|
下面是策略模型的源码
//《海龟多因子动态过滤策略模型》
//DESIGNED BY AI Assistant
//2023.12.15
// 修复布尔逻辑处理方式
//------策略参数------
INPUT:
boLength(17,10,30,1), //短周期通道长度
fsLength(25,20,60,1), //长周期通道长度
ATRLen(15,14,30,1), //ATR周期
VolLookback(20,20,60,1), //波动率观察周期
RiskRatio(0.03,0.01,0.05,0.01),//风险比率
VolThreshold(0.5,0.5,1.2,0.1),//波动率阈值
RSIlen(15,10,20,1), //RSI周期
ContractSize(300, 1, 1000, 1),// 合约乘数参数
UseBacktestEquity(false), // 是否使用回测模式
BacktestEquity(1000000); // 回测初始资金
//------变量声明------
VARIABLE:
AvgTR = 0, ATR_Ratio = 0, //ATR及比率
VOL_5 = 0, VOL_20 = 0, //成交量均值
RSI_14 = 0, //RSI值
DonchianHi = 0, DonchianLo = 0,//短周期动态通道
fsDonchianHi = 0, fsDonchianLo = 0,//长周期通道
LastEntryPrice = 0, //最后进场价格
DynamicStopLoss = 0, //动态止损幅度
TurtleUnits = 0, //交易单位
Position = 0, //持仓方向
BreakFailed = FALSE, //突破失败标记
VolFilter = FALSE, //波动率过滤器
Equity = 0, //账户资金
LLV_10 = 0, HHV_10 = 0, //趋势跟踪变量
TrueRange = 0; // 真实波幅
//------指标计算------
TrueRange := MAX(HIGH-LOW, MAX(ABS(REF(CLOSE,1)-HIGH), ABS(REF(CLOSE,1)-LOW)));
AvgTR := MA(TrueRange, ATRLen);
ATR_Ratio := AvgTR / MA(AvgTR, VolLookback);
VOL_5 := MA(VOL, 5);
VOL_20 := MA(VOL, 20);
LC := REF(CLOSE, 1);
RSI_14 := SMA(MAX(CLOSE-LC,0), RSIlen, 1) / SMA(ABS(CLOSE-LC), RSIlen, 1) * 100;
DonchianHi := REF(HHV(HIGH, boLength), 1) + 0.7*AvgTR*(AvgTR/MA(AvgTR, 60));
DonchianLo := REF(LLV(LOW, boLength), 1) - 0.5*AvgTR*(AvgTR/MA(AvgTR, 60));
fsDonchianHi := REF(HHV(HIGH, fsLength), 1) + 1.2*AvgTR*(1+VOL_5/VOL_20);
fsDonchianLo := REF(LLV(LOW, fsLength), 1) - 0.8*AvgTR*(1-RSI_14/100);
VolFilter := ATR_Ratio > VolThreshold;
LLV_10 := LLV(LOW, 10);
HHV_10 := HHV(HIGH, 10);
//------资金管理------
Equity := If(UseBacktestEquity, BacktestEquity, ASSET);
RiskAmount := Equity * RiskRatio;
TurtleUnits := INTPART(RiskAmount / (AvgTR * ContractSize));
//------交易信号模块------
// 修正布尔逻辑:使用NOT(BreakFailed)而非NOT BreakFailed
IF VolFilter AND NOT(BreakFailed) AND Position=0 AND HIGH>DonchianHi AND TurtleUnits>=1 THEN BEGIN
Buy(1, TurtleUnits, LIMIT, DonchianHi);
LastEntryPrice := DonchianHi;
Position := 1;
BreakFailed := FALSE;
END
IF VolFilter AND NOT(BreakFailed) AND Position=0 AND HIGH>fsDonchianHi AND TurtleUnits>=1 THEN BEGIN
Buy(1, TurtleUnits, LIMIT, fsDonchianHi);
LastEntryPrice := fsDonchianHi;
Position := 1;
END
IF VolFilter AND NOT(BreakFailed) AND Position=0 AND LOW<DonchianLo AND TurtleUnits>=1 THEN BEGIN
BuyShort(1, TurtleUnits, LIMIT, DonchianLo);
LastEntryPrice := DonchianLo;
Position := -1;
BreakFailed := FALSE;
END
IF VolFilter AND NOT(BreakFailed) AND Position=0 AND LOW<fsDonchianLo AND TurtleUnits>=1 THEN BEGIN
BuyShort(1, TurtleUnits, LIMIT, fsDonchianLo);
LastEntryPrice := fsDonchianLo;
Position := -1;
END
//------持仓管理模块------
IF Position <> 0 THEN BEGIN
DynamicStopLoss := 2 * AvgTR * (1 + ATR_Ratio);
IF Position > 0 THEN BEGIN
IF LOW < LLV_10 THEN BEGIN
Sell(1, 0, LIMIT, LLV_10);
Position := 0;
END
ELSE IF LOW < LastEntryPrice - DynamicStopLoss THEN BEGIN
Sell(1, 0, LIMIT, LastEntryPrice - DynamicStopLoss);
Position := 0;
BreakFailed := TRUE;
END
ELSE IF HIGH > LastEntryPrice + 0.5*AvgTR AND TurtleUnits >=1 THEN BEGIN
Buy(1, TurtleUnits, LIMIT, LastEntryPrice + 0.5*AvgTR);
LastEntryPrice := LastEntryPrice + 0.5*AvgTR;
END
END
ELSE IF Position < 0 THEN BEGIN
IF HIGH > HHV_10 THEN BEGIN
SellShort(1, 0, LIMIT, HHV_10);
Position := 0;
END
ELSE IF HIGH > LastEntryPrice + DynamicStopLoss THEN BEGIN
SellShort(1, 0, LIMIT, LastEntryPrice + DynamicStopLoss);
Position := 0;
BreakFailed := TRUE;
END
ELSE IF LOW < LastEntryPrice - 0.5*AvgTR AND TurtleUnits >=1 THEN BEGIN
BuyShort(1, TurtleUnits, LIMIT, LastEntryPrice - 0.5*AvgTR);
LastEntryPrice := LastEntryPrice - 0.5*AvgTR;
END
END
END
//------信号绘制------
DRAWTEXT(Position>0, LOW, '多', COLORRED);
DRAWTEXT(Position<0, HIGH, '空', COLORGREEN);
DRAWNUMBER(BARPOS=1, DonchianHi, DonchianHi, 2, COLORRED, 0);
DRAWNUMBER(BARPOS=1, DonchianLo, DonchianLo, 2, COLORGREEN, 0);
请老师帮忙看一下,只产生了一次买卖交易的原因是什么?是我的代码逻辑有问题吗?
|
-
|