数字货币MACD指标自动化交易策略实现(含源代码)

数字货币MACD指标自动化交易策略实现(含源代码)

    • 前情回顾
    • MACD 策略逻辑
      • 代码实现
      • 代码说明
    • 增加仓位管理逻辑
      • 代码实现
      • 修改说明
    • 增加风险控制功能
      • 代码实现
      • 修改说明

前情回顾

在前面我们实现了2中方法进行数字货币交易,同时还能获取到实时行情。数字货币交易接口实现(含源代码)。

在此基础上,我们今天实现一个指标策略自动化交易的功能(以MACD指标为例),并进行2次优化,增加仓位管理以及风险控制的功能,实现一个完成的交易策略。

MACD 策略逻辑

  1. 获取 5 分钟的 K 线数据
  2. 计算 MACD 指标
  3. 买入条件:MACD 越过零线
  4. 卖出条件:MACD 低于零线

代码实现

import ccxt
import pandas as pd
import ta
import time# 初始化 Binance 交易所实例
exchange = ccxt.binance({'apiKey': 'YOUR_API_KEY',        # 替换为你的 API Key'secret': 'YOUR_SECRET_KEY',     # 替换为你的 Secret Key
})# 获取 5 分钟的 K 线数据
def fetch_ohlcv(symbol, timeframe='5m', limit=100):ohlcv = exchange.fetch_ohlcv(symbol, timeframe, limit=limit)df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')df.set_index('timestamp', inplace=True)return df# 计算 MACD 指标
def calculate_macd(df):macd = ta.trend.MACD(df['close'])df['macd'] = macd.macd()df['macd_signal'] = macd.macd_signal()df['macd_diff'] = macd.macd_diff()# 检查交易信号
def check_trade_signals(df):last_row = df.iloc[-1]previous_row = df.iloc[-2]# 买入条件:MACD 越过零线if previous_row['macd'] < 0 and last_row['macd'] > 0:return 'buy'# 卖出条件:MACD 低于零线if previous_row['macd'] > 0 and last_row['macd'] < 0:return 'sell'return 'hold'# 执行交易
def execute_trade(signal, symbol='BTC/USDT', amount=0.001):if signal == 'buy':order = exchange.create_market_buy_order(symbol, amount)print('Buy order executed:', order)elif signal == 'sell':order = exchange.create_market_sell_order(symbol, amount)print('Sell order executed:', order)# 主循环
def main():symbol = 'BTC/USDT'while True:df = fetch_ohlcv(symbol)calculate_macd(df)calculate_ema(df)calculate_kdj(df)signal = check_trade_signals(df)execute_trade(signal)time.sleep(300)  # 每5分钟运行一次if __name__ == "__main__":main()

代码说明

1、初始化 Binance 交易所实例:使用你的 API Key 和 Secret Key 初始化 ccxt 库中的 Binance 实例。

2、获取 5 分钟的 K 线数据:定义 fetch_ohlcv 函数,从 Binance 获取指定交易对的 5 分钟 K 线数据,并将其转换为 Pandas DataFrame。

3、计算 MACD 指标:定义相应的函数计算这些技术指标,并将其添加到 DataFrame 中。

4、检查交易信号:定义 check_trade_signals 函数,根据 MACD 越过零线和低于零线的条件检查交易信号。

5、执行交易:定义 execute_trade 函数,根据交易信号执行买入或卖出操作。

6、主循环:在 main 函数中,每隔5分钟获取最新数据,计算指标,检查信号,并执行交易。

请注意,这段代码仅为示例,实际交易时应考虑更多因素,例如交易量、手续费、风控等,后面分两步进行完善。

增加仓位管理逻辑

上述执行交易函数存在明显的漏洞,只有开仓动作,没有平仓动作。所以新增一条交易逻辑:当没有持有信号方向的持仓时才进行开仓;如果有信号方向的持仓就进行平仓。

这就需要增加仓位管理的逻辑,实现获取仓位的接口。

代码实现

