python如何实现日内高低点突破策略

这篇文章将为大家详细讲解有关python如何实现日内高低点突破策略,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

成都创新互联公司专注于登封企业网站建设,响应式网站设计,商城网站建设。登封网站建设公司,为登封等地区提供建站服务。全流程按需策划设计,专业设计,全程项目跟踪,成都创新互联公司专业和态度为您提供的服务

什么是日内交易

日内交易的目的是以更小的损失,来获取当天市场微小的价格波动所带来的利润。它是指开仓和平仓在同一天内或同一交易时间段内完成的交易方式,开仓和平仓可以是单次,也可以是多次,只要是开平仓在同一个交易日前结束就行。

理论上日内交易不承担隔夜的跳空风险,是一种较完美的低风险交易策略,但实际上并非如此,虽然日内交易回避了跳空所带来的风险,同时也错失了跳空所带来的利润。但如果以正确的方式交易,通过配合不同的交易规则,日内交易往往也能产生丰厚的回报。

策略逻辑

我们知道判断上涨趋势最简单的方法是,当前低点比前一个低点更高,当前高点也比前一个高点更高;同理下跌趋势最简单的方法是,当前低点比前一个低点更低,当前高点也比前一个高点更低。但如果仅仅以高低点的比较去判断趋势的涨跌,这未免太过简陋,因为价格可能在一个点上来回跳动几十次甚至上百次,从而导致交易过于频繁。

所以我们需要设定一个价格区间来过滤这些日常杂波,来对简单的高低点突破策略进行完善。我们可以根据历史行情所出现的最高价和最低价,组成一个包含上轨和下轨的通道。根据顺势交易的原则,当价格突破上轨时多头开仓,当价格突破下轨时空头开仓。

  • 多头开仓:当前无持仓,时间是在开盘与收盘前10分钟之间,并且价格大于上轨

  • 空头开仓:当前无持仓,时间是在开盘与收盘前10分钟之间,并且价格小于下轨

  • 多头平仓:当前持多单,价格小于下轨,或者时间大于14:50

  • 空头平仓:当前持空单,价格大于上轨,或者时间大于14:50

有人统计过,大部分的窄幅止损都是无效的,小空间的止损会频繁打脸,所以我们要做的就是设计一个宽幅止损:如果多头开仓后,价格不升反跌,我们所要做的不是立即止损,而是等待观望,直到价格跌破下轨才止损出局;空头开仓后也是如此,当价格不跌反升,继续等待价格是否会自我修正,直到跌破上轨才止损出局。

策略编写

第1步:编写策略框架
编写策略就像盖房子一样,先把地基和框架搭建好,再往里面填充东西。我们这里用了两个函数,一个是main主函数,另一个是onTick函数,程序会先从main函数执行代码,在main函数中,我们用了一个无限循环模式,重复执行onTick函数。

# 策略主函数
def onTick():
    pass


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

第2步:导入time库

# 导入库
import time

因为日内策略在编写的时候,要判断当前的时间来控制开平仓逻辑,这个策略在设计的时候是:只能在9点30分之14点50分之间开仓,14点50分之后全部平仓,其余的时间都过滤掉了。所以就需要引入time时间库。

第3步:设置全局变量

mp = 0  # 用于控制虚拟持仓
on_line = 0  # 上轨
under_line = 0  # 下轨

在全局变量中,mp主要用于控制虚拟持仓,判断持仓一般分为两种,一种是真实的账户持仓,另一种就是虚拟持仓,还有一种是真实持仓和虚拟持仓联合判断。实盘时我们只使用真实持仓就足够了,但这里为了简化策略,作为演示使用虚拟持仓。on_line和under_line分别记录上轨和下轨。

第4步:处理时间

# 处理时间函数
def can_time(hour, minute):
    hour = str(hour)
    minute = str(minute)
    if len(minute) == 1:
        minute = "0" + minute
    return int(hour + minute)

