金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 5170|回复: 5

请教老师回测信号和图表信号不一致问题?

[复制链接]

9

主题

45

帖子

45

积分

Rank: 1

等级: 新手上路

注册:
2023-9-4
曾用名:
发表于 2023-9-25 16:36 | 显示全部楼层 |阅读模式
比如这个豆二连续回测数据我是从2010/01/01开始测的,在02/01的时候图表上是只有平空的,但是回测平空后又开多了。开单的信号不一样,如果我把回测周期改到2009/09/01,那02/01就没有开多这个操作了。请老师帮忙看下是否我代码逻辑有问题?
[PEL] 复制代码
//声明参数
INPUT : SCALE(0.01,0.01,0.02,0.005) ;//资金比例
//INPUT : POSNUM(1,1,20,1) ;         //交易手数

//声明变量
POSNUM : =1;                           //交易手数,当ATR值无效时为默认值1

NT := 1 ;                             //调试信息带时间戳
BUYORDERTHISBAR := 0 ;                //当前BAR有过交易

VARIABLE : _DEBUG = 1 ;                             //是否输出前台交易指令
VARIABLE : _TDEBUG = 1 ;                            //是否输出后台交易指令
VARIABLE : _DEBUGOUT = 0 ;                          //是否输出后台交易的调试信息

VARIABLE : MYENTRYPRICE =0 ;                        //开仓价格
VARIABLE : MYEXITPRICE =0 ;                         //平仓价格
VARIABLE : LO_lOSS_PRICE =0 ;                       //平多止损价格
VARIABLE : LO_lOSS_FLAG =0 ;                        //平多止损价格标记
VARIABLE : SHCLOPRICE =0 ;                          //平空止损价格
VARIABLE : SHCLOPRICE_FLAG =0 ;                     //平空止损价格标记

VARIABLE : TURTLEUNITS=0 ;                          //交易单位
VARIABLE : POSITION=0 ;                             //仓位状态,0表示没有仓位,1表示持有多头, -1表示持有空头

VARIABLE : FIRST_H =0;                              //开多最高点,全局变量
VARIABLE : FIRST_L =0;                              //开空最低点,全局变量
VARIABLE : FLAG_UP =0;                              //是否开多标志,0否,1是
VARIABLE : FLAG_DOWN =0;                            //是否开空标志,0否,1是
VARIABLE : IS_OPERATE =0;                           //是否进场,0否,1是
VARIABLE : CLOANDOPN =0;                            //先平后开标志
VARIABLE : N =0;                                    //ATR全局变量,用来保存标记当天的ATR值

//准备需要计算的变量
TR1:=MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
ATR:MA(TR1,21);                                  //ATR
DF:(REF(CLOSE,1)-CLOSE)/REF(CLOSE,1)*100;        //跌幅

//短期、长期指数平滑移动平均线间的差
DIFF: EMA(CLOSE,18) - EMA(CLOSE,39);

//DIFF的9日指数平滑移动平均线
DEA:= EMA(DIFF,13);

//使用COLORSTICK函数的作用是将指标线转换为柱状线显示。
MACD : 2*(DIFF-DEA),COLORSTICK;

ENTERDAY : enterbars+1;//上次开仓到当前的周期数

ALL_UP:=DIFF>REF(DIFF,1) AND MACD>REF(MACD,1);//开多条件.MACD向上,DIFF向上
LAST_ALL_UP:=REF(DIFF,1)>REF(DIFF,2) AND REF(MACD,1)>REF(MACD,2);//上一日.MACD向上,DIFF向上
ALL_DOWN:=DIFF<REF(DIFF,1) AND MACD<REF(MACD,1);//开空条件.MACD向下,DIFF向下
LAST_ALL_DOWN:=REF(DIFF,1)<REF(DIFF,2) AND REF(MACD,1)<REF(MACD,2);//上一日.MACD向下,DIFF向下


