金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 673|回复: 15

帮我修改金字塔能实盘交易

[复制链接]

2

主题

5

帖子

5

积分

Rank: 1

等级: 新手上路

注册:
2025-2-15
曾用名:
发表于 2025-3-3 08:41 | 显示全部楼层 |阅读模式
这个是我用DeepSeek帮我写的策略 但是我复制过来不能用,能我我修改好可用代码,代码里面好像有指定要买哪个股的?可以不要这个吗?到时候换股会不会很麻烦?


三重均线系统(EMA8/21/55)+ 布林带策略逻辑EMA8>21>55且价格突破布林带上轨时减仓均线多头排列+价格触及布林带下轨时加仓


# 导入库
import numpy as np
import pandas as pd
from pylab import *
import matplotlib.pyplot as plt

# 策略主函数
def init(ContextInfo):
    # 参数设置
    ContextInfo.name = "600519.SH"  # 以茅台为例
    ContextInfo.start_date = "20230101"
    ContextInfo.end_date = "20241231"
    ContextInfo.capital = 1000000  # 初始资金100万

    # 定义参数
    ContextInfo.ema_fast = 8
    ContextInfo.ema_mid = 21
    ContextInfo.ema_slow = 55
    ContextInfo.bb_period = 20  # 布林带周期
    ContextInfo.bb_dev = 2  # 标准差倍数

def handle_bar(ContextInfo):
    # 获取历史数据
    data = ContextInfo.get_history(ContextInfo.name,
                                 ContextInfo.ema_slow*2,
                                 '1d',
                                 ['close','high','low','open','volume'])

    close = data['close'].values
    if len(close) < ContextInfo.ema_slow:  # 数据不足时跳过
        return

    # 计算三重EMA
    ema8 = pd.Series(close).ewm(span=ContextInfo.ema_fast).mean().values
    ema21 = pd.Series(close).ewm(span=ContextInfo.ema_mid).mean().values
    ema55 = pd.Series(close).ewm(span=ContextInfo.ema_slow).mean().values

    # 计算布林带
    bb_mid = pd.Series(close).rolling(ContextInfo.bb_period).mean()
    bb_std = pd.Series(close).rolling(ContextInfo.bb_period).std()
    bb_upper = bb_mid + ContextInfo.bb_dev * bb_std  # 上轨
    bb_lower = bb_mid - ContextInfo.bb_dev * bb_std  # 下轨

    # 获取当前持仓
    position = ContextInfo.get_position(ContextInfo.name)

    # 生成交易信号 --------------------------------------------------
    # 多头条件:EMA8>21>55 且 价格触及布林带下轨
    cond_long = (ema8[-1] > ema21[-1]) and (ema21[-1] > ema55[-1]) \
                and (data['low'][-1] <= bb_lower.values[-1])

    # 空头条件:EMA8<21<55 且 价格突破布林带上轨
    cond_short = (ema8[-1] < ema21[-1]) and (ema21[-1] < ema55[-1]) \
                 and (data['high'][-1] >= bb_upper.values[-1])

    # 交易执行 -----------------------------------------------------
    # 买入逻辑
    if cond_long and position['volume'] == 0:
        order(ContextInfo.name, 1000, 'buy', 'open')  # 买入1000股
        print(f"{data.index[-1]} 买入1000股 价格:{close[-1]:.2f}")

    # 卖出逻辑
    elif cond_short and position['volume'] >= 1000:
        order(ContextInfo.name, 1000, 'sell', 'close')  # 卖出1000股
        print(f"{data.index[-1]} 卖出1000股 价格:{close[-1]:.2f}")

# 可视化函数(可选)
def plot_result(ContextInfo):
    data = ContextInfo.result
    plt.figure(figsize=(16,8))
    plt.plot(data['close'], label='Price')
    plt.plot(data['ema8'], label='EMA8')
    plt.plot(data['ema21'], label='EMA21')
    plt.plot(data['ema55'], label='EMA55')
    plt.plot(data['bb_upper'], linestyle='--', color='r')
    plt.plot(data['bb_lower'], linestyle='--', color='g')
    plt.legend()
    plt.show()

