金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 396|回复: 9

为什么加完仓,就在当根k线就平仓呢

[复制链接]

4622

主题

4709

帖子

4734

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-6-10 13:14 | 显示全部楼层 |阅读模式
我量化程序的加仓环节:为什么加完仓,就在当根k线就平仓呢?采用的是macd金叉死叉;
备注:没有触及止损线和系统设置的平仓要求;
截图202506101313387106.png

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

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2025-6-10 13:22 | 显示全部楼层
提供相应的代码。否则只从信号结果无法定位问题的。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2025-6-10 13:22 | 显示全部楼层
提供相应的代码。否则只从信号结果无法定位问题的。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

8

主题

33

帖子

33

积分

Rank: 1

等级: 新手上路

注册:
2025-3-12
曾用名:
发表于 2025-6-10 13:51 | 显示全部楼层
// 均线系统
MA240:=MA(CLOSE,MA240周期);
MA20:=MA(CLOSE,MA20周期);
MA60:=MA(CLOSE,MA60周期);
MAday:=STKINDI('','ma.ma3(60)',0,6,0);   
c60:=MA(CLOSE,60) - 5*MINDIFF;
c61:=MA(CLOSE,60) + 5*MINDIFF;

// MACD指标
DIFF := EMA(CLOSE,12) - EMA(CLOSE,26);
DEA := EMA(DIFF,9);
MACD := 2*(DIFF-DEA);
水上金叉 := CROSS(DIFF, DEA) AND DIFF > 0;
水下死叉 := CROSS(DEA, DIFF) AND DIFF < 0;

END ELSE BEGIN
    // 加仓逻辑 - 多单
    IF HOLDING > 0 AND 加仓次数 < 2 AND 水上金叉 AND CLOSE > MA60 AND 被打止损 = 0 THEN BEGIN
        BUY(1, 加仓手数, MARKET);
        加仓次数 := 加仓次数 + 1;
        // 更新止损位为最新加仓价格的移动止损
        zs1 := MAX(zs1, CLOSE - 移动止损点数*MINDIFF);
    END
   
    // 加仓逻辑 - 空单
    IF HOLDING < 0 AND 加仓次数 < 2 AND 水下死叉 AND CLOSE < MA60 AND 被打止损 = 0 THEN BEGIN
        BUYSHORT(1, 加仓手数, MARKET);
        加仓次数 := 加仓次数 + 1;
        // 更新止损位为最新加仓价格的移动止损
        zs1 := MIN(zs1, CLOSE + 移动止损点数*MINDIFF);
    END
   
    // 移动止损逻辑
    IF HOLDING > 0 THEN BEGIN
        // 多头移动止损(跟踪最高价)
        zs1 := MAX(zs1, HIGH - 移动止损点数*MINDIFF);
    END ELSE IF HOLDING < 0 THEN BEGIN
        // 空头移动止损(跟踪最低价)
        zs1 := MIN(zs1, LOW + 移动止损点数*MINDIFF);
    END
   
    // 平仓条件
    IF HOLDING > 0 AND (死叉条件 OR CLOSE <= zs1 OR CLOSE < c60) THEN BEGIN
        SELL(1, ABS(HOLDING), MARKET);
        IF CLOSE <= zs1 THEN BEGIN  // 记录被打止损
            被打止损 := 1;
            止损价格 := CLOSE;
        END
        加仓次数 := 0;  // 重置加仓次数
    END
    IF HOLDING < 0 AND (金叉条件 OR CLOSE >= zs1 OR CLOSE > c61) THEN BEGIN
        SELLSHORT(1, ABS(HOLDING), MARKET);
        IF CLOSE >= zs1 THEN BEGIN  // 记录被打止损
            被打止损 := -1;
            止损价格 := CLOSE;
        END
        加仓次数 := 0;  // 重置加仓次数
    END
回复

使用道具 举报

8

主题

33

帖子

33

积分

Rank: 1

等级: 新手上路

注册:
2025-3-12
曾用名:
发表于 2025-6-10 13:51 | 显示全部楼层
只是提供加仓部分和止损止盈部分的代码
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2025-6-10 14:44 | 显示全部楼层
把 c60 和zs1的值输出看下。