//如果当前是没有持仓的状态/
IF POSITION=0  THEN BEGIN
         
        //记录第一次满足条件的最高和最低价位
        IF ALL_UP  THEN BEGIN
            FLAG_DOWN :=0;
            IF FLAG_UP =0 THEN BEGIN
                FIRST_H :=H;
                FLAG_UP :=1;
                N := ATR ;
            END
            ELSE BEGIN
                 IS_OPERATE :=1;
            END 
        END 
        
        IF ALL_DOWN  THEN BEGIN
             FLAG_UP :=0;
            IF FLAG_DOWN =0 THEN BEGIN
             FIRST_L :=L;
             FLAG_DOWN :=-1;
             N := ATR ;
            END
            
            ELSE BEGIN
                 IS_OPERATE :=1;
            END  
        END

        IF  NOT(ALL_UP) AND NOT(ALL_DOWN) THEN BEGIN
        
            IF
                (H>FIRST_H+MINDIFF AND FLAG_UP)
                OR
                (L<FIRST_L-MINDIFF AND FLAG_DOWN)
            THEN BEGIN
                IS_OPERATE := 1;
            END
            ELSE BEGIN
                FIRST_H :=0;
                FIRST_L :=0;
                FLAG_UP :=0;
                FLAG_DOWN :=0;
                N := 0;
            END
                
        END 

    //建立多头进场
    IF FLAG_UP  AND IS_OPERATE = 1 AND H>FIRST_H+MINDIFF THEN BEGIN
            TRANPRICE := IF(OPEN>FIRST_H+MINDIFF ,OPEN ,FIRST_H+MINDIFF) ; 
            MYENTRYPRICE := FIRST_H+MINDIFF;
            //根据资金比例来决定交易手数
            IF VALID(N) THEN POSNUM : =FLOOR((ASSET*SCALE)/(1.2*N*MULTIPLIER));                 
            BUY( _DEBUG,max(POSNUM,1),LIMITR,TRANPRICE),ignorecheckprice;
            POSITION := 1 ;                 //持仓状态为1(多头)
            TURTLEUNITS := 1 ;              //交易单位为1
            BUYORDERTHISBAR := 1;
            CLOANDOPN : = 0;
            //N := ATR ;
            
    END
    
    //建立空头进场

    IF FLAG_DOWN  AND IS_OPERATE = 1 AND L<FIRST_L-MINDIFF  THEN BEGIN                        
            TRANPRICE :=  IF(OPEN<FIRST_L-MINDIFF ,OPEN ,FIRST_L-MINDIFF);
            MYENTRYPRICE :=FIRST_L-MINDIFF; 
             //根据资金比例来决定交易手数
            IF VALID(N) THEN  POSNUM : =FLOOR((ASSET*SCALE)/(1.2*N*MULTIPLIER));  
            BUYSHORT( _DEBUG,max(POSNUM,1),LIMITR,TRANPRICE),ignorecheckprice;
            POSITION := -1 ;//持仓状态为-1(空头)
            TURTLEUNITS := 1 ;
            BUYORDERTHISBAR := 1;
            //N := ATR ;
            CLOANDOPN : = 0;
    END
        
END 

//先平后开状态
IF CLOANDOPN = 1 AND BUYORDERTHISBAR = 0 THEN BEGIN
        //建立多头进场
    IF FLAG_UP  AND H>FIRST_H+MINDIFF THEN BEGIN
            TRANPRICE := IF(OPEN>FIRST_H+MINDIFF ,OPEN ,FIRST_H+MINDIFF) ; 
            MYENTRYPRICE := FIRST_H+MINDIFF;
            SELLSHORT( _DEBUG,0,LIMITR,TRANPRICE),ignorecheckprice; //先平再开
            CLOANDOPN :=0; 
             //根据资金比例来决定交易手数
            IF VALID(N) THEN POSNUM : =FLOOR((ASSET*SCALE)/(1.2*N*MULTIPLIER));            
            BUY( _DEBUG,max(POSNUM,1),LIMITR,TRANPRICE);
            POSITION := 1 ;                 //持仓状态为1(多头)
            TURTLEUNITS := 1 ;              //交易单位为1
            BUYORDERTHISBAR := 1;
            //N := ATR ;
    END
    
    //建立空头进场

    IF FLAG_DOWN  AND L<FIRST_L-MINDIFF  THEN BEGIN                        
            TRANPRICE :=  IF(OPEN<FIRST_L-MINDIFF ,OPEN ,FIRST_L-MINDIFF);
            MYENTRYPRICE :=FIRST_L-MINDIFF; 
            SELL( _DEBUG ,0,LIMITR,TRANPRICE);  //先平再开
            CLOANDOPN :=0;
             //根据资金比例来决定交易手数
            IF VALID(N) THEN POSNUM : =FLOOR((ASSET*SCALE)/(1.2*N*MULTIPLIER));           
            BUYSHORT( _DEBUG,max(POSNUM,1),LIMITR,TRANPRICE),ignorecheckprice;
            POSITION := -1 ;//持仓状态为-1(空头)
            TURTLEUNITS := 1 ;
            BUYORDERTHISBAR := 1;
            //N := ATR ;
    END
        
