千家信息网

python怎么实现唐奇安通道策略

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,这篇文章主要介绍"python怎么实现唐奇安通道策略"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"python怎么实现唐奇安通道策略"文章能帮助大家解决问题。
千家信息网最后更新 2024年11月23日python怎么实现唐奇安通道策略

这篇文章主要介绍"python怎么实现唐奇安通道策略"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"python怎么实现唐奇安通道策略"文章能帮助大家解决问题。

编写策略

到目前为止,你应该很好地理解了原始唐奇安通道规则,以及我们将要改进它的方法。现在我们就用代码编写这个交易策略吧。

第1步:编写策略框架

策略框架其实就是两个函数,其中main函数是整个程序的入口函数,也就是说策略开始执行的时候,会先执行main函数;另外一个是onTick函数,onTick只是一个函数的名字,当然你也可以自由命名,onTick函数里面主要编写策略逻辑。整个框架其实就是在main函数中重复执行onTick函数。

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

第2步:定义全局变量和外部参数
我们这个策略只需要一个控制虚拟持仓的全局变量,所谓的虚拟持仓指的是理论持仓而非真实持仓,无论开仓还是平仓,我们都假设订单已经完全成交。

# 定义全局变量mp = 0  # 用于控制虚拟持仓# 外部参数long_coefficient = 0.999short_coefficient = 1.001cycle_length = 55

第3步:处理K线数据
我们在前面已经定义过,上轨是过去N天的最高价的最大值,下轨是过去N天的最低价的最小值。要想计算这两个值,首先要先获取基础K线数据。但是在使用GetRecords方法获取完基础K线数据之后,先不要慌着计算上轨和下轨,而是先把数据处理一下。

因为我们在计算上轨和下轨的时候需要N个K线,如果K线数量太少就不能计算了,所以要加一个if条件,判断当前K线是否满足我们所需要的数量,如果不满足就直接返回,等待下一次循环。另外我们还需要从K线数组中提取当前最新价格和上根K线的收盘价,最新价格主要用于开平仓,上根K线收盘价主要用于判断开平仓信号。

有的朋友可能会问,为什么不直接使用最新的价格来判断开平仓信号呢?这是因为如果使用最新价格来判断,就可能出现信号反复的问题,同时也为了规避未来函数和偷价这些常见的量化交易问题,所以我们的策略在设计上是:当前K线出信号,下根K线发单。

exchange.SetContractType("rb000")  # 订阅期货品种bar_arr = exchange.GetRecords()  # 获取K线数组if len(bar_arr) < cycle_length + 1:  # 判断K线数组的长度    return  # 如果K线长度过小,就直接返回close_new = bar_arr[len(bar_arr) - 1]['Close']  # 获取最新价格(卖价),用于开平仓close_last = bar_arr[len(bar_arr) - 2]['Close']  # 上根K线收盘价,用于

第4步:计算上轨、下轨、中轨
在发明者量化交易软件中,已经内置了talib库中的Highest函数和Lowest函数,所以我们直接调用这两个函数就可以计算上轨和下轨的值。但因为我们是使用上根K线收盘价为基准,来判断它与上轨、下轨、中轨的位置关系来开平仓,所以在计算上轨和下轨之前需要先删除K线数组中的最后一个元素。

bar_arr.pop()  # 去掉K线数组最后一个元素,策略是当前K线出信号,下根K线发单,这样可以避免未来函数和偷价on_line = TA.Highest(bar_arr, cycle_length, 'High') * long_coefficient  # 计算上轨under_line = TA.Lowest(bar_arr, cycle_length, 'Low') * short_coefficient  # 计算下轨middle_line = (on_line + under_line) / 2  # 计算中轨

第5步:下单交易
根据Python的语法规则,要想在函数内使用外部的全局变量,需要在使用这个变量之前,先用global关键字把变量引入。注意下面代码中的注释,真个代码流程是使用if语句,然后根据我们之前定义的策略逻辑来编写。有两个地方需要注意,一个是在下单之前需要先设置下单的类型方向,也就是先调用SetDirection函数。另一个是在下单之后,要把虚拟持仓变量mp重新赋值。

global mp # 引入全局变量if mp == 0:  # 如果当前无持仓    if close_last > on_line:  # 如果价格大于上轨        exchange.SetDirection("buy")  # 设置交易方向和类型        exchange.Buy(close_new, 1)  # 开多单        mp = 1  # 设置虚拟持仓的值,即有多单    elif close_last < under_line:  # 如果价格小于下轨        exchange.SetDirection("sell")  # 设置交易方向和类型        exchange.Sell(close_new - 1, 1)  # 开空单        mp = -1  # 设置虚拟持仓的值,即有空单# 如果持多单,并且价格小于下轨if mp > 0 and close_last < middle_line:    exchange.SetDirection("closebuy")  # 设置交易方向和类型    exchange.Sell(close_new - 1, 1)  # 平多单    mp = 0  # 设置虚拟持仓的值,即空仓# 如果持空单,并且价格大于上轨if mp < 0 and close_last > middle_line:    exchange.SetDirection("closesell")  # 设置交易方向和类型    exchange.Buy(close_new, 1)  # 平空单    mp = 0  # 设置虚拟持仓的值,即空仓

完整策略代码

# 回测配置'''backteststart: 2015-02-22 00:00:00end: 2019-11-27 00:00:00period: 1hexchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]'''# 定义全局变量mp = 0  # 用于控制虚拟持仓# 外部参数long_coefficient = 0.999short_coefficient = 1.001cycle_length = 55def onTick():    exchange.SetContractType("rb000")  # 订阅期货品种    bar_arr = exchange.GetRecords()  # 获取K线数组    if len(bar_arr) < cycle_length + 1:        return    close_new = bar_arr[len(bar_arr) - 1]['Close']  # 获取最新价格(卖价),用于开平仓    close_last = bar_arr[len(bar_arr) - 2]['Close']  # 上根K线收盘价    bar_arr.pop()    on_line = TA.Highest(bar_arr, cycle_length, 'High') * long_coefficient    under_line = TA.Lowest(bar_arr, cycle_length, 'Low') * short_coefficient    middle_line = (on_line + under_line) / 2    global mp # 引入全局变量        if mp == 0:  # 如果当前无持仓,并且在规定的交易时间内        if close_last > on_line:  # 如果价格大于上轨            exchange.SetDirection("buy")  # 设置交易方向和类型            exchange.Buy(close_new, 1)  # 开多单            mp = 1  # 设置虚拟持仓的值,即有多单        elif close_last < under_line:  # 如果价格小于下轨            exchange.SetDirection("sell")  # 设置交易方向和类型            exchange.Sell(close_new - 1, 1)  # 开空单            mp = -1  # 设置虚拟持仓的值,即有空单        # 如果持多单,并且价格小于下轨或者非规定的交易时间    if mp > 0 and close_last < middle_line:        exchange.SetDirection("closebuy")  # 设置交易方向和类型        exchange.Sell(close_new - 1, 1)  # 平多单        mp = 0  # 设置虚拟持仓的值,即空仓        # 如果持空单,并且价格大于上轨或者非规定的交易时间    if mp < 0 and close_last > middle_line:        exchange.SetDirection("closesell")  # 设置交易方向和类型        exchange.Buy(close_new, 1)  # 平空单        mp = 0  # 设置虚拟持仓的值,即空仓    LogStatus(mp)              # 程序入口      def main():    while True:        onTick()        Sleep(1000)  #休眠1秒

关于"python怎么实现唐奇安通道策略"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

0