def getV(line, conf): lastD, nowD = data.readLine(line, conf) v0 = nowD.lastP v1 = nowD.p vm = v0 * (1.0 - conf.SlideRate) + v1 * conf.SlideRate return (v0, vm, nowD.settle) '''
def getV(line,conf): lastD,nowD=data.readLine(line,conf) v0=nowD.lastP v1=nowD.p vm=v0*(1.0-conf.SlideRate)+v1*conf.SlideRate return (v0,vm,nowD.settle) '''
def duralTrust(f,conf=basicConf,arg=None): bank=bankManage.Bank() detail=(arg=="detail") start=conf.StartValue curve=loss.Loss(start) tt=0 phase=wave.Phase(conf.getSizes()) blist=Stack.Queue(conf.MidSize/conf.TSize+1,[0,0,0,0]) restBank=[0,0] #余量窗口 minFlow=curve.now flow=curve.now for line in f: tt+=1 lastD,nowD=data.readLine(line,conf) if nowD == None: continue v0=nowD.lastP v1=nowD.p phase.addV(v0)
def duralTrust(f, conf=basicConf, arg=None): bank = bankManage.Bank() detail = (arg == "detail") start = conf.StartValue curve = loss.Loss(start) tt = 0 phase = wave.Phase(conf.getSizes()) blist = Stack.Queue(conf.MidSize / conf.TSize + 1, [0, 0, 0, 0]) restBank = [0, 0] #余量窗口 minFlow = curve.now flow = curve.now for line in f: tt += 1 lastD, nowD = data.readLine(line, conf) if nowD == None: continue v0 = nowD.lastP v1 = nowD.p phase.addV(v0)
def m2(f, conf1=MultiConf(1), conf2=MultiConf(2), arg=None): detail = (arg == "detail") bank1 = bankManage.Bank() bank2 = bankManage.Bank() start = conf1.StartValue curve = loss.Loss(start) tt = 0 phase1 = wave.Phase(conf1.getSizes()) blist1 = Stack.Queue(conf1.MidSize / conf1.TSize + 1, [0, 0, 0, 0]) phase2 = wave.Phase(conf2.getSizes()) blist2 = Stack.Queue(conf2.MidSize / conf2.TSize + 1, [0, 0, 0, 0]) restBank1 = [0, 0] #余量窗口 restBank2 = [0, 0] minFlow = curve.now flow = curve.now vm1 = 0 vm2 = 0 lastD1 = data.Data() lastD2 = data.Data() nowD1 = data.Data() nowD2 = data.Data() for line in f: tt += 1 if arg == "Curve": print "%s%.4f" % (conf1.CurveFix, curve.now / start * 30.0) if tt < 3: #忽略第一行 continue lastD1, nowD1 = data.readLine(line, conf1, nowD1, lastD1) lastD2, nowD2 = data.readLine(line, conf2, nowD2, lastD2) if nowD1 == None or nowD2 == None: continue v01 = nowD1.lastP v02 = nowD2.lastP vm1 = v01 * (1.0 - conf1.SlideRate) + conf1.SlideRate * nowD1.p vm2 = v02 * (1.0 - conf2.SlideRate) + conf2.SlideRate * nowD2.p phase1.add(v01) phase2.add(v02) curve.addTime() if nowD1.settle: e, f = bank1.destroy(vm1) curve.addE(e) flow += f restBank1 = [0, vm1] blist1 = Stack.Queue(conf1.MidSize / conf1.TSize + 1, [0, 0, 0, 0]) if nowD2.settle: e, f = bank2.destroy(vm2) curve.addE(e) flow += f restBank2 = [0, vm2] blist2 = Stack.Queue(conf2.MidSize / conf2.TSize + 1, [0, 0, 0, 0]) continue tn1 = clear(tt, blist1, v01, vm1, conf1, curve, phase1, detail) tn2 = clear(tt, blist2, v02, vm2, conf2, curve, phase2, detail) tn1 -= restBank1[0] #与整数操作的差额操作 tn2 -= restBank2[0] if tt % conf1.TSize == 7 % conf1.TSize: d1 = direction(phase1, conf1, conf1.Size, detail) d2 = direction(phase2, conf2, conf2.Size, detail) br1 = conf1.BankRate br2 = conf2.BankRate #if abs(d2) >= abs(d1): # br2+=br1 # br1=0 if abs(d1) > 0: n1 = (d1 * curve.now / conf1.MidSize * conf1.TSize * br1 / v01 * conf1.GangRate / conf1.HandSize) tn1 += n1 blist1.add([n1, vm1, vm1, tt]) if abs(d2) > 0: n2 = (d2 * curve.now / conf2.MidSize * conf2.TSize * br2 / v02 * conf2.GangRate / conf2.HandSize) tn2 += n2 blist2.add([n2, vm2, vm2, tt]) (tni1, tnv1) = near(tn1) (tni2, tnv2) = near(tn2) if abs(tni1) > 0: (e, f) = bank1.addBank(tni1, vm1, conf1) curve.addE(e) flow += f if abs(tni2) > 0: e, f = bank2.addBank(tni2, vm2, conf2) curve.addE(e) flow += f if flow < minFlow: minFlow = flow restBank1 = [tnv1, vm1] restBank2 = [tnv2, vm2] (e, f) = bank1.destroy(vm1) curve.addE(e) flow += f (e, f) = bank2.destroy(vm2) curve.addE(e) flow += f if flow < minFlow: minFlow = flow if arg == "Curve": print "%s%.4f" % (conf1.CurveFix, curve.now / start * 30.0) print curve print minFlow
def phase(f, conf=basicConf, arg=None): bank = bankManage.Bank() detail = (arg == "detail") start = conf.StartValue curve = loss.Loss(start) tt = 0 tn = 0 phase = wave.Phase(conf.getSizes()) volSize = 30 smallVolSize = 10 volPhase = wave.Phase([smallVolSize, volSize], [10, 100]) #vol2=wave.Phase([smallVolSize,volSize],[10,100]) sum = 0 blist = Stack.Queue(conf.MidSize + 1, [0, 0, 0, 0]) restBank = [0, 0] #余量窗口 minFlow = curve.now flow = curve.now lastDay = "" day = "" vm = 0 lastV = -1 maxBuyRate = -1 divs = [] divSum = 0 divN = 0 drs = [] drSum = 0 afterWardFac = 0 #滞后因子 myBank = 0 vbn = 0 for line in f: tt += 1 lastD, nowD = data.readLine(line, conf) if nowD == None: continue v0 = nowD.lastP if v0 <= 1e-12: sys.stderr.write(line) break v1 = nowD.p lastV = v0 vol = lastD.vol if lastD.vol > 0 and nowD.vol - lastD.vol < 5 and nowD.vol - lastD.vol >= 0 and nowD.vol < 3000: vbn += 1 if vbn > 10: break if arg == "Curve": print "%s%.4f" % (conf.CurveFix, curve.now / start * 30.0) #phase.add(v1) divs.append(v1) if len(divs) >= conf.DivSize: vopen = divs[-conf.DivSize] max = divs[-1] divRate = abs(max - vopen) / vopen drs.append(divRate) divSum += abs(max - vopen) / vopen divN += 1 #print "",conf.MaxLoss,"divSum",divSum,"divN",divN,divSum/divN,"max-vopen",max-vopen,(max-vopen)/vopen,"max",max,"vopen",vopen divs = [] drSum += divRate if len(drs) > 100: drSum -= drs[0] del drs[0] #conf.MaxLoss=divSum/divN #conf.MaxLoss=0.99*divSum/divN+0.01*divRate #conf.MaxLoss=0.94*divSum/divN+0.05*drSum/len(drs)+0.01*divRate volPhase.simpleAdd(vol) phase.add(v1) #vol2.add(vol) curve.addTime() vm = v1 #v0*(1.0-conf.SlideRate)+v1*conf.SlideRate #print "vm",vm if nowD.settle: if detail: print "destroy: vm", vm, "bank", bank.bank, "price", bank.price, "now", curve.now myBank = 0 e, f = bank.destroy(vm, conf) curve.addE(e) flow += f if detail: print "after destroy:bank", bank.bank, "e", e, "flow", flow, "now", curve.now if abs(e) > 0: curve.addWin(e / conf.HandSize, conf) restBank = [0, vm] blist = Stack.Queue(conf.MidSize / conf.TSize + 1, [0, 0, 0, 0]) continue bankDiff = myBank - bank.bank if abs(bankDiff) > 1e-6: if True: print "tt", tt, "tn", tn, "myBank", myBank, "bank", bank.bank, "rest", restBank[ 0], "bankDiff", bankDiff #myBank-=checkBank(blist,bankDiff,conf,detail) clearN = clear(tt, blist, v0, vm, conf, curve, phase, detail) tn = restBank[0] #-restBank[0] #与整数操作的差额操作 tn += bankDiff myBank -= bankDiff tn += clearN createN = 0 if data.afterInDay(nowD, conf.DayEnd) <= 0 and data.afterInDay( nowD, conf.DayStart) >= 0: createN = create(tt, conf, phase, vm, curve, bank, detail) if createN > 0 and createN < conf.unitLowRate * conf.UnitLimit and bank.bank <= 0: createN = conf.UnitLimit if createN < 0 and createN > -conf.unitLowRate * conf.UnitLimit and bank.bank >= 0: createN = -conf.UnitLimit #afterWardFac=afterWardFac*(conf.MidSize-1.0)/conf.MidSize+createN/conf.MidSize #if abs(afterWardFac) > 0.8*abs(createN): # createN+=0.02*afterWardFac tryBank = bank.bank + tn ceilBank = (curve.now * conf.GangRate * conf.BankRate) / (v0 * conf.HandSize) if abs(createN) > 0 and abs(createN + tryBank) > ceilBank: #if random.random() > 0.9: # print "createN",createN,"tryBank",tryBank,"ceilBank",ceilBank createN *= (ceilBank - abs(tryBank)) / abs(createN) tn += createN if abs(createN) > 0: blist.add([createN, vm, vm, tt]) #phase.add(v1) #(tni,tnv)=near(tn) #tni=int(tn)+clearN tni = int(tn) tnv = tn - int(tn) #int(tn)-tn if tnv > conf.StopLossNearInt and bank.bank + tni < 0: tni += 1 tnv -= 1.0 if tnv < -conf.StopLossNearInt and bank.bank + tni > 0: tni -= 1 tnv += 1.0 myBank += tni #if abs(createN) > 0: # blist.add([createN,vm,vm,tt]) #if abs(int(tn)) > 0: # blist.add([int(tn),vm,vm,tt]) nfold = abs(tni * v1 * conf.HandSize) / (curve.now * conf.GangRate) if maxBuyRate < nfold: #print "nfold",nfold,"maxBuyRate",maxBuyRate,"curve.now",curve.now maxBuyRate = nfold #if nfold > 0.3: #print "nfold",nfold,"maxBuyRate",maxBuyRate,"curve.now",curve.now if conf.Stock and (tni + bank.bank) < 0: tni = -bank.bank tnv = tn - tni #tni-tn if abs(tni) > 0: if tni > 0: vm = vm * (1.0 + conf.SlideRate / 2500.0) else: vm = vm * (1.0 - conf.SlideRate / 2500.0) bb = bank.bank bp = bank.price bf = flow if random.random() < 1.999: #0.1%失败交易 (e, f) = bank.addBank(tni, vm, conf) curve.addE(e) flow += f if detail: print "tt:", tt, "bb:", bb, "bp:", bp, "tni:", tni, "vm:", vm, "now:", curve.now, "e:", e, "f:", f, "flow:", flow else: print "trade fail: tni", tni dflow = curve.now - bank.value(conf) / conf.GangRate - flow if abs(dflow) > 1.0: print line print dflow, curve.now, tni, "vm:", vm, "bb:", bb, "bp:", bp, "after:", bank, e, bf, f, flow break if flow < minFlow: minFlow = flow #浮动 #pass curve.addTrackE((vm - bank.price) * bank.bank * conf.HandSize) if arg == "Bank": #print "%s%.4f"%(conf.CurveFix,tni) print "%s%.4f" % (conf.CurveFix, flow / curve.now) if conf.Stock and bank.bank < 0: print "bank<0", curve.now, bank, tnv restBank = [tnv, vm] if detail: print "destroy: vm", vm, "bank", bank.bank, "price", bank.price, "now", curve.now if bank.bank > 0: vm = vm * (1.0 - conf.SlideRate / 2500.0) else: vm = vm * (1.0 + conf.SlideRate / 2500.0) (e, f) = bank.destroy(vm, conf) curve.addE(e) flow += f if detail: print "after destroy:bank", bank.bank, "e", e, "flow", flow, "now", curve.now if abs(e) > 0: curve.addWin(e / conf.HandSize, conf) return curve
def back(f, conf, guohu=1.0): phase = wave.Phase([100, conf.LargeSize, conf.Size, conf.MidSize]) li = 0 lsmall = 0 bi = -1 bn = 0 bprice = 0 lastV = -1 lastLow = -1 smallQueue = Stack.Queue(3, init=0) smallV = 0 navg = 0 flow = 10000.0 state = State() lastClose5 = False lastIsBull = False for line in f: li += 1 lastD, nowD = data.readLine(line, conf) if nowD == None: if bn > 0: bi = -1 bn = 0 lastV = -1 lastLow = -1 continue if nowD.open <= 0 or nowD.close <= 0: if bn > 0: bi = -1 bn = 0 lastV = -1 lastLow = -1 continue v = nowD.close high = nowD.high if lastV < 0: lastV = nowD.open add = (v - lastV) / float(lastV) if add > 0.11 or add < -0.11: bn = 0 bi = -1 lastV = -1 continue rate = (v - nowD.open) / float(nowD.open) hrate = (high - nowD.open) / float(nowD.open) hadd = (high - lastV) / float(lastV) oadd = (nowD.open - lastV) / float(lastV) avg = phase.avg(conf.MidSize) mavg = phase.avg(conf.LargeSize) avg100 = phase.avg(100) SA = 0.07 #B12 if bn > 0: #B1,B2,B3,B4 p = nowD.close #B11,B12,B13,B14,B15 if nowD.open > (1.0 + SA) * lastV: p = nowD.open #B5,B6,B7,B8,B9,B10,B11,B12,B13,B14,B15 elif nowD.high > (1.0 + SA) * lastV: p = (1.0 + SA) * lastV e = bn * 100 * (p - 0.0013 * p - guohu * 0.6 / 1000 - bprice) bn = 0 print "%s\t%f\t%s" % (nowD.day, e / flow, str(state)) #curve.addE(e) bi = -1 #elif bi > 0: # if nowD.open < 1.06*lastV: # bprice=nowD.open*(1.0+0.0003)+guohu*0.6/1000 # bn=int(curve.now/(100*bprice)) if high > avg: navg += 1 else: navg = 0 #B1,2,3,4,5 #if (hrate > 0.085 or (hadd > 0.085 and hrate > 0.05) )and lsmall >= 1 and nowD.low <= avg and nowD.close > avg: #B6 增长率:0.790062 最大下降:0.228 @683 增长下降比:3.4653 0.6760年 #if (hrate > 0.07 or (hadd > 0.07 and hrate > 0.05) )and lsmall >= 1 and nowD.low <= avg and nowD.close > avg: #B7 HR = 0.08 #加oadd < (0.095-HR)防止买不进 #if hrate > HR and oadd < (0.095-HR) and lsmall >= 1 and nowD.low <= avg and nowD.close > avg: #B8,B9,B10,B11,B12,B13,B14,B15 #HR=0.04 HA = -0.02 #B8 #if hrate > HR and oadd < (0.095-HR) and lsmall >= 1 and lastV <= avg*1.02 and nowD.high > (1+HA)*avg: #B9 #if hrate > HR and oadd < (0.095-HR) and lsmall >= 1 and lastV <= avg*1.02 and nowD.high > (1+HA)*avg: state.reset() #B10,B11,B12,B13,B15 if hrate > HR and oadd < (0.095 - HR) and lsmall >= 1 and lastV <= avg * 1.02: #B14 #if hrate > HR and oadd < (0.095-HR) and lsmall >= 1: state.LastClose5 = lastClose5 state.IsBull = lastIsBull bi = li #B1,2,3,4,5,6 p = nowD.close #B7.1 #HA=0.0 #if hadd > HA: #两个条件要同时满足 # if nowD.open*(1+HR) <= (1.0+HA)*lastV: # p=(1.0+HA)*lastV # else: #sys.stderr.write("high open%.3f!\n"%(nowD.open)) #B7,B10,B11,B12,B13,B14,B15,B16 p = nowD.open * (1 + HR) #B8,B9 #if p < (1+HA)*avg: # p=(1+HA)*avg bprice = p * (1.0 + 0.0003) + guohu * 0.6 / 1000 bn = int(flow / (100 * bprice)) #if add < 0.099 or rate > 0.5: # bprice=nowD.close*(1.0+0.0003)+guohu*0.6/1000 # bn=int(curve.now/(100*bprice)) phase.simpleAdd(nowD.close) smallV -= smallQueue.pop() #B12,B13,B14,B15 lastClose5 = False lastIsBull = False if mavg > avg100: lastIsBull = True #B1 0.48 0.25 #B1#if add < 0.04 and rate < 0.04 and rate > -0.06 and nowD.low <= avg and nowD.high >= avg: #B2# 增长率:0.55 最大下降:0.217 mrate:0.6321 #if add < 0.04 and rate < 0.04 and nowD.low <= avg and nowD.high >= avg: #B3# 0.53 最大下降:0.157 0.6680年 mrate:0.6491 #B4,B5,B6,B7,B8,B9,B10,B11,B12,B13,B14 if add < 0.04 and rate < 0.02 and nowD.low <= avg * 1.02 and nowD.high >= avg * 0.98: #B15 #if add < 0.04 and rate < 0.02 and nowD.low <= avg*1.03 and nowD.high >= avg*0.97: #B12,14 #if nowD.open >= avg*0.98 and nowD.close <= avg*1.02 and nowD.low<= avg and nowD.high >= avg: #B13,B15 if nowD.low <= avg and nowD.high >= avg: lastClose5 = True lsmall += 1 smallV += 1 smallQueue.add(1) else: lsmall = 0 smallQueue.add(0) lastV = v
def back(f,conf,guohu=1.0): phase=wave.Phase([100,conf.LargeSize,conf.Size,conf.MidSize]) li=0 lsmall=0 bi=-1 bn=0 bprice=0 lastV=-1 lastLow=-1 smallQueue=Stack.Queue(3,init=0) smallV=0 navg=0 flow=10000.0 state=State() lastClose5=False lastIsBull=False for line in f: li+=1 lastD,nowD=data.readLine(line,conf) if nowD == None: if bn > 0: bi=-1 bn=0 lastV=-1 lastLow=-1 continue if nowD.open <= 0 or nowD.close <= 0: if bn > 0: bi=-1 bn=0 lastV=-1 lastLow=-1 continue v=nowD.close high=nowD.high if lastV < 0: lastV=nowD.open add=(v-lastV)/float(lastV) if add > 0.11 or add < -0.11: bn=0 bi=-1 lastV=-1 continue rate=(v-nowD.open)/float(nowD.open) hrate=(high-nowD.open)/float(nowD.open) hadd=(high-lastV)/float(lastV) oadd=(nowD.open-lastV)/float(lastV) avg=phase.avg(conf.MidSize) mavg=phase.avg(conf.LargeSize) avg100=phase.avg(100) SA=0.07 #B12 if bn > 0: #B1,B2,B3,B4 p=nowD.close #B11,B12,B13,B14,B15 if nowD.open > (1.0+SA)*lastV: p=nowD.open #B5,B6,B7,B8,B9,B10,B11,B12,B13,B14,B15 elif nowD.high > (1.0+SA)*lastV: p=(1.0+SA)*lastV e=bn*100*(p-0.0013*p-guohu*0.6/1000-bprice) bn=0 print "%s\t%f\t%s"%(nowD.day,e/flow,str(state)) #curve.addE(e) bi=-1 #elif bi > 0: # if nowD.open < 1.06*lastV: # bprice=nowD.open*(1.0+0.0003)+guohu*0.6/1000 # bn=int(curve.now/(100*bprice)) if high > avg: navg+=1 else: navg=0 #B1,2,3,4,5 #if (hrate > 0.085 or (hadd > 0.085 and hrate > 0.05) )and lsmall >= 1 and nowD.low <= avg and nowD.close > avg: #B6 增长率:0.790062 最大下降:0.228 @683 增长下降比:3.4653 0.6760年 #if (hrate > 0.07 or (hadd > 0.07 and hrate > 0.05) )and lsmall >= 1 and nowD.low <= avg and nowD.close > avg: #B7 HR=0.08 #加oadd < (0.095-HR)防止买不进 #if hrate > HR and oadd < (0.095-HR) and lsmall >= 1 and nowD.low <= avg and nowD.close > avg: #B8,B9,B10,B11,B12,B13,B14,B15 #HR=0.04 HA=-0.02 #B8 #if hrate > HR and oadd < (0.095-HR) and lsmall >= 1 and lastV <= avg*1.02 and nowD.high > (1+HA)*avg: #B9 #if hrate > HR and oadd < (0.095-HR) and lsmall >= 1 and lastV <= avg*1.02 and nowD.high > (1+HA)*avg: state.reset() #B10,B11,B12,B13,B15 if hrate > HR and oadd < (0.095-HR) and lsmall >= 1 and lastV <= avg*1.02: #B14 #if hrate > HR and oadd < (0.095-HR) and lsmall >= 1: state.LastClose5=lastClose5 state.IsBull=lastIsBull bi=li #B1,2,3,4,5,6 p=nowD.close #B7.1 #HA=0.0 #if hadd > HA: #两个条件要同时满足 # if nowD.open*(1+HR) <= (1.0+HA)*lastV: # p=(1.0+HA)*lastV # else: #sys.stderr.write("high open%.3f!\n"%(nowD.open)) #B7,B10,B11,B12,B13,B14,B15,B16 p=nowD.open*(1+HR) #B8,B9 #if p < (1+HA)*avg: # p=(1+HA)*avg bprice=p*(1.0+0.0003)+guohu*0.6/1000 bn=int(flow/(100*bprice)) #if add < 0.099 or rate > 0.5: # bprice=nowD.close*(1.0+0.0003)+guohu*0.6/1000 # bn=int(curve.now/(100*bprice)) phase.simpleAdd(nowD.close) smallV-=smallQueue.pop() #B12,B13,B14,B15 lastClose5=False lastIsBull=False if mavg > avg100: lastIsBull=True #B1 0.48 0.25 #B1#if add < 0.04 and rate < 0.04 and rate > -0.06 and nowD.low <= avg and nowD.high >= avg: #B2# 增长率:0.55 最大下降:0.217 mrate:0.6321 #if add < 0.04 and rate < 0.04 and nowD.low <= avg and nowD.high >= avg: #B3# 0.53 最大下降:0.157 0.6680年 mrate:0.6491 #B4,B5,B6,B7,B8,B9,B10,B11,B12,B13,B14 if add < 0.04 and rate < 0.02 and nowD.low <= avg*1.02 and nowD.high >= avg*0.98: #B15 #if add < 0.04 and rate < 0.02 and nowD.low <= avg*1.03 and nowD.high >= avg*0.97: #B12,14 #if nowD.open >= avg*0.98 and nowD.close <= avg*1.02 and nowD.low<= avg and nowD.high >= avg: #B13,B15 if nowD.low<= avg and nowD.high >= avg: lastClose5=True lsmall+=1 smallV+=1 smallQueue.add(1) else: lsmall=0 smallQueue.add(0) lastV=v
def pricePhase(f,conf=PricePhaseConf(),arg=None): bank=bankManage.Bank() detail=(arg=="detail") start=conf.StartValue curve=loss.Loss(start) tt=0 tn=0 blist=Stack.Queue(conf.MidSize+1,[0,0,0,0,conf.MidSize]) restBank=[0,0] #余量窗口 minFlow=curve.now flow=curve.now lastDay="" day="" vm=0 MaxPNum=1000000 ptime=[0]*MaxPNum for line in f: tt+=1 lastD,nowD=data.readLine(line,conf) if nowD == None: continue v1=nowD.p vpn=int(v1*5.0) vm=v1 ptime[vpn]=tt #if detail: # print "v1",v1,"vpn",vpn if arg == "Curve": print "%s%.4f"%(conf.CurveFix,curve.now/start*30.0) curve.addTime() clearN=clear(tt,blist,v1,vm,conf,curve,detail) tn=restBank[0] #-restBank[0] #与整数操作的差额操作 tn+=clearN createN=0 pt0=tt pt_1=smoothPrice(ptime,vpn-conf.SmallSize) pt1=smoothPrice(ptime,vpn+conf.SmallSize) pt_2=smoothPrice(ptime,vpn-conf.Size) pt2=smoothPrice(ptime,vpn+conf.Size) pt_3=smoothPrice(ptime,vpn-conf.LargeSize) pt3=smoothPrice(ptime,vpn+conf.LargeSize) #pt_4=smoothPrice(ptime,vpn-conf.MSize) #pt4=smoothPrice(ptime,vpn+conf.MSize) if data.afterInDay(nowD,conf.DayEnd) <= 0 and data.afterInDay(nowD,conf.DayStart) >= 0: #createN=create(tt,conf,phase,vm,curve,bank,detail) msize=conf.MidSize if pt0 > pt_2 and pt_1 > pt1 and pt0 > pt_2 and pt_2 > pt_3 and pt0-pt_3 < 200: msize=conf.MidSize createN=(curve.now/msize*conf.BankRate/vm*conf.GangRate/conf.HandSize) if detail: print "pt0",pt0,"pt1",pt1,"pt2",pt2,"pt3",pt3, print "pt0",pt0,"pt_1",pt_1,"pt_2",pt_2,"pt_3",pt_3,"msize",msize,"v1",v1,"cn",createN if pt0 > pt2 and pt1 > pt_1 and pt0 > pt2 and pt2 > pt3 and pt0-pt3 < 200: msize=conf.MidSize createN=-(curve.now/msize*conf.BankRate/vm*conf.GangRate/conf.HandSize) if detail: print "pt0",pt0,"pt_1",pt_1,"pt_2",pt_2,"pt_3",pt_3 print "pt0",pt0,"pt1",pt1,"pt2",pt2,"pt3",pt3,"msize",msize,"v1",v1,"cn",createN if createN > 0 and createN < conf.unitLowRate*conf.UnitLimit and bank.bank <= 0: createN=conf.UnitLimit if createN < 0 and createN > -conf.unitLowRate*conf.UnitLimit and bank.bank >= 0: createN=-conf.UnitLimit #afterWardFac=afterWardFac*(conf.MidSize-1.0)/conf.MidSize+createN/conf.MidSize #if abs(afterWardFac) > 0.8*abs(createN): # createN+=0.02*afterWardFac tryBank=bank.bank+tn ceilBank=(curve.now*conf.GangRate*conf.BankRate)/(v1*conf.HandSize) if abs(createN) > 0 and abs(createN+tryBank) > ceilBank: #if random.random() > 0.9: # print "createN",createN,"tryBank",tryBank,"ceilBank",ceilBank createN*=(ceilBank-abs(tryBank))/abs(createN) tn+=createN if createN > 0: blist.add([createN,vm+conf.SlideRate,vm+conf.SlideRate,tt,msize]) if createN < 0: blist.add([createN,vm-conf.SlideRate,vm-conf.SlideRate,tt,msize]) tni=int(tn) tnv=tn-int(tn) #int(tn)-tn if tnv > conf.StopLossNearInt and bank.bank+tni < 0: tni+=1 tnv-=1.0 if tnv < -conf.StopLossNearInt and bank.bank+tni > 0: tni-=1 tnv+=1.0 if conf.Stock and (tni+bank.bank) < 0: tni=-bank.bank tnv=tn-tni #tni-tn if abs(tni) > 0: bb=bank.bank bp=bank.price bf=flow if tni > 0: vm=vm+conf.SlideRate else: vm=vm-conf.SlideRate (e,f)=bank.addBank(tni,vm,conf) curve.addE(e) flow+=f if detail: print "tt:",tt,"bb:",bb,"bp:",bp,"tni:",tni,"vm:",vm,"now:",curve.now,"e:",e,"f:",f,"flow:",flow dflow=curve.now-bank.value(conf)/conf.GangRate-flow if abs(dflow) > 1.0: print line print dflow,curve.now,tni,"vm:",vm,"bb:",bb,"bp:",bp,"after:",bank,e,bf,f,flow if flow < minFlow: minFlow=flow else: #浮动 #pass curve.addTrackE((vm-bank.price)*bank.bank*conf.HandSize) restBank=[tnv,vm] if detail: print "destroy: vm",vm,"bank",bank.bank,"price",bank.price,"now",curve.now (e,f)=bank.destroy(vm,conf) curve.addE(e) flow+=f if detail: print "after destroy:bank",bank.bank,"e",e,"flow",flow,"now",curve.now if abs(e) > 0: curve.addWin(e/conf.HandSize,conf) print curve.confStr(conf) print minFlow
def m2(f,conf1=MultiConf(1),conf2=MultiConf(2),arg=None): detail=(arg=="detail") bank1=bankManage.Bank() bank2=bankManage.Bank() start=conf1.StartValue curve=loss.Loss(start) tt=0 phase1=wave.Phase(conf1.getSizes()) blist1=Stack.Queue(conf1.MidSize/conf1.TSize+1,[0,0,0,0]) phase2=wave.Phase(conf2.getSizes()) blist2=Stack.Queue(conf2.MidSize/conf2.TSize+1,[0,0,0,0]) restBank1=[0,0] #余量窗口 restBank2=[0,0] minFlow=curve.now flow=curve.now vm1=0 vm2=0 lastD1=data.Data() lastD2=data.Data() nowD1=data.Data() nowD2=data.Data() for line in f: tt+=1 if arg == "Curve": print "%s%.4f"%(conf1.CurveFix,curve.now/start*30.0) if tt < 3: #忽略第一行 continue lastD1,nowD1=data.readLine(line,conf1,nowD1,lastD1) lastD2,nowD2=data.readLine(line,conf2,nowD2,lastD2) if nowD1 == None or nowD2 == None: continue v01=nowD1.lastP v02=nowD2.lastP vm1=v01*(1.0-conf1.SlideRate)+conf1.SlideRate*nowD1.p vm2=v02*(1.0-conf2.SlideRate)+conf2.SlideRate*nowD2.p phase1.add(v01) phase2.add(v02) curve.addTime() if nowD1.settle: e,f=bank1.destroy(vm1) curve.addE(e) flow+=f restBank1=[0,vm1] blist1=Stack.Queue(conf1.MidSize/conf1.TSize+1,[0,0,0,0]) if nowD2.settle: e,f=bank2.destroy(vm2) curve.addE(e) flow+=f restBank2=[0,vm2] blist2=Stack.Queue(conf2.MidSize/conf2.TSize+1,[0,0,0,0]) continue tn1=clear(tt,blist1,v01,vm1,conf1,curve,phase1,detail) tn2=clear(tt,blist2,v02,vm2,conf2,curve,phase2,detail) tn1-=restBank1[0] #与整数操作的差额操作 tn2-=restBank2[0] if tt % conf1.TSize == 7%conf1.TSize: d1=direction(phase1,conf1,conf1.Size,detail) d2=direction(phase2,conf2,conf2.Size,detail) br1=conf1.BankRate br2=conf2.BankRate #if abs(d2) >= abs(d1): # br2+=br1 # br1=0 if abs(d1) > 0: n1=(d1*curve.now/conf1.MidSize*conf1.TSize*br1/v01*conf1.GangRate/conf1.HandSize) tn1+=n1 blist1.add([n1,vm1,vm1,tt]) if abs(d2) > 0: n2=(d2*curve.now/conf2.MidSize*conf2.TSize*br2/v02*conf2.GangRate/conf2.HandSize) tn2+=n2 blist2.add([n2,vm2,vm2,tt]) (tni1,tnv1)=near(tn1) (tni2,tnv2)=near(tn2) if abs(tni1) > 0: (e,f)=bank1.addBank(tni1,vm1,conf1) curve.addE(e) flow+=f if abs(tni2) > 0: e,f=bank2.addBank(tni2,vm2,conf2) curve.addE(e) flow+=f if flow < minFlow: minFlow=flow restBank1=[tnv1,vm1] restBank2=[tnv2,vm2] (e,f)=bank1.destroy(vm1) curve.addE(e) flow+=f (e,f)=bank2.destroy(vm2) curve.addE(e) flow+=f if flow < minFlow: minFlow=flow if arg == "Curve": print "%s%.4f"%(conf1.CurveFix,curve.now/start*30.0) print curve print minFlow
def phase(f,conf=basicConf,arg=None): bank=bankManage.Bank() detail=(arg=="detail") start=conf.StartValue curve=loss.Loss(start) tt=0 tn=0 phase=wave.Phase(conf.getSizes()) volSize=30 smallVolSize=10 volPhase=wave.Phase([smallVolSize,volSize],[10,100]) #vol2=wave.Phase([smallVolSize,volSize],[10,100]) sum=0 blist=Stack.Queue(conf.MidSize+1,[0,0,0,0]) restBank=[0,0] #余量窗口 minFlow=curve.now flow=curve.now lastDay="" day="" vm=0 lastV=-1 maxBuyRate=-1 divs=[] divSum=0 divN=0 drs=[] drSum=0 afterWardFac=0 #滞后因子 myBank=0 vbn=0 for line in f: tt+=1 lastD,nowD=data.readLine(line,conf) if nowD == None: continue v0=nowD.lastP if v0 <= 1e-12: sys.stderr.write(line) break v1=nowD.p lastV=v0 vol=lastD.vol if lastD.vol > 0 and nowD.vol - lastD.vol< 5 and nowD.vol - lastD.vol >= 0 and nowD.vol < 3000: vbn+=1 if vbn > 10: break if arg == "Curve": print "%s%.4f"%(conf.CurveFix,curve.now/start*30.0) #phase.add(v1) divs.append(v1) if len(divs) >= conf.DivSize: vopen=divs[-conf.DivSize] max=divs[-1] divRate=abs(max-vopen)/vopen drs.append(divRate) divSum+=abs(max-vopen)/vopen divN+=1 #print "",conf.MaxLoss,"divSum",divSum,"divN",divN,divSum/divN,"max-vopen",max-vopen,(max-vopen)/vopen,"max",max,"vopen",vopen divs=[] drSum+=divRate if len(drs) > 100: drSum-=drs[0] del drs[0] #conf.MaxLoss=divSum/divN #conf.MaxLoss=0.99*divSum/divN+0.01*divRate #conf.MaxLoss=0.94*divSum/divN+0.05*drSum/len(drs)+0.01*divRate volPhase.simpleAdd(vol) phase.add(v1) #vol2.add(vol) curve.addTime() vm=v1 #v0*(1.0-conf.SlideRate)+v1*conf.SlideRate #print "vm",vm if nowD.settle: if detail: print "destroy: vm",vm,"bank",bank.bank,"price",bank.price,"now",curve.now myBank=0 e,f=bank.destroy(vm,conf) curve.addE(e) flow+=f if detail: print "after destroy:bank",bank.bank,"e",e,"flow",flow,"now",curve.now if abs(e) > 0: curve.addWin(e/conf.HandSize,conf) restBank=[0,vm] blist=Stack.Queue(conf.MidSize/conf.TSize+1,[0,0,0,0]) continue bankDiff=myBank-bank.bank if abs(bankDiff) > 1e-6: if True: print "tt",tt,"tn",tn,"myBank",myBank,"bank",bank.bank,"rest",restBank[0],"bankDiff",bankDiff #myBank-=checkBank(blist,bankDiff,conf,detail) clearN=clear(tt,blist,v0,vm,conf,curve,phase,detail) tn=restBank[0] #-restBank[0] #与整数操作的差额操作 tn+=bankDiff myBank-=bankDiff tn+=clearN createN=0 if data.afterInDay(nowD,conf.DayEnd) <= 0 and data.afterInDay(nowD,conf.DayStart) >= 0: createN=create(tt,conf,phase,vm,curve,bank,detail) if createN > 0 and createN < conf.unitLowRate*conf.UnitLimit and bank.bank <= 0: createN=conf.UnitLimit if createN < 0 and createN > -conf.unitLowRate*conf.UnitLimit and bank.bank >= 0: createN=-conf.UnitLimit #afterWardFac=afterWardFac*(conf.MidSize-1.0)/conf.MidSize+createN/conf.MidSize #if abs(afterWardFac) > 0.8*abs(createN): # createN+=0.02*afterWardFac tryBank=bank.bank+tn ceilBank=(curve.now*conf.GangRate*conf.BankRate)/(v0*conf.HandSize) if abs(createN) > 0 and abs(createN+tryBank) > ceilBank: #if random.random() > 0.9: # print "createN",createN,"tryBank",tryBank,"ceilBank",ceilBank createN*=(ceilBank-abs(tryBank))/abs(createN) tn+=createN if abs(createN) > 0: blist.add([createN,vm,vm,tt]) #phase.add(v1) #(tni,tnv)=near(tn) #tni=int(tn)+clearN tni=int(tn) tnv=tn-int(tn) #int(tn)-tn if tnv > conf.StopLossNearInt and bank.bank+tni < 0: tni+=1 tnv-=1.0 if tnv < -conf.StopLossNearInt and bank.bank+tni > 0: tni-=1 tnv+=1.0 myBank+=tni #if abs(createN) > 0: # blist.add([createN,vm,vm,tt]) #if abs(int(tn)) > 0: # blist.add([int(tn),vm,vm,tt]) nfold=abs(tni*v1*conf.HandSize)/ (curve.now*conf.GangRate) if maxBuyRate < nfold: #print "nfold",nfold,"maxBuyRate",maxBuyRate,"curve.now",curve.now maxBuyRate=nfold #if nfold > 0.3: #print "nfold",nfold,"maxBuyRate",maxBuyRate,"curve.now",curve.now if conf.Stock and (tni+bank.bank) < 0: tni=-bank.bank tnv=tn-tni #tni-tn if abs(tni) > 0: if tni > 0: vm=vm*(1.0+conf.SlideRate/2500.0) else: vm=vm*(1.0-conf.SlideRate/2500.0) bb=bank.bank bp=bank.price bf=flow if random.random() < 1.999: #0.1%失败交易 (e,f)=bank.addBank(tni,vm,conf) curve.addE(e) flow+=f if detail: print "tt:",tt,"bb:",bb,"bp:",bp,"tni:",tni,"vm:",vm,"now:",curve.now,"e:",e,"f:",f,"flow:",flow else: print "trade fail: tni",tni dflow=curve.now-bank.value(conf)/conf.GangRate-flow if abs(dflow) > 1.0: print line print dflow,curve.now,tni,"vm:",vm,"bb:",bb,"bp:",bp,"after:",bank,e,bf,f,flow break if flow < minFlow: minFlow=flow #浮动 #pass curve.addTrackE((vm-bank.price)*bank.bank*conf.HandSize) if arg == "Bank": #print "%s%.4f"%(conf.CurveFix,tni) print "%s%.4f"%(conf.CurveFix,flow/curve.now) if conf.Stock and bank.bank < 0: print "bank<0",curve.now,bank,tnv restBank=[tnv,vm] if detail: print "destroy: vm",vm,"bank",bank.bank,"price",bank.price,"now",curve.now if bank.bank > 0: vm=vm*(1.0-conf.SlideRate/2500.0) else: vm=vm*(1.0+conf.SlideRate/2500.0) (e,f)=bank.destroy(vm,conf) curve.addE(e) flow+=f if detail: print "after destroy:bank",bank.bank,"e",e,"flow",flow,"now",curve.now if abs(e) > 0: curve.addWin(e/conf.HandSize,conf) return curve