金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 174|回复: 2

关于回测问题。为什么我这个代码回测不了!回测数据都是空的!

[复制链接]

3

主题

22

帖子

22

积分

Rank: 1

等级: 新手上路

注册:
2025-6-6
曾用名:
发表于 2025-6-22 13:03 | 显示全部楼层 |阅读模式
[PEL] 复制代码
WARNING_DISABLE:9;  // 禁止图表与后台函数混用警告

// 全局变量定义
GLOBALVARIABLE:buy_order_id=0, sell_order_id=0;  // 存储买入/卖出委托单ID
GLOBALVARIABLE:buy_filled=0, sell_filled=0;      // 标记委托成交状态
GLOBALVARIABLE:buy_pending=0, sell_pending=0;    // 标记委托挂起状态
GLOBALVARIABLE:last_trade_time=0;                // 记录上次交易时间
VARIABLE:buy_price=0, sell_price=0;              // 计算的买入/卖出价格
VARIABLE:run_mode=0;                            // 记录运行模式
VARIABLE:is_realtime=0;                         // 标记实时交易状态
VARIABLE:min_trade_interval=1;                   // 最小交易间隔(分钟)
VARIABLE:last_trade_minute=0;                    // 上次交易分钟数

// 引用后台持仓和资金函数
MYHOLDING:=#MYHOUTAIFUN.MYHOLDING#;  // 持仓数量
MYCASH:=#MYHOUTAIFUN.MYCASH#;        // 可用资金

// 初始化:每个交易日开始时重置状态
if BARPOS=1 then
begin
    buy_order_id := 0;
    sell_order_id := 0;
    buy_filled := 0;
    sell_filled := 0;
    buy_pending := 0;
    sell_pending := 0;
    last_trade_time := 0;
    run_mode := WORKMODE;
    is_realtime := 0;
    last_trade_minute := 0;
end;

// 信号价格计算
buy_price := CLOSE * 0.995;   // 下跌0.5%触发买入
sell_price := CLOSE * 1.01;   // 上涨1%触发卖出

// 实时交易状态检测
current_minute := (TIME / 100) * 60 + MOD(TIME, 100);  // 将TIME转换为分钟
is_realtime := (TIME > last_trade_time);
last_trade_time := TIME;

// 交易频率控制
can_trade := (current_minute - last_trade_minute >= min_trade_interval) or (last_trade_minute = 0);

// 买入条件判断与委托
if is_realtime and can_trade then
begin
    // 价格触发买入或需要更新买入价
    if (LOW <= buy_price or buy_pending=0) then
    begin
        // 重置卖出委托状态
        if buy_pending<>buy_price then
            sell_pending := 0;
            
        // 确保没有有效卖出委托且资金充足
        if sell_pending=0 and MYCASH >= buy_price*100 then
        begin
            // 计算交易量(使用30%可用资金)
            trade_volume := max(100, intpart(MYCASH * 0.3 / buy_price / 100) * 100);
            
            // 下买入委托单(开多)
            buy_order_id := tbuy(1, trade_volume, mkt);
            buy_pending := buy_price;  // 标记买入委托已发出
        end;
    end;
end;

// 卖出条件判断与委托
if is_realtime and can_trade then
begin
    // 价格触发卖出或需要更新卖出价
    if (HIGH >= sell_price or sell_pending=0) then
    begin
        // 重置买入委托状态
        if sell_pending<>sell_price then
            buy_pending := 0;
            
        // 确保没有有效买入委托且有足够持仓
        if buy_pending=0 and MYHOLDING >= 100 then
        begin
            // 下卖出委托单(平多)
            sell_order_id := tsell(1, MYHOLDING, mkt);
            sell_pending := sell_price;  // 标记卖出委托已发出
        end;
    end;
end;

