金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
楼主: 梦清明

问题请教

[复制链接]

5

主题

25

帖子

25

积分

Rank: 1

等级: 新手上路

注册:
2025-6-19
曾用名:
 楼主| 发表于 2025-8-22 21:11 | 显示全部楼层
请问,Python获取期货品种交易时间的函数是什么?
回复

使用道具 举报

5

主题

25

帖子

25

积分

Rank: 1

等级: 新手上路

注册:
2025-6-19
曾用名:
 楼主| 发表于 2025-8-22 22:24 | 显示全部楼层
请问,Python获取期货品种交易时间的函数是什么?
回复

使用道具 举报

44

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-8-25 09:16 | 显示全部楼层



没有专门时间函数,只有这个
用来判断是不是在交易时间内得

本帖子中包含更多资源

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

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

使用道具 举报

5

主题

25

帖子

25

积分

Rank: 1

等级: 新手上路

注册:
2025-6-19
曾用名:
 楼主| 发表于 2025-8-25 18:24 | 显示全部楼层
我是想获取不同期货品种的交易时间段,有没有这个函数?
因为MA均线值总是计算的不准确,我怀疑隔夜的没有进行连续性计算
回复

使用道具 举报

44

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-8-26 09:19 | 显示全部楼层
这个实在没有了,ma和隔夜与否没有关系的,他就是给他传多少数据他安这些数据去计算
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

5

主题

25

帖子

25

积分

Rank: 1

等级: 新手上路

注册:
2025-6-19
曾用名:
 楼主| 发表于 2025-8-26 23:02 | 显示全部楼层
我现在均线的问题一直解决不了,怎样让数据每天都自动下载,自动存储,以供获取到足够的数据去计算均线,比如我做5分钟周期白银连续。
以下截图设置帮我看一下对不对,这样是不是可以每天自动下载数据。


以下是我均线的代码,帮我看一下对不对,搞了太久,不知道哪里出问题了,总是不对。

def update_ma_values(context: Any, bars: np.ndarray, prev_index: int):
    """更新均线值(使用简单移动平均,与金字塔前台一致)"""
    max_ma = max(context.ma_periods)
   
    if bars is None or len(bars) < max_ma:
        log_error(f"数据不足计算均线: {len(bars) if bars else 0}/{max_ma}")
        return
   
    # 解析收盘价 - 使用所有可用K线(包括夜盘数据)
    close_prices = []
    bar_times = []
   
    for i in range(len(bars)):
        bar_data = parse_bar_data(bars, i)
        close_prices.append(bar_data['close'])
        
        # 记录K线时间用于调试
        bar_time = get_bar_time_period(bars, i)
        bar_times.append(bar_time)
   
    # 确保有足够的数据计算均线
    if len(close_prices) < max_ma:
        log_error(f"数据不足计算均线: {len(close_prices)}/{max_ma}")
        return
   
    # 计算均线值(简单移动平均)
    for period in context.ma_periods:
        if len(close_prices) >= period:
            # 使用前period根K线的收盘价计算均线
            ma_value = np.mean(close_prices[-period:])
            context.ma_values[period] = ma_value
            
            # 调试信息:输出计算均线使用的K线时间段
            if context.first_run and period in [5, 10]:
                used_bars = bar_times[-period:]
                log_info(f"MA{period}计算使用的K线时间段: {used_bars}")
        else:
            log_error(f"数据不足计算MA{period},需要{period}根,现有{len(close_prices)}根")

def get_kline_data(context: Any, bar_count: int = None, include_now: bool = False) -> np.ndarray:
    """获取K线数据"""
    if bar_count is None:
        bar_count = max(context.ma_periods) + 20  # 默认多取一些
   
    try:
        # 关键修改:使用include_now参数控制是否包含当前K线
        bars = history_bars(
            context.symbol,
            bar_count,
            context.period,
            ['datetime', 'open', 'high', 'low', 'close'],
            skip_suspended=True,
            include_now=include_now,  # 控制是否包含当前K线
            adjusted_price=False
        )
        if bars is None or len(bars) == 0:
            log_error("获取K线数据返回空")
            return np.array([])
            
        return bars
        
    except Exception as e:
        log_error(f"获取K线数据异常: {str(e)}")
        return np.array([])

