Loading ...

8.10 经典恒温器策略

Author: Hukybo, Date: 2019-12-20 13:17:57
Tags:

摘要

趋势行情不会永远持续下去,事实上市场大部分时间都处于震荡行情,所以才会有人希望能得到一种交易策略,既可以用在趋势行情,也可以用在震荡行情。那么今天我们就用发明者量化交易平台,构建一个趋势和震荡行情通用的经典恒温器策略。 点击阅读更多


'''backtest
start: 2016-01-01 00:00:00
end: 2019-01-01 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''

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

# 策略主函数
def onTick():
    exchange.SetContractType("rb000")  # 订阅期货品种
    bar_arr = exchange.GetRecords()  # 获取K线数组
    if len(bar_arr) < 100:  # 如果K线少于100根
        return  # 直接返回
    close0 = bar_arr[-1]['Close']  # 获取最新价格(卖价),用于开平仓
    bar_arr.pop()  # 删除K线数组最后一个元素,策略采用开平仓条件成立,下根K线交易模式
    
    # 计算CMI指标用以区分震荡市与趋势市
    close1 = bar_arr[-1]['Close']  # 最新收盘价
    close30 = bar_arr[-30]['Close']  # 前30根K线的收盘价
    hh30 = TA.Highest(bar_arr, 30, 'High')  # 最近30根K线的最高价
    ll30 = TA.Lowest(bar_arr, 30, 'Low')  # 最近30根K线的最低价
    cmi = abs((close1 - close30) / (hh30 - ll30)) * 100  # 计算市场波动指数

    # 震荡市中收盘价大于关键价格为宜卖市,否则为宜买市
    high1 = bar_arr[-1]['High']  # 最新最高价
    low1 = bar_arr[-1]['Low']  # 最新最低价
    kod = (close1 + high1 + low1) / 3  # 计算关键价格
    if close1 > kod:
        be = 1
        se = 0
    else:
        be = 0
        se = 1
    
    # 计算10根K线ATR指标
    atr10 = TA.ATR(bar_arr, 10)[-1]

    # 定义最高价与最低价3日均线
    high2 = bar_arr[-2]['High']  # 上根K线最高价
    high3 = bar_arr[-3]['High']  # 前根K线最高价
    low2 = bar_arr[-2]['Low']  # 上根K线最低价
    low3 = bar_arr[-3]['Low']  # 前根K线最低价
    avg3high = (high1 + high2 + high3) / 3  # 最近3根K线最高价的均值
    avg3low = (low1 + low2 + low3) / 3  # 最近3根K线最低价的均值
    
    # 计算震荡行情的进场价格
    open1 = bar_arr[-1]['Open']  # 最新开盘价
    if close1 > kod:  # 如果收盘价大于关键价格
        lep = open1 + atr10 * 3
        sep = open1 - atr10 * 2
    else:
        lep = open1 + atr10 * 2
        sep = open1 - atr10 * 3
    lep1 = max(lep, avg3high)  # 计算震荡市多头进场价格
    sep1 = min(sep, avg3low)  # 计算震荡市空头进场价格
    
    # 计算趋势行情的进场价格
    boll = TA.BOLL(bar_arr, 50, 2)
    up_line = boll[0][-1]
    mid_line = boll[1][-1]
    down_line = boll[2][-1]
    
    global mp  # 引入全局变量
    if cmi < 20:  # 如果是震荡行情
        if mp == 0 and close1 >= lep1 and se:
            exchange.SetDirection("buy")  # 设置交易方向和类型
            exchange.Buy(close0, 1)  # 开多单
            mp = 1  # 设置虚拟持仓的值,即有多单
        if mp == 0 and close1 <= sep1 and be:
            exchange.SetDirection("sell")  # 设置交易方向和类型
            exchange.Sell(close0 - 1, 1)  # 开空单
            mp = -1  # 设置虚拟持仓的值,即有空单
        if mp == 1 and (close1 >= avg3high or be):
            exchange.SetDirection("closebuy")  # 设置交易方向和类型
            exchange.Sell(close0 - 1, 1)  # 平多单
            mp = 0  # 设置虚拟持仓的值,即空仓
        if mp == -1 and (close1 <= avg3low or se):
            exchange.SetDirection("closesell")  # 设置交易方向和类型
            exchange.Buy(close0, 1)  # 平空单
            mp = 0  # 设置虚拟持仓的值,即空仓
    else:  # 如果是趋势行情
        if mp == 0 and close1 >= up_line:
            exchange.SetDirection("buy")  # 设置交易方向和类型
            exchange.Buy(close0, 1)  # 开多单
            mp = 1  # 设置虚拟持仓的值,即有多单
        if mp == 0 and close1 <= down_line:
            exchange.SetDirection("sell")  # 设置交易方向和类型
            exchange.Sell(close0 - 1, 1)  # 开空单
            mp = -1  # 设置虚拟持仓的值,即有空单
        if mp == 1 and close1 <= mid_line:
            exchange.SetDirection("closebuy")  # 设置交易方向和类型
            exchange.Sell(close0 - 1, 1)  # 平多单
            mp = 0  # 设置虚拟持仓的值,即空仓
        if mp == -1 and close1 >= mid_line:
            exchange.SetDirection("closesell")  # 设置交易方向和类型
            exchange.Buy(close0, 1)  # 平空单
            mp = 0  # 设置虚拟持仓的值,即空仓
            
            
# 程序入口        
def main():
    while True:  # 进入无限循环模式
        onTick()  # 执行策略主函数
        Sleep(1000)  # 休眠1秒
    


More