金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
12
返回列表 发新帖
楼主: Julien

有关代码编写的问题

[复制链接]

2

主题

12

帖子

12

积分

Rank: 1

等级: 新手上路

注册:
2025-5-14
曾用名:
 楼主| 发表于 2025-5-16 14:58 | 显示全部楼层
日内策略是不能回测的吗?我选了1分钟周期,还是没有数据呀,就是,我想要确定这个代码本身是不是正确的,如果是正确的,我就按照这个格式去改写之前我自己的那个策略。
截图202505161457405076.png
回复

使用道具 举报

38

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-5-16 14:59 | 显示全部楼层
加载k线图上看有没有信号,本地这边都是正常的
截图202505161459153120.png
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

2

主题

12

帖子

12

积分

Rank: 1

等级: 新手上路

注册:
2025-5-14
曾用名:
 楼主| 发表于 2025-5-16 15:01 | 显示全部楼层
好的,我改了测试的时间长度,现在有数据了。谢谢老师。
回复

使用道具 举报

2

主题

12

帖子

12

积分

Rank: 1

等级: 新手上路

注册:
2025-5-14
曾用名:
 楼主| 发表于 2025-5-16 15:27 | 显示全部楼层
老师,这个是我现在编写好的,目标是适配金字塔的回测代码。它的交易思路就是在传统的海龟交易法则上优化了以下几点:
回复

使用道具 举报

2

主题

12

帖子

12

积分

Rank: 1

等级: 新手上路

注册:
2025-5-14
曾用名:
 楼主| 发表于 2025-5-16 15:30 | 显示全部楼层
老师,这个是我现在编写好的,目标是适配金字塔的回测代码。它的交易思路就是在传统的海龟交易法则上优化了以下几点:
1,动态通道突破:使用长短周期动态通道捕捉价格突破机会,长周期通道更宽松,作为后备信号。
2,波动率过滤:通过 ATR 比率判断市场波动状态,仅在波动率高于阈值时交易,避免震荡行情。
3,资金管理:基于账户权益和 ATR 动态计算交易单位,实现风险敞口的动态调整。
4,持仓管理:包含动态止损、趋势跟随离场和金字塔式加仓策略,增强趋势行情的盈利能力。

下面是代码:

//《海龟多因子动态过滤策略模型》
//DESIGNED BY AI Assistant
//2023.12.15

//------策略参数------
INPUT:
    boLength(22,20,30,1),        //短周期通道长度
    fsLength(50,40,60,1),        //长周期通道长度
    ATRLen(20,14,30,1),          //ATR周期
    VolLookback(30,20,60,1),     //波动率观察周期
    RiskRatio(0.02,0.01,0.05,0.01),//风险比率
    VolThreshold(0.8,0.5,1.2,0.1),//波动率阈值
    RSIlen(14,10,20,1);          //RSI周期

//------变量声明------
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);            //波动率过滤器

//------指标计算------
TR := MAX(MAX(HIGH-LOW,ABS(REF(CLOSE,1)-HIGH),ABS(REF(CLOSE,1)-LOW));
AvgTR := MA(TR,ATRLen);
ATR_Ratio := AvgTR / MA(AvgTR,VolLookback);

VOL_5 := MA(VOL,5);
VOL_20 := MA(VOL,20);

//手动计算RSI
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;

//------资金管理------
Equity := TACCOUNT(4);
RiskAmount := Equity * RiskRatio;
ContractSize := MONEYTOTICKS(1,1);  //获取合约乘数
TurtleUnits := INTPART(RiskAmount/(AvgTR*ContractSize));

//------交易信号模块------
//多头主信号
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 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 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(LOW,10) Then Begin
            Sell(1,0,LIMIT,LLV(LOW,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(HIGH,10) Then Begin
            SellShort(1,0,LIMIT,HHV(HIGH,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);
DRAWNUMBER(BARPOS=1,DonchianLo,DonchianLo,2,COLORGREEN);

请教老师,能帮我调试一下吗,感谢感谢
回复

使用道具 举报

2

主题

12

帖子

12

积分

Rank: 1

等级: 新手上路

注册:
2025-5-14
曾用名:
 楼主| 发表于 2025-5-16 20:05 | 显示全部楼层
//《海龟多因子动态过滤策略模型》
//DESIGNED BY AI Assistant
//2023.12.15
// 修复布尔逻辑处理方式

//------策略参数------
INPUT:
    boLength(22,20,30,1),        //短周期通道长度
    fsLength(50,40,60,1),        //长周期通道长度
    ATRLen(20,14,30,1),          //ATR周期
    VolLookback(30,20,60,1),     //波动率观察周期
    RiskRatio(0.02,0.01,0.05,0.01),//风险比率
    VolThreshold(0.8,0.5,1.2,0.1),//波动率阈值
    RSIlen(14,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);


老师,麻烦能帮我看一下,这个回测源码是不是OK的?有没有格式上的错误?感谢感谢
回复

使用道具 举报

2

主题

12

帖子

12

积分

Rank: 1

等级: 新手上路

注册:
2025-5-14
曾用名:
 楼主| 发表于 2025-5-16 20:23 | 显示全部楼层
求教老师,为什么这个代码回测的时候只有一笔交易呢?这个是什么问题呀
截图202505162022542624.png
回复

使用道具 举报

1

主题

9

帖子

9

积分

Rank: 1

等级: 新手上路

注册:
2025-4-7
曾用名:
发表于 2025-5-17 15:31 | 显示全部楼层
在金字塔软件中30分k线的周期中的技术指标成立时如何实现声音文件每150秒播报一次!为什么只在30分钟周期内K线移动后就播报一次呢?
微信图片_20250517152949.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 21:24 , Processed in 0.104091 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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