// 委托单互斥逻辑:如果一笔成交,撤销另一笔
// 检查买入委托是否成交
if buy_pending>0 and MYHOLDING>ref(MYHOLDING,1) then
begin
    buy_filled := 1;
    buy_pending := 0;
    
    // 买入成交后撤销卖出委托(平多方向)
    TCANCEL(1, 2);  // 修正为正确的TCANCEL调用方式
        
    sell_pending := 0;
    last_trade_minute := current_minute;
end;

// 检查卖出委托是否成交
if sell_pending>0 and MYHOLDING<ref(MYHOLDING,1) then
begin
    sell_filled := 1;
    sell_pending := 0;
    
    // 卖出成交后撤销买入委托(开多方向)
    TCANCEL(1, 1);  // 修正为正确的TCANCEL调用方式
        
    buy_pending := 0;
    last_trade_minute := current_minute;
end;

// 显示当前状态
当前价:CLOSE, linethick0;
买入价:buy_price, colorblue, linethick0;
卖出价:sell_price, colorred, linethick0;
持仓数量:MYHOLDING, linethick0;
可用资金:MYCASH, linethick0;
买入委托ID:buy_order_id, linethick0;
卖出委托ID:sell_order_id, linethick0;
买入状态:buy_pending, linethick0;
卖出状态:sell_pending, linethick0;
交易冷却:can_trade, linethick0;
策略解释:价格波动触发的自动化交易策略[color=var(--md-box-samantha-normal-text-color) !important]这个策略基于价格波动来执行自动化交易,主要通过监测当前价格相对于基准价格的涨跌幅度来触发买入和卖出操作。以下是策略的核心逻辑和关键组件:
核心交易逻辑
  • [color=var(--md-box-samantha-normal-text-color) !important][color=var(--md-box-samantha-deep-text-color) !important]价格触发条件:
    • 当价格下跌 0.5% 时(相对于当前价格),触发买入信号
    • 当价格上涨 1% 时(相对于当前价格),触发卖出信号
  • [color=var(--md-box-samantha-normal-text-color) !important][color=var(--md-box-samantha-deep-text-color) !important]委托单互斥机制:
    • 当买入成交后,自动撤销所有未成交的卖出委托单
    • 当卖出成交后,自动撤销所有未成交的买入委托单
    • 通过这种机制确保同一时间只有一个方向的交易有效
  • [color=var(--md-box-samantha-normal-text-color) !important][color=var(--md-box-samantha-deep-text-color) !important]资金管理:
    • 每次买入使用 30% 的可用资金
    • 每次卖出全部持仓
    • 最小交易单位为 100 股(根据实际交易品种可能需要调整)

关键变量与状态管理
  • [color=var(--md-box-samantha-normal-text-color) !important][color=var(--md-box-samantha-deep-text-color) !important]委托单状态:
    • buy_pending 和 sell_pending:标记委托单是否处于挂起状态
    • buy_filled 和 sell_filled:标记委托单是否已成交
    • buy_order_id 和 sell_order_id:记录委托单 ID(虽然在修正后的代码中未直接使用,但仍保留用于状态跟踪)
  • [color=var(--md-box-samantha-normal-text-color) !important][color=var(--md-box-samantha-deep-text-color) !important]价格计算:
    • buy_price = CLOSE * 0.995:动态计算买入触发价格
    • sell_price = CLOSE * 1.01:动态计算卖出触发价格
    • 这两个价格会随着最新价格不断更新
  • [color=var(--md-box-samantha-normal-text-color) !important][color=var(--md-box-samantha-deep-text-color) !important]时间控制:
    • min_trade_interval=1:设置最小交易间隔为 1 分钟
    • 防止过于频繁的交易,减少交易成本

