模拟测试kdj

Author: zhiyuanfirst, Date: 2018-09-28 10:00:55
Tags: 工具PythonKDJ


import types # 导入类型模块
import time  # 导入时间模块
import platform # 版本信息 

versionMainValue = None
isFirstCheck = True
def typeOfstr(str):
    if str == "list":
        if versionMainValue == 2:
            return types.ListType
        elif versionMainValue == 3:
            return list
    elif str == "int":
        if versionMainValue == 2:
            return types.IntType
        elif versionMainValue == 3:
            return int
    elif str == "float":
        if versionMainValue == 2:
            return types.FloatType
        elif versionMainValue == 3:
            return float
    else:
        Log("error , typeOfstr used false")
            
def CheckVersion():
    global versionMainValue,isFirstCheck
    platformInfo = platform.python_version()
    if platformInfo[0] == '2':
        Log("您使用的托管者 python编译环境的python版本是",platformInfo)
        versionMainValue = 2
    elif platformInfo[0] == '3':
        Log("您使用的托管者 python编译环境的python版本是",platformInfo)
        versionMainValue = 3
    else:
        Log("其它版本")
    isFirstCheck = False

def CancelPendingOrders(e, orderType = "") : # 取消所有未完成挂单
    while True: # 循环
        orders = e.GetOrders()
        LogStatus("orders:",orders,time.time()) # 测试
        if(type(orders) != typeOfstr("list")):
            Sleep(RetryDelay)
            continue
        processed = 0
        for j in range(len(orders)):
            if (type(orderType) == typeOfstr("int") and orders[j].Type != orderType):
                continue
            e.CancelOrder(orders[j].Id,orders[j])
            processed += 1
            if (j < (len(orders) - 1)):
                Sleep(RetryDelay)
        if(processed == 0):
            break

def GetAccount(e, waitFrozen = False):
    account = null
    alreadyAlert = False
    while True:
        account = _C(e.GetAccount)
        if(not waitFrozen or (account.FrozenStocks < _GetMinStocks and account.FrozenBalance < 0.01)):
            break
        if(not alreadyAlert):
            alreadyAlert = True
            Log("发现账户有冻结的钱或币",account)
        Sleep(RetryDelay)
    return account

def StripOrders(e,orderId = null):
    order = null
    while True:
        dropped = 0
        orders = _C(e.GetOrders)
        for i in range(len(orders)):
            if(orders[i].Id == orderId):
                order = orders[i]
            else:
                extra = ""
                if(orders[i].DealAmount > 0):
                    extra = "成交:" + str(orders[i].DealAmount)
                else:
                    extra = "未成交"
                e.CancelOrder(orders[i].Id,"买单" if orders[i].Type == ORDER_TYPE_BUY else "卖单",extra)
                dropped += 1
        if(dropped == 0):
            break
        Sleep(RetryDelay)
    return order

def Trade(e,tradeType,tradeAmount,mode,slidePrice,maxAmount,maxSpace,retryDelay):
    initAccount = GetAccount(e,True)
    nowAccount = initAccount
    orderId = null
    prePrice = 0.0
    dealAmount = 0.0
    diffMoney = 0.0
    isFirst = True
    tradeFunc = e.Buy if tradeType == ORDER_TYPE_BUY else e.Sell
    isBuy = (tradeType == ORDER_TYPE_BUY)
    while True:
        ticker = _C(e.GetTicker)
        tradePrice = 0.0
        if(isBuy):
            tradePrice = _N((ticker.Sell if mode == 0 else ticker.Buy) + slidePrice,4)
        else:
            tradePrice = _N((ticker.Buy if mode == 0 else ticker.Sell) - slidePrice,4)
        if(not orderId):
            if(isFirst):
                isFirst = False
            else:
                nowAccount = GetAccount(e,True)
            doAmount = 0.0;
            if(isBuy):
                diffMoney = _N(initAccount.Balance - nowAccount.Balance,4)
                dealAmount = _N(nowAccount.Stocks - initAccount.Stocks,4)
                doAmount = min(maxAmount,tradeAmount - dealAmount,_N((nowAccount.Balance - 10) / tradePrice,4))
            else:
                diffMoney = _N(nowAccount.Balance - initAccount.Balance,4)
                dealAmount = _N(initAccount.Stocks - nowAccount.Stocks,4)
                doAmount = min(maxAmount,tradeAmount - dealAmount,nowAccount.Stocks)
            if(doAmount < _GetMinStocks):
                break
            prePrice = tradePrice
            orderId = tradeFunc(tradePrice,doAmount,ticker)
            if(not orderId):
                CancelPendingOrders(e,tradeType)
        else:
            if(mode == 0 or (abs(tradePrice - prePrice) > maxSpace)):
                orderId = null
            order = StripOrders(e,orderId)
            if(not order):
                orderId = null
        Sleep(retryDelay)
    if(dealAmount <= 0):
        Log("交易失败--TradeType:","buy" if tradeType == ORDER_TYPE_BUY else "sell","  ,diffMoney:",diffMoney,"  ,dealAmount",dealAmount,"  ,doAmount",doAmount)
        return null
    
    ret = {'price': _N(diffMoney/dealAmount,4),'amount':dealAmount}
    return ret
    # 调用时 这样写  ret['price'] 、 ret['amount']

