Example #1
0
 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
Example #2
0
 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
Example #3
0
 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)
Example #4
0
 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)
Example #5
0
 def appendChild(self, childNode):
     if DomMutex.acquire(3):
         try:
             self.dom.documentElement.appendChild(childNode)
         except:
             logger.info('添加节点出错。')
         finally:
             DomMutex.release()
Example #6
0
 def Reload(self):
     if DomMutex.acquire(3):
         try:
             self.dom = xmldom.parse(XmlPath + self.__AccountFileName)
         except:
             logger.info('解析文件出错,检查文件是否合法。')
         finally:
             DomMutex.release()
Example #7
0
 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
Example #8
0
 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()
Example #9
0
 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
Example #10
0
 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]
Example #11
0
 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
Example #12
0
 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
Example #13
0
 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
Example #14
0
 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
Example #15
0
给这个节点添加文本: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  #费率
Example #16
0
 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])