def ClearStock(self, code): #以当前市场价清空对应的股票 if code in self.StockCodeList: tempDir = {} for dir in self.position: if dir[POS_SCo] == code: tempDir = dir break Fac = PriceLoopFactory() loop = Fac.GetPriceLoop() pricedata = loop.GetPriceData(code) CurrentPrice = float(pricedata['price']) ableCount = tempDir[POS_ABa] if ableCount == 0: return False self.balance[BAL_AFu] = self.balance[ BAL_AFu] + CurrentPrice * ableCount #增加可用资金 self.balance[BAL_CBa] = self.balance[ BAL_CBa] + CurrentPrice * ableCount #增加资金余额 self.__S_ReduceStock(CurrentPrice, ableCount, code) self.CalAllData() self.RemoveEmptyStock() logger.info('卖出股票%s成功', code) self.XMLLog.TodayLog.SellOper(code, ableCount, CurrentPrice) return True else: inofr = self.Number + '未拥有股票:' + code + ' 无法卖出。' logger.info(inofr) return False
def SellOper(self, Code, count, price): # reduceHold = False for hold in self.EndHolding: if hold.StockCode == Code and hold.StockNumber == 0: logger.warning('股票数量为空,不继续操作。') return if hold.StockCode == Code and hold.StockNumber > count: logger.warning('正常卖出股票') hold.CostPrice = (hold.CostPrice * hold.StockNumber - count * price) / (hold.StockNumber - count) hold.StockNumber = hold.StockNumber - count reduceHold = True elif hold.StockCode == Code and hold.StockNumber == count: logger.warning('正常卖出股票') hold.CostPrice = 0 hold.StockNumber = 0 reduceHold = True elif hold.StockCode == Code and hold.StockNumber < count: logger.warning('股票数量不足,以卖出所有计算。') hold.CostPrice = 0 hold.StockNumber = 0 reduceHold = True if not reduceHold: logger.warning('拥有的股票数量不足,不可以正常操作。') return False logger.info('清除股票完成。') Operation = StockOperation() Operation.Set(Code, count, price, 0, datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) self.Sell.append(Operation) self.EndAvailable = self.EndAvailable + count * price
def __NodeToData(self, key, data): if key in strNode: return data elif key in floatNode: return float(data) else: logger.info('key-%s do not find', key)
def LoadTodayCode(self, fileParh): if not os.path.exists(fileParh): return codeReadFromFile = ReadCsv(fileParh) curtime = datetime.datetime.now() try: for key in codeReadFromFile: temptime = datetime.datetime.strptime(key, '%Y-%m-%d') if temptime.strftime('%Y-%m-%d') == curtime.strftime( '%Y-%m-%d'): for code in codeReadFromFile[key]: CDPData = GetCDP(code) if type(CDPData) == type(False): continue tempDir = { 'code': code, 'up': CDPData[1], 'down': CDPData[3], 'Aup': CDPData[0], 'Adown': CDPData[4], 'time': datetime.datetime.today() } self.stockCDPList[code] = tempDir #self.AddStockData(code) self.UserAccount.FSetTodayCodeList([ codeReadFromFile[key], datetime.datetime.strptime(key, '%Y-%m-%d') ]) return except: logger.info('LoadTodayCode出错。', exc_info=True)
def appendChild(self, childNode): if DomMutex.acquire(3): try: self.dom.documentElement.appendChild(childNode) except: logger.info('添加节点出错。') finally: DomMutex.release()
def Reload(self): if DomMutex.acquire(3): try: self.dom = xmldom.parse(XmlPath + self.__AccountFileName) except: logger.info('解析文件出错,检查文件是否合法。') finally: DomMutex.release()
def Element_FClearAccountStock(self, code): #清空所有账号当中对应的所有股票 for ac in self.ValueAllAcList: if ac.GetPositionStockTradableCount(code) > 0: #如果有可用的股票,则执行清空 logger.info('执行清空股票%s操作', code) ac.ClearStock(code) if len(self.FindAccountHasTradableStockCode(code)) > 0: logger.info('股票%s还未清空完成。', code) self.ValueTaskList.put([self.Element_FClearAccountStock, code]) return True else: return False
def Reload(self, mode='Buck'): if DomMutex.acquire(3): try: if mode == 'Buck': #从备份文件中重新加载 self.dom = xmldom.parse(XmlPath + 'BackUp' + self.__AccountFileName) elif mode == '': self.dom = xmldom.parse(XmlPath + self.__AccountFileName) except: logger.info('解析文件出错,检查文件是否合法。') finally: DomMutex.release()
def RemoveEmptyStock(self): #删除空的股票 tempposition = [] codeList = [] logger.info('开始清除无用股票。') for dir in self.position: if dir[POS_SBa] > 1: tempposition.append(dir) codeList.append(dir[POS_SCo]) else: logger.info('%s股票余额为空,清除。', dir[POS_SCo]) self.position = tempposition self.StockCodeList = codeList
def GetPositionStockTradableCount(self, stockcode): #返回股票的可用股票数量 tempDir = {} for dir in self.position: if dir[POS_SCo] == stockcode: tempDir = dir break if len(tempDir) == 0: #logger.info('未持有股票%s', stockcode) return 0 elif tempDir[POS_ABa] < 1: logger.info('无可用股票,当前%s股票,拥有%d股,可用共%f股。', stockcode, tempDir[POS_SBa], tempDir[POS_ABa]) return 0 else: logger.info('有可用股票,当前%s股票,拥有%d股,可用共%f股。', stockcode, tempDir[POS_SBa], tempDir[POS_ABa]) return tempDir[POS_ABa]
def Element_FClearCodeNotInCodeLiat(self): #清除今天不需要跟踪的所有股票 if not StockTimer.NowIsTransactionTime(): self.ValueTaskList.put(self.Element_FClearCodeNotInCodeLiat) logger.warning('不是交易时间,不操作') return False # for ac in self.ValueAllAcList: #清空不在股票池当中的所有股票 surplusStockCode = set(ac.GetStockCodeList()) - set( self.ValueTodayTrackedCodeList) for code in surplusStockCode: logger.info('股票%s不在今日的列表,清空。', code) ac.ClearStock(code) if not self.FTodayCodeListCleanUp(): logger.warning('检查发现还没有清空非今日可操作的股票。') self.ValueTaskList.put(self.Element_FClearCodeNotInCodeLiat) return False else: return True
def BuyStock(self, price, count, stockcode): #买入股票,会自动判断是否可以买入,正常买入返回true if not (count % 100 == 0): logger.warning('不是购买100的整数倍股。不可以操作。') return False elif not self.__B_CheckFinancialConditions(price, count, stockcode): return False if not self.__B_CheckMarketPrice(price, stockcode): return False else: cost = self.__B_GetCost(price, count, stockcode) self.balance[BAL_AFu] = self.balance[ BAL_AFu] - price * count - cost #可用资金下调 self.balance[BAL_CBa] = self.balance[ BAL_CBa] - price * count - cost #资金余额下调 self.__B_AddPositionStock(price, count, stockcode) self.XMLLog.TodayLog.BuyOper(stockcode, count, price, cost) logger.info('购入股票成功') self.CalAllData() return True
def SellStock(self, price, count, stockcode): #卖出股票,会自动判断是否可以卖出,正常卖出返回true if not (count % 100 == 0): logger.warning('不是卖出100的整数倍股。不可以操作。') return False TradableCount = self.GetPositionStockTradableCount(stockcode) if TradableCount == 0: return False elif not self.__S_CheckMarketPrice(price, count, stockcode): return False elif TradableCount > count: TradableCount = count self.balance[ BAL_AFu] = self.balance[BAL_AFu] + price * TradableCount #增加可用资金 self.balance[ BAL_CBa] = self.balance[BAL_CBa] + price * TradableCount #增加资金余额 self.__S_ReduceStock(price, TradableCount, stockcode) logger.info('卖出股票%s成功', stockcode) self.XMLLog.TodayLog.SellOper(stockcode, count, price) self.CalAllData() self.RemoveEmptyStock() return True
def OperationByCDPState(self, stockStateList): # self.ProcePrint.write_mmap_info('操作开始.') for key in stockStateList: if (datetime.datetime.now() - self.FrontBuyTime) < datetime.timedelta( seconds=self.minuteTime): #限制多久可以进行一次操作 self.ProcePrint.write_mmap_info('5分钟内不再进行第二次买入.') break if stockStateList[key] == CDPState.Mid or stockStateList[ key] == CDPState.Out: #不在可操作状态的股票跳过 #logger.warning('跳过不可操作股票.') continue if stockStateList[key] == CDPState.UP: #卖出操作 #logger.info('尝试卖出.股票:%s',key) if self.Element_FClearAccountStock(key): logger.info('成功卖出.股票:%s', key) self.ValueTodaySellCode.append(key) self.FSaveToXML() #else: #logger.warning('卖出股票:%s失败',key) continue if self.TodayBuyCount > self.OneDayStockCount: self.ProcePrint.write_mmap_info('今天买入的股票数已经到达上限,不再进行买入操作。') return if key in self.ValueTodayBuyCode and self.ValueTodayBuyCode[ key] > self.oneStockLimit: #今天买过的次数走过限制的股票不可以再买入 #logger.warning('今天已经买过的股票不可以再买入.') continue if not self.__FGetRandprobability(1 / 3): #随机跳过部分股票 self.ProcePrint.write_mmap_info('随机跳过部分股票' + key) continue if stockStateList[key] == CDPState.Down: logger.info('买入股票:%s', key) self.__FBuyStock(key) self.FrontBuyTime = datetime.datetime.now() self.FSaveToXML() self.ProcePrint.write_mmap_info('操作结束.') return True
给这个节点添加文本:element.appendChild(dom.createTextNode('default')) 注意:这里的节点文本值是存成另外一个节点的,是createTextNode 设置属性:element.setAttribute('age', '20') 添加到节点:root.appendChild(element) # 保存文件account with open('default.xml', 'w', encoding='utf-8') as f: dom.writexml(f, addindent='\t', newl='\n',encoding='utf-8') 读取文档:dom = minidom.parse('default.xml') 获得根节点:root = dom.documentElement 按照名称查找子节点,注意这里会递归查找所有子节点:names = root.getElementsByTagName('Name') 所有的子节点:root.childNodes 注意:每个节点的文本值存在TextNode节点中,也就是最后一个节点的第一个子节点 查看是否含有属性:name.hasAttribute('age') 查看属性:name.getAttribute('age') ''' if __name__ == '__main__': logger.info(FilePath) def GetCost(count, price): stampDuty = count * price * 0.001 #印花税 CertificateManagementFee = count * price * 0.002 / 100 * 2 #证管费 HandlingExpenses = count * price * 0.00487 / 100 * 2 #经手费 TransferFee = count * price * 0.02 / 1000 * 2 #过户费 Commission = count * price * 0.0006 #佣金 cost = stampDuty + CertificateManagementFee + HandlingExpenses + TransferFee + Commission return cost / count / price * 100 #费率
def PrintAllBalance(self, dataindex): #打印 logger.info('%s data', dataindex) for ac in self.ValueAllAcList: temp_balance = ac.GetB()[0] if dataindex in temp_balance: logger.info(temp_balance[dataindex])