Loading ...

8.11 菲阿里四价策略

Author: Hukybo, Date: 2019-12-25 15:57:21
Tags:

摘要

在期货市场,价格呈现一切。几乎所有的技术分析,如均线、布林线、MACD、KDJ等等,这些都是以价格为基础,通过特定的方法计算。包括基本面分析也是如此,通过分析近期和远期价差、期货和现货升贴水、上下游库存等等数据,计算当前价格是否合理,并预估未来的价格。既然如此,为什么不直接研究价格呢?今天我们讲的菲阿里四价策略就是完全根据价格来做出卖决定。

点击阅读更多内容


# 回测配置
'''backtest
start: 2015-02-22 00:00:00
end: 2019-12-26 00:00:00
period: 5m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''


# 导入库
import time  # 用于转换时间格式


# 策略主函数
def onTick():
    exchange.SetContractType("rb888")  # 订阅期货品种
    bar_arr = _C(exchange.GetRecords, PERIOD_D1)  # 获取日线数组
    if len(bar_arr) < 2:  # 如果小于2根K线
        return  # 返回继续等待数据
    yesterday_high = bar_arr[-2]['High']  # 昨日最高价
    yesterday_low = bar_arr[-2]['Low']  # 昨日最低价
    yesterday_close = bar_arr[-2]['Close']  # 昨日收盘价
    today_open = bar_arr[-1]['Open']  # 当日开盘价
    
    bar_arr = _C(exchange.GetRecords)  # 获取当前设置周期K线数组
    current_time = bar_arr[-1]['Time']  # 获取当前K线时间戳
    time_local = time.localtime(current_time / 1000)  # 处理时间戳
    hour = int(time.strftime("%H", time_local))  # 格式化时间戳,并获取小时
    minute = int(time.strftime("%M", time_local))  # 格式化时间戳,并获取分钟
    current_close = bar_arr[-1]['Close']  # 获取最新价格
    
    # 处理时间函数
    def trade_time(hour, minute):
        hour = str(hour)
        minute = str(minute)
        if len(minute) == 1:
            minute = "0" + minute
        return int(hour + minute)
    
    # 获取持仓
    real_position = _C(exchange.GetPosition)  # 获取持仓数组
    if len(real_position) > 0:  # 如果持仓数组长度大于0
        real_position = real_position[0]
        if real_position['ContractType'] == 'rb888':  # 如果持仓品种等于订阅品种
            if real_position['Type'] == 0 or real_position['Type'] == 2:  # 如果是多单
                mp = real_position['Amount']  # 赋值持仓为正数
            elif real_position['Type'] == 1 or real_position['Type'] == 3:
                mp = -real_position['Amount']  # 赋值持仓为负数
    else:
        mp = 0  # 赋值持仓为0
    
    # 设置多头止损
    if today_open / yesterday_high > 1.005:  # 如果当天开盘价大于昨天最高价
        long_stop_loss = yesterday_high  # 设置多头止损价为昨天最高价
    elif today_open / yesterday_high < 0.995:  # 如果当天开盘价小于昨天最高价
        long_stop_loss = today_open  # 设置多头止损价为当天开盘价
    else:  # 如果当天开盘价接近于昨天最高价
        long_stop_loss = (yesterday_high + yesterday_low) / 2  # 设置多头止损为昨天中间价
    
    # 设置空头止损
    if today_open / yesterday_low < 0.995:  # 如果当天开盘价小于昨天最低价
        short_stop_loss = yesterday_low  # 设置空头止损价为昨天最低价
    elif today_open / yesterday_low > 1.005:  # 如果当天开盘价大于昨天最低价
        short_stop_loss = today_open  # 设置空头止损价为当天开盘价
    else:  # 如果当天开盘价接近于昨天最低价
        short_stop_loss = (yesterday_high + yesterday_low) / 2  # 设置多头止损为昨天中间价
    
    # 下单交易
    if mp > 0:  # 如果当前持有多单
        if current_close < long_stop_loss or trade_time(hour, minute) > 1450:  # 如果当前价格小于多头止损线,或者超过规定的交易时间
            exchange.SetDirection("closebuy")  # 设置交易方向和类型
            exchange.Sell(current_close - 1, 1)  # 平多单
    if mp < 0:  # 如果当前持有空单
        if current_close > short_stop_loss or trade_time(hour, minute) > 1450:  # 如果当前价格大于空头止损线,或者超过规定的交易时间
            exchange.SetDirection("closesell")  # 设置交易方向和类型
            exchange.Buy(current_close + 1, 1)  # 平空单
    if mp == 0 and 930 < trade_time(hour, minute) < 1450:  # 如果当前无持仓,并且在规定的交易时间内
        if current_close > yesterday_high:  # 如果当前价格大于昨天最高价
            exchange.SetDirection("buy")  # 设置交易方向和类型
            exchange.Buy(current_close + 1, 1)  # 开多单
        elif current_close < yesterday_low:  # 如果价格小于昨天最低价
            exchange.SetDirection("sell")  # 设置交易方向和类型
            exchange.Sell(current_close - 1, 1)  # 开空单


# 程序入口
def main():
    while True:  # 无限循环
        onTick()  # 执行策略主函数
        Sleep(1000)  #休眠1秒


More