def _Buy(e = exchange,amount = 0):
    if isFirstCheck:
        CheckVersion()
    if (type(e) == typeOfstr("int") or type(e) == typeOfstr("float")):
        amount = e
        e = exchange
    return Trade(e,ORDER_TYPE_BUY,amount,OpMode,SlidePrice,MaxAmount,MaxSpace,RetryDelay)

def _Sell(e = exchange,amount = 0):
    if isFirstCheck:
        CheckVersion()
    if (type(e) == typeOfstr("int") or type(e) == typeOfstr("float")):
        amount = e
        e = exchange
    return Trade(e,ORDER_TYPE_SELL,amount,OpMode,SlidePrice,MaxAmount,MaxSpace,RetryDelay)

def _CancelPendingOrders(e = exchange,orderType = ""):
    if isFirstCheck:
        CheckVersion()
    return CancelPendingOrders(e,orderType)

def _GetAccount(e = exchange):
    if isFirstCheck:
        CheckVersion()
    return _C(e.GetAccount)

_MACalcMethod = [TA.EMA,TA.MA][MAType]
Interval = 200
def Cross(a,b):
    if isFirstCheck:
        CheckVersion()
    crossNum = 0
    arr1 = []
    arr2 = []
    if type(a) == typeOfstr("list") and type(b) == typeOfstr("list"):
        arr1 = a
        arr2 = b
    else:
        records = null
        while True:
            records = exchange.GetRecords()
            if records and len(records) > a and len(records) > b:
                break
            Sleep(Interval)
        arr1 = _MACalcMethod(records,a)
        arr2 = _MACalcMethod(records,b)
    if len(arr1) != len(arr2):
        raise Exception("array length not equal")
    for i in range(len(arr1) - 1,-1,-1):
        if (type(arr1[i]) != typeOfstr("int") and type(arr1[i]) != typeOfstr("float")) or (type(arr2[i]) != typeOfstr("int") and type(arr2[i]) != typeOfstr("float")):
            break
        if arr1[i] < arr2[i] :
            if crossNum > 0 :
                break
            crossNum -= 1
        elif arr1[i] > arr2[i] :
            if crossNum < 0 :
                break
            crossNum += 1
        else:
            break
    return crossNum


# 导出函数
ext.Buy = _Buy
ext.Sell = _Sell
ext.CancelPendingOrders = _CancelPendingOrders
ext.GetAccount = _GetAccount
ext.Cross = Cross

_G("status", 'none')
_G("valueJ", 0)
_G("count", 0)
_G("buy_type","default")
ZERO = 1e-9
# 点
class Point(object):

    def __init__(self, x, y):
        self.x, self.y = x, y

# 向量
class Vector(object):

    def __init__(self, start_point, end_point):
        self.start, self.end = start_point, end_point
        self.x = end_point.x - start_point.x
        self.y = end_point.y - start_point.y

def negative(vector):
    """取反"""
    return Vector(vector.end, vector.start)

def vector_product(vectorA, vectorB):
    '''计算 x_1 * y_2 - x_2 * y_1'''
    return vectorA.x * vectorB.y - vectorB.x * vectorA.y

def is_intersected(A, B, C, D):
    '''A, B, C, D 为 Point 类型'''
    AC = Vector(A, C)
    AD = Vector(A, D)
    BC = Vector(B, C)
    BD = Vector(B, D)
    CA = negative(AC)
    CB = negative(BC)
    DA = negative(AD)
    DB = negative(BD)

    return (vector_product(AC, AD) * vector_product(BC, BD) <= ZERO) \
        and (vector_product(CA, CB) * vector_product(DA, DB) <= ZERO)        

    
    
# 测试
def onTick2():
    records = exchange.GetRecords(PERIOD_H1)
    #Log("第一根k线数据为,Time:", records[0].Time, "Open:", records[0].Open, "High:", records[0].High,"Low:", records[0].Close, "Volume:", records[0].Volume);
        
    #Log("第二根k线数据为,Time:", records[len(records)-1].Time, "Open:", records[1].Open, "High:", records[1].High,"Low:", records[1].Close, "Volume:", records[1].Volume);
    kdj = TA.KDJ(records, 9, 3, 3)
    k = kdj[0]
    d = kdj[1]
    j = kdj[2]
    if len(k) == len(d) == len(j):
        length = len(k)
    
        if k[length-1] is None or d[length-1] is None or j[length-1] is None:
            return
        if _G("buy_type") == "block" and j[length-1] > 0:
            _G("buy_type", "default")

        if _G("status") != 'buy' and j[length-1] < 0:
            if j[length-1] < -100:
                _G("buy_type", "black")
                           
                
            if _G("buy_type") == "default":          
                #buy
                ext.Buy(0.1)
                _G("status", "buy")                  
                Log("buy:k,d,j", k[length-1], d[length-1], j[length-1])
    
        if _G("status") == 'buy' and j[length-1] > 100:
            #sell
            ext.Sell(0.1)
            _G("status", "sell")                   
            Log("sell:k,d,j", k[length-1], d[length-1], j[length-1])