回复

使用道具 举报

37

主题

9787

帖子

5万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
wenarm
发表于 2025-3-3 08:48 | 显示全部楼层
抱歉,不提供python代码的修改服务。建议客户学习python后自行实现。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

2

主题

5

帖子

5

积分

Rank: 1

等级: 新手上路

注册:
2025-2-15
曾用名:
 楼主| 发表于 2025-3-3 10:54 | 显示全部楼层
技术006 发表于 2025-3-3 08:48
抱歉,不提供python代码的修改服务。建议客户学习python后自行实现。

可以帮我重新写一个三重均线系统(EMA8/21/55)+ 布林带策略逻辑EMA8>21>55且价格突破布林带上轨时卖出1000股
均线多头排列+价格触及布林带下轨时买入1000股,谢谢
回复

使用道具 举报

38

主题

9811

帖子

9821

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-3-3 10:59 | 显示全部楼层
您要给出具体的条件描述
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

2

主题

5

帖子

5

积分

Rank: 1

等级: 新手上路

注册:
2025-2-15
曾用名:
 楼主| 发表于 2025-3-3 11:39 | 显示全部楼层
技术008 发表于 2025-3-3 10:59
您要给出具体的条件描述

1. 买入条件(多头开仓)
趋势确认:EMA8 > EMA21 > EMA55(严格多头排列)

价格位置:当日最低价 ≤ 布林带下轨

附加过滤

成交量 > 5日均量(排除缩量假突破)

RSI(14) < 40(超卖区域强化信号)

2. 卖出条件(空头开仓)
趋势确认:EMA8 < EMA21 < EMA55(严格空头排列)

价格位置:当日最高价 ≥ 布林带上轨

附加过滤

MACD柱状线斜率转负

ATR(14) > 平均水平的1.5倍(波动加剧确认)

3. 平仓规则
趋势反转:EMA排列被破坏(如EMA8下穿EMA21)

动态止盈:

移动止盈:从入场后最高点回落5%

轨道止盈:价格触及反向布林带轨道(如多头触及上轨)

强制止损:

固定止损:成本价下方8%

波动止损:2.5倍ATR浮动止损
回复

使用道具 举报

38

主题

9811

帖子

9821

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2025-3-3 11:48 | 显示全部楼层


EMA8 := EMA(CLOSE, 8);
EMA21 := EMA(CLOSE, 21);
EMA55 := EMA(CLOSE, 55);

BOLL_MID := MA(CLOSE, 20);
UPPER := BOLL_MID + 2 * STD(CLOSE, 20); // 布林带上轨
LOWER := BOLL_MID - 2 * STD(CLOSE, 20); // 布林带下轨

LC:=REF(CLOSE,1);
RSI14:=SMA(MAX(CLOSE-LC,0),9,1)/SMA(ABS(CLOSE-LC),9,1)*100;

MACD_DIFF := EMA(CLOSE, 12) - EMA(CLOSE, 26);
MACD_DEA := EMA(MACD_DIFF, 9);
MACD_HIST := 2 * (MACD_DIFF - MACD_DEA); // MACD柱状线

TR1 : MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
ATR14 : MA(TR1,14);
//======= 条件判断 =======//
// 买入条件(多头开仓)
买入条件 := EMA8 > EMA21 AND EMA21 > EMA55 // 趋势确认:EMA8 > EMA21 > EMA55
            AND LOW <= LOWER // 价格位置:当日最低价 ≤ 布林带下轨
            AND VOL > MA(VOL, 5) // 成交量 > 5日均量
            AND RSI14 < 40; // RSI(14) < 40

// 卖出条件(空头开仓)
卖出条件 := EMA8 < EMA21 AND EMA21 < EMA55 // 趋势确认:EMA8 < EMA21 < EMA55
            AND HIGH >= UPPER // 价格位置:当日最高价 ≥ 布林带上轨
            AND MACD_HIST < REF(MACD_HIST, 1) // MACD柱状线斜率转负
            AND ATR14 > 1.5 * MA(ATR14, 14); // ATR(14) > 平均水平的1.5倍