以空头为例 你这个平仓除了金叉,就是这2个变量值和收盘价的关系。既然触发了说明这2个条件中至少有一个是满足的。但是大概率是zs1这里触发的。
截图202506101444528215.png

只要收盘价比最低价大一定点数 CLOSE >= zs1 是肯定会满足的。







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

使用道具 举报

0

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
gxx978
发表于 2025-6-10 14:48 | 显示全部楼层
1、这个首先就是需要调试你的代码,你提供的部分代码,我们没法完整调试,不知道这个平仓信号具体是哪条语句触发的。你需要先找到这个平仓是哪条平仓语句触发的,才可以重点排查那个条件,出现信号,肯定是条件满足了,如果信号和预期的不符,那只能优化这个平仓条件了。
2、你可以把鼠标移到信号位置上,即可知道这个信号是哪条语句触发的,再来排除那条语句的条件。
截图202506101448405356.png
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

8

主题

33

帖子

33

积分

Rank: 1

等级: 新手上路

注册:
2025-3-12
曾用名:
发表于 2025-6-10 15:10 | 显示全部楼层
完整程序:
INPUT: MA240周期(240), MA20周期(20), MA60周期(60), 手数(10,1,20,1), 加仓手数(1,1,20,1), 移动止损点数(35);

// 声明普通全局变量(图表级)
VARIABLE:
    zs1:=0,               // 初始化止损位
    被打止损:=0,          // 记录是否被打止损
    止损价格:=0,          // 记录止损时的价格
    加仓次数:=0;          // 记录加仓次数

// 均线系统
MA240:=MA(CLOSE,MA240周期);
MA20:=MA(CLOSE,MA20周期);
MA60:=MA(CLOSE,MA60周期);
MAday:=STKINDI('','ma.ma3(60)',0,6,0);   
c60:=MA(CLOSE,60) - 5*MINDIFF;
c61:=MA(CLOSE,60) + 5*MINDIFF;

// MACD指标
DIFF := EMA(CLOSE,12) - EMA(CLOSE,26);
DEA := EMA(DIFF,9);
MACD := 2*(DIFF-DEA);
水上金叉 := CROSS(DIFF, DEA) AND DIFF > 0;
水下死叉 := CROSS(DEA, DIFF) AND DIFF < 0;

// 方向判断模块
多空方向 := IFF(CLOSE >= MA240 AND CLOSE >= MAday, 1, -1);

// 交易信号模块
金叉条件 := CROSS(MA20, MA60) AND REF(CLOSE,1) >= REF(MA60,1);
死叉条件 := CROSS(MA60, MA20) AND REF(CLOSE,1) <= REF(MA60,1);

// 主交易系统
IF HOLDING = 0 THEN BEGIN
    // 开多条件
    IF 多空方向 = 1 AND 金叉条件 THEN BEGIN
        BUY(1, 手数, MARKET);
        zs1 := CLOSE - 移动止损点数*MINDIFF;  // 初始化多头止损
        被打止损 := 0;  // 重置被打止损标志
        加仓次数 := 0;  // 重置加仓次数
    END
   
    // 开空条件
    IF 多空方向 = -1 AND 死叉条件 THEN BEGIN
        BUYSHORT(1, 手数, MARKET);
        zs1 := CLOSE + 移动止损点数*MINDIFF;  // 初始化空头止损
        被打止损 := 0;  // 重置被打止损标志
        加仓次数 := 0;  // 重置加仓次数
    END
   
    // 回补仓逻辑 - 多单
    IF 被打止损 = 1 AND 水上金叉 AND CLOSE > MA60 THEN BEGIN
        BUY(1, 手数, MARKET);
        zs1 := CLOSE - 移动止损点数*MINDIFF;
        被打止损 := 0;  // 重置被打止损标志
        加仓次数 := 0;  // 重置加仓次数
    END
   
    // 回补仓逻辑 - 空单
    IF 被打止损 = -1 AND 水下死叉 AND CLOSE < MA60 THEN BEGIN
        BUYSHORT(1, 手数, MARKET);
        zs1 := CLOSE + 移动止损点数*MINDIFF;
        被打止损 := 0;  // 重置被打止损标志
        加仓次数 := 0;  // 重置加仓次数
    END