exchange.SetContractType("MA888")  # 订阅期货品种
bar_arr = exchange.GetRecords()  # 获取K线数组 
time_new = bar_arr[len(bar_arr) - 1]['Time']  # 获取当根K线的时间戳
time_local_new = time.localtime(time_new / 1000)  # 处理时间戳
hour_new = int(time.strftime("%H", time_local_new))  # 格式化时间戳,并获取小时
minute_new = int(time.strftime("%M", time_local_new))  # 格式化时间戳,并获取分钟
day_new = int(time.strftime("%d", time_local_new))  # 格式化时间戳,并获取日期
time_previous = bar_arr[len(bar_arr) - 2]['Time']  # 获取上根K线的时间戳
time_local_previous = time.localtime(time_previous / 1000)  # 处理时间戳
day_previous = int(time.strftime("%d", time_local_previous))  # 格式化时间戳,并获取日期

处理时间一共用于两个地方:一个是判断当前时间是否在我们规定的交易时间内,如果是在这个时间之内并且达到开仓条件就开仓,如果不是在这个时间之内并且当前有持仓就全部平仓;另一个是判断当前K线是不是最新交易日的K线,如果当前K线是最新交易日的K线,就重置on_line和under_line的值。

第4步:计算高低点上下轨

global mp, on_line, under_line  # 引入全局变量
high = bar_arr[len(bar_arr) - 2]['High']  # 获取上根K线的最高价
low = bar_arr[len(bar_arr) - 2]['Low']  # 获取上根K线的最低价
if day_new != day_previous or len(bar_arr) == 1:  # 如果当前是第一个K线,或者是最新一根K线
    on_line = high * up # 重置上轨
    under_line = low * down  # 重置下轨
if can_time(hour_new, minute_new) < 930:  # 如果不是在规定交易的时间内
    if high > on_line:  # 如果上根K线最高价大于上轨
        on_line = high * up  # 重置上轨
    elif low < under_line:  # 如果上根K线最低价小于下轨
        under_line = low * down  # 重置上轨

计算高低点上下轨的逻辑其实非常简单:如果当前是第一根K线,那么on_line和under_line的值分别是最高价和最低价,如果当前K线是最新交易日的K线,就重置on_line和under_line的值为最高价和最低价;一旦在规定的交易时间内,on_line和under_line的值就固定不变了,除非在这个时间之外并且如果上根K线最高价大于on_line就重置为最新的最高价;如果上根K线最低价小于under_line就重置为最新的最低价。

第5步:下单交易

close_new = bar_arr[len(bar_arr) - 1]['Close']  # 获取最新价格(卖价),用于开平仓
if mp == 0 and 930 < can_time(hour_new, minute_new) < 1450:  # 如果当前无持仓,并且在规定的交易时间内
    if close_new > on_line:  # 如果价格大于上轨
        exchange.SetDirection("buy")  # 设置交易方向和类型
        exchange.Buy(close_new, 1)  # 开多单
        mp = 1  # 设置虚拟持仓的值,即有多单
    elif close_new < under_line:  # 如果价格小于下轨
        exchange.SetDirection("sell")  # 设置交易方向和类型
        exchange.Sell(close_new - 1, 1)  # 开空单
        mp = -1  # 设置虚拟持仓的值,即有空单

# 如果持多单,并且价格小于下轨或者非规定的交易时间
if mp > 0 and (close_new < under_line or can_time(hour_new, minute_new) > 1450):
    exchange.SetDirection("closebuy")  # 设置交易方向和类型
    exchange.Sell(close_new - 1, 1)  # 平多单
    mp = 0  # 设置虚拟持仓的值,即空仓

# 如果持空单,并且价格大于上轨或者非规定的交易时间
if mp < 0 and (high > on_line or can_time(hour_new, minute_new) > 1450):
    exchange.SetDirection("closesell")  # 设置交易方向和类型
    exchange.Buy(close_new, 1)  # 平空单
    mp = 0  # 设置虚拟持仓的值,即空仓

在下单交易之前,我们要先获取当前最新价格,因为在下单时需要在函数中传入下单价格。然后使用if语句,根据之前设计的交易逻辑,先是判断当前的持仓状态,然后再判断当前时间状态,以及最新价格与上下轨的相互位置关系,最后下单交易并重置虚拟持仓状态。需要注意的是在期货交易下单之前,先指定交易的方向类型,即:开多、开空、平多、平空。调用exchange.SetDirection()函数,分别传入:“buy”、“sell”、“closebuy”、“closesell”。

