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 wird wiedermal Zeit für einen Zwischenbericht. Derzeit gehts leider etwas mühsam voran um nicht zu sagen gar nicht.
     
    Was sich bereits abzeichnet: Je höher der TF desto besser die Trefferquote. Zumindest die Trefferquote die mir angezeigt wird.
    Nach ein paar 100000 Generationen ist das beste gefundene Pattern in M15 bei 35%, M30 bei 40%, H1 61%, H4 77% und D1 auf unglaublichen 90%.
     
    Ich hab ein bissl die Befürchtung das diese hohen Trefferquoten in größeren TFs auch darauf beruhen das hier schnellmal in einem Bar eine Bewegung passiert. Sprich Breakout etc. Aber die genaue Analyse steht hier leider noch aus.
     
    Als nächstes wird jetzt mal getestet wie sich die gut klingenden Patterns in einem Handelssystem schlagen. Wenn die 90% mit halbwegsem CRV umsetzbar sind ist alles in Ordnung.
     
    Die Hoffnung lebt ;)
  2. Mythos
    Da bin ich wieder. Wie zu erwarten war geht nach Behebung (hoffentlich) aller Denk- und Implementierungsfehler die Trefferquote nicht mehr entsprechend nach oben. Also heißt es die Logiken überarbeiten.
     
    Einerseits hab ich eine Sinnhaftigkeitsfilterung eingebaut. Damit es nicht passieren kann das zb eine Regel den gleichen Wert mit sich selbst vergleichen will etc. Andererseits überlege ich grade ob der Matchingalgo wirklich so sinnvoll ist.
     
    Es gibt derzeit Regeln die aus mehreren Teilkriterien bestehen und ein Pattern besteht aus mehreren Regeln. Wie sollte man diese am besten kombinieren?
    Methoden die mir derzeit einfallen (und halbwegs sinn machen):
     
    Mittelwert: Jedes Kriterium erhält ja einen Wert zwischen 0 und 100 wie gut es erfüllt ist. Der gemeinsame Wert ist der Mittelwert der Einzelwerte.
    Das würde bedeuten das ein einzelnes nicht matchendes Kriterium überstimmt werden kann (9*100 + 0)/10 = 90%. Aber von der Logik her matched ein Pattern nur wenn alle Regeln erfüllt sind oder?
     
    Multiplikation: Die prozentuellen Matches werden multipliziert. Damit sorgt ein einziges nichterfülltes für ein komplettes 0%. Aber gleichzeitig kann das Ergebniss auch schnell schlechter als das schlechteste Einzelmatching sein (0.9*0.9= 0.81). Bin mir grad nit sicher ob das so gut ist oder nicht
     
    Minimum: Man nimmt einfach das Minimum der Einzelwerte. Damit ignoriert man natürlich alle anderen Ergebnisse, was jetzt aber nicht schlecht sein muss.
     
    Ich glaub ich werds jetzt mal einstellbar implementieren und ein bissl damit experimentieren.
     
    Allgemein seh ich gerade ein bissl ein Problem darin, wie der Algo "intelligent" lernen kann. Das mutieren und vermischen von Patterns klingt in der Theorie gut, aber ist es mehr als "raten"?
    Möglicherweise bau ich noch was ein das jede Regel sich merkt wie oft sie gematcht hat und dementsprechend bei der Auswahl behandelt wird. zB Regeln die selten/nie matchen, werden wahrscheinlicher nicht übernommen.
     
    schau ma mal...
  3. Mythos
    Eigentlich wollte ich gerade mit der Implementierung anfangen, da hab ich gemerkt das ich das Bewertungssystem noch gar nicht beschrieben habe.
     
    Im letzten Eintrag hab ich gerade noch beschrieben wann ein Chartpattern auf den aktuellen Kursverlauf matcht. Aber für die Evolution dürfen sich ja nur die "erfolgreichsten" fortpflanzen. Also folgender Plan für die "natürliche Auslese" :
     
    Jede Generation wird natürlich neu bewertet, es bringt also nix wenn die Eltern erfolgreich waren.
    Jedes Pattern einer Generation wird auf X (vermutlich 5000) Bars getestet, wenn es matcht und das Target erfüllt bekommt es Bewertung +1. Gleichzeitig wird mitgezählt wie oft es gematcht hat.
    Die Gesamtbewertung berechnet sich dann folgend:
     
    Ist die Anzahl der matches > X/10:
    Gesamtbewertung = Bewertung/Anzahl.
    Ist die Anzahl
    Gesamtbewertung= Bewertung/Anzahl* (Anzahl/(X/10)) = 10*Bewertung/X
     
    Sprich wenn es weniger als in 10% der Fälle matcht, wird die relative Bewertung linear reduziert bis 0.
     
    So, jetzt kann die Implementierung aber endgültig starten.
  4. Mythos
    Wird Zeit für ein neues Update:
     
    Auf meinem Rechner läuft jetzt seit ca. 1 Woche ständig irgendein Trainingsdurchlauf. MT nutzt zwar leider nur 1 Kern (ja man könnte es mit mehreren Installationen parallelisieren) aber da ich ja eigentlich selber beim "lernen" bzw. Erfahrung sammeln bin, und unter der Woche nicht gerade viel freie Zeit hab, passt das ganz gut.
     
    Wie gehe ich derzeit vor
    Ich habe einerseits eine mqh, die mir die Vorbereitung der Inputs (Erstellung des Inputvektors inkl. Normierung) und die gewünschten Outputs erzeugt, sowieso ein paar weitere Kapselungen für den Einsatz in einem EA liefert. zB getSignalFromNN() oder updateNN().
    Sprich diese mqh enthält die Erweiterung des "allgemeinen NN" auf das "projektspezifische NN". Auch mit einer Funktion trainNN(int offsetBars, int barsInTraining), getCurrentNNError(int offsetBars, int barsInTest) etc.
     
    Was es derzeit "lernt"
    Zuerst habe ich die Outputs so gewählt das ein "positiver Move" vorhanden war wenn der Kurs mindestens x rauf und maximal y runter gegangen ist.
    Das ganze gleich mal mit einem 5 schichtigen Netz trainiert auf 1000 Bars. Nunja, das Netz/der Backprop ist so "intelligent" das er einfach den Input ignoriert und immer das rät was am häufigsten vorkommt (rauf/runter oder seitwärts). Also nicht wirklich brauchbar.
     
    Dann hab ich versucht die Kategorien aufzuweichen und rein auf die Differenz Close-Open des nächsten Bars zu gehen. Also "positiver Move" wenn Close-Open > x.
    Bei mehrschichtigem Netz der gleiche "Erfolg".
     
    Dann hab ich das Netz mal deutlich zurückgefahren und trainiere mal mit nur 1 inneren Schicht. Hier werden die Inputs zumindest nicht mehr ignoriert. Bei 1000 Trainingsbars lernt er jedoch scheinbar recht bald die Trainingsdaten auswendig, denn der Trainingserror geht runter (gestoppt bei 30% Fehler) wobei der Testfehler bei 60% blieb... möglicherweise wird der Testfehler mit der Zeit besser.
     
    Derzeit läuft jetzt ein Training auf 5000 Bars, mal sehen ob er da weniger auswendig lernt.
     
    Mögliche Gründe
    Warum er mit mehr als 1 inneren Schicht die Inputs ignoriert ist mir nicht ganz klar. Hier werd ich noch mehrere Test machen müssen.
    Warum er jedoch nicht so gut lernt bzw. wenn dann auswendig lernt könnte aus meiner Sicht folgenden Grund haben:
    Ich gebe ihm alle Bars und "hoffe" das er von alleine eine Struktur dahinter erkennt und diese lernt. Das ist natürlich etwas optimistisch. Es gänge vermutlich deutlich besser wenn man das NN zB auf ein konkretes Pattern trainieren lässt und ihm zum lernen eine Reihe klassischer Beispiele dieses Patterns gibt. Hiefür muss man aber zuerst ein Pattern finden das wirklich Aussagekraft hat.
    Das finden solcher Patterns ist aber bereits Thema des Evolution-Teil dieses Projektes, weswegen ich hier nicht auf diese Taktik wechseln werde, sondern weiter versuche eine Möglichkeit zu finden das NN auf den rohen Daten zu lernen.
     
    UPDATE
    Habe jetzt ein Netz mit 2 inneren Schichten "antrainiert". Mit 30 Bars als Input macht es ein schönes Overfitting: 2% Fehler am Training, 72% am Test.
    Die 500Bars Back auf 5000 Bars trainiert tümpeln noch immer bei 60% training und test error herum.
  5. Mythos
    Dann starten wir mal mit ein bisschen Theorie. Heute: Neuronale Netze.
    Wer sich "ernsthaft" mit dem Thema auseinandersetzen will, findet im Netz jede Menge "serious shit" zum Thema. Ich will hier eher einen (weiteren) kurzen Streifzug zu dem Thema geben, damit der geneigte Leser im weiteren Verlauf die Grundmechanismen versteht die ich zu verwenden gedenke.
     
    Was ist ein Neuronales Netz
    Prinzipiell ist ein NN nichts anderes als die Approximation einer (beliebig komplexen) Funktion. Also eine Black-Box mit einer fixen Menge an Eingabeparametern und einer fixen Menge an Ausgaben. Man versucht also eine Funktion zu "schätzen" deren wahre Logik man nicht kennt, von der man aber eine gewisse Menge an Beispielwerten (Eingabeparameter mit dazugehörigen Ausgaben) hat.
     
    Aber warum heißt es dann "neuronales Netz"?
    Ein NN ist eine Menge von Knoten (genannt "Neuronen") die miteinander in einer Netzartigen Struktur verbunden sind. Jede Verbindung kann man sich wie eine Datenübertragungsleitung vorstellen über die jeweils eine Zahl übertragen wird.
    Ein Neuron hat eine beliebige Anzahl an Eingangsverbindungen (über die jeweils eine Zahl an das Neuron geschickt wird). Aus all diesen Zahlen berechnet das Neuron eine neue Zahl (mit der sogenannten Übergangsfunktion). Diese Zahl sendet das Neuron dann über seine Ausgangsverbindungen an die nächsten Neuronen weiter.
    Damit es nicht zu kompliziert wird sind die Neuronen in Schichten (Layern) angeordnet. Die erste Schicht besteht aus den Input-Neuronen, diese erhalten ihre Werte aus den Inputparametern. Die letzte Schicht sind die Output-Neuronen, deren Ergebnisse sind die Ausgaben des NN.
     
    Feed Forward
    Um es nicht unnötig kompliziert zu machen, verwende ich ein feed forward NN. Das bedeutet einfach, das es innerhalb des Netzwerks nur Verbindungen von einer Schicht zu Neuronen in der direkt nächsten Schicht gibt. Also weder Verbindungen die "zurück zum Eingang" laufen, noch Verbindungen die Schichten überspringen.
     
     
    Die Übergangsfunktionen
    Nicht unwesentlich für die Funktion des NN sind die Übergangsfunktionen. In der Regel haben sie eine sehr einfache Form:
    Jede Eingangsverbindung erhält ein fixes Gewicht. Kommt ein neuer Satz von Eingangswerten (also 1 Zahl pro Verbindung) daher, wird der jeweilige Wert mit dem entsprechenden Gewicht multipliziert und die Ergebnisse summiert. Sprich es wird eine gewichtete Summe gebildet.
    Dieser Summenwert ist nun der Input für die Aktivierungsfunktion, deren Ergebnis auch schon der Ausgangswert des Neurons ist. Typische Beispiele für diese Aktivierungsfunktion ist zB die sogenannte HeavySide Funktion die 0 liefert solang der Wert unter einem fixen Schwellwert ist und 1 wenn er darüber ist.
    Oder die lineare Aktivierungsfunktion die einfach den Eingangswert 1:1 als Ausgang zurückgibt.
     
    Wie lernt ein NN
    Die gerade beschriebenen Gewichte sind auch schon der Schlüssel wie ein NN nun lernt. Einfach ausgedrückt so wie ein Mensch auch: Man zeigt ihm eine Reihe von Beispielhaften Inputdaten und die dazugehörigen Outputs.
    Das NN rechnet nun für diese Inputdaten aus welche Outputs es gerade liefern würde, vergleicht diese mit den gewünschten Outputs und passt alle internen Gewichte so an, das ab sofort für diese Inputs die gewünschten Outputs geliefert werden.
    (Der eigentlich Lernalgorithmus ist etwas komplizierter, aber das ist die Grundidee)
     
    Auswendig lernen
    Man kennt es vom optimieren: Overfitting. Auch beim NN gibt es dieses Problem: Man hat ein hochkomplexes NN mit massig Neuronen und Schichten und trainiert es auf wenige Testdaten (Inputs mit entsprechenden Outputs). Nun besteht das große Risiko, dass das Netz einfach diese Testdaten auswendig lernt. Somit für die Testmenge perfekte Ergebnisse liefert, aber für leicht veränderte Daten komplett daneben liegt.
    Verhindert wird es mit der gleichen Technik wie beim Trading: Out of Sample. Man teilt die Menge der vorhandenen Testdaten auf. Mit der einen Menge trainiert man das Netz, nach jeder Lerniteration (davon braucht man meist sehr viele) testet man das Netz an der zweiten Menge (lässt es aber nicht "lernen" also die Gewichte bleiben unverändert). Zu Beginn sollte der Fehler nun bei beiden Mengen sinken. Sobald der Fehler bei der zweiten Menge wieder steigt, beginnt offensichtlich das overfitten und man stoppt den Lernalgorithmus. Nun sollte das NN bestmöglich trainiert sein.
     
     
    Soweit der Überblick über neuronale Netze. Wie ich ein solches Netz jetzt im Trading anwenden will, gibts in einem nächsten Eintrag.
  6. Mythos
    Dann legen wir mal mit dem 2. Teil des Projektes los: Die Evolution der Pattern-Recognition. (Der Titel ist doch schon mal schön ;)
     
    Die Idee dahinter
    Es wird wie gesagt ein Evolutionsalgorithmus. Entwickelt (Evolutioniert klingt komisch) werden Chartpatterns die eine statistisch signifikante Prognose geben. Hierbei will ich mich gar nicht weiter einschränken was die Chartpatterns angeht. Zu Beginn werden es sicher nur simple Patterns, mit der Zeit soll aber deren Komplexität auch ausgebaut werden (soweit es MQL halt zulässt).
     
     
    Chart-Pattern Description Language
    Um überhaupt Evolution betreiben zu können, benötigt es eine Definition der "Gene". Bzw. eine Beschreibung welches Gen was bewirkt. Anders gesagt muss es gelingen "beliebige" Chart-Patterns mit einer (möglichst kleinen) Menge an Parametern eindeutig zu beschreiben. Ich nenn diese Beschreibung jetzt einfach mal Chart-Pattern Description Language (kurz CDL).
     
    Da ich sowas selber noch nie gemacht habe, kann es leicht sein das die CDL sich im Laufe der Entwicklung noch gravierend ändert, nur als Vorwarnung.
     
    Zunächst wird die CDL aus einer (beliebigen) Anzahl an Regeln bestehen. Von den Regeln wird es mehrere Typen geben. zB "Bar X hat folgende Form" oder "Wert von Bar X steht in diesem Verhältnis zu Wert von Bar Y". Über die CDL werde ich noch einen eigenen Eintrag schreiben.
     
    Die Bewertungsfunktion
    Jedes Pattern bekommt eine "Targetfunktion". Sprich es muss nicht jedes Pattern das Close des nächsten Bars vorhersagen. Auch hier wird es wieder unterschiedliche Typen geben. zB "Wenn beim nächsten Bar Preis X überstiegen wird, steigt der Preis um Y weiter", oder eben das klassische "Der nächste Close ist mind. X über dem aktuellen".
    Weiters gibt es für jede Regel in der CDL eine "Ähnlichkeitsfunktion" die entscheidet wie sehr das aktuelle Chartbild diese Regel erfüllt. Ist die gesamte Ähnlichkeit des Patterns unter dem Schwellwert, so "muss" die Aussage der Targetfunktion zutreffen.
    Bewertet wird wie oft die Targetfunktion zutrifft relativ zur Anzahl wie oft das Pattern gepasst hat.
     
    Matcht das Pattern zu selten (zB
     
    Die Evolution
    Erfolgreiche Patterns werden dann miteinander kombiniert: Sprich es wird eine Teilmenge der Regeln der beiden "Eltern" übernommen. Wenn beide Eltern eine Regel enthalten, so kommt sie "sehr wahrscheinlich" auch ins neue Pattern und die Parameter der Regel werden "kombiniert". Zusätzlich gibt es natürlich Mutationen, sprich es kommen teils zufällig neue Regel dazu. Bzw. Regeln ändern ihre Parameter teils zufällig.
     
    Die Implementierung
    Wenn sich jetzt jemand fragt wie zum Teufel ich das in MQL bauen will, da hab ich ehrlich gesagt selber noch keine Ahnung. Das Projekt schreit ja regelrecht nach Objektorientierung. Aber zumindest in der ersten Version wird sich schon ein Weg finden. Ggf. muss ich halt auf eine C++ dll ausweichen, das will ich aber so gut es geht vermeiden.
     
    als dann wiedermal thx for reading ;)
  7. Mythos
    Wie versprochen hier ein bissl was grundlegendes zu Evolutionsalgorithmen.
     
    Gleich vorweg: Ich hab keine "Ausbildung" in dem Bereich. Alles was ich hier schreibe hab ich mir selbst erarbeitet. Es kann also leicht sein das meine Definitionen und Vorgehensweisen von den "offiziellen" abweichen. Das hier ist also die "Evolutionstheorie von mythos"
     
    Evolution at its best
    Wenn man Evolutionsalgorithmen verstehen will, muss man zuerst die Evolution als solches verstehen. Jeder hat den Begriff schon gehört, aber ich bin mir nicht sicher ob jeder weiß wie die Evolution wirklich funktioniert.
     
    Evolution basiert auf 2 Grundpfeilern: Überproduktion und natürliche Auslese
    Überproduktion
    Betrachtet man rein die "Geburtenraten" in der Natur, so gäbe es ein derart massives Wachstum der Populationen, das in wenigen Generationen die Erde zu klein wäre. (Sehen wir ja mit den Menschen zurzeit). Es kommen also viel mehr Exemplare einer Spezies auf die Welt, als "nötig" wären.
     
    natürliche Auslese
    Die "Evolution" ist kein hochintelligenter Apparat, der die Gene einer Spezies analysiert und entsprechend verbessert. Wenn ein neues Exemplar der Spezies gezeugt wird, setzen sich die Gene beider Seiten nicht zusammen und diskutieren welches das bessere ist. Die Gene der beiden Eltern werden einfach "zufällig" gemischt. Manche mutieren sogar zufällig und es kommt einfach eine neue Kombination raus. Ob diese Kombination jetzt gut war entscheidet die Umgebung durch die natürlich Auslese.
    Ein Gnu das nicht laufen kann wird schnell Opfer eines Löwen -> die Gene dieses Gnu werden sich nicht weiter verbreiten.
    Wenn es nicht bei der Herde bleibt sondern alleine rumläuft wird es auch schnell gefressen -> Gene verbreiten sich nicht.
    Kann es gut laufen und bleibt in der Herde überlebt es lange genug seine Gene weiterzugeben. Dadurch kommen viel mehr Gnus mit guten Beinen und Herdenzusammenhalt auf die Welt. Die "Evolution" hat die schlechten Beine und Einzelgängertum aussortiert.
     
    Evolution in der Praxis
    Ein kleines Beispiel weil ich es so toll finde ;) (Keine Ahnung ob es 100% korrekt ist, veranschaulicht das ganze aber gut):
    Birkenfalter sind Schmetterlinge die bevorzugt auf Birken sitzen. Normalerweise sind sie weiß, weil sie dadurch auf den weißen Birken gut getarnt sind. Jetzt ist es passiert das durch äußere Umwelteinflüsse die Birken sich dunkel gefärbt haben. Innerhalb von 2 Generation waren alle Birkenfalter schwarz. Nicht weil die "Evolution" gesehen hat das schwarze Falter jetzt besser sind. Schwarze Birkenfalter sind zuvor genauso (durch die zufälligen Mutationen) auf die Welt gekommen. Sie wurden nur immer schnell gefressen weil sie keine Tarnung hatten. Mit den dunklen Birken, hat sich das umgedreht und die schwarzen Falter überleben und pflanzen sich fort, während die Weißen gefressen werden.
     
    Evolutionsalgorithmen vs. klassische Softwareentwicklung
    Jetzt muss man das Ganze nur noch auf die Software übertragen. Ein "normales" Programm unterscheidet sich aber doch deutlich von einem lebenden Organismus. Vor allem weil ein Programm für einen konkreten Zweck geschrieben wird. Optimiert für diese Umgebungsbedingungen. Es implementiert normalerweise einen konkreten Lösungsweg, der lt. Entwickler der Beste für dieses Problem ist. Hier gibt es keine Überproduktion und keine Auslese.Es gibt eine konkrete Ausprägung der Spezies und aus.
     
    Solange die Umgebung gleich bleibt, und der Entwickler zu Beginn wirklich den besten Lösungsweg kennt ist das Programm auch optimal. Da wäre Evolution fehl am Platz. Wer will schon einen Taschenrechner der immer wieder mal ein anderes Ergebnis liefert und schaut obs jetzt näher an der Lösung ist.
     
    Hat man aber ein Problem mit veränderlicher Umgebung, und dessen Lösung nicht so leicht analysierbar ist, dann ist das Prinzip der Evolution sehr hilfreich. Bleibt die Frage wie ein Evolutionsalgorithmus funktioniert.
     
    Der generische Evolutionsalgorithmus
    Wir brauchen als erstes einmal Gene, die man verbessern kann. Also Parameter für unseren Algorithmus. Das müssen aber nicht nur Parameter im Sinn von Zahlen sein. Hier können/sollen auch ganze Teile der Logik als Parameter vorkommen. Es kann also sein das es nicht nur den Parameter "Stärke der Beine" gibt sondern auch einen "Habe ich Beine?". Bzw. Tradingrelevanter: "SL Entfernung" oder "Gibt es überhaupt einen SL?". Oder "Welche Einstiegslogik wird verwendet?".
     
    Dann braucht es die natürliche Auslese. Oder technischer ausgedrückt: Wir benötigen eine Bewertungsmöglichkeit der einzelnen Genkombinationen. In der Natur erhält ein Tier eine "hohe Bewertung" wenn es lange überlebt. In der Softwareentwicklung gibt es eben eine hohe Bewertung je besser der resultierende Algorithmus das Problem löst.
     
    Kommen wir zur Überproduktion: Jene Genkombinationen, welche die besten Bewertungen haben, werden miteinander "gekreuzt" und teils mutiert. Diese Kreuzung und Mutation muss dermaßen ablaufen das wieder ein lauffähiger Algorithmus entsteht (zumindest meistens, Fehlgeburten gibt es in der Natur auch häufig). Je besser die Bewertung einer Kombination, desto öfter wird sie weitergegeben.
     
    Die neue Generation wird nun erneut bewertet und die besten Genkombinationen dürfen sich wieder fortpflanzen, die schlechten werden aussortiert.
     
    Und fertig ist der Evolutionsalgorithmus. Sofern alles passt hat man nach ein paar (hundert/tausend/keineAhnung) Generationen einen Satz von Algorithmen, die das Problem gut lösen. Das gute daran: es ist keine Blackbox. Man schaut sich die Genkombination an und weiß was der Algo tut. In der laufenden Praxis kann man damit dann natürlich Algorithmus ständig an geänderte Umgebungsbedingungen anpassen. Es gibt einfach regelmäßig Fortpflanzungen und die Algos werden laufend bewertet. Schlechte Algos sterben aus, gute dürfen sich fortpflanzen... ein ewiger Kreislauf.
     
    Im Gegensatz zur klassischen Entwicklung hat man damit zwar immer einen kleinen Teil von Algos die nicht optimal laufen, aber dafür ist man flexibel und das System (Softwaretechnisch) findet selbstständig funktionierende Algos und passt sich somit automatisch an eine veränderte Umgebung an.
     
    Soweit die Theorie. Zur Anwendung im konkreten Projekt kommen wir im nächsten Eintrag.
     
    thx for reading.
  8. Mythos
    Kommen wir zum letzten Teil der NN-Lib Implementierung: Der Lernalgorithmus.
     
     
    Wie gesagt habe ich mich für den Backprop entschieden, einfach weil ich ihn kenne und verstehe ;)
     
    Die implementierung ist derzeit noch nicht performance optimiert, aber das kann man später auch noch machen.
    Vom Ablauf her siehts so aus:
    Bereche den Output des NN wie übliche und speichere dabei für jede Schicht die Inputliste (also die Outputs der Schicht davor)
     
    Berechne die deltas für die Output-schicht und pass die Gewichte an
     
    Propagiere zurück durch alle Schichten des NN, berechne die Deltas (mithilfe der Deltas der bereits berechneten Schicht) und pass die Gewichte an.

    In code sieht das Ganze so aus:




    void NNdoBackProp(double input[],double wantedOutput[]) { if(!initialized) return; int numberLayers= ArraySize(neuronsOnLayer); if(ArraySize(input) < neuronsOnLayer[0]) return; //perform layers, each neuron per layer, calc result and save inputs per layer double tempresults[]; double tempInputs[]; //saved inputs per layer: double innerInputs[]; ArrayResize(innerInputs,cumInnerNeuronsTillLayer[numberLayers-1]+neuronsOnLayer[0]); ArrayResize(tempInputs,ArraySize(input)); ArrayCopy(tempInputs,input,0,0,WHOLE_ARRAY); ArrayCopy(innerInputs,input,0,0,WHOLE_ARRAY); int layer,neuron,source_neuron; //--- // 1. for(layer= 1;layer < numberLayers;layer++) { ArrayResize(tempresults,neuronsOnLayer[layer]); for(neuron= 0; neuron < neuronsOnLayer[layer];neuron++) { tempresults[neuron]= calculateOutput(layer, neuron,tempInputs); } //results are inputs of next layer ArrayResize(tempInputs,ArraySize(tempresults)); if(layer != numberLayers - 1) ArrayCopy(innerInputs,tempresults,cumInnerNeuronsTillLayer[layer]+neuronsOnLayer[0],0,WHOLE_ARRAY); ArrayCopy(tempInputs,tempresults,0,0,WHOLE_ARRAY); } //--- // 2. double newDeltas[]; double deltas[]; double delta_w; ArrayResize(deltas,neuronsOnLayer[numberLayers-1]); ArrayResize(tempInputs,neuronsOnLayer[numberLayers-2]); ArrayCopy(tempInputs,innerInputs,0,cumInnerNeuronsTillLayer[numberLayers-2]+neuronsOnLayer[0],neuronsOnLayer [numberLayers-2]); // do backprop on final for(neuron= 0;neuron < neuronsOnLayer[numberLayers-1];neuron++) { //tempresults is last output deltas[neuron]= calcOutputDash(numberLayers-1,neuron,tempInputs)*(wantedOutput[neuron] - tempresults[neuron]); for(source_neuron= 0;source_neuron < neuronsOnLayer[numberLayers-2];source_neuron++) { delta_w= randomDeltaW(learningRate*deltas[neuron]*tempInputs[source_neuron]); setWeightAt(numberLayers-2,source_neuron,neuron,weightAt(numberLayers-2,source_neuron,neuron)+delta_w); } delta_w= randomDeltaW(learningRate*deltas[neuron]); setBiasAt(numberLayers-2,neuron,biasAt(numberLayers-2,neuron)+delta_w); } //---- // 3. //remaining double deltaSum= 0; for(layer= numberLayers-2;layer > 0;layer--) { ArrayResize(newDeltas,neuronsOnLayer[layer]); ArrayResize(tempInputs,neuronsOnLayer[layer-1]); ArrayCopy(tempInputs,innerInputs,0,cumInnerNeuronsTillLayer[layer-1]+neuronsOnLayer[0],neuronsOnLayer[layer-1]); //delta= phi-dash*Sum(deltak*weight_jk) for(neuron= 0;neuron < neuronsOnLayer[layer];neuron++) { deltaSum= 0; for(int dest_neuron= 0;dest_neuron < neuronsOnLayer[layer-1];dest_neuron++) { deltaSum += deltas[dest_neuron]*weightAt(layer-1,neuron,dest_neuron); } newDeltas[neuron]= calcOutputDash(layer,neuron,tempInputs)*deltaSum; for(source_neuron= 0;source_neuron < neuronsOnLayer[layer-1];source_neuron++) { delta_w= randomDeltaW(learningRate*newDeltas[neuron]*tempInputs[source_neuron]); setWeightAt(layer-1,source_neuron,neuron,weightAt(layer-1,source_neuron,neuron)+delta_w); } delta_w= randomDeltaW(learningRate*newDeltas[neuron]); setBiasAt(layer-1,neuron,biasAt(layer-1,neuron)+delta_w); } ArrayResize(deltas,neuronsOnLayer[layer]); ArrayCopy(deltas,newDeltas,0,0,WHOLE_ARRAY); } }

     
    Wie man sieht ist es gar nicht so wenig was berechnet werden muss, trotzdem läuft es zumindest für kleinere Netze (unerwartet) schnell.
     
    Ein wichtiger Punkt beim Backprop ist die Ableitung der Aktivierungsfunktion. Für Linear und Sigmoid ist sie wenigstens definiert, die Heavy Side ist leider formal gar nicht differenzierbar, aber die Ableitung gibt in diesem Fall sowieso nur die Richtung der Änderung vor. Daher hab ich sie für die HeavySide auf 1 gesetzt (so wie bei der Linearen). Das ist zwar nicht 100% korrekt, aber die Richtung stimmt.
     
    Bei ersten Versuchen hab ich dann auch gemerkt wie wichtig zufällige Startgewichte und eine kleine Lernrate sind. Bei zu hoher Lernrate ( 0.5 zB) sind die Gewichte gegen unendlich explodiert. Bei fixen Startgewichten von 0.1 hat das Netz für einen Input und Output zwar wunderbar gelernt, jedoch unabhängig vom Input. Als ich dann 2 unterschiedliche Inputs mit unterschiedlichen Outputs trainiert habe, war der Output plötzlich immer im Mittelwert zwischen den beiden gewünschten, und der Input wurde brav ignoriert. Mit zufälligen Startgewichten scheint er hier also stärker den Einfluss des Inputs zu merken und entsprechend zu reagieren.
     
    Ich werde die Lib jetzt dann auch ins Downloadmodul stellen. Sie ist wie gesagt noch nicht perfekt aber vielleicht hilfts trotzdem dem einen oder anderen. Wer es sich antun will kann auf jeden Fall mal ein NN "von innen" sehen ;)
     
    http://www.tom-next....uralnetworkmq4/
  9. Mythos
    Kommen wir zum schwierigen Teil: Die Implementierung.
     
    Für das ganze restliche rundherum hab ich das EA Kitchen Framework genommen. Den aktuellen Source gibts dann immer im dazugehörigen Thread.
     
    Die konkrete Implementierung der NN Logik wird in eine Lib ausgelagert. Ich hatte zwar schon mal so eine geschrieben, aber keine Ahnung mehr wo die is. Also nochmal.
     
    Das ganze wird jetzt sicher ein bissl hardcore programmiertechnisch, also wems nur ums prinzip geht: besser wegschaun ;)
     
    Softwarestruktur
    Die Lib wird so aufgebaut das sie genau 1 NN repräsentiert. Sprich es gibt globale variablen in der Lib die Status und Konfiguration speichern, und dann Funktionen für die entsprechenden Zugriffe.
    Gespeichert werden muss:
    Anzahl der Schichten -> integer bzw. direkt über größe des layers array
    Anzahl der Neuronen pro Schicht -> int-array: layers
    Definition der Übergangsfunktion pro Neuron -> zweidimensionales array (anzahl schichten x knoten pro schicht)
    Gewichte pro Verbindung -> wird wohl ein dreidimensionales double array. Ebene 1: layer, ebene 2: neuron am layer Ebene 3: neuron auf nächstem Layer

    Nötige Zugriffsfunktionen:
    Erzeuge NN. Parameter: ,, ,
    Berechne NN. ,
    Lade Parameter von File:
    Speichere in File:
    Autosave (nimmt filename aus dem geladen wurde
    Trainiere 1 Schritt: ,

    Als Lernalgorithmus werd ich den backpropagation verwenden, einfach weil ich ihn kenne ;)
     
    Sprich die Lib wird ein komplett allgemeines NN, das man ggf. auch für ganz andere Varianten verwenden kann. Alle Projektspezifischen Einstellungen werd ich in eine mqh packen die die NN-Lib dann verwendet.
     
    Dann geh ich mal an die Implementation der Lib. Mal sehen wie lang es dauert ;)
  10. Mythos
    Hi zusammen,
     
    da ich scheinbar zuviel freie Zeit habe (obwohl eigentlich nicht) oder weil mir meine anderen Projekte zu langweilig werden (das wohl eher), hat sich letztens irgendwo über Stuttgart eine Idee festgesetzt:
    Ich werd nach längerer Abstinenz wieder mal ein Handelssystem schreiben. (Ja ich weiß, das is eigentlich keinen Blog wert, wartet ab ;)
    Da es wie alle wissen auch passieren kann das ich keinen Gral entwickle und nicht reich werde (ich geh natürlich davon aus das ich heute in einem Jahr den Porschekatalog durchblättere ;) soll das Projekt auch in diesem (äußerst unwahrscheinlichen) Fall etwas bringen. Deswegen werde ich versuchen jeden Schritt zu erläutern damit ganz im Sinn von public learning alle was davon haben. Falls ich reich werde dürft ihr euch gern daran erfreuen, wenn nicht haben zumindest ein paar Mitleser was davon (hoffentlich).
     
    Also zur Grundidee: Genaugenommen werden es 2 Systeme werden. Eines wird auf "klassischer KI" (konkret Neuronale Netze) beruhen, das andere auf Statistik gewürzt mit Evolutionsalgorithmen (keine Angst Details dazu kommen später mehr). Hier denke ich wird das public learning auch "interessant", denn die meisten Systeme und Diskussionen befassen sich mit der "normalen" technischen Analyse. Also Indikatoren etc. intelligent kombiniert. Ich werde hier einen anderen Weg gehen und dabei versuchen auch die grundlegenden Ideen zu erklären. Ziel ist es auch diese beiden Ansätze zu vergleichen was ihre Anwendung im vollautomatischen Handel angeht.
     
    Normalerweise behandelt man KI etc. mit Geschossen wie MatLab oder so. Da ich (und die vermutlich die meisten Leser) leider keinen Zugang zu solchen Geschossen habe, werde ich versuchen alles rein in MT4 zu bauen. Performancetechnisch ist das nicht optimal, aber wenn dann mal die Struktur des Grals steht werd ich ggf. auf dlls etc. ausweichen.
     
    Damit nicht zu große Erwartungen geweckt werden, für alle die mich nicht kennen: Ich hab mathematische Computerwissenschaften studiert und mich während dem Studium u.a. mit künstlicher Intelligenz beschäftigt. Hab was das angeht also ein bissl Background. Evolutionsalgorithmen gab es damals leider noch fast keine, von daher ist mein Background da nicht unbedingt universitär, aber ehrlich gesagt ist vieles in der KI-Forschung mit etwas Grundwissen und Hausverstand selbst erforschbar. Schließlich gehts um die Natur die uns umgibt und keine Quantenverschränkungen oder so ;)
     
    Achja: Ursprünglich wollt ich 2 threads draus machen, aber da es vermutlich sowieso eher ein monolog wird, und man beim Blog irgendwie eine bessere Struktur reinbringen kann, is es ein Blog geworden. Falls sich die Notwendigkeit einer Diskussion ergibt, wirds einen entsprechenden Thread im Forum geben. Über Kommentare/Hinweise/Anregungen freu ich mich natürlich immer. Wenn jemand sachdienliche Hinweise für den Gral gibt, wird er natürlich am resultierenden Gewinn beteiligt ;)
     
    Alsdann rein ins Geschehen, viel Spass und gute Reise ;)
  11. Mythos
    Kommen wir zum ersten spannenden Teil: Das Design des NN. Ob das NN die gewünschte Funktion richtig erlernt, hängt einerseits natürlich von der Funktion selbst ab. Aber zu einem großen Teil auch von der gewählten Form des Netzes und den Inputdaten.
     
    Ich habe vor für das Experiment verschiedene Ausprägungen eines Typs von NN zu testen. Grundsätzlich wird es wie gesagt ein mehrschichtiges feedforward NN. Die Anzahl der Schichten und Anzahl der Neuronen auf den Schichten werde ich variabel gestalten und im Laufe der Tests dann schaun welche Kombination am besten funktioniert.
     
    Die Funktion als solches wird ein "simpler" Klassifikator (darin sind NNs besonders gut). Sprich +1 wenn der nächste Bar min X Einheiten nach oben geht und nicht mehr als Y Einheiten fällt, -1 bei entsprechender Konstellation für Short und 0 sonst.
    Sicherheitshalber werde ich es auch mit 3 Outputneuronen (einen für Long, einen für Short, einen für Flat) testen um zu sehen wie hier die Unterschiede sind.
     
    Kurzer Exkurs zu NN als Klassifikator
    Will man ein NN nutzen um Inputs (zB Bilder) in gewisse Kategorien zu trennen, geht man meist so vor:
    Das NN hat gleich viele Outputneuronen wie es Kategorien gibt. Beim Trainieren setzt man dann den Output der korrekten Kategorie auf 1 und alle anderen auf 0. Ein neuer Input wird dann jener Kategorie zugeordnet deren zugehöriges Outputneuron den höchsten Wert hat.
     
     
    Weiter im Text:
    Also ein Klassifikator mit 3 Kategorien (entweder über 1 oder 3 Outputneuronen realisiert). nächste große Frage:
     
     
    Was wird klassifiziert/ Was sind die Inputs
    Einerseits werden natürlich die Daten der letzten X Bars (O/H/L/C + Volume) als Input dienen. Zusätzlich werd ich aber auch "jede Menge" halbwegs sinnvolle Vorverarbeitungen (Indikatoren) in das NN schmeißen und schaun was passiert.
     
    Aber: Mit genug Schichten kann sich das NN zwar aus den Inputs beliebige gewichtete Kombination bauen. die 2. Schicht kann also schon inputs der Form (C-O) oder (H-C) etc. kriegen. Aber es gibt (zumindest mit den Übergangsfunktionen die ich nehmen werd) keine Relationen zwischen den Inputs. Also (C-O)/ATR muss ich selber als Input definieren.
    Bei Inputs sollte man grundsätzlich sowieso immer darauf achten das alle auf ein einheitliches Maß "normiert" werden (meist zw. -1 und +1). Da in einem Chart ja stärker die relative Bewegung als die absoluten Zahlen zählen, werd ich die Bars auch entsprechend vorverarbeiten:
    Open_NN wird (Open- Close[1])/M wobei M wiederum per Parameter entschieden wird, entweder das Open des Bars (prozentuale Veränderung) oder ATR(13) (relative Bewegung)
    High_NN = (High - Open)/M
    Low_NN = (Open-Low)/M
    Close_NN= (Close-Open)/M
     
    Welche Indis noch dazukommen weiß ich noch nicht genau, aber auf jeden Fall: RSI, (Diff zw. zwei SMA)/M...
     
    Die Übergangsfunktionen
    Da ich noch keine Ahnung habe welche Übergangsfunktionen für diese Anwendung gut funktionieren, wirds auch hier im Sinne eines Forschungsprojekts zuerst einen Fundus geben. Nur das hier jedes NN gleich mit allen ausgestattet sind. Nach dem lernen werd ich mir die Gewichte anschauen, falls die Ausgangsgewichte eines Neurons alle nahe 0 sind, ist das Neuron für die Klassifikation offensichtlich umsonst. Dann kann ich es weglassen.
    Im ersten Schritt wird es also auf jedem Layer 3* an Neuronen geben. jeweils 1 lineare Übergangsfunktion, 1 Heavyside und eine sigmoide.
     
    Wie man merkt gibt es noch viele "Unbekannte" die im Laufe des Experiments gelöst werden sollen. Aber dafür ist so ein Projekt ja da ;)
  12. Mythos
    Es werden also 2 Systeme werden. Da damit aber 2 Techniken verglichen werden sollen, haben beide Systeme die gleiche Basis und damit fangen wir mal an.
     
    Für die erfahreneren Handelssystementwickler: Ich will hier mal wirklich von ganz ganz unten anfangen, an dem Punkt der normalerweise unbeachtet bleibt weil er "selbstverständlich" passiert. Aber manchmal ist es gut sich klar zu machen worauf alles aufbaut. Also nicht wundern und ggf. einfach Einträge überspringen ;)
     
    Die Grundannahmen
    Jedes Handelssystem beruht auf (einer oder mehr) Grundannahmen. Ich meine da so Grundannahmen wie "Es gibt Trends an der Börse, und diese können vollautomatisch erkannt und gehandelt werden"...
    Egal wie die Grundannahme aussieht, sie ist in Stein gemeißelt. Auf dieser Annahme basiert das gesamte System.
     
    In meinem Fall sieht die Grundannahme so aus:
    Der Markt ist auf "längere" Sicht nicht (vollautomatisch) vorraussagbar. Vollautomatische Systeme können demnach nur in sehr kleinen Timeframes mit schnellen Positionen funktionieren.
    Im Preis (inkl. Volume und ggf. Level X ) sind alle nötigen Informationen für ein erfolgreiches System enthalten.
    Es gibt Muster und Konstellationen in den vorhandenen Daten, auf die der Markt "meist" ähnlich reagiert.

     
    Hat man diese Grundannahme für sich getroffen, kann man sich überlegen wie man darauf basierend ein erfolgreiches System schreibt. Meist ist die Grundrichtung hier offensichtlich. In meinem Fall wird es die Erkennung und Verwertung der Muster sein. Außerdem gibt die Grundannahme vor das es in sehr kleinen Timeframes passieren muss.
     
    Wie gesagt werde ich mich also nicht direkt mit Indikatoren etc. beschäftigen sondern versuchen auf die pure PriceAction zurückzugreifen. Da man natürlich zur Mustererkennung die Preise "vorbereiten" muss, werd ich hier teils sicher auf Indikatoren zurückgreifen, aber die Grundidee sind Muster in der Preisaction.
     
    Der nächste Schritt ist jetzt die erste Rohfassung für die Systemlogik. Noch bevor die erste Zeile Code geschrieben wird, sollte man eine grobe Vorstellung haben, auf welchen Eckpfeilern das System stehen wird.
     
    Dazu mehr im nächsten Eintrag.
  13. Mythos
    Finally!
     
    Nun ging es doch etwas schneller als gedacht. Durch den Aufwärtstrend der letzten Tage, kam Kiwee wieder in eine sehr illiquide Zone zwischen 70 und 100, die mir mit einem Schlag die Balance über die 1000000 Marke katapultiert hat.
    Zugegeben, dieser letzte Kick war Glück, aber vor allem die Anfänge haben deutlich gezeigt das alles möglich ist. Ohne solche Gelegenheiten dauert es halt dementsprechend länger.
     
    Also abschließende Balance: 1104620,41. Das Ziel eine Million zu ertraden ist damit deutlich erreicht und ich erkläre das Experiment für erfolgreich .
     
    Ich bedanke mich bei allen die interessiert dabei waren und auch für die netten Gespräche in der Shoutbox.
     
    lg
    der TEFEx-Millionär (jetzt wirklich ;)
  14. Mythos
    Finally!
     

    Der DAX is aus, es lebe die TEFEx


     
    Soeben wurde eine eigene Forenkategorie zur Technical Exotic Fruits Exchange public geschalten. Diese dient als Supportforum für alle Tom-Nextler unter den TEFEx-Tradern. Dort findet ihr sowohl jede Menge Infos zur TEFEx, als auch die entsprechenden personalisierten Links zur Registrierung und Login.
     
    Freue mich schon auf schöne Tradingsetups bei Kiwee.
     
    lg mythos
  15. Mythos
    soda, es ging doch schneller als erwartet. Heute hab ich die in Summe über 4 Stunden in Zug und Bus genutzt um ein bissl weiter zu schrauben.
     
    Soweit ich nix vergessen habe, sollten jetzt alle Userspezifischen Einstellmöglichkeiten/Datenänderung auf der "Profilseite" zusammengefasst sein.
     
    Als kleines Gimmick sieht man jetzt auf der Highscorepage an welcher Position man im Gesamten steht, auch wenn man sich nicht in der Liste anzeigen lässt. Die aktuelle Highscorelistenpositionen wird auch live im Shoutboxheader (also direkt unter dem Applet) angezeigt.
     
    Geht natürlich alles nur wenn man eingeloggt ist, neben dem üblichen TEFEx-Login direkt bei der Exchange gibts jetzt auch noch eine eigene Loginpage auf der TEFEx-Seite.
     
    Im Moment schwanke ich ein bissl ob noch mehr Userdaten/Profile sinnvoll sind oder nicht. An sich bin ich dagegen der TEFEx ein Social-Media Kleid anzuziehen, dafür gibts die Partnercommunitys. Aber da im Endeffekt (fast) nur zählt was die User sich wünschen, starte ich gleich mal eine kleine Umfrage:
     
    Wollt ihr mehr Infos auf der TEFEx zur Verfügung stellen/von anderen sehen?
    (Also das man zB in der Highscore auf die einzlnen User klicken kann und dann zusatzinfos sieht?)
    Wenn ja, welche?
     
    Freue mich auf eure Kommentare
    lg Mythos
  16. Mythos
    Hi Leute,
     
    sorry für die Funkstille, aber ich bin gerade im realen Leben stark eingespannt, aber ich gelobe Besserung ;)
     
    Eigentlich wollte ich schon länger was zum Thema "Marktmanipulation" schreiben, jetzt komm ich endlich dazu:
     
    In der heutigen Zeit, vor allem seit Start der Krise, liest man ja immer wieder von (Vorwürfen) der Marktmanipulation. Wie sich manche dadurch unerlaubt bereichern und das es überhaupt was ganz ganz Böses ist.
     
    Aber was ist eigentlich "Marktmanipulation"? Wenn ich zB derzeit bei der TEFEx durch mein größeres Kapital eine große Position kaufe und damit den Kurs ein paar Punkte nach oben ziehe, ist das Marktmanipulation? Oder erst wenn ich es mit der Absicht mache, das andere Trader und den Marketmaker dazu zu bewegen dort oben mir die Kontrakte wieder abzukaufen?
     
    Fakt ist, das ich als Teilnehmer an der Börse mit jeder Aktion den Kurs/Markt beeinflusse. Je größer mein Volumen, desto größer mein Einfluss. Und ich mach es auch immer mit der Absicht mir einen persönlichen Vorteil zu schaffen. Sonst würde ich ja nicht traden.
     
    Wo ist also die Grenze zwischen aktivem Trading und Marktmanipulation? Oder geht es rein um die "Absicht" dahinter? Also um den Unterschied zwischen "Ich kaufe weil ich denke das es raufgeht" und "Ich kaufe damit es raufgeht".
     
    Ich freu mich über eure Ansichten und Kommentare
    euer TEFEx-Millionär
  17. Mythos
    Aufgrund von ein paar Meldungen/Problemberichten hab ich jetzt endlich die automatische "Sichtbarkeitssynchronisierung" eingebaut, damit der Server sicher immer (also nach spätestens 1 Minute) weiß welche Module gerade sichtbar sind und dementsprechend die Daten sendet. Somit kann es nichtmehr passieren das zB die Level2 offen ist, aber keine aktuellen Daten mehr bekommt (wegen Verbindungsausfall zwischendrin etc).
     
    Das wars auch schon wieder.
     
    lg mythos
  18. Mythos
    Hi Leute,
     
    Heute gings wieder ab das einem schwindlig wird.
     
    Durch den starken Aufwärtstrend der letzten Tage kam Kiwee in einen sehr ausgedünnten Markt mit sehr wenig LimitSells (zumindest die nächsten 4 Punkte). Und das wurde von mir und ein paar anderen aktiven Tradern (ich nenn hier mal keine Namen, what happens on TEFEx stays on TEFEx ) natürlich schamlos ausgenutzt.
     
    Heißt konkret: bei ~64 bis zu 200 Kontrakte gekauft, bei ~68,50 Position voll gedreht und weiter gehts. Und das ein paar mal hintereinander... In Summe Kohle zum abwinken!
    Wieviel ich genau getraded hab erspar ich euch jetzt, interessiert eh keinen (Ich verzichte natürlich auf den neuen Tradingbonus).
     
    Aber genug Geschwafel:
    Neuer Kontostand: 75179.48
     
    Damit hab ich nach 2 Wochen Trading satte 7400% erreicht. Mal sehen wie lang es dauert bis sich diverse Tradingseminaranbieter melden
     
    Jo ich glaub mehr is da gar nicht mehr zu sagen. Langsam wirds schwer solche Nachrichten und Performancezahlen zu toppen. Ich glaub es is gar nit genug Liquidität in Kiwee um in der Geschwindigkeit weiterzumachen... Mal sehen.
     
    no worries
    der TEFEx-Millionär
  19. Mythos
    Es ist soweit, endlich geht wieder ein Update online das tiefgreifendere Erweiterungen beinhaltet: Das Preisalarmmodul!

    Für den Trader gibt es ein zusätzliches Modul im Applet, das so wie Orders über den Button im Menü erreichbar ist. Dort kann man für jedes Symbol Preisalarme definieren.
    Ein Preisalarm besteht aus dem Symbol, Preis (nona) und einem frei wählbaren Kommentar. Wird der angegebene Preis bei einer Transaktion berührt (sprich wenn der Alarmpreis zwischen und ist) so erhält der Trader eine Mail mit allen Infos. Nach einer solchen Auslösung wird der Alarm gelöscht (sind also Einmalalarme).
     
    Ich hoffe das neue Feature hilft euch und erhöht den Tradingkomfort!
     
    In diesem Sinne
    happy trading
    mythos
  20. Mythos
    (ist doch ein schöner Titel oder?)
     
    hallo zusammen,
     
    Es wird wiedermal Zeit für eine kleine Statistik. Diesmal die in Anspruch genommen Resets, sprich Unterstützungszahlungen.
     
    Seit Beginn wurden in Summe 1'804'895,61 Credits ausgezahlt (Die Startgelder selbst sind hier nicht inkludiert)
     
    Pro Trader gehen die Zahlungen von unglaublichen Beträgen wie 1'660'537,84 beim größten Bittsteller (der satte 34 mal Hilfe beansprucht hat) bis zu entspannten 581,32 Credits.
    In Summe zeigt sich das es scheinbar doch nicht ganz so einfach ist einen simplen, vollautomatischen MarketMaker zu schlagen.
     
    Auf der anderen Seite schreibt auch der MarketMaker (dessen Konto wird ja wie jedes andere auch abgerechnet) rote Zahlen, in Summe gewinnt die Masse also. Das klingt im ersten Moment widersprüchlich, ist es aber ganz und gar nicht. An der TEFEx ist es wie in der Realität: Es gibt ein paar wenige (nämlich genau 2) deren Kapital die 100'000 Marke überstiegen hat.
     
    Ob jetzt im Endeffekt der MM verantwortlich ist, dass schon soviele Resets nötig waren, oder die erfolgreichen Trader den verlustreichen das Geld aus der Tasche gezogen haben, ist schwer zu sagen.
     
    Bleibt nur allen zu wünschen das sie noch nicht zuviel Resets nötig hatten
     
    happy trading
    mythos
  21. Mythos
    Hallo zusammen,
     
    also heute fällt definitiv unter die Kategorie "Bist du deppat" und da sich das nicht wirklich toppen lässt, lass ich es für heute auch gleich gut sein.
     
    Ein >30 Pip Gap hat sich als so ertragreich erwiesen, das ich inzwischen mit MM Positionen handeln kann. Macht das ganze teils zwar einfacher, aber für wirklichen Einfluss fehlt noch ein bissl Kapital.
     
    Die harten Zahlen:
     
    Kiwee: gesamt 2220 Kontrakte und Netto 1939,90 Gewinn!
     
    Macht eine Performance heute von 106% und neuen Kontostand von 3762,50
     
    Mal sehen wie aktiv ich morgen bin, aber die erste Woche hat schonmal eine Performance von 276%. Ich muss sagen, ich bin zufrieden
     
    happy Trading
    euer TEFEx Millionär
     
    PS Bei Fragen zum "wie" oder sonstigen Frage: Einfach Kommentare hinterlassen.
  22. Mythos
    Hi Leute,
     
    für alle die an der TEFEx nicht nur zum Spass traden wollen, sondern in erste Linie den anderen zeigen das sie die Besten sind, gibt es jetzt ein neues Feature:
    Die Highscoreliste
    Um jedoch die Privatsphäre zu schützen werden nicht einfach alle angezeigt, sondern nur wer sich dem harten Wettkampf stellen will. Einfach per Username und Passwort "freischalten" und man sieht sich im direkten Vergleich.
     
    Viel Spass damit.
  23. Mythos
    Hallo zusammen,
     
    hab heute wieder über den Tag verteilt ein bissl getraded.
    Wieder nur Kiwee, 122 Positionen in Summe 765 Kontrakte. Netto Profit 159,60
     
    Ergibt also 13% Tagesperformance und ein Bankroll Kontostand von 1366,50
     
    Ich muss sagen ich bin zufrieden, so eine Performance wär an der realen Börse auch nett ;)
     
    no worries
    der TEFEx-Millionär
     
    EDIT: war natürlich übermütung und hab noch schnell 7 Credits abgegeben...
  24. Mythos
    So, genug getradet für heute.
    Erstes Resumee: Es ist so "einfach" wie erwartet.
     
    Gehandelt in Summe:
    Kiwee: 55 Positionen mit in Summe 308 Kontrakten, Gewinn: 67,90
    Bananach: 1 Position mit in Sume 14 Kontrakten, Gewinn: 32,30
     
    Also Gesamt 100.20 Gewinn (also 10%)
     
    Neuer Kontostand: 1100.20
     
    Ich stell jetzt nicht alle Positionen rein, das wär nur ne ewig lange Liste. Falls es wen interessiert möge er mich anschreiben, oder Kommentar hinterlassen, dann tu ich mir das rauskopieren an.
     
     
    Morgen komm ich vermutlich leider nicht zum traden. Aber Dienstag gehts dann weiter.
     
    no worries
    euer TEFEx Millionär
  25. Mythos
    Hallo zusammen,
     
    ich bin der Mythos und ich werde aus 1000 eine Million machen.
     
    Alle die an dieser Stelle das Bedürfnis bekommen schreiend aus dem Raum zu laufen kann ich beruhigen: Das wird nicht noch ein Millionärsblog. Zumindest nicht ganz.
     
    Es gibt soviele Forex-Millionäre und Gurus, da darf die TEFEx als echte Börsensimulation natürlich nicht hinterherhinken. Deswegen starte ich die Challenge:
     
    Ich starte mit einem Startkapital von 1000 Credits (so wie jeder neu angemeldete User) und werde daraus 1 000 000 machen. Wie lang ich dafür brauche kann ich noch nicht sagen, aber sicher keine 365 Tage
     
    Aber es geht mir natürlich nicht nur darum es zu schaffen, sondern auch darum zu zeigen das (und auch wie) es geht. Deswegen werd ich nicht nur meine Trades dokumentieren (das werden vermutlich sehr sehr viele werden) sondern hauptsächlich die Strategie erklären und wie sich diese im Laufe des Kaptialzuwachses verändern muss. Damit es dann keine Ausreden mehr gibt wenn man den Reset-Button zum glühen bringt
     
    Da die TEFEx ja 24 Stunden am Tag, 7 Tage die Woche offen ist, starte ich am Sonntag den 1. Mai. "Tag der Arbeit" ... irgendwie passend ;)
     
    Ich lade natürlich alle ein mitzumachen, mal sehen wer als erstes die Million knackt.
     
    no worries
    eurer TEFEx-Millionär
×
×
  • Create New...