Börsenprogramm_Candlestickmuster heraussuchen

Du hast eine Idee für ein Projekt?
Antworten
Torsten2005
User
Beiträge: 34
Registriert: Mittwoch 2. November 2005, 15:37
Wohnort: Berlin
Kontaktdaten:

Hallo, ich sag gleich , es ist mein erstes größeres Programm ;
Also was soll das Programm können :
[der Quelltext kommt am Ende]

-Kurse von aktien runterladen --> gelöst ,-aktuell 2tagealte kurse(rückwirkend ca. 9 monate)
-aktelle Kursdaten des Tages aus börsenseite herausfiltern --> fast gelöst
-aus den Daten Candlestick muster heraussuchen , wie z.b hammer , morgenstern , tower usw. --> für hammer gelöst und dann ausgabe der Tage

Das soll erstmal das Grundgerüst sein , natürlich kann man das später noch erweitern !

Probleme:
Allerdings tun sich da jetzt einige problem auf , weil ich bis jetzt auf Klassen , methoden verzichtet habe , weil ich noch nicht so ganz damit klar komme .
- Daten erweitern : damit meine ich , die csv-datei umfasst daten vom 28.2.2005 bis 7.12.05 , für den 9.12 bekomm ich es von der aktuellen seite, am montag den 12.12 bekomme ich die daten für den 8.12 am dienstag für den 9.12 usw. , die daten vom 28. 2 sind dann aber weg weil csv. datei überschrieben?????

- also aktuelle Daten der csv-datei hinzufügen ??
- wichtigste Frage: welche Klassen , sind hier am sinnvollsten , ?

Naja villeicht ist hier noch ein charttechnisch innteressierter
kurz zum Programm : Ordner müssen individuell verändert werden ,; beim start öffnet sich ein fenster mit 2 botton ; K--> Kurse holen ; W--> Muster heraussuchen , bisher nur Hammer ;
Quelltext

Code: Alles auswählen

 
#! /usr/bin/env python
# -*- coding: cp1252 -*-
from time import *
from Tkinter import *
import urllib
from re import *

heute=strftime('%d')+'-'+strftime('%b')+'-'+strftime('%y')
Wochentag=strftime('%w')           #Sonntag ist 0 ; sammstag 6
int(strftime('%d'))-1
if strftime('%w')=='6':            #Wochentagsänderung wenn So oder Sa zu Freitag
    heute=str(int(strftime('%d'))-1)+'-'+strftime('%b')+'-'+strftime('%y')
if strftime('%w')=='0':
    heute=str(int(strftime('%d'))-2)+'-'+strftime('%b')+'-'+strftime('%y')

Symbol="DCX"
Monatvon="01"
Tagvon="10"
Jahrvon="2005"
Monatbis="11"
Tagbis="09"
Jahrbis="2005"

#aktuelle daten lesen
url=("http://de.finance.yahoo.com/q?s=%s.DE" %(Symbol))
a=urllib.urlopen(url).readlines()
for i in a:
  if '</td></tr></table><br><table width="585" id="yfncsumtab" cellpadding="0"' in i:   # Zeile mit den Daten; i ist ein string
    Eroeffnungskurs=str(findall('Er\xf6ffnungskurs\S+\s\S+\d+',i))
    heute_open=str(findall('>\d+,\d+',Eroeffnungskurs)).replace('>','')   #open 
    heute_Tagesspanne=str(findall('Tagesspanne\S+\s\S+\d+\s-\s\d*,\d*',i))
    heute_Tagesspanne1=str(findall('>\d+,\d+',heute_Tagesspanne))   
    heute_tief=findall('\d+,\d+',heute_Tagesspanne1)                     #tiefkurs
    heute_Tagesspanne2=str(findall('-\s\d+,\d+',heute_Tagesspanne))
    heute_hoch=heute_Tagesspanne2.replace('- ','')                       #hochkurs
    Schlusskurs=str(findall('Letzter\s*Kurs\S+\s\S+\d+',i))
    heute_letzter=str(findall('>\d+,\d+',Schlusskurs)).replace('>','')   #letzterKurs