import ccxt
import pandas as pd
import ta
import time# 初始化 Binance 交易所实例
exchange = ccxt.binance({'apiKey': 'YOUR_API_KEY',        # 替换为你的 API Key'secret': 'YOUR_SECRET_KEY',     # 替换为你的 Secret Key
})# 获取 5 分钟的 K 线数据
def fetch_ohlcv(symbol, timeframe='5m', limit=100):ohlcv = exchange.fetch_ohlcv(symbol, timeframe, limit=limit)df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')df.set_index('timestamp', inplace=True)return df# 计算 MACD 指标
def calculate_macd(df):macd = ta.trend.MACD(df['close'])df['macd'] = macd.macd()df['macd_signal'] = macd.macd_signal()df['macd_diff'] = macd.macd_diff()# 检查交易信号
def check_trade_signals(df):last_row = df.iloc[-1]previous_row = df.iloc[-2]# 买入条件:MACD 越过零线if previous_row['macd'] < 0 and last_row['macd'] > 0:return 'buy'# 卖出条件:MACD 低于零线if previous_row['macd'] > 0 and last_row['macd'] < 0:return 'sell'return 'hold'# 获取当前持仓方向和数量
def get_position(symbol):balance = exchange.fetch_balance()if symbol in balance['total']:return balance['total'][symbol]return 0# 执行交易
def execute_trade(signal, symbol='BTC/USDT', amount=0.001):base_currency = symbol.split('/')[0]position = get_position(base_currency)if signal == 'buy':if position <= 0:order = exchange.create_market_buy_order(symbol, amount)print('Buy order executed:', order)else:print('Already holding a buy position. No action taken.')elif signal == 'sell':if position > 0:order = exchange.create_market_sell_order(symbol, amount)print('Sell order executed:', order)else:print('No buy position to sell. No action taken.')# 主循环
def main():symbol = 'BTC/USDT'while True:df = fetch_ohlcv(symbol)calculate_macd(df)calculate_ema(df)calculate_kdj(df)signal = check_trade_signals(df)execute_trade(signal, symbol)time.sleep(300)  # 每5分钟运行一次if __name__ == "__main__":main()

修改说明

1、获取当前持仓方向和数量:添加 get_position 函数,获取当前账户的持仓情况。如果持有目标资产(如 BTC),返回持有数量,否则返回 0。

2、修改交易逻辑:在 execute_trade 函数中,根据信号检查当前持仓:

  • 如果是买入信号(‘buy’),且当前没有持有或持有空头仓位,则进行买入操作。
  • 如果是卖出信号(‘sell’),且当前持有多头仓位,则进行卖出操作。

3、主循环:保持不变,每隔 5 分钟获取最新数据,计算指标,检查信号,并执行交易。

请注意,这段代码仍然是一个简化的示例。在实际交易中,还需要考虑更多的细节和异常处理,例如 API 调用失败、交易失败、网络问题等。另外,务必在模拟环境中进行充分测试,确保策略的可靠性和安全性。

增加风险控制功能

增加风险控制功能也就是止盈止损的逻辑:

  • 持仓盈利超过5%,则平仓
  • 持仓亏损超过3%,则平仓

代码实现

import ccxt
import pandas as pd
import ta
import time# 初始化 Binance 交易所实例
exchange = ccxt.binance({'apiKey': 'YOUR_API_KEY',        # 替换为你的 API Key'secret': 'YOUR_SECRET_KEY',     # 替换为你的 Secret Key
})# 获取 5 分钟的 K 线数据
def fetch_ohlcv(symbol, timeframe='5m', limit=100):ohlcv = exchange.fetch_ohlcv(symbol, timeframe, limit=limit)df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')df.set_index('timestamp', inplace=True)return df# 计算 MACD 指标
def calculate_macd(df):macd = ta.trend.MACD(df['close'])df['macd'] = macd.macd()df['macd_signal'] = macd.macd_signal()df['macd_diff'] = macd.macd_diff()# 检查交易信号
def check_trade_signals(df):last_row = df.iloc[-1]previous_row = df.iloc[-2]# 买入条件:MACD 越过零线if previous_row['macd'] < 0 and last_row['macd'] > 0:return 'buy'# 卖出条件:MACD 低于零线if previous_row['macd'] > 0 and last_row['macd'] < 0:return 'sell'return 'hold'# 获取当前持仓方向和数量
def get_position(symbol):balance = exchange.fetch_balance()base_currency = symbol.split('/')[0]if base_currency in balance['total']:return balance['total'][base_currency]return 0# 计算持仓盈亏比例
def calculate_profit_loss(entry_price, current_price):return (current_price - entry_price) / entry_price# 执行交易
def execute_trade(signal, symbol='BTC/USDT', amount=0.001, entry_price=None):base_currency = symbol.split('/')[0]position = get_position(symbol)if signal == 'buy':if position <= 0:order = exchange.create_market_buy_order(symbol, amount)print('Buy order executed:', order)entry_price = order['price']else:print('Already holding a buy position. No action taken.')elif signal == 'sell':if position > 0:order = exchange.create_market_sell_order(symbol, amount)print('Sell order executed:', order)entry_price = Noneelse:print('No buy position to sell. No action taken.')# 止盈止损逻辑if entry_price:ticker = exchange.fetch_ticker(symbol)current_price = ticker['last']profit_loss_ratio = calculate_profit_loss(entry_price, current_price)if profit_loss_ratio >= 0.05:  # 止盈条件if position > 0:order = exchange.create_market_sell_order(symbol, amount)print('Take profit order executed:', order)entry_price = Noneelif profit_loss_ratio <= -0.03:  # 止损条件if position > 0:order = exchange.create_market_sell_order(symbol, amount)print('Stop loss order executed:', order)entry_price = None# 主循环
def main():symbol = 'BTC/USDT'entry_price = Nonewhile True:df = fetch_ohlcv(symbol)calculate_macd(df)calculate_ema(df)calculate_kdj(df)signal = check_trade_signals(df)execute_trade(signal, symbol, entry_price=entry_price)time.sleep(300)  # 每5分钟运行一次if __name__ == "__main__":main()

