金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 380|回复: 30

基准差

[复制链接]

2

主题

20

帖子

30

积分

Rank: 6Rank: 6

等级: 机构版

注册:
2023-2-16
曾用名:
发表于 2026-3-30 16:35 | 显示全部楼层 |阅读模式
{
  策略描述:基于开盘价的网格交易策略
  逻辑:
  1. 获取每日开盘价作为基准价格
  2. 计算基准差(最小变动价*10)
  3. 多单网格:价格每下跌基准差*10开多1手,平仓价为开仓价+基准差*10
  4. 空单网格:价格每上涨基准差*10开空1手,平仓价为开仓价-基准差*10
  5. 限制最多开仓10次(多空各自)
  6. 收盘前撤销所有委托并平仓
}

// 参数定义
INPUT:MAX_GRID(10); // 最大网格层数

// 变量定义
VARIABLE:BASE_PRICE = 0; // 基准价格(每日开盘价)
VARIABLE:GRID_SIZE = 0; // 网格大小(最小变动价*10)
VARIABLE:LAST_LONG_PRICE = 0; // 上次多单开仓价
VARIABLE:LAST_SHORT_PRICE = 0; // 上次空单开仓价
VARIABLE:LONG_COUNT = 0; // 当前多单层数
VARIABLE:SHORT_COUNT = 0; // 当前空单层数

// 获取每日开盘价
IF TODAYBAR = 1 THEN BEGIN
    BASE_PRICE : =OPEN; // 当日开盘价
    GRID_SIZE := 2; // 网格基准差
    LAST_LONG_PRICE := BASE_PRICE;
    LAST_SHORT_PRICE := BASE_PRICE;
    LONG_COUNT := 0;
    SHORT_COUNT := 0;
END;

AB: BASE_PRICE;;

// 多单网格逻辑
IF CLOSE <= (LAST_LONG_PRICE - GRID_SIZE * 10) AND LONG_COUNT < MAX_GRID THEN BEGIN
    // 开多单
    BUY(1, 1, LIMITR, LAST_LONG_PRICE - GRID_SIZE * 10),ignorecheckprice;
    // 设置平仓委托
    //SELL(1, 1, LIMITR, ENTERPRICE + GRID_SIZE * 10),ignorecheckprice;
    // 更新记录

    LAST_LONG_PRICE := LAST_LONG_PRICE - GRID_SIZE * 10;
    LONG_COUNT := LONG_COUNT + 1;
END;

IF HOLDING()>0 AND ENTERBARS()>0  AND H-LAST_LONG_PRICE>=GRID_SIZE THEN BEGIN
         SELL(1, 1, LIMITR, C),ignorecheckprice;
     END

// 空单网格逻辑
IF CLOSE >= (LAST_SHORT_PRICE + GRID_SIZE * 10) AND SHORT_COUNT < MAX_GRID THEN BEGIN
    // 开空单
    BUYSHORT(1, 1, LIMITR, LAST_SHORT_PRICE + GRID_SIZE * 10),ignorecheckprice;
    // 设置平仓委托
    //SELLSHORT(1, 1, LIMITR, ENTERPRICE - GRID_SIZE * 10),ignorecheckprice;
    // 更新记录
    LAST_SHORT_PRICE := LAST_SHORT_PRICE + GRID_SIZE * 10;
    SHORT_COUNT := SHORT_COUNT + 1;
END;

IF HOLDING()<0 AND ENTERBARS()>0  AND LAST_SHORT_PRICE-L>=GRID_SIZE THEN BEGIN
         SELLSHORT(1, 1, LIMITR, C),ignorecheckprice;
END

// 收盘前处理
IF TIME = CLOSETIME(0) THEN BEGIN
    // 撤销所有委托单
    // TODO:需要确认PEL中撤销委托的函数
    // GAP:缺少撤销委托单的函数

    // 平掉所有持仓
    IF HOLDING > 0 THEN BEGIN
        SELL(1, HOLDING, MARKETR);
    END;
    IF HOLDING < 0 THEN BEGIN
        SELLSHORT(1, ABS(HOLDING), MARKETR);
    END;

    // 重置网格状态
    LONG_COUNT := 0;
    SHORT_COUNT := 0;
     LAST_LONG_PRICE := 0;
    LAST_SHORT_PRICE := 0;
END;

// 显示信息
DRAWTEXT(TODAYBAR=1,LOW,'基准价:'+NUMTOSTR(BASE_PRICE,2),COLORWHITE);
DRAWTEXT(TODAYBAR=1,LOW-10*MINDIFF,'网格大小:'+NUMTOSTR(GRID_SIZE*10,2),COLORWHITE);
DRAWTEXT(TODAYBAR=1,LOW-20*MINDIFF,'多单层数:'+NUMTOSTR(LONG_COUNT,0),COLORRED);
DRAWTEXT(TODAYBAR=1,LOW-30*MINDIFF,'空单层数:'+NUMTOSTR(SHORT_COUNT,0),COLORGREEN);
麻烦帮忙修改下,想变成每一次多单开仓对应的平仓均是开仓成本价+网格基准差,然后空单也是如此,每天限制多空各10次

