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

server/2024/9/25 16:09:22/

数字货币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.ppmy.cn/server/93768.html

相关文章

LeetCode题解:2073. 买票需要的时间,直接计算,JavaScript,详细注释

原题链接&#xff1a; https://leetcode.cn/problems/time-needed-to-buy-tickets/ 解题思路&#xff1a; 如果是k和他之前的人 如果买票数量比k少&#xff0c;肯定全部买完&#xff0c;及tickets[i]如果买票数量比k大&#xff0c;最多只能买tickets[k]张 如果是k之后的人 如…

强化学习之Dyna-Q算法——以悬崖漫步环境为例

0.介绍 在强化学习中模型通常指与智能体交互的环境模型&#xff0c;即对环境的状态转移概率和奖励函数进行建模&#xff0c;强化学习依据是否具有环境模型分为基于模型的强化学习&#xff08;model-based reinforcement learning&#xff09;以及无模型的强化学习&#xff08;m…

PHP命名空间

PHP 命名空间是 PHP 5.3.0 版本之后引入的一个重要特性&#xff0c;它提供了一种将相关的类、接口、函数和常量组合在一起的方式&#xff0c;以避免命名冲突&#xff0c;并更好地组织代码。以下是对 PHP 命名空间的详细教程&#xff1a; 一、命名空间的定义 使用 namespace 关…

Python爬虫(6) --深层爬取

深层爬取 在前面几篇的内容中&#xff0c;我们都是爬取网页表面的信息&#xff0c;这次我们通过表层内容&#xff0c;深度爬取内部数据。 接着按照之前的步骤&#xff0c;我们先访问表层页面&#xff1a; 指定url发送请求获取你想要的数据数据解析 我们试着将以下豆瓣读书页…

栈应用---中缀表达式转后缀表达式及计算实现

中缀表达式转后缀表达式及计算 概述 该程序实现了将中缀表达式转换为后缀表达式&#xff0c;并计算后缀表达式的值。程序首先读取用户输入的中缀表达式&#xff0c;然后将其转换为后缀表达式&#xff0c;并输出转换后的结果。接着&#xff0c;程序要求用户输入一个后缀表达式…

OceanBase v4.2 特性解析:如何实现表级恢复

背景 在某些情况下&#xff0c;你可能会因为误操作而遇到表数据损坏或误删表的情况。为了能在事后将表数据恢复到某个特定时间点&#xff0c;在OceanBase尚未有表级恢复功能之前&#xff0c;你需要进行以下步骤&#xff1a; 利用OceanBase提供的物理恢复工具&#xff0c;您可…

2024年最全数据库开发必备神器:DataGrip 使用介绍

DataGrip 使用介绍 前言 DataGrip 是由 JetBrains 开发的一款专业的数据库管理工具&#xff0c;广泛支持多种数据库系统&#xff0c;如 MySQL、PostgreSQL、Oracle、SQL Server、SQLite、MongoDB 等。它提供了强大的 SQL 编辑和调试功能&#xff0c;使数据库开发和管理更加高…

轨迹优化 | 基于ESDF的共轭梯度优化算法(附ROS C++/Python仿真)

目录 0 专栏介绍1 数值优化:共轭梯度法2 基于共轭梯度法的轨迹优化2.1 障碍约束函数2.2 曲率约束函数2.3 平滑约束函数3 算法仿真3.1 ROS C++实现3.2 Python实现0 专栏介绍 🔥课设、毕设、创新竞赛必备!🔥本专栏涉及更高阶的运动规划算法轨迹优化实战,包括:曲线生成、…