快速上手,Python自动交易实现MACD指标快速布局(示例实操源码)

以下是利用easytrader库,可在python环境中实现该交易策略示例的实操源码:

import easytrader
import talib
import numpy as np

# 初始化easytrader
user = easytrader.use('ht')
user.prepare('ht.json') # 根据自己的情况填写自己的信息

# 获取历史数据
hist_data = user.get_history_data('sh000001', 365)

# 计算MACD
ema12 = talib.EMA(hist_data['close'].values, timeperiod=12)
ema26 = talib.EMA(hist_data['close'].values, timeperiod=26)
macd, signal, hist = talib.MACD(hist_data['close'].values, fastperiod=12, slowperiod=26, signalperiod=9)

# 定义交易函数
def trade(hist_data, ema12, ema26, macd, signal, position):
  current_close = hist_data['close'][-1]
  current_macd = macd[-1]
  current_signal = signal[-1]

  # 判断是否可以开仓或平仓
  if (ema12[-1] > ema26[-1]) and (ema12[-2] <= ema26[-2]): # 突破EMA上穿
    if position == 'short': # 如果是做空,则买入平仓
      user.buy('sh000001', current_close, 100) # 假设买100股
      position = 'none'
    elif position == 'none': # 如果未持仓,则买入开仓
      user.buy('sh000001', current_close, 100) # 假设买100股
      position = 'long'
  elif (ema12[-1] < ema26[-1]) and (ema12[-2] >= ema26[-2]): # 突破EMA下穿
    if position == 'long': # 如果是做多,则卖出平仓
      user.sell('sh000001', current_close, 100) # 假设卖100股
      position = 'none'
    elif position == 'none': # 如果未持仓,则卖出开仓
      user.sell('sh000001', current_close, 100)
      position = 'short'

  # 判断是否保持持仓
  elif current_macd > current_signal and position == 'long': # MACD高于信号线保持多仓
    pass
  elif current_macd < current_signal and position == 'short': # MACD低于信号线保持空仓
    pass
  else: # 其他情况则平仓
    if position == 'long':
      user.sell('sh000001', current_close, 100)
      position = 'none'
    elif position == 'short':
      user.buy('sh000001', current_close, 100)
      position = 'none'

  return position

# 开始交易
position = 'none' # 初始化持仓
for i in range(len(hist_data)):
  position = trade(hist_data[:i+1], ema12[:i+1], ema26[:i+1], macd[:i+1], signal[:i+1], position)


该代码使用了easytrader库中的buy和sell函数进行交易,get_history_data函数获取了过去一年的历史数据,MACD指标使用了talib库进行计算。在交易函数中,判断了突破EMA上穿和下穿的情况,并使用了current_macd和current_signal判断是否保持持仓。最后在交易循环中调用了该交易函数。