回复

使用道具 举报

2

主题

6366

帖子

6366

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2026-3-30 17:38 | 显示全部楼层
你是要每一笔平仓和开仓都一一对应?

回复

使用道具 举报

2

主题

20

帖子

30

积分

Rank: 6Rank: 6

等级: 机构版

注册:
2023-2-16
曾用名:
 楼主| 发表于 2026-3-31 09:27 | 显示全部楼层
资深技术05 发表于 2026-3-30 17:38
你是要每一笔平仓和开仓都一一对应?

是的,每笔开仓对应每一笔的平仓
回复

使用道具 举报

2

主题

6366

帖子

6366

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2026-3-31 10:55 | 显示全部楼层
尝试下来只能使用数组。

代码如下,注意为了测试方便这里我定义了一个GRID_DIF  ,等同于你源代码里的  GRID_SIZE * 10 这里的数值10   :
[PEL] 复制代码
// 参数定义
INPUT:MAX_GRID(10); // 最大网格层数

// 变量定义
VARIABLE:BASE_PRICE = 0; // 基准价格(每日开盘价)
VARIABLE:GRID_SIZE = 0; // 网格大小(最小变动价*10)
VARIABLE:LAST_LONG_PRICE = 0; // 上次多单开仓价
VARIABLE:LAST_SHORT_PRICE = 0; // 上次空单开仓价
VARIABLE:LONG_COUNT = 0; // 当前多单层数
VARIABLE:SHORT_COUNT = 0; // 当前空单层数

VARIABLE:P1[MAX_GRID]:=0,P2[MAX_GRID]:=0;

// 获取每日开盘价
IF TODAYBAR = 1 THEN BEGIN
        
        initbound(P1,0);
        initbound(p2,0);
    BASE_PRICE : =OPEN; // 当日开盘价
    GRID_SIZE := 2; // 网格基准差
    GRID_DIF:=2;
    
    LAST_LONG_PRICE := BASE_PRICE;
    LAST_SHORT_PRICE := BASE_PRICE;
    
    LONG_COUNT := 0;
    SHORT_COUNT := 0;
END;

AB: BASE_PRICE;

// 多单网格逻辑
IF CLOSE <= (LAST_LONG_PRICE - GRID_SIZE * GRID_SIZE) AND LONG_COUNT < MAX_GRID THEN BEGIN
    // 开多单
    BUY(1, 1, LIMITR, LAST_LONG_PRICE - GRID_SIZE * GRID_SIZE),ignorecheckprice;
    LONG_COUNT := LONG_COUNT + 1;
    P1[LONG_COUNT]:=LAST_LONG_PRICE;
    LAST_LONG_PRICE := LAST_LONG_PRICE - GRID_SIZE * GRID_SIZE; 
    
END;


当前平多:0;
FOR I=1 TO MAX_GRID DO 
BEGIN

IF         P1[I]=0 THEN CONTINUE;

IF H>P1[I] AND HOLDING>0 AND ENTERBARS>0 THEN 
BEGIN
SELL(1,1,LIMITR,P1[I]),IGNORECHECKPRICE;
P1[I]:=0;
当前平多:=I;
BREAK;         
END         
         
END 

PX:=ENTERPRICE;
PY:=EXITPRICE;



// 空单网格逻辑
IF CLOSE >= (LAST_SHORT_PRICE + GRID_SIZE * 10) AND SHORT_COUNT < MAX_GRID THEN BEGIN
    // 开空单
    BUYSHORT(1, 1, LIMITR, LAST_SHORT_PRICE + GRID_SIZE * 10),ignorecheckprice;
    SHORT_COUNT := SHORT_COUNT + 1;
    P2[SHORT_COUNT]:=LAST_LONG_PRICE;
    LAST_SHORT_PRICE := LAST_SHORT_PRICE + GRID_SIZE * 10;
    
END;

当前平空:0;
FOR I=1 TO MAX_GRID DO 
BEGIN

IF         P2[I]=0 THEN CONTINUE;

IF L<P2[I] AND HOLDING<0 AND ENTERBARS>0 THEN 
BEGIN
SELLSHORT(1,1,LIMITR,P2[I]),IGNORECHECKPRICE;
P2[I]:=0;
当前平空:=I;
BREAK;         
END         
         
END 

