KDJ策略

第一步:架构和交易类库 

的策略架构就是设计整个策略的方式,如下图所示,该架构由2个函数构成:一个是main主函数,程序是从主函数开始执行代码,它的功能是处理策略逻辑核心之外的事情,比如:判断与交易所连接是否正常、过滤一些不必要的日志信息、控制执行策略逻辑核心执行的时间间隔等等;另一个是onTick函数,在这个函数里面,主要编写策略逻辑,包括:获取原始数据、计算数据、下单买卖等等。

def onTick(): 
    ## 这里是我们整个策略的核心判断逻辑以及具体的下单操作

def main():  ## 程序从这里开始执行代码
    if not onTick(): ## 这里先判断onTick函数是否正常
        Sleep(1000) ## 休眠一秒钟,然后开始重试

第二步:获取各种数据

各种原始数据是组成交易逻辑的重要部分,仔细想下,都需要哪些数据呢?从我们的策略交易逻辑中发现:首先需要需要获取K线数据,有了原始的K线数据,就可以计算出KDJ指标了,最后比较K值与D值的相互关系,判断是否下单。那么接下来让我们一以获取这些数据吧。

  • 获取K线数据

首先就是获取K线数组,因为有了K线数组,才能计算出KDJ指标。用代码写出来是这样的:

def onTick():
ct = exchange.SetContractType("rb888") ## 设置合约代码,方面后边的容错判断
    
    position = 0 ## 定义变量用来储存持仓状态和方向,初始为0,代表为空仓
    
    if ct == false: ## 如果设置合约不成功
        return false ## 返回false
    
    r = exchange.GetRecords() ## 获取K线数组,这里用到了发明者量化的API,可以为你省去很多再去自己写逻辑判断的时间和精力
    if len(r) < 10: ## 如果K线数量少于10根
        return false ## 返回false

我们把以上代码写入onTick函数中,注意其中的注释部分,有非常详细的逻辑说明。

  • 获取KDJ指标以及K值和D值

接着就需要计算KDJ指标的K值和D值了。那就要先获取KDJ指标数组,在从数组中获取K值和D值。在发明者量化工具中,获取KDJ数组还很简单,直接调用KDJ的API就可以了,难的是获取K值和D值,因为KDJ数组是一个二维数组。

二维数组其实很好理解,它就是数组中的数组,那么获取的顺序就是:先获取数组中指定的数组,然后在从指定的数组中获取指定的元素,如下所示:

def onTick():
ct = exchange.SetContractType("rb888") ## 设置合约代码,方面后边的容错判断
    
    position = 0 ## 定义变量用来储存持仓状态和方向,初始为0,代表为空
    
    if ct == false: ## 如果设置合约不成功
        return false ## 返回false
    
    r = exchange.GetRecords() ## 获取K线数组,这里用到了发明者量化的API,可以为你省去很多再去自己写逻辑判断的时间和精力
    if len(r) < 10: ## 如果K线数量少于10根
        return false ## 返回false

    arr = TA.KDJ(r, 9, 3, 3) ## 计算KDJ指标,这里用到了二维数。
    k = arr[0][-2] ## 获取上根K线KDJ指标的K值
    d = arr[1][-2] ## 获取上根K线KDJ指标的D值
    dPre = arr[1][-3] ## 获取上上根K线KDJ指标的D值

这里我们继续添加OnTick函数的内容,如上,我们直接使用发明者量化工具的API(arr = TA.KDJ),获取KDJ指标数组,这是一个二维数组:arr = [[K值, K值, K值...], [D值, D值, D值...], [J值, J值, J值...]]。

第三步:下单交易

有了以上数据,就可以编写交易逻辑以及下单交易的代码了。格式也非常简单,最常用到的是“if语句”,用文字可以描述为:如果条件1和条件2成立,下单;如果条件3或条件4成立,下单。如下所示:

def onTick(): ## 首先我们定义一个onTick函数,策略的核心逻辑都在这个函数内
    ct = exchange.SetContractType("rb888") ## 设置合约代码,方面后边的容错判断
    
    position = 0 ## 定义变量用来储存持仓状态和方向,初始为0,代表为空
    
    if ct == false: ## 如果设置合约不成
        return false ## 返回false
    
    r = exchange.GetRecords() ## 获取K线数组,这里用到了发明者量化的API,可以为你省去很多再去自己写逻辑判断的时间和精力
    if len(r) < 10: ## 如果K线数量少于10根
        return false ## 返回false

    arr = TA.KDJ(r, 9, 3, 3) ## 计算KDJ指标,这里用到了二维数。
    k = arr[0][-2] ## 获取上根K线KDJ指标的K值
    d = arr[1][-2] ## 获取上根K线KDJ指标的D值
    dPre = arr[1][-3] ## 获取上上根K线KDJ指标的D值

    action = "" ## 定义一个变量用来储存将要执行的开仓平仓操信号,初始值我设置为空。
    
    ## 如果上根K线的D值小于上上根K线的D值,并且持有单,就全部平仓
    ## 如果上根K线的D值大于上上根K线的D值,并且持有空单,就全部平仓

    if (d < dPre and position > 0) or (d > dPre and position < 0):
        action = 'cover'
    
    elif (k > d and position <= 0):  ## 如果上根K线的K值大于上根K线的D值,并且没有持有多单
        action = 'buy'   ## 把变量action设置为buy

    elif (k < d and position >= 0):  ## 如果上根K线的K值小于上根K线的D值,并且没有持有空单
        action = 'sell'  ## 把变量action设置为sell

    ## 这里需要注意的是,我们需要用到发明者量化平台的国内商品期货模版,模版地址为:https://www.fmz.com/strategy/24288位在发明者量化策编写页面进行编码时,需要把此模版先复制到自己的策略库,然后在回测时勾选上,这里请各位读者注意

    obj = ext.NewPositionManager()  ## 发明者量化平台的国内商品期模版

    if action == 'cover': ## 根据action的值来进行平仓操作
        obj.CoverAll()
    
    if action == 'buy':  ## 根据action的值来进行开多操作
        obj.OpenLong("rb888", 1)
    
    if action == 'sell':  ## 根据action的值来进行开空操作
        obj.OpenShort("rb888", 1)
        
    return true ## 返回true


def main():  ## 程序从这里开始执行代码
    if not onTick(): ## 这里先判断onTick函数是否正常
        Sleep(1000) ## 休眠一秒钟,然后开始重试

 

上一篇:KDJ计算公式


下一篇:【邢不行|量化小讲堂系列07-Python量化入门】历史数据告诉你:KDJ指标选股有效吗?