金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 440|回复: 3

求帮忙看一下错在哪里

[复制链接]

4

主题

11

帖子

11

积分

Rank: 1

等级: 新手上路

注册:
2024-7-24
曾用名:
发表于 2024-8-5 13:08 | 显示全部楼层 |阅读模式
我设置的5分钟的macd大于0的情况下,1分钟的kdj的j线上穿0,下多单。5分钟的macd小于0的情况下,1分钟的kdj的j线下穿100,下空单。5点止损,5点以上利润减少40%就平所有仓位,有仓位时不开新单。但是回测不出结果,不知道问题出在哪里了。求解答。



from PythonApi import *
import pandas as pd
import numpy as np
def init(context):
    context.position = 0  # 1 for long, -1 for short, 0 for no position
    context.entry_price = 0
    context.stop_loss = 0
    context.max_profit = 0
    context.trail_profit = 0
    context.mindiff = get_instruments(context.run_info.base_book_id).mintick
def convert_ndarray_to_dataframe(data, columns):
    df = pd.DataFrame(data, columns=columns)
    return df
def calculate_macd(data, short_period=12, long_period=26, signal_period=9):
    short_ema = data["close"].ewm(span=short_period, adjust=False).mean()
    long_ema = data["close"].ewm(span=long_period, adjust=False).mean()
    macd = short_ema - long_ema
    signal = macd.ewm(span=signal_period, adjust=False).mean()
    return macd, signal
def calculate_kdj(data, n=9, k_period=3, d_period=3):
    low_min = data["low"].rolling(window=n, min_periods=1).min()
    high_max = data["high"].rolling(window=n, min_periods=1).max()
    rsv = (data["close"] - low_min) / (high_max - low_min) * 100
    k = rsv.ewm(com=(k_period - 1), min_periods=1).mean()
    d = k.ewm(com=(d_period - 1), min_periods=1).mean()
    j = 3 * k - 2 * d
    data["K"] = k
    data["D"] = d
    data["J"] = j
    return data
def handle_bar(context):
    security = context.run_info.base_book_id  # 获取当前交易的证券代码
    # 获取1分钟和5分钟历史数据
    data_1m_raw = history_bars(security, 30, "1m", ["close", "high", "low"])
    data_5m_raw = history_bars(
        security, 31, "5m", ["close"]
    )  # 获取31条数据,用于计算前一根完整的5分钟数据
    # 确保数据量足够
    if len(data_1m_raw) < 30 or len(data_5m_raw) < 31:
        return
    # ndarray转换为DataFrame
    data_1m = convert_ndarray_to_dataframe(data_1m_raw, ["close", "high", "low"])
    data_5m = convert_ndarray_to_dataframe(
        data_5m_raw[:-1], ["close"]
    )  # 使用前30条数据
    # 计算MACDKDJ指标
    macd_5m, signal_5m = calculate_macd(data_5m)
    data_1m = calculate_kdj(data_1m)
    # 当前价格
    current_price = data_1m["close"].iloc[-1]
    # 判断是否有未平仓订单
    if context.position != 0:
        max_profit = max(
            context.max_profit,
            (
                current_price - context.entry_price
                if context.position == 1
                else context.entry_price - current_price
            ),
        )
        trail_profit = (
            context.entry_price + 1 * context.mindiff
            if context.position == 1
            else context.entry_price - 1 * context.mindiff
        )
        if (
            context.position == 1
            and (
                current_price < context.stop_loss
                or (
                    max_profit >= 5 * context.mindiff
                    and current_price < context.entry_price + max_profit * 0.6
                )
            )
        ) or (
            context.position == -1
            and (
                current_price > context.stop_loss
                or (
                    max_profit >= 5 * context.mindiff
                    and current_price > context.entry_price - max_profit * 0.6
                )
            )
        ):
            if context.position == 1:
                sell_close(security, "Market", volume=100)
                print(f"Sell at {current_price} on {security}")
            else:
                buy_close(security, "Market", volume=100)
                print(f"Cover at {current_price} on {security}")
            context.position = 0
    # 没有未平仓订单时判断开仓信号
    if context.position == 0:
        if macd_5m.iloc[-1] > signal_5m.iloc[-1]:
            if data_1m["J"].iloc[-2] < 0 and data_1m["J"].iloc[-1] > 0:
                buy_open(security, "Market", volume=100)
                context.position = 1
                context.entry_price = current_price
                context.stop_loss = current_price - 5 * context.mindiff
                context.max_profit = 0
                print(f"Buy at {current_price} on {security}")
        elif macd_5m.iloc[-1] < signal_5m.iloc[-1]:
            if data_1m["J"].iloc[-2] > 100 and data_1m["J"].iloc[-1] < 100:
                sell_open(security, "Market", volume=100)
                context.position = -1
                context.entry_price = current_price
                context.stop_loss = current_price + 5 * context.mindiff
                context.max_profit = 0
                print(f"Short at {current_price} on {security}")
截图202408051307097039.png
回复

使用道具 举报

31

主题

7810

帖子

7820

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2024-8-5 13:10 | 显示全部楼层
建议自己print输出看下条件为何没有满足呢
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

4

主题

11

帖子

11

积分

Rank: 1

等级: 新手上路

注册:
2024-7-24
曾用名:
 楼主| 发表于 2024-8-5 13:24 来自手机 | 显示全部楼层
技术008 发表于 2024-8-5 13:10
建议自己print输出看下条件为何没有满足呢

我自己有点看糊涂了,您能帮忙改一下吗
回复

使用道具 举报

20

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2024-8-5 14:22 | 显示全部楼层
你点开交易明细,你手数是100手,资金够?

然后你设置得回测的基准合约周期是多少?你策略里用了1分钟,你设置里最好保持一致。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 12:22 , Processed in 0.248046 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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