def parse_bar_data(bars: np.ndarray, index: int) -> dict:
    """解析K线数据,返回包含OHLC的字典"""
    bar_data = {}
   
    if hasattr(bars, 'dtype') and bars.dtype.names:  # 结构化数组
        # 金字塔返回的结构化数组,字段名可能是英文
        field_names = bars.dtype.names
        
        # 查找正确的字段名
        open_field = None
        high_field = None
        low_field = None
        close_field = None
        
        for name in field_names:
            if 'open' in name.lower() or '开盘' in name.lower():
                open_field = name
            elif 'high' in name.lower() or '最高' in name.lower():
                high_field = name
            elif 'low' in name.lower() or '最低' in name.lower():
                low_field = name
            elif 'close' in name.lower() or '收盘' in name.lower():
                close_field = name
        
        # 使用找到的字段名获取数据
        bar_data['open'] = bars[open_field][index] if open_field else bars[index][1]
        bar_data['high'] = bars[high_field][index] if high_field else bars[index][2]
        bar_data['low'] = bars[low_field][index] if low_field else bars[index][3]
        bar_data['close'] = bars[close_field][index] if close_field else bars[index][4]
    else:  # 普通数组
        # 金字塔返回的普通数组,顺序通常是: [datetime, open, high, low, close, ...]
        bar_data['open'] = bars[index][1]  # 索引1为开盘价
        bar_data['high'] = bars[index][2]  # 索引2为最高价
        bar_data['low'] = bars[index][3]   # 索引3为最低价
        bar_data['close'] = bars[index][4]  # 索引4为收盘价
   
    return bar_data

def get_bar_time_period(bars: np.ndarray, index: int) -> str:
    """获取K线的时间段(正确处理时区)"""
    try:
        # 获取K线的时间戳
        if hasattr(bars, 'dtype') and bars.dtype.names and 'datetime' in bars.dtype.names:
            bar_time = bars['datetime'][index]
        else:
            bar_time = bars[index][0]
        
        # 金字塔的datetime格式通常是YYYYMMDDHHMMSS
        time_str = str(int(bar_time))
        if len(time_str) < 12:
            time_str = time_str.zfill(12)
        
        # 提取日期和时间部分
        date_str = time_str[:8]  # YYYYMMDD
        hour = int(time_str[8:10])
        minute = int(time_str[10:12])
        
        # 创建datetime对象
        bar_datetime = datetime.datetime(
            int(date_str[:4]), int(date_str[4:6]), int(date_str[6:8]),
            hour, minute
        )
        
        # 根据数据源时区转换为北京时间
        beijing_time = convert_bar_time_to_beijing(bar_datetime)
        
        # 计算时间段
        start_time = beijing_time.time()
        end_time_obj = beijing_time + datetime.timedelta(minutes=5)
        end_time = end_time_obj.time()
        
        return f"{start_time.strftime('%H:%M')}-{end_time.strftime('%H:%M')}"
    except Exception as e:
        log_error(f"获取K线时间段错误: {str(e)}")
        return "未知时间段"

本帖子中包含更多资源

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

x
回复

使用道具 举报

44

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-8-27 08:59 | 显示全部楼层
就这里设置自动收盘就行了,每天盘后会把当天数据给存到本地

本帖子中包含更多资源

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

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

使用道具 举报

5

主题

25

帖子

25

积分

Rank: 1

等级: 新手上路

注册:
2025-6-19
曾用名:
 楼主| 发表于 2025-8-27 12:43 | 显示全部楼层
我的代码帮我看一下,或者帮我写一段获取本地数据然后自动计算Ma5,10,20,40,60。
这对我很重要,均线问题困扰我很久了,多谢。
另外,自动收盘-只能存储当天的数据吗?如果有跨交易日计算均线的怎么办?比如MA60
回复

使用道具 举报

44

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-8-27 13:09 | 显示全部楼层
自动收盘就是每天保存数据下来,你第一次使用手工通过工具-数据补充补充好历史数据就行了。后续收盘就是增加当天数据进去

你上面这个就是通过history_bar获取数据就行了,后面算均线这个是python自己计算逻辑了,你可以自己百度看下怎么算的
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

5

主题

25

帖子

25

积分

Rank: 1

等级: 新手上路

注册:
2025-6-19
曾用名:
 楼主| 发表于 2025-8-29 12:47 | 显示全部楼层
昨晚均线值还计算正常,今天早上我补充了一下数据,均线值怎么就不对了?帮我分析一下是什么原因呢?
设置按照你上面的截图设置的,我都是开着电脑,让电脑每天早上2:35才关机,正常来说数据不是自动更新上去吗? 但是昨天测试显示,27号晚上2点多的有些数据是缺失的,后来补充了数据,计算又对了。但是今天补充了数据,早上计算均线值又不对了,是怎么回事?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-16 14:43 , Processed in 0.142169 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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