def but1():  
#Datei erzeugen und alte daten(2tage alt) als CSV datei runterladen
 anfrage = urllib.urlopen('http://ichart.yahoo.com/table.csv?a=%s&b=%s&c=%s&d=%s&e=%s&f=%s&s=%s.DE&y=0&g=d&ignore=.csv' \
                          %(Monatvon,Tagvon,Jahrvon,Monatbis,Tagbis,Jahrbis,Symbol)) 
 datei=file('C:/Dokumente und Einstellungen/Torsten/Desktop/Boersenprogramm_Python/Daten/%s.csv' %Symbol, 'w+')  #hier kommen die Daten hin
 datei.write(anfrage.read()) 
 datei.close() 
 anfrage.close()
   
def but2():
#Daten bearbeiten--> Datum (Format T.M.jahr) , O ,H, T,S ,V ,rest;
 daten=file('C:/Dokumente und Einstellungen/Torsten/Desktop/Boersenprogramm_Python/Daten/%s.csv' %Symbol, 'r')   
 kurse=daten.read()              #beispiel: 7-Dec-05,43.17,43.45,42.57,42.99,4392391,42.99          
 zeilen=kurse.splitlines()
 d_dcx ={}                         #Dictionary
 zeilen.remove('Date,Open,High,Low,Close,Volume,Adj. Close*')
 for z in zeilen:
    spalte=z.split(',')
    datum=spalte[0]
    open=spalte[1]
    hoch=spalte[2]
    tief=spalte[3]
    schluss=spalte[4]
    volumen=spalte[5]
#float(((float(open)-float(tief))/(float(schluss)-float(open))))
    if (float(schluss)-float(open))!=0:                  # and(float(hoch)-float(schluss))
     if  float(((float(open)-float(tief))/(float(schluss)-float(open)))) >3\
        and float(((float(hoch)-float(tief))/(float(hoch)-float(schluss)+0.0000001)))> 7.0: 
            #Hammer  
      hammer=1
     else: hammer=0
    d_dcx[datum]=[open,hoch,tief,schluss,volumen,hammer]
    #print d_dcx[datum][hammer]
    #if (d_dcx[datum][hammer])==0:
    # print d_dcx[datum]
 for e in d_dcx.keys():
  #print e
  if (d_dcx[e][5])==1:            #wenn hammer
        print e
 
  

 d_dcx[heute]=[heute_open,heute_hoch,heute_tief,heute_letzter,1]   
 #neuedatei=file('C:/Dokumente und Einstellungen/Torsten/Desktop/Boersenprogramm_Python/Daten/%s_.txt' %Symbol, 'w+') 
 #Oberflächengestalltung      
fenster1 = Tk()

titel = Label(master=fenster1, text='Börsenprogramm',fg='blue',font=(sb,15,'bold','underline'),bd=10)
titel.pack()
fenster1.button=Button(master=fenster1, text='Kurse',command= but1,fg='red',font=(st,10),bd=5,height=1)
fenster1.button.pack(side=LEFT)

fenster1.button=Button(master=fenster1 , text='W',command=but2,fg='red',font=(st,10),bd=5)
fenster1.button.pack(side=LEFT)


fenster1.mainloop()                                 
Zuletzt geändert von Torsten2005 am Sonntag 4. Juni 2006, 11:32, insgesamt 1-mal geändert.
BlackJack

Für CSV Daten ist das `csv` Modul geeignet.

Ansonsten kann man CSV Daten mit den gleichen "Spalten" ja einfach an die Datei anhängen, solange keine Kopfzeile mit Spaltennamen am Anfang steht. Sonst muss man die überspringen.

