金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 11|回复: 1

为什么这个策略模型,只产生一笔交易之后就没有信号了?

[复制链接]

2

主题

12

帖子

12

积分

Rank: 1

等级: 新手上路

注册:
2025-5-14
曾用名:
发表于 2025-5-18 13:51 | 显示全部楼层 |阅读模式
下面是策略模型的源码

//《海龟多因子动态过滤策略模型》
//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);


请老师帮忙看一下,只产生了一次买卖交易的原因是什么?是我的代码逻辑有问题吗?
截图202505181350168469.png
回复

使用道具 举报

0

主题

1

帖子

1

积分

Rank: 1

等级: 新手上路

注册:
2025-5-18
曾用名:
发表于 2025-5-18 16:20 | 显示全部楼层
这个策略代码可能存在以下问题:

1. 入场订单类型可能错误,应该使用STOP单而非LIMIT单。

2. BreakFailed变量可能在止损后一直为TRUE,导致无法再次入场,除非再次成功开仓。

3. 加仓时未重新计算TurtleUnits,可能导致风险暴露过大。

4. 通道计算可能使用了前一天的HHV/LLV,导致信号延迟。

5. 未处理多次加仓的头寸管理问题,可能导致过度加仓。

6. 某些函数或变量是否存在平台兼容性问题,如ASSET。

可能的优化点包括:

- 修正订单类型为突破后市价入场。

- 添加BreakFailed的重置条件,例如在一定周期后或当市场条件变化时。

- 在加仓时重新计算TurtleUnits,确保资金和波动性变化后的头寸合理。

- 检查通道计算是否应该基于当日数据而非前一天。

- 优化止损和加仓逻辑,避免过度风险暴露。

需要根据具体的交易平台和策略设计意图,进一步验证和调整这些部分。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2025-5-18 19:37 , Processed in 0.143848 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表