END 
//如果当前持有多头仓位的状态

IF POSITION=1  THEN BEGIN
        
        //建立多头止损条件
        IF  NOT(LO_lOSS_FLAG)  THEN BEGIN
            //①价格跌到P-1.2*N                           
            LO_lOSS_PRICE :=MYENTRYPRICE - 1.2*N;
                        //②价格涨幅达到P+N,止损价格P-0.2*N 
            IF  HIGH>MYENTRYPRICE + N THEN BEGIN
                LO_lOSS_PRICE :=MYENTRYPRICE - 0.2*N;
                LO_lOSS_FLAG :=1;
                LONGX1 := C < LO_lOSS_PRICE;
            END
         END 
        //满足①时用最低价<1.2N止损,满足②时用收盘价<0.2N止损,注意用最低价小于止损价会存在经过止损价时就平仓
        LONGX2 := LOW < LO_lOSS_PRICE;
        IF (LONGX1 OR LONGX2) AND POSITION=1 AND BUYORDERTHISBAR=0 THEN BEGIN
            MYEXITPRICE := IF(OPEN<LO_lOSS_PRICE ,OPEN ,LO_lOSS_PRICE) ;                
            MYEXITPRICE := FLOOR(MYEXITPRICE/MINDIFF)*MINDIFF ;        
            SELL( _DEBUG ,0,LIMITR,MYEXITPRICE),ignorecheckprice;
            POSITION := 0 ;
            TURTLEUNITS := 0 ;
            IS_OPERATE := 0;
            //止损后如果满足开空条件,则要作为标记
            FLAG_DOWN := IFELSE(ALL_DOWN,1,0);
            FLAG_UP :=IFELSE(ALL_UP,1,0);;
            FIRST_L := IFELSE(ALL_DOWN,L,0);
            FIRST_H := IFELSE(ALL_UP,H,0);
            N := IFELSE(ALL_UP OR ALL_DOWN,ATR,0);
            LO_lOSS_PRICE :=0 ;
            LO_lOSS_FLAG :=0;
            SHCLOPRICE : =0 ;
            SHCLOPRICE_FLAG :=0;
        END
        
        //③MACD↓ AND DIFF ↓ AND 跌幅大于0.9%
        LONGX1 :=ALL_DOWN AND ABS(DF)>0.9;
        IF LONGX1 AND POSITION=1 AND BUYORDERTHISBAR=0 THEN BEGIN
            SELL( _DEBUG ,0,LIMITR,CLOSE),ignorecheckprice;
            POSITION := 0 ;
            TURTLEUNITS := 0 ;
            FLAG_DOWN :=1;//当天也要作为标记
            FLAG_UP :=0;
            FIRST_L :=L;
            N := ATR ;
            IS_OPERATE := 0; 
            LO_lOSS_PRICE :=0 ;
            LO_lOSS_FLAG :=0;
            SHCLOPRICE : =0 ;
            SHCLOPRICE_FLAG :=0;
        END 
        dddd: ALL_DOWN;
        //④MACD↓ AND DIFF ↓ AND 跌幅小于0.9%,第二天的最低点加一个最小单位平多并开空
        IF ALL_DOWN AND ABS(DF)<0.9 AND POSITION=1 AND  BUYORDERTHISBAR=0 THEN BEGIN
            CLOANDOPN :=1;        //一平一开标记
            // POSITION := 0; 
            TURTLEUNITS := 0 ;
            FLAG_DOWN :=1;//当天要作为标记
            FLAG_UP :=0;
            FIRST_L :=L;
            N := ATR ;
            LO_lOSS_PRICE :=0 ;
            LO_lOSS_FLAG :=0;
            SHCLOPRICE : =0 ;
            SHCLOPRICE_FLAG :=0;
        END 
        
        //④6个交易日后按P-0.2N止损(包含突破当天)
        IF  ENTERDAY>=6 AND C<MYENTRYPRICE-0.2*N AND POSITION=1 AND BUYORDERTHISBAR=0 THEN BEGIN
             SELL( _DEBUG ,0,LIMITR,CLOSE),ignorecheckprice;
             POSITION := 0 ;
             TURTLEUNITS := 0 ;
             IS_OPERATE := 0;
            //止损后如果满足开空条件,则要作为标记
             FLAG_DOWN := IFELSE(ALL_DOWN,1,0);
             FLAG_UP :=IFELSE(ALL_UP,1,0);;
             FIRST_L := IFELSE(ALL_DOWN,L,0);
             FIRST_H := IFELSE(ALL_UP,H,0);
             N := IFELSE(ALL_UP OR ALL_DOWN,ATR,0);
             LO_lOSS_PRICE :=0 ;
             LO_lOSS_FLAG :=0;
             SHCLOPRICE : =0 ;
             SHCLOPRICE_FLAG :=0;
        END 
        