// 收盘前处理
IF TIME = CLOSETIME(0) THEN BEGIN
    // 撤销所有委托单
    // TODO:需要确认PEL中撤销委托的函数
    // GAP:缺少撤销委托单的函数

    // 平掉所有持仓
    IF HOLDING > 0 THEN BEGIN
        收盘平多:SELL(1, HOLDING, MARKETR);
    END;
    IF HOLDING < 0 THEN BEGIN
        收盘平空:SELLSHORT(1, ABS(HOLDING), MARKETR);
    END;

    // 重置网格状态
    LONG_COUNT := 0;
    SHORT_COUNT := 0;
     LAST_LONG_PRICE := 0;
    LAST_SHORT_PRICE := 0;
END;

持仓:holding;



截图202603311055029378.png
回复

使用道具 举报

2

主题

20

帖子

30

积分

Rank: 6Rank: 6

等级: 机构版

注册:
2023-2-16
曾用名:
 楼主| 发表于 2026-3-31 11:37 | 显示全部楼层
资深技术05 发表于 2026-3-31 10:55
尝试下来只能使用数组。

代码如下,注意为了测试方便这里我定义了一个GRID_DIF  ,等同于你源代码里的   ...

这里好像多单在止盈的那根K线的过程中,也满足空单的条件了,但是好像回测的时候没有开空单,我定为5*5,25个点,今天中证500的开盘1分钟线9点38就满足止盈多单和开空,但是没有开空单,麻烦看下哈
回复

使用道具 举报

2

主题

20

帖子

30

积分

Rank: 6Rank: 6

等级: 机构版

注册:
2023-2-16
曾用名:
 楼主| 发表于 2026-3-31 13:00 | 显示全部楼层
这里还是一样的,开的空单,基准差是25个点,这里的最低点超过25个点了,这里应该平仓的,但是没有显示平仓
366AD69DDE0C44d586B622BAB9918A86.png
回复

使用道具 举报

2

主题

6366

帖子

6366

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2026-3-31 13:29 | 显示全部楼层
这个你要输出下 具体开仓价,再对比你标记那个K最低价。

你标记的位置我看不出来具体位置在什么地方,周期时间都看不到。但是我本地核算下来是没有问题的。

追加1条输出,放到代码最后面:

PX:ENTERPRICE;


“今天中证500的开盘1分钟线9点38就满足止盈多单和开空” 。我不知道你说的是不是这个位置,但是这里不是有一个开空的么。另外你代码里开仓判断是用的收盘价,所以你比较时候要看收盘价和基准价关系。平仓你是用的最低和最高价。

截图202603311328253581.png


回复

使用道具 举报

2

主题

20

帖子

30

积分

Rank: 6Rank: 6

等级: 机构版

注册:
2023-2-16
曾用名:
 楼主| 发表于 2026-3-31 13:46 | 显示全部楼层
资深技术05 发表于 2026-3-31 13:29
这个你要输出下 具体开仓价,再对比你标记那个K最低价。

你标记的位置我看不出来具体位置在什么地方,周 ...


// 获取每日开盘价
IF TODAYBAR = 1 THEN BEGIN
         
        initbound(P1,0);
        initbound(p2,0);
    BASE_PRICE : =OPEN; // 当日开盘价
    GRID_SIZE := 5; // 网格基准差
    GRID_DIF:=2;
     
    LAST_LONG_PRICE := BASE_PRICE;
    LAST_SHORT_PRICE := BASE_PRICE;
     
    LONG_COUNT := 0;
    SHORT_COUNT := 0;
END;
上述的代码里我只修改了 GRID_SIZE := 5; // 网格基准差,将10改为5,没有动别的,但是中证500哪里我就没有看到开空的信号
回复

使用道具 举报

2

主题

20

帖子

30

积分

Rank: 6Rank: 6

等级: 机构版

注册:
2023-2-16
曾用名:
 楼主| 发表于 2026-3-31 13:51 | 显示全部楼层
这里就是你这边发的代码里,我将网格基准查有10改为5,运行的,这里是中证500,27号的图形显示
705C5C2FF7514135988072869C371C4F.png
回复

使用道具 举报

2

主题

6366

帖子

6366

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2026-3-31 13:54 | 显示全部楼层
改漏了一个地方,空单这里,GRID_DIF 忘了替换过去了

// 空单网格逻辑
IF CLOSE >= (LAST_SHORT_PRICE + GRID_SIZE * GRID_DIF) AND SHORT_COUNT < MAX_GRID THEN BEGIN
    // 开空单
    BUYSHORT(1, 1, LIMITR, LAST_SHORT_PRICE + GRID_SIZE * GRID_DIF),ignorecheckprice;
    SHORT_COUNT := SHORT_COUNT + 1;
    P2[SHORT_COUNT]:=LAST_LONG_PRICE;
    LAST_SHORT_PRICE := LAST_SHORT_PRICE + GRID_SIZE * GRID_DIF;
   
END;
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-3 01:45 , Processed in 0.192454 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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