Loading ...

自适应动态双均线策略Python版

Author: Hukybo, Date: 2019-10-18 17:16:54
Tags:


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


# 导入库
import talib
import numpy as np


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


# 把K线数组转换成收盘价数组,用于计算AMA的值
def get_close(r):
    arr = []
    for i in r:
        arr.append(i['Close'])
    return arr


# 判断AMA是否上升
def is_up(arr):
    arr_len = len(arr)
    if arr[arr_len - 1] > arr[arr_len - 2] and arr[arr_len - 2] > arr[arr_len - 3]:
        return True     

    
# 判断AMA是否下降
def is_down(arr):
    arr_len = len(arr)
    if arr[arr_len - 1] < arr[arr_len - 2] and arr[arr_len - 2] < arr[arr_len - 3]:
        return True

    
# 判断两根AMA是否金叉
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

# 判断两根AMA是否死叉
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) < ama_long:  # 判断K线数组的长度,如果小于参数ama_long就不能计算AMA,所以直接返回跳过
        return
    close_arr = get_close(bar_arr)  # 把K线数组转换成收盘价数组,用于计算AMA的值
    np_close_arr = np.array(close_arr) # 把列表转换为numpy.array,用于计算AMA的值
    ama1 = talib.KAMA(np_close_arr, ama_short).tolist() # 计算短期AMA
    ama2 = talib.KAMA(np_close_arr, ama_long).tolist()  # 计算长期AMA
    last_close = close_arr[len(close_arr) - 1]  # 获取最新价格(卖价),用于开平仓
    global mp  # 全局变量,用于控制虚拟持仓
    
    # 开多单
    if mp == 0 and is_up_cross(ama1, ama2) and is_up(ama1):
        exchange.SetDirection("buy")  # 设置交易方向和类型
        exchange.Buy(last_close, 1)  # 开多单
        mp = 1  # 设置虚拟持仓的值,即有多单
    
    # 开空单
    if mp == 0 and is_down_cross(ama1, ama2) and is_down(ama1):
        exchange.SetDirection("sell")  # 设置交易方向和类型
        exchange.Sell(last_close - 1, 1)  # 开空单
        mp = -1  # 设置虚拟持仓的值,即有空单
    
    # 平多单
    if mp == 1 and (is_down_cross(ama1, ama2) or is_down(ama1)):
        exchange.SetDirection("closebuy")  # 设置交易方向和类型
        exchange.Sell(last_close - 1, 1)  # 平多单
        mp = 0  # 设置虚拟持仓的值,即空仓
    
    # 平空单
    if mp == -1 and (is_up_cross(ama1, ama2) or is_up(ama1)):
        exchange.SetDirection("closesell")  # 设置交易方向和类型
        exchange.Buy(last_close, 1)  # 平空单
        mp = 0  # 设置虚拟持仓的值,即空仓

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


More