完整策略

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

# 导入库
import time


# 定义全局变量
mp = 0  # 用于控制虚拟持仓
on_line = 0  # 上轨
under_line = 0  # 下轨


def onTick():
    # 处理时间函数
    def can_time(hour, minute):
        hour = str(hour)
        minute = str(minute)
        if len(minute) == 1:
            minute = "0" + minute
        return int(hour + minute)
    
    exchange.SetContractType("MA888")  # 订阅期货品种
    bar_arr = exchange.GetRecords()  # 获取K线数组 
    time_new = bar_arr[len(bar_arr) - 1]['Time']  # 获取当根K线的时间戳
    time_local_new = time.localtime(time_new / 1000)  # 处理时间戳
    hour_new = int(time.strftime("%H", time_local_new))  # 格式化时间戳,并获取小时
    minute_new = int(time.strftime("%M", time_local_new))  # 格式化时间戳,并获取分钟
    day_new = int(time.strftime("%d", time_local_new))  # 格式化时间戳,并获取日期
    time_previous = bar_arr[len(bar_arr) - 2]['Time']  # 获取上根K线的时间戳
    time_local_previous = time.localtime(time_previous / 1000)  # 处理时间戳
    day_previous = int(time.strftime("%d", time_local_previous))  # 格式化时间戳,并获取日期
    
    global mp, on_line, under_line  # 引入全局变量
    high = bar_arr[len(bar_arr) - 2]['High']  # 获取上根K线的最高价
    low = bar_arr[len(bar_arr) - 2]['Low']  # 获取上根K线的最低价
    if day_new != day_previous or len(bar_arr) == 1:  # 如果当前是第一个K线,或者是最新一根K线
        on_line = high * up # 重置上轨
        under_line = low * down  # 重置下轨
    if can_time(hour_new, minute_new) < 930:  # 如果不是在规定交易的时间内
        if high > on_line:  # 如果上根K线最高价大于上轨
            on_line = high * up  # 重置上轨
        elif low < under_line:  # 如果上根K线最低价小于下轨
            under_line = low * down  # 重置上轨
    
    close_new = bar_arr[len(bar_arr) - 1]['Close']  # 获取最新价格(卖价),用于开平仓
    if mp == 0 and 930 < can_time(hour_new, minute_new) < 1450:  # 如果当前无持仓,并且在规定的交易时间内
        if close_new > on_line:  # 如果价格大于上轨
            exchange.SetDirection("buy")  # 设置交易方向和类型
            exchange.Buy(close_new, 1)  # 开多单
            mp = 1  # 设置虚拟持仓的值,即有多单
        elif close_new < under_line:  # 如果价格小于下轨
            exchange.SetDirection("sell")  # 设置交易方向和类型
            exchange.Sell(close_new - 1, 1)  # 开空单
            mp = -1  # 设置虚拟持仓的值,即有空单
    
    # 如果持多单,并且价格小于下轨或者非规定的交易时间
    if mp > 0 and (close_new < under_line or can_time(hour_new, minute_new) > 1450):
        exchange.SetDirection("closebuy")  # 设置交易方向和类型
        exchange.Sell(close_new - 1, 1)  # 平多单
        mp = 0  # 设置虚拟持仓的值,即空仓
    
    # 如果持空单,并且价格大于上轨或者非规定的交易时间
    if mp < 0 and (high > on_line or can_time(hour_new, minute_new) > 1450):
        exchange.SetDirection("closesell")  # 设置交易方向和类型
        exchange.Buy(close_new, 1)  # 平空单
        mp = 0  # 设置虚拟持仓的值,即空仓

        
# 程序入口      
def main():
    while True:
        onTick()
        Sleep(1000)  #休眠1秒

关于“python如何实现日内高低点突破策略”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。


当前名称:python如何实现日内高低点突破策略
文章位置:http://scyanting.com/article/pseheo.html