// 平仓规则
趋势反转 := (HOLDING > 0 AND (EMA8 < EMA21 OR EMA21 < EMA55)) // 多头持仓趋势反转
            OR (HOLDING < 0 AND (EMA8 > EMA21 OR EMA21 > EMA55)); // 空头持仓趋势反转

移动止盈 := (HOLDING > 0 AND CLOSE < HHV(HIGH, ENTERBARS) * 0.95) // 多头移动止盈
            OR (HOLDING < 0 AND CLOSE > LLV(LOW, ENTERBARS) * 1.05); // 空头移动止盈

轨道止盈 := (HOLDING > 0 AND CLOSE >= UPPER) // 多头触及布林带上轨
            OR (HOLDING < 0 AND CLOSE <= LOWER); // 空头触及布林带下轨

固定止损 := (HOLDING > 0 AND CLOSE < ENTERPRICE * 0.92) // 多头固定止损
            OR (HOLDING < 0 AND CLOSE > ENTERPRICE * 1.08); // 空头固定止损

波动止损 := (HOLDING > 0 AND CLOSE < ENTERPRICE - 2.5 * ATR14) // 多头波动止损
            OR (HOLDING < 0 AND CLOSE > ENTERPRICE + 2.5 * ATR14); // 空头波动止损

//======= 交易逻辑 =======//
IF 趋势反转 OR 移动止盈 OR 轨道止盈 OR 固定止损 OR 波动止损 THEN BEGIN
  IF HOLDING > 0 THEN SELL(1, holding,MARKET); // 平多单
  IF HOLDING < 0 THEN SELLSHORT(1, holding,MARKET); // 平空单

END
ELSE IF HOLDING = 0 THEN BEGIN // 无持仓
  IF 买入条件  THEN BEGIN
    BUY(1,1, MARKET); // 开多单

  END;
  IF 卖出条件  THEN BEGIN
    BUYSHORT(1,1, MARKET); // 开空单
  END;
END;
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

2

主题

5

帖子

5

积分

Rank: 1

等级: 新手上路

注册:
2025-2-15
曾用名:
 楼主| 发表于 2025-3-8 11:13 | 显示全部楼层
技术008 发表于 2025-3-3 11:48
EMA8 := EMA(CLOSE, 8);
EMA21 := EMA(CLOSE, 21);
EMA55 := EMA(CLOSE, 55);

你好,我就想问下为什么回测没有数据都是0,还有这个策略代码是否股票期货都能用?
就是我如果想执行股票的话按100股买BUY(1,1, MARKET); // 开多单,如果是买1000股的话是不是改为BUY(1,10, MARKET); // 开多单
IF 买入条件  THEN BEGIN
    BUY(1,1, MARKET); // 开多单

  END;
  IF 卖出条件  THEN BEGIN
    BUYSHORT(1,1, MARKET); // 开空单
  END;
END;
回复

使用道具 举报

37

主题

9787

帖子

5万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
wenarm
发表于 2025-3-10 08:44 | 显示全部楼层
870101226 发表于 2025-3-8 11:13
你好,我就想问下为什么回测没有数据都是0,还有这个策略代码是否股票期货都能用?
就是我如果想执行股 ...

1. 可能没有历史数据,建议你补充数据后再回测。
2.策略逻辑是否适用于期货和股票,取决于交易思想。这个策略中有多空头仓位的控制。所以这个策略目前是对期货合约的。
3.如果是股票,直接填写股数,因为是1000。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

0

主题

11

帖子

11

积分

Rank: 1

等级: 新手上路

注册:
2025-3-21
曾用名:
发表于 2025-3-24 21:09 | 显示全部楼层
你6#发表的程序我运行后出现:语句末尾缺少分号,问题在哪儿
回复

使用道具 举报

0

主题

11

帖子

11

积分

Rank: 1

等级: 新手上路

注册:
2025-3-21
曾用名:
发表于 2025-3-24 21:48 | 显示全部楼层
不用了,已经解决
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-4 07:28 , Processed in 0.252643 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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