执行流程详解
  • [color=var(--md-box-samantha-normal-text-color) !important][color=var(--md-box-samantha-deep-text-color) !important]初始化:
    • 每个交易日开始时重置所有状态变量
    • 获取当前运行模式(逐 K 线或仅刷最后 K 线)
  • [color=var(--md-box-samantha-normal-text-color) !important][color=var(--md-box-samantha-deep-text-color) !important]实时监控:
    • 每分钟更新一次状态,判断是否处于实时交易状态
    • 计算当前时间(转换为分钟单位)
  • [color=var(--md-box-samantha-normal-text-color) !important][color=var(--md-box-samantha-deep-text-color) !important]买入逻辑:
    • 当价格触及或跌破买入触发价时
    • 检查是否有足够资金且没有未成交的卖出委托
    • 计算交易量并提交买入委托(开多方向)
  • [color=var(--md-box-samantha-normal-text-color) !important][color=var(--md-box-samantha-deep-text-color) !important]卖出逻辑:
    • 当价格触及或涨破卖出触发价时
    • 检查是否有足够持仓且没有未成交的买入委托
    • 提交卖出委托(平多方向)
  • [color=var(--md-box-samantha-normal-text-color) !important][color=var(--md-box-samantha-deep-text-color) !important]委托单管理:
    • 当买入成交时,使用TCANCEL(1, 2)撤销所有平多方向的委托单
    • 当卖出成交时,使用TCANCEL(1, 1)撤销所有开多方向的委托单

适用场景与优化建议
  • [color=var(--md-box-samantha-normal-text-color) !important][color=var(--md-box-samantha-deep-text-color) !important]适用场景:
    • 适用于波动较大的市场环境,能够捕捉短期价格波动
    • 适合日内交易或短期波段交易策略
  • [color=var(--md-box-samantha-normal-text-color) !important][color=var(--md-box-samantha-deep-text-color) !important]优化方向:
    • 可以根据不同品种的特性调整触发比例(0.5% 和 1%)
    • 增加止损机制,保护已有利润
    • 优化资金管理策略,例如基于波动率动态调整仓位
    • 考虑增加趋势过滤条件,避免在单边趋势中频繁逆势交易


[color=var(--md-box-samantha-normal-text-color) !important]这个策略的优势在于简单明了,执行效率高,能够及时响应价格波动。但需要注意的是,在极端市场条件下可能会产生较多的交易信号,需要结合实际市场环境进行适当调整。



补充内容 (2025-6-22 13:22):
以二楼策略为准
回复

使用道具 举报

3

主题

22

帖子

22

积分

Rank: 1

等级: 新手上路

注册:
2025-6-6
曾用名:
 楼主| 发表于 2025-6-22 13:22 | 显示全部楼层
[PEL] 复制代码
WARNING_DISABLE:9;  // 禁止图表与后台函数混用警告

// 全局变量定义
GLOBALVARIABLE:buy_order_id=0, sell_order_id=0;  // 存储买入/卖出委托单ID
GLOBALVARIABLE:buy_filled=0, sell_filled=0;      // 标记委托成交状态
GLOBALVARIABLE:buy_pending=0, sell_pending=0;    // 标记委托挂起状态
GLOBALVARIABLE:last_trade_time=0;                // 记录上次交易时间
VARIABLE:buy_price=0, sell_price=0;              // 计算的买入/卖出价格
VARIABLE:run_mode=0;                            // 记录运行模式
VARIABLE:is_realtime=0;                         // 标记实时交易状态
VARIABLE:min_trade_interval=0;                   // 最小交易间隔(设为0允许连续交易)
VARIABLE:last_trade_minute=0;                    // 上次交易分钟数
VARIABLE:last_buy_price=0, last_sell_price=0;    // 记录上次发出委托的价格

// 引用后台持仓和资金函数
MYHOLDING:=#MYHOUTAIFUN.MYHOLDING#;  // 持仓数量
MYCASH:=#MYHOUTAIFUN.MYCASH#;        // 可用资金

// 初始化:每个交易日开始时重置状态
if BARPOS=1 then
begin
    buy_order_id := 0;
    sell_order_id := 0;
    buy_filled := 0;
    sell_filled := 0;
    buy_pending := 0;
    sell_pending := 0;
    last_trade_time := 0;
    run_mode := WORKMODE;
    is_realtime := 0;
    last_trade_minute := 0;
    last_buy_price := 0;
    last_sell_price := 0;