Eine Textdatei kann man mit ``open(name, 'a')`` öffnen, dann werden geschriebene Zeilen an die schon vorhandene Datei angehängt.
Torsten2005
User
Beiträge: 34
Registriert: Mittwoch 2. November 2005, 15:37
Wohnort: Berlin
Kontaktdaten:

mm ok , ich werd es wahrscheinlich mit einer Datenbank machen .

Ein anderes problem:
ich muss das dictionary oder die datenbank nacht datum sortieren !??
also der schlüssel ist das datum , z.b so 5-Dec-05 ; die werte sind dann
open,hoch,tief,schluss,volumen, muster1 usw.....;

Und ich muss die daten nach datum sortieren , weil ich z.b auf ein datum zugreife und dann auf den vortag oder den tag danach , usw.

Also muss ich doch die datenbank in eine liste umwandeln und dann sortieren ??

ein kleines beispiel wäre nicht schlecht , porbleme machtr mir das Datumformat und és gibt ja nur datum für Mo- FR , nicht für sa , so !!

Gruß
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Forumssuche mit dem Suchbegriff:
datum

unter den ersten 10 Einträgen:
http://www.python-forum.de/viewtopic.ph ... ight=datum

cu Sebastian
Torsten2005
User
Beiträge: 34
Registriert: Mittwoch 2. November 2005, 15:37
Wohnort: Berlin
Kontaktdaten:

mm danke hat mir überhauot nicht weiter geholfen , :cry:

ich habe eine datenbank/dictionary mit den datum als schlüssel und ich brauch die reihenfolge das datums , ich hab da nix vergleichbares gefunden!
mir ist klar , ich kann die keys in listen dann sortieren , aber wie sag ich das es sich um datum handelt vom format 5-Dec-05 ???????

Gruß
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Pack es doch in eine SQLite DB...

Oder ändere das Datum von z.B. 01.12.2005 nach 20051201... Dann kannst du es mit sort() behandeln...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Torsten2005
User
Beiträge: 34
Registriert: Mittwoch 2. November 2005, 15:37
Wohnort: Berlin
Kontaktdaten:

jens hat geschrieben:Pack es doch in eine SQLite DB...

Oder ändere das Datum von z.B. 01.12.2005 nach 20051201... Dann kannst du es mit sort() behandeln...
-guter vorschlag , thx
habs so gemacht:

Code: Alles auswählen

def datumformat(sp): #Format von 5-Dec-05 nach 20051205
	k=sp.split('-')       #liste
	for i in k:
		m=''
		d=''
		if strptime(k[1],'%b')[1]<10:  m='0'                  
		if strptime(k[0],'%d')[2]<10:  d='0'
		sp=str(strptime(k[2],'%y')[0])+m+str(strptime(k[1],'%b')[1])+d+str(strptime(k[0],'%d')[2])
		return sp

datum=datumformat(datum)  
liste1=[e for e in d_dcx.keys() if (d_dcx[e][5])==1]        #wenn hammer
liste1.sort() 
print liste1 
liste2=[e for e in d_dcx.keys() if (d_dcx[e][6])==1]       #wenn roter hammer 
liste2.sort() 
print liste2 

Torsten2005
User
Beiträge: 34
Registriert: Mittwoch 2. November 2005, 15:37
Wohnort: Berlin
Kontaktdaten:

geändert:

so , hab versucht alles in Klassen zu machen , komm irgendwie nicht weiter, die Oberflächen-klasse ist soweit stimmig ,
die datenklasse , da stimmen die variablen nicht, die wird ja auch noch nicht angesprochen .

hat jemand vielleicht ne Idee welche klassen hier sinnvoll wären .
Sollte man nur eine nehmen? Oder wann muss man mehr als nur eine Klasse nehmen?

ich poste mal neuen code und bild von der oberfläche.

Code: Alles auswählen

from time import *
import urllib
from re import *
import csv
import pickle
from Tkinter import *