END ELSE BEGIN
    // 加仓逻辑 - 多单
    IF HOLDING > 0 AND 加仓次数 < 2 AND 水上金叉 AND CLOSE > MA60 AND 被打止损 = 0 THEN BEGIN
        BUY(1, 加仓手数, MARKET);
        加仓次数 := 加仓次数 + 1;
        // 更新止损位为最新加仓价格的移动止损
        zs1 := MAX(zs1, CLOSE - 移动止损点数*MINDIFF);
    END
   
    // 加仓逻辑 - 空单
    IF HOLDING < 0 AND 加仓次数 < 2 AND 水下死叉 AND CLOSE < MA60 AND 被打止损 = 0 THEN BEGIN
        BUYSHORT(1, 加仓手数, MARKET);
        加仓次数 := 加仓次数 + 1;
        // 更新止损位为最新加仓价格的移动止损
        zs1 := MIN(zs1, CLOSE + 移动止损点数*MINDIFF);
    END
   
    // 移动止损逻辑
    IF HOLDING > 0 THEN BEGIN
        // 多头移动止损(跟踪最高价)
        zs1 := MAX(zs1, HIGH - 移动止损点数*MINDIFF);
    END ELSE IF HOLDING < 0 THEN BEGIN
        // 空头移动止损(跟踪最低价)
        zs1 := MIN(zs1, LOW + 移动止损点数*MINDIFF);
    END
   
    // 平仓条件
    IF HOLDING > 0 AND (死叉条件 OR CLOSE <= zs1 OR CLOSE < c60) THEN BEGIN
        SELL(1, ABS(HOLDING), MARKET);
        IF CLOSE <= zs1 THEN BEGIN  // 记录被打止损
            被打止损 := 1;
            止损价格 := CLOSE;
        END
        加仓次数 := 0;  // 重置加仓次数
    END
    IF HOLDING < 0 AND (金叉条件 OR CLOSE >= zs1 OR CLOSE > c61) THEN BEGIN
        SELLSHORT(1, ABS(HOLDING), MARKET);
        IF CLOSE >= zs1 THEN BEGIN  // 记录被打止损
            被打止损 := -1;
            止损价格 := CLOSE;
        END
        加仓次数 := 0;  // 重置加仓次数
    END
END

// 仓位管理模块
IF HOLDING > 手数 THEN BEGIN
    SELL(1, HOLDING - 手数, MARKET);
END
IF HOLDING < -手数 THEN BEGIN
    SELLSHORT(1, ABS(HOLDING) - 手数, MARKET);
END

// 状态监控
AA: zs1, COLORRED;  // 显示动态止损线
当前持仓:HOLDING,COLORGRAY,LINETHICK0;
被打止损标志:被打止损,COLORGRAY,LINETHICK0;
加仓次数显示:加仓次数,COLORGRAY,LINETHICK0;

1、我试过将鼠标移到信号位置,什么都不显示啊?
回复

使用道具 举报

8

主题

33

帖子

33

积分

Rank: 1

等级: 新手上路

注册:
2025-3-12
曾用名:
发表于 2025-6-10 15:11 | 显示全部楼层
我试过将鼠标移到信号位置,什么都不显示啊?
jietu.png
回复

使用道具 举报

0

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
gxx978
发表于 2025-6-10 15:21 | 显示全部楼层
1、不能在十字光标的情况下显示啊,去掉十字光标,单独移动鼠标才会弹出浮窗。
2、也可以在平仓语句前加变量,来判断时哪个平仓语句触发的。你这个加仓后立即平仓,时你代码后面的仓位管理中触发的啊,代码时从上往下计算的,加仓后,holding就变化了,那和数量笔,不一样,就触发平仓了啊,你需要检查你这个仓位管理的代码逻辑啊。
截图202506101521369153.png
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-30 03:34 , Processed in 0.125248 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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