end;

// 信号价格计算(基于当前价格)
buy_price := CLOSE * 0.995;   // 下跌0.5%触发买入
sell_price := CLOSE * 1.01;   // 上涨1%触发卖出

// 实时交易状态检测
current_minute := (TIME / 100) * 60 + MOD(TIME, 100);  // 将TIME转换为分钟
is_realtime := (TIME > last_trade_time);
last_trade_time := TIME;

// 交易频率控制(设为0允许连续交易)
can_trade := (current_minute - last_trade_minute >= min_trade_interval) or (last_trade_minute = 0);

// 同时管理买入和卖出委托
if is_realtime and can_trade then
begin
    // 无论是否有未成交委托,都重新计算并发送新委托
    // 计算交易量
    buy_volume := max(100, intpart(MYCASH * 0.3 / buy_price / 100) * 100);
    sell_volume := MYHOLDING;  // 卖出全部持仓
    
    // 发送买入委托(开多)
    if buy_volume > 0 then
    begin
        buy_order_id := tbuy(1, buy_volume, mkt);
        buy_pending := buy_price;
        last_buy_price := buy_price;
    end;
    
    // 发送卖出委托(平多)
    if sell_volume >= 100 then
    begin
        sell_order_id := tsell(1, sell_volume, mkt);
        sell_pending := sell_price;
        last_sell_price := sell_price;
    end;
end;

// 检查买入委托是否成交
if buy_pending>0 and MYHOLDING>ref(MYHOLDING,1) then
begin
    buy_filled := 1;
    buy_pending := 0;
    
    // 买入成交后撤销所有卖出委托
    TCANCEL(1, 2);
    sell_pending := 0;
    
    last_trade_minute := current_minute;
end;

// 检查卖出委托是否成交
if sell_pending>0 and MYHOLDING<ref(MYHOLDING,1) then
begin
    sell_filled := 1;
    sell_pending := 0;
    
    // 卖出成交后撤销所有买入委托
    TCANCEL(1, 1);
    buy_pending := 0;
    
    last_trade_minute := current_minute;
end;

// 显示当前状态
当前价:CLOSE, linethick0;
买入价:buy_price, colorblue, linethick0;
卖出价:sell_price, colorred, linethick0;
持仓数量:MYHOLDING, linethick0;
可用资金:MYCASH, linethick0;
买入委托ID:buy_order_id, linethick0;
卖出委托ID:sell_order_id, linethick0;
买入状态:buy_pending, linethick0;
卖出状态:sell_pending, linethick0;
上次买入价:last_buy_price, linethick0;
上次卖出价:last_sell_price, linethick0;

持续双向委托:
每个周期都基于当前价格计算买入和卖出触发价
同时发送买入和卖出委托,无论之前是否有未成交委托
成交后处理:
当买入成交时,立即撤销所有卖出委托(平多方向)
当卖出成交时,立即撤销所有买入委托(开多方向)
资金管理优化:
动态计算买入量,使用 30% 的可用资金
卖出时使用全部持仓
连续交易支持:
设置最小交易间隔为 0,允许连续交易
记录上次交易价格,便于跟踪
这个策略实现了你描述的功能:
以当前价格为基准,同时发出上涨 1% 卖出和下跌 0.5% 买入的委托
无论价格如何变动,持续更新并发送新的委托
当任意一个方向的委托成交后,立即撤销另一个方向的所有未成交委托
确保同一时间只有一个方向的交易生效,但不限制后续交易
你可以根据实际需要调整买入 / 卖出比例和资金使用比例。这个策略在波动较大的市场中可能会产生较多交易信号,建议先进行充分回测。
回复

使用道具 举报

40

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-6-23 08:52 | 显示全部楼层
这种策略只能自己debugfile去调试输出了,先程序化运行时候输出自己定义那些变量看对不对
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 07:21 , Processed in 0.173497 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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