class Daten:
	pass
	def kurse_altholen(self):
		anfrage = urllib.urlopen('http://ichart.yahoo.com/table.csv?a=%s&b=%s&c=%s&d=%s&e=%s&f=%s&s=%s.DE&y=0&g=d&ignore=.csv' \
                          %(Monatvon,Tagvon,Jahrvon,Monatbis,Tagbis,Jahrbis,Aktie)) 
		datei=file('/Boersenprogramm/Daten/%s1.csv' %d, 'w+')                      #hier kommen die Daten hin
		datei.write(anfrage.read()) 
		datei.close() 
		anfrage.close()
	def kurse_neuholen(self):
		url=("http://de.finance.yahoo.com/q?s=%s.DE" %d)   # F--> Frankfurt  ; DE--> Xetra
		a=urllib.urlopen(url).readlines()
		for i in a:
			if '</td></tr></table><br><table width="585" id="yfncsumtab" cellpadding="0"' in i:   # Zeile mit den Daten; i ist ein string
				Eroeffnungskurs=str(findall('Er\xf6ffnungskurs\S+\s\S+\d+',i))
				heute_open=str(findall('>\d+,\d+',Eroeffnungskurs)).replace('>','')          #open 
				heute_open=heute_open.replace('[','') ;  heute_open=heute_open.replace(']','')
				heute_open=heute_open.replace("'",'') ;  heute_open=heute_open.replace(",",'.')
				heute_Tagesspanne=str(findall('Tagesspanne\S+\s\S+\d+\s-\s\d*,\d*',i))
				heute_Tagesspanne1=str(findall('>\d+,\d+',heute_Tagesspanne))   
				heute_tief=str(findall('\d+,\d+',heute_Tagesspanne1))                     #tiefkurs
				heute_tief=heute_tief.replace('[','') ; heute_tief=heute_tief.replace(']','')
				heute_tief=heute_tief.replace("'",'') ;  heute_tief=heute_tief.replace(",",'.')
				heute_Tagesspanne2=str(findall('-\s\d+,\d+',heute_Tagesspanne))
				heute_hoch=heute_Tagesspanne2.replace('- ','')                       #hochkurs
				heute_hoch=heute_hoch.replace('[','') ; heute_hoch=heute_hoch.replace(']','')
				heute_hoch=heute_hoch.replace("'",'') ; heute_hoch=heute_hoch.replace(",",'.')
				Schlusskurs=str(findall('Letzter\s*Kurs\S+\s\S+\d+',i))
				heute_letzter=str(findall('>\d+,\d+',Schlusskurs)).replace('>','')   #letzterKurs
				heute_letzter=heute_letzter.replace('[','') ;  heute_letzter=heute_letzter.replace(']','')
				heute_letzter=heute_letzter.replace("'",'') ;  heute_letzter=heute_letzter.replace(",",'.')
				hammer=0
				hammerrot=0
		print heute_letzter
	def muster_suchen(self):
		if float(heute_open)-float(heute_letzter)!=0.0:        #Hammer  weiß         
			if  ((float(heute_hoch)-float(heute_tief))/(float(heute_letzter)-float(heute_open))) >2.4 \
				and ((float(heute_hoch)-float(heute_tief))/(float(heute_hoch)-float(heute_letzter)+0.0000001))> 6.0:    
					hammer=1
        	if  ((float(heute_open)-float(heute_tief))/(float(heute_open)-float(heute_letzter)+0.0000001)) >3 \
				and ((float(heute_hoch)-float(heute_tief))/(float(heute_hoch)-float(heute_open)+0.0000001))> 6.0:      #Hammer  rot
					hammerrot=1
	
	def altkurse_dic(self):
		aktie=csv.reader(open('/Boersenprogramm/Daten/dcx.csv', "rb"))
		for row in aktie:
			self.dic[row[0]]=[row[1],row[2],row[3],row[4],row[5]]
    
	
	def neukurse_dic(self):
		pass
	
	def dic_speichern(self):
		datei=file('/Boersenprogramm/Daten/dcx_neu.csv','w')
		pickle.dump(dic,datei) #Dictionaery in der neuen Datei gespeichert
		datei.close
	
	def dic_laden(self):
		datei=file('/Boersenprogramm/Daten/dcx_neu.csv','r')
		daten = pickle.load(datei) #Dictionaery von der neuen Datei geladen
		datei.close()