def onTick1():
    status = 'none'
    Log(exchange.GetAccount())
    records = exchange.GetRecords(PERIOD_D1)
    kdj = TA.KDJ(records, 9, 3, 3)
    k = kdj[0]
    d = kdj[1]
    j = kdj[2]
    Log("kdj:", k, d, j)
    if len(k) == len(d) == len(j):
        length = len(k)
        Log("length:", length)
        if k[length-1] is None or d[length-1] is None or j[length-1] is None:
            return
        if k[length-2] is None or d[length-2] is None or j[length-2] is None:
            return
        if k[length-3] is None or d[length-3] is None or j[length-3] is None:
            return
        
        valueJ = _G("valueJ")
        if valueJ > 0 and  j[length-1] > 0 or valueJ < 0 and  j[length-1] < 0:
            count = _G("count")
            count = count + 1
            _G("count", count)
        else:
            _G("count", 0)    
            
        _G("valueJ", j[length-1])
        
        k1 = Point(length-2, k[length-2])
        d1 = Point(length-2, d[length-2])
        j1 = Point(length-2, j[length-2])
        
        k2 = Point(length-1, k[length-1])
        d2 = Point(length-1, d[length-1])
        j2 = Point(length-1, j[length-1])
        
        k3 = Point(length-3, k[length-3])
        d3 = Point(length-3, d[length-3])
        j3 = Point(length-3, j[length-3])
        
        resultJ = (j2.y-j3.y) / (j2.x - j3.x)   
        resultJ2 = (j1.y-j3.y) / (j1.x - j3.x)
        if (_G("status") != 'buy' and resultJ > 0 and resultJ2 > 0 
            and j[length-1] > k[length-1] and j[length-1] > d[length-1] 
            and j[length-2] > k[length-2] and j[length-2] > d[length-2] 
            and j[length-3] > k[length-3] and j[length-3] > d[length-3]):
                # 买点
                ext.Buy(0.1)
                _G("status", "buy")                  
                Log("buy:k,d,j", k[length-1], d[length-1], j[length-1])                  
                    
        if _G("status") == 'buy' and resultJ < 0 and resultJ2 < 0:   
            # 卖点
            ext.Sell(0.1)
            _G("status", "sell")                   
            Log("sell:k,d,j", k[length-1], d[length-1], j[length-1])     
       

        
        

def onTick():
    Log(exchange.GetAccount())
    records = exchange.GetRecords(PERIOD_D1)
    kdj = TA.KDJ(records, 9, 3, 3)
    k = kdj[0]
    d = kdj[1]
    j = kdj[2]
    Log("kdj:", k, d, j)
    if len(k) == len(d) == len(j):
        k1 = Point(0, 0)
        d1 = Point(0, 0)
        j1 = Point(0, 0)
        for i in range(0, len(k)):
            if k[i] is None or d[i] is None or j[i] is None:
                continue
            if i > 0:
                if k[i-1] is None or d[i-1] is None or j[i-1] is None:
                    continue
                k1 = Point(i-1, k[i-1])
                d1 = Point(i-1, d[i-1])
                j1 = Point(i-1, j[i-1])
                
            k2 = Point(i, k[i])
            d2 = Point(i, d[i])
            j2 = Point(i, j[i])
                
            if is_intersected(k1,k2,d1,d2) and is_intersected(d1,d2,j1,j2) and is_intersected(j1,j2,k1,k2):
                # k,d,j三线相交
                resultJ = (j2.y-j1.y) / (j2.x - j1.x)            
                if resultJ > 0 and j[i] > k[i] and j[i] > k[i]:
                    # 买点
                    ext.Buy(0.1)
                    status = 'buy'                  
                    Log("buy:k,d,j", k[i], d[i], j[i])                  
                    
                if resultJ < 0 and j[i] < k[i] and j[i] < k[i]:   
                    # 卖点
                    ext.Sell(0.1)
                    status = 'sell'                   
                    Log("sell:k,d,j", k[i], d[i], j[i])
                    

    else:
        Log("kdj not len equal")
        
        
def main():
    while True:
        onTick2()
        Sleep(15*60*1000)


相关内容

更多内容

1725664 是在tick上的KDJ?楼主能交流吗