修改说明

1、计算持仓盈亏比例:添加 calculate_profit_loss 函数,计算当前持仓的盈亏比例。

2、止盈止损逻辑:在 execute_trade 函数中,添加止盈和止损逻辑:

  • 如果当前持仓的盈利比例大于等于 5% (profit_loss_ratio >= 0.05),则执行止盈平仓操作。
  • 如果当前持仓的亏损比例小于等于 -3% (profit_loss_ratio <= -0.03),则执行止损平仓操作。

3、更新 execute_trade 函数:在买入和卖出操作中记录或清除 entry_price,以便在止盈止损逻辑中使用。

4、主循环中传递 entry_price:在 main 函数中,每次调用 execute_trade 函数时传递 entry_price 参数。

如果说还要继续优化的话,可能增加动态止盈的功能,后面有时间在进一步优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习之人脸识别-使用 scikit-learn 和人工神经网络进行高效人脸识别

文章摘要 本文将介绍如何使用 Python 的 scikit-learn 库和人工神经网络&#xff08;ANN&#xff09;来识别人脸。我们将使用 LFW 数据集&#xff08;Labeled Faces in the Wild&#xff09;&#xff0c;这是一个广泛用于人脸识别基准测试的大型人脸数据库。我们将展示如何准备…

【微软蓝屏】构建更加稳固和安全的网络环境:从“微软蓝屏”事件谈起

最近&#xff0c;那个让全球都头疼的“微软蓝屏”事件&#xff0c;简直就像是科技界的一场大地震。你说这背后的原因&#xff0c;竟然是一个软件更新的小失误&#xff1f;哎呀&#xff0c;这可真是让人哭笑不得。不过&#xff0c;笑归笑&#xff0c;这事儿也给我们提了个醒&…

nodejs - express 学习笔记

express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架&#xff0c;官方网址&#xff1a;https://www.expressjs. com.cn/ 简单来说&#xff0c;express 是一个封装好的工具包&#xff0c;封装了很多功能&#xff0c;便于我们开发 WEB 应用&#xff08;HTTP 服务&am…

MOE模式:或将是最好的大模型应用开发路径

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 基于Dify的智能分类方案&#xff1a;大模型结合KNN算法&#xff08;附代码&#xff…

TiDB-从0到1-sync-diff-inspector数据校验工具

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇TiDB-从0到1-集群扩缩容TiDB-从0到1-数据导出导入TiDB-从0到1-BR工具 一、sync-diff-inspector工具 sync-diff-inspector是TiDB原生…

3.仓颉编程_没有switch_case需使用match_case

仓颉编程_没有switch_case需使用match_case 支持两种 match 表达式&#xff0c;一种是包含待匹配值的 match 表达式&#xff0c;另一种是不含待匹配值的 match 表达式。 含有匹配值的 match 表达式 main() {let a Hello World!//不可变量var a2 var b 77 //可变变量match(b…

指针!!C语言(第三篇)

目录 一. 二维数组传参的本质 二. 函数指针变量和函数指针数组 三. typedef关键字 四. 转移表 五. 回调函数以及qsort使用举例 一. 二维数组传参的本质 &#x1f35f;首先我们先回顾一下二维数组是怎样传参的&#xff1f;我们需要传入数组名以及行数和列数&#xff0c;这…

Spring Boot|如何实现 Spring Boot 的优雅停机

文章目录 概述优雅停机的重要性实现优雅停机的方法1. 使用Spring Boot Actuator配置使用 2. 自定义Shutdown Hook示例代码 3. 使用Spring Boot 2.3及更高版本的优雅停机特性配置 4. 通过Spring Cloud Gateway和Ribbon示例配置 5. 定制化停机逻辑示例代码 最佳实践结论 概述 在…

Dhtmlx Gantt教程:创建交互式甘特图的完整指南

在现代的项目管理中&#xff0c;时间是一种宝贵的资源&#xff0c;而甘特图则是一把解锁项目进度的魔法钥匙&#xff0c;想象一下&#xff0c;您可以在一个直观而动态的时间轴上&#xff0c;清晰地看到项目的每一个任务如何交织在一起&#xff0c;如何随着时间的推移展开&#…