class Oberflaeche:
	
	def __init__(self):
		
		#Widget instanzieren
		self.fenster = Tk()
		self.fenster.title('Musterfinden')
		self.variable_radiobutton=IntVar()
		self.frame5=Frame(master=self.fenster,width=1500)
		self.frame1=Frame(master=self.frame5,width=120) # für Radiobuttons Auswahl 
		self.frame2=Frame(master=self.frame5) # für 2 Buttons Kurse laden 8alt und neu       #hier Zeile 20
		self.frame3=Frame(master=self.frame5) # für Buttons Muster suchen  (m1  - m10)
		self.frame4=Frame(master=self.fenster) # für Textfeld als Ausgabe und Listbox der Aktien des Index
		
		self.dax=Radiobutton(master=self.frame1,text='Dax', value= 1, variable=self.variable_radiobutton, command=self.ausgabe_dax)
		self.mdax=Radiobutton(master=self.frame1,text='MDax', value= 2, variable=self.variable_radiobutton,command=self.ausgabe_mdax).grid(column=1, row=0)
		self.tecdax=Radiobutton(master=self.frame1,text='TecDax',value= 3, variable=self.variable_radiobutton,command=self.ausgabe_tecdax).grid(column=2, row=0)
		self.stoxx=Radiobutton(master=self.frame1,text='Stoxx50',value= 4, variable=self.variable_radiobutton,command=self.ausgabe_stoxx).grid(column=3, row=0)
		#self.dax.select()
		self.dax.grid(column=0, row=0) 
		
		self.k1_Button=Button(master=self.frame2, text='K_alt',width=10,command=self.K1).grid(column=0, row=0)
		self.k2_Button=Button(master=self.frame2, text='K_neu',width=10,command=self.K2).grid(column=1, row=0)
		
		self.m1Button=Button(master=self.frame3, text='M1',command=self.m1).grid(column=0, row=0)
		self.m2Button=Button(master=self.frame3, text='M2',command=self.m2).grid(column=1, row=0)
		self.m3Button=Button(master=self.frame3, text='M3',command=self.m3).grid(column=2, row=0)
		self.m4Button=Button(master=self.frame3, text='M4',command=self.m4).grid(column=3, row=0)
		self.m5Button=Button(master=self.frame3, text='M5',command=self.m5).grid(column=4, row=0)
				
		self.scrollbar1=Scrollbar(master=self.frame4)
		self.scrollbar2=Scrollbar(master=self.frame4)
		
		self.listbox=Listbox(master=self.frame4,selectmode=SINGLE,width=30,height=46,yscrollcommand=self.scrollbar2.set)
		self.ausgabe=Text(master=self.frame4 , font=('Arial',10),width=90,height=40,yscrollcommand=self.scrollbar1.set)
		self.scrollbar1.config(command=self.ausgabe.yview)
		self.scrollbar2.config(command=self.listbox.yview)
		
		self.layout()                                           #für die Übersicht eine extra Methode pack
		#self.auswertung_radiobutton()
		#self.ausgabe_dax()
		self.fenster.mainloop()
		
	def layout(self):
		self.frame1.pack(side=LEFT,anchor=W)
		self.frame2.pack(side=LEFT,padx=20,anchor=CENTER)
		self.frame3.pack(side=RIGHT,padx=20,anchor=E)
		self.frame5.pack(side=TOP,pady=35)
		self.frame4.pack(anchor=CENTER)
						
		self.listbox.pack(side=LEFT)
		self.scrollbar2.pack(side=LEFT,fill =Y,anchor=W)
		self.ausgabe.pack(side=LEFT)
		self.scrollbar1.pack(side=RIGHT,fill =Y)
		
	def ausgabe_dax(self):
		self.loeschen_listbox()
		self.liste_dax=['ADS','FME','ALV','HEN3','ALT','HVM','BAS','IFX','BMW','LIN','BAY','MAN','CBK','MEO','MUV2','DCX','RWE','DBK','SAP','DPW','DB1','SIE','LHA','TKA','DTE','TUI','EOA','VOW']
		for item in self.liste_dax:
			self.listbox.insert(END, item) 
	def ausgabe_mdax(self):
		self.loeschen_listbox()
		self.liste_mdax=['ARL', 'IWK', 'AMB2', 'SDF', 'BZL', 'KAR', 'BEI', 'KRN', 'BZL', 'LEO', 'GBF', 'MDN', 'CLS', 'MRK', 'MGT', 'DGX', 'MLP', 'DEP', 'MPC', 'DOU', 'NDA', 'DEQ', 'PSM', 'DPB', 'PUM', 'EAD', 'RHM3', 'FIE', 'RHK3', 'FRA', 'SZG', 'FRE3', 'SRZ', 'HNR1', 'SGL', 'HDD', 'SAZ', 'HEI', 'SZU', 'HOT', 'TNH', 'BOS3', 'HRX', 'VOS', 'IKB', 'IVG', 'WIN']	
		for item in self.liste_mdax:
			self.listbox.insert(END, item) 
	
	def ausgabe_tecdax(self):
		self.loeschen_listbox()
		self.liste_tecdax=['AIX', 'AUS', 'BBZ', 'BC8', 'DRW3', 'ELG', 'EPC', 'EVT', 'FRN', 'FEW', 'IDS', 'IDS', 'JEN', 'KBC', 'MNSN', 'MOB', 'MOR', 'PFV', 'QGENF', 'QSC', 'RSI', 'SNG', 'SOW', 'SWV', 'TOI', 'TLI', 'UTDI', 'WE2']
		for item in self.liste_tecdax:
			self.listbox.insert(END, item) 
	
	def ausgabe_stoxx(self):
		self.loeschen_listbox()
		self.liste_stoxx=['ALV', 'BAS', 'BAY', 'DCX', 'DBK', 'EOA', 'DTE', 'MUV2', 'RWE', 'SAP', 'SIE', 'CS', 'CGE', 'BNP', 'CA', 'ACA', 'FTE', 'OR', 'MC', 'LG', 'SGO', 'GLE', 'SZE', 'FP', 'EX', 'BN', 'AI', 'AXAF', 'CGEP', 'BNPP', 'CARR', 'CAGR', 'FTE', 'OREP', 'LVMH', 'LAFP', 'SGOB', 'SOGN', 'LYOE', 'TOTF', 'EAUG', 'DANO', 'AI']
		for item in self.liste_stoxx:
			self.listbox.insert(END, item) 
			
	def loeschen_listbox(self): #Listbox wird gelöscht
		self.listbox.delete(0,END)
		
	##############################################	
	#Radiobutton haben die Kontrollvariable "self.variable_radiobutton "	
	
	def K1(self):
		pass
	def K2(self):
		pass
	def m1(self):
		pass
	def m2(self):
		pass
	def m3(self):
		pass
	def m4(self):
		pass
	def m5(self):
		pass
	
#Hauptprogramm
b=Oberflaeche()
Bild

kurze Programmbeschreibung:
-Radiobuttons wählen die Liste aus , die in der Listbox ausgegeben wird ,und später mit K1 runtergeladen wird.
-K2 ist dann nochmal da um aktuelle Daten runterzuladen ;
Die buttons M1 bis M5 (später erweitert) durchsuchen dann die daten (der entsprechenden Liste) nach Muster und geben diese dann ins Textfeld aus ;

-Klingt eigentlich recht simpel , aber wie gesagt ist mein erstes Programm
Antworten