金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 19|回复: 1

麻烦老师请帮我看一下为什么回测的资金突然变负的

[复制链接]

3

主题

14

帖子

14

积分

Rank: 1

等级: 新手上路

注册:
2025-5-14
曾用名:
发表于 2025-5-19 18:34 | 显示全部楼层 |阅读模式
如图片中所示,本来是盈利的,结果最后突然一下子负了那么多,止损都没有出现。是否是我的代码中有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);

001.png
002.png
回复

使用道具 举报

37

主题

9933

帖子

5万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
wenarm
发表于 2025-5-20 08:23 | 显示全部楼层
Units计算的手数可能有问题,你要确定下自己的逻辑思想。

一次性开几千万手仓位,没有相应的仓位风险管理,迭代后自然爆仓了。

注:不是ai写的就一定对的。使用者必须基本代码的阅读调试能力,才能驾驭ai工具
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-24 09:54 , Processed in 0.191907 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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