END

//如果当前持有空头仓位的状态
IF POSITION=-1 THEN BEGIN
        
        //建立空头止损条件
        IF NOT(SHCLOPRICE_FLAG) THEN BEGIN    
                //①价格涨到P+1.2*N 
                SHCLOPRICE :=MYENTRYPRICE + 1.2*N;
            //②价格跌幅达到P-N,止损价格为P+0.2*N 
            IF  LOW<MYENTRYPRICE - N THEN BEGIN
                 SHORTX1 := C > MYENTRYPRICE + 0.2*N;
                 SHCLOPRICE :=MYENTRYPRICE + 0.2*N;
                 SHCLOPRICE_FLAG :=1;
            END  
        END 
        //满足①时用最高价>1.2N止损,满足②时用收盘价>0.2N止损,注意用最高价大于止损价会存在经过止损价时就平仓
        SHORTX2 := HIGH > SHCLOPRICE ;
      	
        IF (SHORTX1 OR SHORTX2) AND POSITION=-1 AND BUYORDERTHISBAR=0 THEN BEGIN
             MYEXITPRICE := IF(OPEN>SHCLOPRICE ,OPEN ,SHCLOPRICE ) ;                
             MYEXITPRICE := FLOOR(MYEXITPRICE/MINDIFF)*MINDIFF ;      
             SELLSHORT( _DEBUG,0,LIMITR,MYEXITPRICE),ignorecheckprice;
             POSITION := 0 ;
             TURTLEUNITS := 0 ;
             IS_OPERATE := 0;
             //止损后如果满足开空条件,则要作为标记
             FLAG_UP := IFELSE(ALL_UP,1,0);
             FLAG_DOWN :=IFELSE(ALL_DOWN,1,0);
             FIRST_H := IFELSE(ALL_UP,H,0);
             FIRST_L := IFELSE(ALL_DOWN,L,0);
             N := IFELSE(ALL_UP OR ALL_DOWN,ATR,0);
             LO_lOSS_PRICE :=0 ;
             LO_lOSS_FLAG :=0;
             SHCLOPRICE : =0 ;
             SHCLOPRICE_FLAG :=0;
        END   
        //③MACD↑ AND DIFF ↑ AND 涨幅大于0.9%
        SHORTX1 :=ALL_UP AND ABS(DF)>0.9;
        IF SHORTX1 AND POSITION=-1 AND BUYORDERTHISBAR=0  THEN BEGIN
            SELLSHORT( _DEBUG,0,LIMITR,CLOSE),ignorecheckprice;
            POSITION := 0 ;
            TURTLEUNITS := 0 ;
            FLAG_UP :=1;//当天也要作为标记
            FLAG_DOWN :=0;
            FIRST_H :=H;
            N := ATR ;
            IS_OPERATE := 0;
            LO_lOSS_PRICE :=0 ;
            LO_lOSS_FLAG :=0;
            SHCLOPRICE : =0 ;
            SHCLOPRICE_FLAG :=0;
        END
         //③MACD↑ AND DIFF ↑ AND 涨幅小于0.9%,第二天的最高点加一个最小单位平空并开多
        IF ALL_UP AND ABS(DF)<0.9 AND POSITION=-1 AND BUYORDERTHISBAR= 0 THEN BEGIN
            CLOANDOPN := 1;        //一平一开标记
            // POSITION := 0 ;  不允许重置为0,为导致开多单                      
            TURTLEUNITS := 0 ;
            FLAG_UP :=1;        //当天也要作为标记
            FLAG_DOWN :=0;
            FIRST_H :=H;
            N := ATR ;
            LO_lOSS_PRICE :=0 ;
            LO_lOSS_FLAG :=0;
            SHCLOPRICE : =0 ;
            SHCLOPRICE_FLAG :=0;
        END
        //④6个交易日后按P+0.2N止损(包含突破当天)
        IF  ENTERDAY>=6 AND C>MYENTRYPRICE+0.2*N AND POSITION=-1 AND BUYORDERTHISBAR=0 THEN BEGIN
             SELLSHORT( _DEBUG ,0,LIMITR,CLOSE),ignorecheckprice;
             POSITION := 0 ;
             TURTLEUNITS := 0 ;
             IS_OPERATE := 0;
             //止损后如果满足开空条件,则要作为标记
             FLAG_UP := IFELSE(ALL_UP,1,0);
             FLAG_DOWN :=IFELSE(ALL_DOWN,1,0);
             FIRST_H := IFELSE(ALL_UP,H,0);
             FIRST_L := IFELSE(ALL_DOWN,L,0);
             N := IFELSE(ALL_UP OR ALL_DOWN,ATR,0);
             LO_lOSS_PRICE :=0 ;
             LO_lOSS_FLAG :=0;
             SHCLOPRICE : =0 ;
             SHCLOPRICE_FLAG :=0;
             
        END   
