Loading ...

经典MACD交易策略

Author: Hukybo, Date: 2019-10-25 16:43:14
Tags:

摘要

相信做过交易的人对MACD都不陌生,这是一个非常古老的技术指标,它是由查拉尔·阿佩尔(Geral Appel)在上个世纪70年代发明的,全称指数平滑异同移动平均线。本节我们将继续重温经典技术分析工具MACD,深度解析每一个计算步骤,以及如何用Python和talib库去实现它,并根据MACD比较常用的使用方法来构建策略。

点击阅读更多内容


# 回测配置
'''backtest
start: 2015-02-22 00:00:00
end: 2019-10-17 00:00:00
period: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''


mp = 0  # 定义一个全局变量,用于控制虚拟持仓

    
# 判断两根两个数组是否金叉
def is_up_cross(arr1, arr2):
    if arr1[len(arr1) - 2] < arr2[len(arr2) - 2] and arr1[len(arr1) - 1] > arr2[len(arr2) - 1]:
        return True

# 判断两根两个数组是否死叉
def is_down_cross(arr1, arr2):
    if arr1[len(arr1) - 2] > arr2[len(arr2) - 2] and arr1[len(arr1) - 1] < arr2[len(arr2) - 1]:
        return True    

    
# 程序主函数
def onTick():
    exchange.SetContractType("rb000")  # 订阅期货品种
    bar_arr = exchange.GetRecords()  # 获取K线数组
    if len(bar_arr) < long + m + 1:  # 如果K线数组长度太小,就不能计算MACD,所以直接返回跳过
        return
    all_macd = TA.MACD(bar_arr, short, long, m)  # 计算MACD值,返回的是一个二维数组
    dif = all_macd[0]  # 获取DIF的值,返回一个数组
    dif.pop()  # 删除DIF数组最后一个元素
    dea = all_macd[1]  # 获取DEA的值,返回一个数组
    dea.pop()  # 删除DEA数组最后一个元素
    last_close = bar_arr[len(bar_arr) - 1]['Close']  # 获取最新价格(卖价),用于开平仓
    global mp  # 全局变量,用于控制虚拟持仓
    
    # 开多单
    if mp == 0 and dif[len(dif) - 1] > 0:
        exchange.SetDirection("buy")  # 设置交易方向和类型
        exchange.Buy(last_close, 1)  # 开多单
        mp = 1  # 设置虚拟持仓的值,即有多单
    
    # 开空单
    if mp == 0 and dif[len(dif) - 1] < 0:
        exchange.SetDirection("sell")  # 设置交易方向和类型
        exchange.Sell(last_close - 1, 1)  # 开空单
        mp = -1  # 设置虚拟持仓的值,即有空单
        
    # 平多单
    if mp == 1 and is_down_cross(dif, dea):
        exchange.SetDirection("closebuy")  # 设置交易方向和类型
        exchange.Sell(last_close - 1, 1)  # 平多单
        mp = 0  # 设置虚拟持仓的值,即空仓
    
    # 平空单
    if mp == -1 and is_up_cross(dif, dea):
        exchange.SetDirection("closesell")  # 设置交易方向和类型
        exchange.Buy(last_close, 1)  # 平空单
        mp = 0  # 设置虚拟持仓的值,即空仓

        
def main():
    while True:
        onTick()
        Sleep(1000)


More