【优质精选】12节大模型系列教学课程之二:RAG 原理与应用

课程二&#xff1a;RAG 原理与应用 12节大模型系列教学课程之二&#xff1a;RAG 原理与应用 课程详细内容RAG 技术的基础知识RAG 的工作原理RAG 提高生成质量和准确性的原理RAG 在问答系统中的应用RAG 在文本创作中的应用RAG 在其他领域的应用探索RAG 技术的挑战与应对策略RAG …

代码随想录算法训练营【动态规划篇】

动态规划 注&#xff1a;本文代码来自于代码随想录 509. 斐波那契数 力扣509 Python 动态规划&#xff08;版本一&#xff09; class Solution:def fib(self, n: int) -> int:# 排除 Corner Caseif n 0:return 0# 创建 dp table dp [0] * (n 1)# 初始化 dp 数组dp[0]…

LangChain4j-RAG高级-检索增强器

Retrieval Augmentor 检索增强器 RetrievalAugmentor 是 RAG 管道的入口点。它负责使用从各种来源检索的相关 Content 来扩充 ChatMessage 。 可以在创建 AiService 期间指定 RetrievalAugmentor 的实例&#xff1a; Assistant assistant AiServices.builder(Assistant.cla…

探索大型语言模型LLama 2:原理揭秘与代码实践

一、引言 1.1 大型语言模型的重要性 大型语言模型作为人工智能领域的重要研究方向&#xff0c;近年来取得了显著的成果。这些模型在自然语言处理、机器翻译、对话系统、文本生成等领域展现了强大的能力&#xff0c;为人类带来了诸多便利。大型语言模型的出现&#xff0c;使得…

初识git工具~~上传代码到gitee仓库的方法

目录 1.背景~~其安装 2.gitee介绍 2.1新建仓库 2.2进行相关配置 3.拉取仓库 4.服务器操作 4.1克隆操作 4.2查看本地仓库 4.3代码拖到本地仓库 4.4关于git三板斧介绍 4.4.1add操作 4.4.2commit操作 4.4.3push操作 5.一些其他说明 5.1.ignore说明 5.2git log命令 …

ElementPlus轮播图-Vue3

注意&#xff1a;安装时建议使用手机热点&#xff0c;wifi不稳定&#xff0c;会出现执行不成功的现象。 安装 使用包管理器 # 选择一个你喜欢的包管理器# NPM npm install element-plus --save# Yarn yarn add element-plus# pnpm pnpm install element-plus引入配置 完整引…

视频主题Qinmei 3.0视频站源码_WordPress影视视频主题/附详细安装教程

Qinmei 3.0主题主要是将 wordpress 改造成纯 api 的站点&#xff0c;以便实现前后端分离的技术栈&#xff0c;目前的进度已经大致完成&#xff0c;唯一的问题就是需要安装 JWT token 插件。 功能介绍&#xff1a; 支持豆瓣以及 bangumi 的一键获取信息, 豆瓣 api 目前使用的是…

【Node.js基础05】包的理解与使用

一&#xff1a;包的理解与简介 1 什么是包 包是一个将模块、代码、以及其他资料聚合成的文件夹 2 包的分类 项目包&#xff1a;编写项目代码的文件夹 软件包&#xff1a;封装工具和方法供开发者使用 3 为什么要在软件包中编写package.json文件 记录包的清单信息 二&…

NSIS打包脚本第二篇

NSIS打包脚本 NSIS打包脚本第一篇 字符串提取过滤 WordFind 使用方法 ${WordFind} "[string]" "[delimiter]" "[E][options]" $varoption解读 +1和+01一样,代表分割后的第一个字符串 +表示从左往右,-表示从右向左 +2}} 表示从左到右,前2…

Matlab arrayfun 与 bsxfun——提高编程效率的利器!

许多人知道 MATLAB 向量化编程&#xff0c;少用 for 循环 可以提高代码运行效率&#xff0c;但关于代码紧凑化编程&#xff0c; arrayfun 与 bsxfun 两个重要函数却鲜有人能够用好&#xff0c;今天针对这两个函数举例说明其威力。 Matlab arrayfun 概述 arrayfun 是 Matlab …

第五十天 第十一章:图论part01 图论理论基础 深搜理论基础 98. 所有可达路径 广搜理论基础

图论理论基础 了解邻接矩阵(*)&#xff0c;度&#xff0c;邻接表&#xff08;数组链表&#xff09;等 遍历顺序&#xff1a;深搜加广搜 深搜理论基础 dfs是可一个方向去搜&#xff0c;不到黄河不回头&#xff0c;直到遇到绝境了&#xff0c;搜不下去了&#xff0c…