Jump to content
Tom Next - Daytrading Community

Mythos

Moderatoren
  • Posts

    3,694
  • Joined

  • Last visited

  • Days Won

    175

Blog Entries posted by Mythos

  1. Mythos
    Es hat (leider) etwas länger gedauert als erwartet, aber jetzt steht mal die erste Version.
     
    Ausgeführt wie gesagt als eine Library. Folgende Probleme (und Lösungen) sind während der Implementierung aufgetreten:
     
    Transferfunktionen
    Ich kann leider nicht beliebige Transferfunktionen zulassen, Grund ist genaugenommen nur die "Beschränktheit" von MQL. Mit OO könnte man eine Abstrakte "Transferfunction" Klasse machen und dem NN pro neuron ein solches Objekt übergeben. Aber is halt nicht. Also gibt es derzeit 3 mögliche Funktionen: Linear, sigmoid und heavy side.
    Welches Neuron welche Funktion verwendet wird bei der Initialisierung durch ein Array von IDs festgelegt (Linear hat ID 0, Sigmoid 1, HeavySide 2). Damit keine verwechslungen aufkommen, hab ich die Definition dieser IDs über Prekompilerkonstanten in ein eigenes mqh gelöst.
    Je nachdem welche TransferId das Neuron hat, verhält sich nun also die Funktion zur Berechnung des Neuron-Outputs entsprechend anders.
     
    MT und die Arrays
    In MQL gibt es ja bekanntlich Arrays, und man kann mit ArrayResize auch zur Laufzeit beliebig die Größe des Arrays ändern. Das gilt in der Form aber leider nur für eindimensionale Arrays.
    Für ein NN benötigt man aber auch 2 und 3 dimensionale Arrays. Und da ich nicht ein konkretes NN mit fixer Anzahl an Layern und Neuronen bauen will, muss auch die Größe der verschiedenen Dimensionen dynamisch sein.
     
    Also musste ein workaround her. Sieht im konkreten Fall so aus, das ich alles eindimensionale Arrays habe und die mehrdimensionalität mit der Indizierung "simuliere".

    realesArray[0] entspricht theoretischesArray[0][0][0] realesArray[1] entspricht theoretischesArray[0][0][1]
    Schwierig wirds jetzt zusätzlich weil die Dimensionen nicht nur variabel in der Größe sind, sondern natürlich komplett unterschiedlich sind. Nehmen wir als Beispiel das "zweidimensionale" Array welches die Transferfunction-Id pro neuron speichert.
    Theoretisch ist das Array so aufgebaut:

    transferId[layer][neuron]
    gibt es jetzt 5 Neuronen am Eingangslayer, 3 am layer1 und 2 am Layer2, dann ist

    transferId[0][1]= realesArray[1] transferId[1][1]= realesArray[5+1]; transferId[1][2]= realesArray[5+2]; transferId[2][0]= realesArray[5+3+0];
    Ich muss mir hier also merken wieviele Neuronen es bis zum LayerX gibt, um dann für LayerX den richtigen Offset im Array zu wissen.
    Diese Info hab ich wiederum in ein Array gespeichert (simple, eindimensional ;) das für jeden Layer genau diesen Offset speichert.
     
    Noch eine Ebene komplizierter wirds dann bei den Gewichten, die eigentlich 3-dimensional sind. Hier arbeite ich wieder mit solchen gespeicherten Offsets. wobei ich mir speichere wieviele Gewichtswerte es bis zu LayerX gibt (wieder in einem Array) und dann im LayerX einfach nach dem fixen 2D prinzip gehe. Hier funktioniert es, da innerhalb eines Layers alle 2. Dimensionen gleiche Länge haben, da ja jeder Konten auf dem Layer gleichviele Outputknoten hat (Anzahl Knoten vom nächsten Layer).
     
    Biases
    Jedes Neuron in einem NN hat ja einerseits die inputs, aber zusätzlich noch einen Schwellwert oder Bias der zur gewichteten Summe dazugezählt wird. Ich habs einfach so implementiert das es ein weiteres Array gibt das sämtliche Biases beinhaltet, analog zum Array mit den Ids der Transferfunktionen.
     
    Speichern und Laden
    Die nächste Herausforderung war die Speicherung eines NN (also die Anzahl der Layer, Neuronen pro Layer, TransferId und Bias pro Neuron sowie alle Gewichte zwischen den Neuronen). Da ich die Gewichte grundsätzlich auch händisch/extern anaylisieren will, hab ich mich für csv entschieden, obwohl binär natürlich schneller und effizienter wäre.
    MQL hat ja an sich recht nette Filezugriffsmöglichkeiten, aber der Schreibbefehl für csv nimmt zwar eine beliebig lange liste an werten, aber macht immer eine newline. wenn man also zur compilezeit noch nicht weiß wieviele werte das werden und über eine Schleife schreiben will, kann man nur entweder die gesamte line selber als string bauen oder jeden wert in eine eigene Zeile schreiben. Ich hab mich für zweiteres entschieden. Dadurch is das file zwar recht lang, aber mei, die Anzahl der Zeichen ist gleich ;)
     
    Weitere Herausforderungen gabs dann noch beim Einbau des Lernalgorithmus, aber dazu mehr nachdem ich den in einem anderen Eintrag erklärt hab ;)
  2. Mythos
    Also die Eckpfeiler.
    Ich möchte das System eigentlich möglichst "einfach" halten. Vor allem zu Beginn und solange noch nicht klar ist was die Ansätze überhaupt können.
     
    Die Eckpfeiler bestehen für mich (u.a.) aus diesen Punkten:
    Welcher Markt/Märkte
    Welcher Timeframe
    Einstiegslogik
    Ausstiegslogik
    MM/RM

    Markt: Da die Systeme selbstlernend werden (sollen), werde ich mich auf keinen Markt einschränken, sondern die Systeme dann mit diversen Märkten füttern und schaun was passiert, Schwerpunkt aber FOREX.
    Timeframe ergibt sich aus der Grundannahme: M1 bzw. ggf. M5. Die Systeme werde ich Timeframe unabhängig bauen damit man auch Test auf höheren Timeframes machen kann, aber der produktive Einsatz ist für kleine TF geplant.
    Die Ausstiege und MM/RM wird wie gesagt sehr simpel sein, jede Position bekommt TP und SL (abhängig von dem erkannten Muster). Später werde ich sicher auch mit trailing und BreakEven testen, aber derweil reicht TP und SL. Risiko bekommt jeder Trade gleich viel, es soll ja jeder die gleiche Chance haben.
     
    Kommt das spannenste hier: die Einstiege.
    Wie schon gesagt wird alles auf Mustererkennung beruhen. Eigentlich macht das fast jedes Handelssystem, also konkreter: Muster in der PriceAction. Der Knackpunkt ist natürlich "wie" diese Muster erkannt werden und welches Muster wie gehandelt werden soll.
    Und hier beginnen sich die beiden Systeme zu unterscheiden:
     
    klassische KI
    Der KI Teil, wird ein neuronales Netz bekommen, mit diversen (noch zu definierenden Eingängen) und damit klassifizieren ob der Kurs innerhalb der nächsten 2 Bars nach oben oder nach unten geht. (Details dazu später). Entsprechend dieser Klassifikation wird dann die Position eröffnet.
     
    Evolution
    Beim Evolutionsteil wird es noch etwas leichter sein zu verstehen warum das System etwas macht. Hier versuche ich zuerst einige mögliche Muster zu definieren. Das System wird dann diese Muster in der Vergangenheit testen und analysieren welche "funktionieren" und welche nicht. Die "guten Muster" werden dann einerseits gehandelt, andererseits werden durch Mutation und Vermischung neue "Muster" definiert die bei Erfolg automatisch zum Pool hinzugefügt werden.
    (Auch hier Details später).
     
     
    Um mir für das ganze rundherum die Arbeit zu erleichtern, werde ich das ganze in das EA-Kitchen Framework einbetten.
  3. Mythos
    Hi Leute,
     
    ursprünglich war die TEFEx als sehr simples Standalone Tool gedacht. Also nur das Applet und aus. Keine Userverwaltung auf der Page (passiert alles im Applet direkt), kein SchnickSchnack runderherum. Aber bereits bei der Erstellung der Registrierungspage musste ich ein bissl davon abweichen, da es eher sinnlos gewesen wäre den Registrierungsprozess umständlich über Java zu machen.
    Dann kam die Frage "Password ändern" und der erste Workaround um die Userverwaltung indem man seine Userdaten dazu eingeben muss.
     
    Da dann schon ein paar seiten vorhanden waren musste bald mal ein Menü her, und ich hab angefangen einen Teil der Backgroundgeschichte und des Manuals in die TEFEx-Page zu integrieren.
    Mit der Highscore kam dann der nächste Workaround und es wurde langsam hässlich.
    Jetzt tauchte auch noch der Wunsch auf die Emailadresse ändern zu können. Und damit is die Idee ohne Page-Userverwaltung zu leben endgültig ad absurdum.
     
    Heißt für mich: Umbau der internen Struktur und der bereits vorhandenen Userspezifischen Seiten. Also ein kleiner Strukturwechsel hinter der Bühne.
     
    Als ersten Schritt gibts dafür jetzt auf der TEFEx-Page eine erste gesammelte "Daten ändern" Seite. Im Laufe der nächsten Zeit (Dank Siedelei dauerts vermutlich etwas länger) werd ich versuchen die ganzen bestehenden workarounds auszubessern.
     
    Für euch auf der Userseite ändert sich dadurch eigentlich nix. Vor allem wer "nur" traded merkt erstmal gar keinen Unterschied. Aber einen Eintrag ins Tech Diary wars auf jeden Fall wert.
     
    Das Ändern der Emailadresse ist übrigens seit heute möglich.
     
    lg
    mythos
  4. Mythos
    Hi Leute,
     
    dank eines weiteren Abstechers zu dem schönen Gap gestern hab ich endlich die 100k Hürde geknackt. Aber damit wirds jetzt wirklich schwer.
    Bisher hab ich mit Positionen gehandelt die locker vom MM genommen wurden. Wenn ich die Positionsgröße ans Konto anpassen will, würd ich sie nicht mehr unterbringen und es wird sicher negativ.
     
    also bleiben 2 Möglichkeiten: Strategie ändern oder die Performanceerwartungen reduzieren.
    Da ich keine Ahnung hab welche andere Strategie wirklich Sinn machen würde, werd ich einfach mal mit kleinem Volumen weitermachen... dauerts halt ein bissl länger.
     
    happy trading
    euer TEFEx-Millionär
  5. Mythos
    Achtung alle miteinander:
     
    Um die aktiven Trader zu belohnen startet ab heute Mitternacht ein neues Bonussystem.
     
    Jeder gehandelte Kiwee-Kontrakte wird mit 1 Credit belohnt.
     
    "Gehandelt" bedeutet in diesem Zusammenhang den roundturn. Also nach Kauf 1 und Verkauf 1 hat man 1 Kontrakt gehandelt.
     
    Ausgezahlt wird ab einem Guthaben von 50 Credits pro Tag. Wer denkt das er Anspruch hat, einfach PM an mich und ich schreib den entsprechenden Betrag gut.
     
    Also rein ins Vergnügen und Happy Trading
    mythos
  6. Mythos
    auf die Gefahr hin das mich jetzt ein paar steinigen: Irgendwie wirds eintönig.
     
    Aber alles der Reihe nach.
    Zuerstmal sorry für die Funkstille, musste erst ein paar gesundheitliche herausforderungen aus dem Weg räumen.
    Dadurch bin ich auch nicht ganz soviel zum Traden gekommen wie ich wollte, aber erfolgreich war es trotzdem.
     
    Inzwischen hab ich die 6000er Marke geknackt wodurch ich endlich über 100 Kontrakte handeln könnte. Ich sag bewusst könnte, denn bei der derzeitigen Liquidität und meinem derzeitigen Tradingstil, ist es nicht ratsam so große Positionen anzuhäufen, weil man sie einfach nicht mehr schnell genug los wird.
    Erfahrungsgemäß liegt die optimale Positionsgröße derzeit so zwischen 50 und 70 Kontrakten. Also unten warten bis man > 40 Kontrakte hat, raufziehen, oben warten bis man > 40 Short ist, wieder runter... und das solange der Markt es zulässt.
     
    Es ist teils fast schon zu einfach. Ich mein ich hab ja gehofft das ich hier nicht voll auf die Schnauze fall sondern eine halbwegs respektable Performance zeigen kann, aber das es so einfach wird hab ich mir nicht gedacht. Wenn nicht gelegentlich jemand in der Shoutbox auftauchen und mit mir quatschen würd, wärs teils richtig langweilig.
     
    Noch schnell die Fakten:
    in den letzten 3 Tagen hab ich 3525 kiwees gehandelt und 2208,90 Gewinn erzielt.
    Also neuer Kontostand 6005,70 und Performance die letzten 3 Tage: 58%.
    Noch sind 10% am Tag machbar.
     
    Mal sehen ob es sich ändert wenn ich mal die 10'000 knacke...
     
    in diesem Sinne
    no worries
    der TEFEx-Millionär
  7. Mythos
    Hi zusammen,
     
    es gab wieder ein kleines update. Im Level2 wird jetzt der letzte Preis auch markiert (blau umrandet) und der Einstiegspreis wird jetzt wieder auf 3 Kommastellen angezeigt damit man sieht das es kein runder Kurs ist (zumindest nit immer).
     
    mfg
    mythos
  8. Mythos
    Hallo zusammen,
     
    hab wieder ein kleines Update eingespielt. In der Level2 Liste werden jetzt endlich immer alle Zellen richtig eingefärbt (bis jetzt gab es Probleme wenn Bid und Ask ausserhalb des Bereichs lagen). Sieht man im Moment zB bei Cocoo schön, hier wird jetzt die gesamte Liste grün eingefärbt weil der Bid mehr als 20 Ticks über dem letzten Preis liegt.
    Außerdem öffnet jetzt auch ein Klick in die Limit-Spalte die Ordermaske (kA warum das nicht von Anfang an so war, wär eigentlich logisch gewesen )
     
    Sonst gabs nur ein paar Verbesserungen in der Codelesbarkeit, aber das betrifft euch ja nicht ;)
     
    lg mythos
  9. Mythos
    Bin wieder da.
    Und dank eines recht großen Gaps konnte ich auch gleich die versäumten Tage aufholen.
    Zunächst ging der erste Trade heute gleich mal massig in die Hose. -25 Credits. Aber dann gabs einen 5 Pip Spread wo ich recht konstant oben und unten die Limits setzen konnte und auch immer wieder ausgeführt wurde.
    Und dann hat ein starker Aufwärtstrend (der mir zuerst mal einen kleinen Verlust produziert hat), einen Gap geöffnet der mir in Summe sicher 300 Credits Profit gebracht hat.
     
    In Summe 842 Kontrakte Kiwee gehandelt mit Nettoprofit von 467,20.
     
    Neuer Kontostand: 1833,70 also eine Performance heute von 34%
     
    Inzwischen kann ich mir endlich 30 Kontrakte leisten.
     
    Dieses Wochenende komm ich vermutlich erstmals dazu einen ganzen Tag immer wieder zu traden, mal sehen was dann raus kommt.
     
    no worries und happy trading
    der TEFEx Millionär
  10. Mythos
    Hi Leute,
     
    wenn man sich die Liste der letzten Blogartikel anschaut, könnte man denken es is eine Gallerie mit nur meinem Foto. Ich spam hier regelrecht das Blogmodul zu. Nichtsdestotrotz gibts wieder eine kleine Meldung.
     
    Heute morgen war ich irgendwie übermotiviert und hab mich entschieden die gesamten Tools am VPS upzudaten. An sich kein Problem, die Benutzeroberfläche sieht auch schon viel cooler aus. Aber es ging natürlich nicht ohne das ein update hängen blieb. Und das war natürlich genau eines das temporät den Apache stoppt... Deswegen der kurze Ausfall heute morgen. Sorry dafür. (Wer das Applet schon offen hatte, hats nicht gemerkt weil der Server unbeeindruckt weiter lief).
     
    Ich hab auch wieder ein paar Verbesserungen eingebaut. Inzwischen wird zumindest schon bei Marketorders eine Warnung angezeigt, falls man für diese Order womöglich nicht die nötige Margin hat. Ob die Order dann im Endeffekt ausgeführt werden kann weiß die TEFEx selber leider auch erst direkt bei der Ausführung.
     
    Das wärs fürs erste wiedermal. Da ich inzwischen mein entspanntes Arbeitsfreies Leben gegen einen Job eingetauscht hab, wird die Weiterentwicklung vermutlich ein bissl an Speed verlieren. Dafür läuft sie derzeit eh recht rund.
     
    lg
    mythos
  11. Mythos
    Hi Leute,
     
    heute war ein klassischer Fall von "Vorführeffekt", aber alles der Reihe nach.
     
    Gehandelte Positionen heute (Abend):
    Kiwee 44 Pos in Summe 305 Kontrakte, Nettoprofit: 106,70
     
    Gesamtprofit also 106,70 macht 9,6%
     
    Wie man sieht hab ich heute kein Bananach gehandelt. Der Gap is zwar immer noch da, aber da is zuwenig Bewegung und Liquidität um schnell reich zu werden.
     
    Zum Thema Vorführeffekt: Eigentlich hatte ich 117 Gewinn und wollte für heute Schluss machen und nur noch den Blog schreiben. Dann seh ich das:

    Sprich ein Gap von 10 Punkten (Die 7 dazwischen hätt ich einfach wegverkauft).
    Also rein:

    Man sieht schon, der MM war nicht mein Freund (8@47,79), aber der G/V von 15,70 hat so schön hergeleuchtet. Naja, wer den Chart anschaut sieht das es da dann eigentlich gerade rauf ging... und ich mit 10 Credits verlust raus :( (im wesentlichen die erste Verlustposition)
     
    Also Strategie"anpassung":
    nicht gierig sein, und nicht Screenshots machen während der Markt aktiv is.
     
    Nochmal kurz zur allgemeinen Strategie:
    Ich versuche die RandomWalk Characteristic die der MM (und damit der momentane Kurs) an den Tag legt zu nutzen. Sobald sich eine "Öffnung" im Orderbuch zeigt (also der Spread aufgeht auf ein paar Pips) setzt ich direkt unter den Ask ein LimitSell und über den Bid ein LimitBuy und warte/hoffe das beide ausgeführt werden. Bevorzugt nutze ich so Löcher wenn an einem Ende ein größerer Block ist, der mir "garantiert" das der Kurs nicht ohne weiteres in diese Richtung wegrauscht. Normalerweise pendelt der Kurs eben ein bissl hin und her, ich geh mit meienr Order im Marktrauschen unter und nehm ein paar Pips mit.
     
    Durch die hohe Tradingfrequenz summiert sich das dann doch recht schnell.
     
    in diesem Sinne happy trading und
    no worries
    der TEFEx-Millionär
  12. Mythos
    Los gehts. Da die TEFEx ja 24 Stunden am Tag, 7 Tage die Woche offen hat gehts eben an einem Sonntag los.
     
    Der Account heißt tefex_millionaire und ist in der Highscore ersichtlich.
     
    Zur Strategie:
    Da man mit 1000 nicht wirklich viel machen kann, bleibt nur eine kleine Scalpingstrategie. Für lange Trades hat das Ganze einen zu starken RandomWalk Character.
    Also: kleine Lücke im Orderbuch finden, schnell Limits oben und unten hin und hoffen das aufgeht. Und das sooft wie möglich.
     
    Mal sehen ob heute Abend ein + vor der Performance steht ;)
  13. Mythos
    wobei es wiedermal nicht das MySQL direkt sondern die Anbindung über Java ist.
     
    Eine normale SQL Anbindung hätte ja eh schon genug Stolperfallen, aber ich muss ja so ein komplexes Serverdings bauen wo eine simple Anbindung natürlich nicht reicht (Es wollen ja möglicherweise mehrere User gleichzeitig bedient werden, also mehrere Querys parallel), sondern man einen kleine connection-pool braucht. Die Verwaltung eines solchen Pools ist natürlich noch ein bissl komplexer, aber inzwischen läufts (hoff ich ;)
     
    Sonst hatt sich nicht viel getan. Hier ein Bug ausgebessert dort am Design/Source gefeilt. Das Projekt is inzwischen auf einem Status wos keine großen Sprünge mehr gibt sondern man lange an kleinen Verbesserungen sitzt... Motivation pur ;)
     
    jo, das wars wiedermal von mir.
    Lebenszeichen: DONE ;)
     
    no worries
    mythos
  14. Mythos
    Falls sich jemand wundert: ja ich war eine Woche weg vom PC. Aber jetzt gehts wieder ran mit neuer Energie. Es ist leider noch viel zu tun aber Schritt für Schritt gehts weiter.
     
    Aktuell ganz oben auf der TODO:

    Die ganzen Querys auf Performance checken, vor allem die Joins.
    Datenübertragung beim Chart verbessern um Traffic zu sparen
    Die Server/Client Verbindung nochmal ausgiebig testen und das Leseverhalten des Servers verbessern.

     
    jo, dann mal wieder ran an den Speck ;)
     
    lg mythos
  15. Mythos
    (...die man ewig suchen tut)
     
    Hi there,
     
    muss gleich noch einen Beitrag nachschießen. Irgendwie gehört es eigentlich zu jedem richtigen Programmierprojekt das man regelmäßig "Fehler" hat/macht die sich seltsam auswirken und die man teils ewig sucht.
    Heute auf der Speisekarte: Deadlock dank synchronized und invokeAndWait(), "Warum wird die Verbindung ständig geschlossen? ... Ah weil ein ENUM nicht voll "ausgefüllt" ist und Nullpointer schmeißt", "Warum zeigt der die Daten nicht realtime an obwohl er sie Realtime kriegt? ... Ah, weil dem Datencenter keiner sagt wen er bei neuen Daten aktualisieren sollen" und ein superschmankerl: "Wieso ruft der SCH*** Browser beim verlassen der Seite nit "deinit()" auf so wies in der Spec von Applets steht? ... Ah weil die Methode "destroy()" heißen sollte...."
     
    In diesem Sinne, ich hab Hunger und aufs Mittagessen vergessen... ich geh kochen ;)
     
    no worries
    mythos
  16. Mythos
    Hi Leute,
     
    Falls sich jemand wundert warum man nix hört: Ganz einfach, es gibt wenig zu berichten ;)
    Einerseits halten mich meine Neffen auf Trab, andererseits besteht der Entwicklungsfortschritt derzeit in Styleverbesserungen des Codes (das Codedesign der Orderliste zB is irgendwie happig), suchen von Fehlern und Beheben dieser etc. Aber mit jeder Zeile Code wird das Ganze ein bissl besser... hoff ich ;)
     
    Ich bau jetzt übrigens auch eine Art StyleSheet ein über das (vorerst nur) die Farben in den Tabellen und Buttons eingestellt werden. Also wenn es Wünsche für Custom-Designs gibt, meldet euch. Aber ich warne euch Magenta für Buy und Cyan für Sell und Pink als Background hat Augenkrebspotential ;)
     
    Hab mich auch entschieden auf kurz oder lang doch den Chart selber zu schreiben. Wird wohl eher "auf lang" aber der soll besser werden.
     
    soda, zurück in die Tretmühle ;)
     
    no worries
    mythos
  17. Mythos
    Was wäre das Leben ohne Hebelwirkung?
     
    Ich hab doch noch ein Backgroundthema gefunden, und wills euch natürlich nicht vorenthalten:
    Das Marginsystem.
    Wiedermal als "Disclaimer": Das ist das wie ich es verstanden habe, bzw. es bei der Exchange implementiert habe. Vor allem beim Thema Margin und Hebel gibt es AFAIK starke Brokerspezifische Unterschiede.
     
    Nehmen wir an ich will den FDAX handeln. Das Ding hat einen Punktwert von 25 Euro und steht derzeit bei rund 7400 Punkten. Wenn ich also 1 Kontrakt kaufen will, müsste ich lasche 185000 Euro hinblättern. Ich will das Ding aber nicht behalten sondern vielleicht in ein paar Minuten wieder verkaufen. Da ist es doch irgendwie witzlos für die paar 100 Euro Gewinn/Verlust gleich 185000 hin und her zu schieben.
    Zusätzlich ist es im Futuremarkt auch so, das ich ja nicht sofort etwas kaufe, sondern nur einen Vertrag abschließe zu einem fixen Zeitpunkt in der Zukunft (deswegen Future ;) etwas zu kaufen (bzw. verkaufen wenn ich short gehe). Also wenn ich es jetzt noch nicht kaufe, wieso gleich dafür zahlen?
    Auf der anderen Seite muss man die gehandelten Kontrakte doch irgendwie einschränken. Weil wenn ich 1 Kontrakt jetzt kaufe und in 30 Minuten wieder verkaufe, kann ich auch gleich 10 oder 10000 Kontrakte kaufen und gleich wieder verkaufen (abgesehen davon das ich damit sicher Verluste mach), ich muss das Geld ja nie parat haben, weil ich eh wieder verkauf. Also irgendwie muss man da scheinbar doch was tun.
     
    Auf einem anderen Markt zB der Forex ist es ähnlich, hier handle ich Positionen im Wert von 100000 Euro für ein paar Euro Gewinn. Hier ist es zwar kein Future, aber eigentlich geht ja niemand her und handelt FOREX um echt Geld zu wechseln.
     
    Aus diesem und anderen Gründen gibt es das Marginsystem bzw. Hebel. Wenn man eine Position eröffnet, muss man nicht den gesamten Betrag zahlen, man muss eigentlich gar kein Geld zahlen, es wird lediglich ein Teil des Kontos als Sicherheitsleistung (die sogenannte Margin) "eingefroren". Mit einem Hebel 1:100 müsste man zB nur 1/100 des Positionswertes als Margin zur Verfügung haben. Hat man nicht genug freie Margin (also Kapital das noch nicht als Margin verwendet wurde) zur Verfügung kann man die Position nicht eröffnen.
     
    Soweit so gut, aber dank Hebel kann ich jetzt zB mit 1000 Euro eine Position im Wert von 100000 eröffnen. Wenn die Position jetzt aber 1000 Euro an Wert verliert, hab ich damit mein Konto theoretisch (weil noch nicht realisierter Gewinn) an die Wand gefahren. Aber das ist nicht das einzige Problem. Der Broker besteht darauf das ich inkl. offener Gewinn/Verlust genug Geld am Konto hab für die Sicherheitsleistungen. Das wär hier natürlich nicht der Fall und dann kommt es zum sogenannten MarginCall.
    Der Broker "ruft" mich an und stellt mich vor die Wahl: entweder ich schieße Geld nach oder er wird meine Position zwangsschließen.
    Bei der Exchange ist das ein bissl anders, hier ruft niemand an. In regelmäßigen Abständen wird die Margin kontrolliert, und wer nicht genug hat dem werden einfach alle offenen Positionen geschlossen.
     
    Nun zur Berechnung der Margin. AFAIK wird zB beim FDAX ein fixer Wert pro Kontrakt als Margin verlangt. An der Forex ist es glaub ich abhängig vom aktuellen Kurs. So ist es auch bei der Exchange.
    Die notwendige Margin ergibt sich aus (aktueller Kurs * Positionsgröße * Punktwert)/Hebel.
  18. Mythos
    ...mit Wartungsarbeiten am Server
     
    Bisher (eine ganze Woche) bin ich verschont geblieben, aber prompt zum Start vom Betatest führen die natürlich welche durch. Zuerst hab ich schon gedacht die paar Betatester hätten gleich meinen Server gekillt.
     
    Aber dafür hab ich jetzt die Emailbenachrichtigung aktiviert, und für alle die noch bei hosteurope anfangen: Achtung, die Benachrichtigung über Störungen ist scheinbar nicht standardmäßig aktiviert. Wozu auch, wer will schon wissen wenn sein Server nicht erreichbar sein wird?!
     
    Egal, jetzt gehts wieder. Und ich sollte endlich die Startskripte in den "Autostart" legen.
     
    no worries
    mythos
  19. Mythos
    Is wiedermal Zeit für einen "Tagebucheintrag".
     
    Hallo zusammen,
     
    Es ist einiges weitergegangen. Es gab ein paar böse Bugs im Clearing (hat mir Short positionen nicht geschlossen sondern vergrößert... nit gut ;) und ein paar Designtechnische Verbesserungen (hoffentlich).
    So sieht man jetzt wenn der Chart gerade neue Daten ladet, wieviele Daten vorhanden sind und er ladet die Daten jetzt auch wirklich *G*
     
    Zum besseren Feeling hab ich auch einen Logout Button eingebaut und die faden Standardlogos der Fenster durch provisorische eigene ersetzt. (Wenn jemand künstlerisch begabt ist und eine gute Idee hat: immer her damit ;)
     
    Achja, der Chart hat endlich auch ein Volumen (also der Server schickts endlich mit ;) und inzwischen gibts eine Trafficbegrenzung pro User. Wenn zuviele Daten innerhalb von 5 Sekunden gesendet werden, wird erstmal zurückgeschalten und nur mehr das nötigste an den User gesendet (damit nicht einer mit Unmengen an Chart und LEvel2 Anfragen das ganze blockiert).
     
    Jo, php hab ich auch ein bissl was weitergewerkelt. Der Login wird jetzt geprüft BEVOR das Applet startet und ohne korrekten Login kommt man gar nicht zum Applet. Und es gibt endlich eine Möglichkeit das Passwort zu ändern.
    Alles in allem ist das web-teil aber sehr einfach gehalten, ich kenn mich ja auch nit wirklich aus damit.
     
    In Summe kann man sagen: Server stabil, Code nicht schön aber ok, Client besser aber noch nicht perfekt.
    Spass am damit rumspielen testen: garantiert ;)
     
    no worries
    mythos
  20. Mythos
    Weiter gehts.
    Wenn man sich also festgelegt hat bzw. weiß welche Orders es gibt, ist noch die Frage wie diese gespeichert und ausgeführt werden.
    Ich hab zwar schon von Fill or Kill Orders gehört, aber die machen aus einem einfachen Grund nicht global Sinn (maximal für MarketOrders): Wenn man die Order löscht sobald sie nicht sofort ausgeführt werden kann, gibt es keine gespeicherten Orders (Kauf oder Verkaufsangebote) die zur Verfügung stehen, ergo kann keine Order ausgeführt werden... blöde Börse;)
     
    Also speichern wir die Order im sogenannten Orderbuch. Zur Vereinfachung werden sie gleichmal nach Limit/Triggerpreis sortiert. Die MarketOrders die nicht ausgeführt werden können (was normal nicht vorkommen sollte, wie gesagt macht aber hier ein Fill or Kill sehrwohl Sinn) hauen wir einfach in einen Topf (hier gibt es ja keinen Limit oder Triggerpreis). Zum Glück kann es nie vorkommen das Kauf- UND Verkaufsorders gleichzeitig im Topf liegen. Was passiert aber wenn es unausgeführte MarketBuys gibt (zB) und es kommt eine MarketSell? Genaugenommen hat man als Börse hier fast alle Freiheiten, denn beide sagen "Gib mir den besten (sprich irgendeinen) Preis". Bei der Exchange wird in diesem seltenen Fall der letzte gehandelte Preis als Matchingprice festgelegt. Dadurch wird verhindert das sich der Kurs unnötig bewegt und es ist halbwegs fair gegenüber der neuesten Ordern.
     
    Trifft eine neue LimitSell auf unausgeführte MarketBuys, wird ebenfalls der letzte gehandelte Preis verwendet sofern dieser innerhalb des Limits liegt, andernfalls wird zum Limit gehandelt. Somit kann es bei dieser Konstellation dazu kommen das der Kurs durch eine Verkaufsorder nach oben gezogen wird. Sprich wenn der Markt so ausgedünnt ist, das eine Seite komplett weg ist und sich noch MarketOrders (zB ausgelöste Stopps) auf der anderen Seite befinden, sonst nicht.
    So wie ich den Börsenheini auf dem Tonband verstanden hab gabs eine so ähnliche Situation damals wo der Dow in 10 Minuten 1000 Punkte runtergerast is, da war irgendwas von "I got no Buyers here", aber das nur nebenbei ;)
     
    Limit und Stoporders werden also, sofern sie nicht sofort ausgeführt werden können, im Orderbuch gespeichert. Dabei gibt es automatisch zwei Seiten: Die Käufer und die Verkäufer deren Preisbereiche sich nie (ausser in sehr pathologischen Fällen, wem einer einfällt: Kommentar ;) überschneiden. Im oberen Bereich sind die LimitSells und im unteren die LimitBuys. Bei den Stops sind die Bereiche genauso getrennt aber vertauscht: über dem Preis sind die StopBuys darunter die StopSells.
     
    StopSells können sich also nicht mit StopBuys überschneiden weil beide ausgelöst werden sobald sie auf die "andere" Seite des letzten Preises fallen oder ihn berühren. Limits können sich nicht überschneiden weil dann eine Übereinstimmung vorhanden wäre und die entsprechenden Orders bereits ausgeführt wären.
    Was aber sehr wohl sein kann, ist das sich zB StopSells und LimitSells überschneiden (obwohl sie eigentlich auf unterschiedlichen Seiten liegen). Das passiert zB wenn es wenig LimitBuys gibt (vor allem keine knapp unter dem letzten Preis) aber die LimitSells immer tiefer wandern (also immer neue mit tieferen limits dazukommen). In dem Fall liegt dann auch der letzte Preis nicht mehr zwischen LimitBuys und LimitSells. Deswegen spricht man auch vom letzten Preis (bzw. letzten gehandelten Preis). Denn er ist genau das und nicht mehr. Es gibt keine Garantie das man zu diesem Preis wieder handeln kann, noch das man überhaupt in der Nähe davon wieder handeln kann, es ist nur ein Hinweis wo gerade was passiert ist.
     
    Anders ist es mit dem Bid und Ask. Also dem Angebot und Nachfrage. Das bezieht sich auf den höchsten vorhanden Limitpreis bei den LimitBuys und den niedrigsten vorhandenen Limitpreis bei den LimitSells. Also die zwei Werte zu denen man aktuell kaufen bzw. verkaufen kann (wohlgemerkt nur mindestens 1 Stück).
     
    Was passiert wenn ein Limit zu einem gefüllten Orderbuch kommt?
    Gibt es eine Überschneidung, also LimitBuy >= LimitSell, dann werden die bereits im Orderbuch stehenden Orders solange gegen die neue ausgeführt, bis nichts mehr geht oder die Order ausgeführt ist.
    Und zu welchem Preis?
    Ist der letzte gehandelte Preis unter den LimitSells und über den LimitBuys ist klar das zum Limit der gespeicherten Order gehandelt wird. Einerseits um die Bewegung minimal zu halten andererseits weil der Ersteller der neuen Order ja diesen Preis bereits als Angebot gesehen hat.
    Was passiert wenn der Ask unter dem zuletzt gehandelten Preis ist und eine LimitBuy über dem zuletztgehandelten Preis reinkommt?
    Tjo jetzt wirds schwer: Will man die Preisbewegung minimieren oder gibt man dem Ersteller der neuen Order den besten Preis den er kriegen kann? Ehrlich gesagt bin ich mir jetzt gar nicht mehr sicher wie ich es implementiert habe bzw. in der neuen Version implementieren werde, deswegen hier gleichmal ne Publikumsfrage: was wäre euch lieber?
     
    MarketOrders werden einfach zum bestmöglichen Preis ausgeführt (wandern also einfach die LimitSells von unten bzw. die LimitBuys von oben durch bis sie gefüllt sind). Hier gibt es wieder die Frage: was passiert wenn der letzte Preis innerhalb des Limit ist?
     
    Zur Ausführung von Stoporders gibts eigentlich nicht viel zu sagen, die werden nämlich gar nicht "ausgeführt". Sobald der zuletzt gehandelte Preis den Trigger auslöst, wird die Order in eine MarketOrder verwandelt und "neu auf den Markt geschmissen" also ausgeführt als wäre es eine neue MarketOrder.
     
    hmmm das ist schon wieder mehr geworden als geplant, egal.
     
    so long und ich freu mich auf Anregungen
    mythos
  21. Mythos
    Hi there,
     
    diese Kategorie (TechDiary) dient einerseits als ein bissl Tagebuch bei der Entwicklung für mich um später manche Dinge nachblättern zu können, andererseits soll es euch ein bissl einen Einblick geben was hinter so einer Entwicklung steckt, das ihr seht das was weitergeht ;) und falls es ein paar Java-Cracks gibt die mitlesen freu ich mich hier auch über Anregungen.
     
    Seit ich aus Oz zurück bin, bin ich eigentlich hauptsächlich damit beschäftigt den bestehenden Code durchzuarbeiten und auf "Level" zu bringen. Da das Projekt im Grunde meinen Lernprozess in Java widerspiegelt, sieht der ältere Teil vom Code aus heutiger Sicht noch sehr Anfängermäßig aus :(
    Sprich ich arbeit gerade das gesamte Design durch, brings nach bestem Wissen und Gewissen auf schöne OO und leicht wartbare Classes.
     
    Da ich beim Server angefangen hab, (ist aufgrund "fehlender" GUI deutlich weniger Code) hab ich mit dem Durchwälzen der ConnectionHandler auch gleich das Protokoll überarbeitet.
    Noch ist das Ganze "klein" genug das ich während der Arbeit alle Bereiche im Kopf hab und dadurch on the fly Änderungen im Protokoll machen kann ohne lang überlegen zu müssen was ich jetzt eigentlich für Daten schicke oder brauche. Mal sehen wie langs noch so bleibt oder wie oft ich das Protokoll noch anpassen muss (inzwischen geht das zumindest sehr einfach).
     
    Der Server ist auf alle Fälle mal durchgeackert. Da es noch keine Unittests gibt (ja ich weiss, die sollte man am Anfang schreiben, aber mein Prof. schaut ja gsd nicht zu ;), weiss ich leider erst ob er tut was er soll, wenn ich den ConnectionHandler des Clients durch hab und den in einen kleinen "ClientDummy" integriere. Sprich eine Art Testapp die Verbindungstechnisch einen Client simuliert, aber einfach die Daten direkt ausgibt. Da sieht man dann gleich ob die Verbindung funkt ohne das einen Bugs in GUI und Datenverarbeitung dazwischenfunken.
     
    Also wieder ran an den Speck, ich hoff ja schon das ich bis Wochenende den ersten Screenshot hier reinstellen kann, aber mal sehen...
     
    so long
    mythos
     
    btw. falls hier wirklich interessierte Coder mitlesen: Einfach melden ich kann auch gern tiefer ins Detail gehen (soweit ichs halt weiß ;)
  22. Mythos
    Legen wir gleich mal mit ein paar technischen Details los.
     
    Usprünglich lief die Exchange in der Datenbank am TradeScout Server. Da das Um und Auf einer aktiven Börse aber eine Vielzahl an Usern ist, und TradeScout sicher nicht so schnell wächst, hab ich mich entschieden die Exchange rauszulösen und unabhängig zu machen. Sprich die neue Exchange wird auf einem eigenen Server laufen und unterschiedliche Foren können sich als "Partner" anmelden wodurch der Einstieg in die Börse direkt über die Plattform läuft. Damit teilen sich dann viele User aus unterschiedlichen Communitys einen Börsenplatz. Ein bissl wie an der realen Börse mit den Brokern.
     
    Eine weitere Neuerung ist das ich das Clearing wieder aus der DB herauslösen werde. Ok dazu muss ich ein bissl ausholen. Ganz ursprünglich wurde das Clearing (also der Versuch 2 Orders zu matchen) in einem externen C++ Prog erledigt das sich regelmäßig die neuen Orders aus der DB holte und abarbeitete. Aus vermeintlichen Performance und Timinggründen hab ich das ganze dann jedoch in die DB per procedures und functions verlagert und eine Order wurde nicht mehr in eine Tabelle eingefügt, sondern es wurde eine "newOrder" Procedure aufgerufen wodurch die Order sofort abgearbeitet wurde. Hat aber den Nachteil, das große Orders die DB belasten, denn beim Clearing sind zwar auch einige DB Aufrufe beteiligt, aber es gibt auch viel DB-unabhängige Berechnungen. Deshalb inzwischen das Umdenken. Um das Timing zu lösen (derzeit muss die Clearing alle paar millisekunden auf neue Orders checken) wird der Exchange Server in Zukunft neue Orders nicht in die DB einfügen sondern direkt ans Clearing senden wodurch auch das Problem gelöst wäre. Bedeutet nur eine weitere Client/Server Verbindung, diesmal zwar einfacher aber ich mach erstmal die aktuelle Geschichte fertig. Man soll ja immer noch Möglichkeiten zur Verbesserung haben ;)
    Einzige Frage derzeit ist noch ob das Clearing besser Java oder C++ basiert ist. Speedtechnisch auf jeden fall C++, wobei hier vermutlich nicht so ein großer Unterschied ist. Aus programmiertechnischer Sicht ist es sicher einfacher alles auf der gleichen Sprache zu haben, vor allem in Hinblick auf die Erweiterung weil ich (noch) keine Ahnung hab wie man Server in C++ implementiert.
    Wenn ich die zeit finde werd ichs in beiden schreiben und den Speed testen. Tendiere derzeit aber deutlich mehr zu java.
     
    Noch ein kurzes Wort zum Applet: Es basiert auf Swing, im Applet selbst wird es die AccountInfo und den aktuellen Ticker geben. Per Menü wird man dann zu jedem Symbol Chart und Level2 Fenster öffnen können bzw. ein Fenster mit der Übersicht über die eigenen Orders.
     
    so weit fürs erste, damit seid ihr Überblickstechnisch glaub ich auf dem aktuellen Stand.
     
    mythos
×
×
  • Create New...