END


//显示账户状态
{CONTINUELINE@ 资产:ASSET,LINETHICK0;
可用现金:CASH(0),LINETHICK0;
POS:HOLDING,LINETHICK0;
交易次数:TOTALDAYTRADE, LINETHICK0 ;

当前持仓:HOLDING,COLORGRAY,LINETHICK0;
当前资产:ASSET,NOAXIS,COLORGRAY;}



补充内容 (2023-9-26 09:12):
是否会是回测前期的时间区间的MACD和DIFF的值和图表上的不一致,导致代码逻辑不一样呢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号? 微信登录

x
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-9-26 09:17 | 显示全部楼层
代码的逻辑是没有问题的。这种差异 本质上是数据起点差异导致的,或者通俗点说相同的下单逻辑,从不同时间开始执行,结果就是有偏差的。

就举个简单例子 我开仓条件 就是阳线 不加仓,你回测时间不一样,你开仓位置直接就是有差异,如果还有止盈。那么很可能你当前开仓位置 是一个回测时间下的平仓位置,你能说这个信号不对吗?

金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

9

主题

45

帖子

45

积分

Rank: 1

等级: 新手上路

注册:
2023-9-4
曾用名:
 楼主| 发表于 2023-9-26 09:40 | 显示全部楼层
技术009 发表于 2023-9-26 09:17
代码的逻辑是没有问题的。这种差异 本质上是数据起点差异导致的,或者通俗点说相同的下单逻辑,从不同时间 ...

那其实就是说数据起点刚开始的那段时间的MACD和DIFF这些值和图表上的会有一些差异,才会导致开平仓的逻辑不太一样了。那有什么设置能把回测上数据不管什么时间区间的MACD这些变量值都跟图表上的保持一致吗?已经尝试过用 图表加载策略,左上角策略名称上点右键-》公式测试 的方式回测过了,还是说就是刚开始的区间就是会有些差异在
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-9-26 09:52 | 显示全部楼层
macd 指标差异是一部分原因,其他的的代码逻辑同样也会受到数据起点差异 导致走向有差异。
只要你数据起点不一样,理论上就无法保证回测结果总是一样的。

“已经尝试过用 图表加载策略,左上角策略名称上点右键-》公式测试 的方式回测过了” 这个方式 一般是可以采纳图上数据来回测,如果你本地还不行,应该是你操作上还有不当的地方。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

9

主题

45

帖子

45

积分

Rank: 1

等级: 新手上路

注册:
2023-9-4
曾用名:
 楼主| 发表于 2023-9-26 10:07 | 显示全部楼层
技术009 发表于 2023-9-26 09:52
macd 指标差异是一部分原因,其他的的代码逻辑同样也会受到数据起点差异 导致走向有差异。
只要你数据起点 ...

”请问本地不行,操作不当”一般是哪里设置的问题?还需要哪里设置呢
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-9-26 10:14 | 显示全部楼层
你直接群里找客服远程看下吧。相关的设置太多,可能一个不留意就设置到了都有可能。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-31 05:02 , Processed in 0.126383 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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