Geschrieben 25. Mai 201016 Jr. comment_99329 Erstmal ein freundliches hallo an die Community. Ich bin neu hier im Forum daher möchte ich mich erstmal vorstellen. Ich bin Werner 25J. und beschäftige mich seit ca.2 Jahren mit der schönen Welt des Handelns.Nachdem ich mich durch einiges an Literatur geschlagen habe und einige Märkte erkundet habe. bin ich mitlerweile zu dem Schluss gekommen das cfd´s und möglicherweise der Forex markt speziell der automatisierte Handel mir am ehesten liegt.Daher beschäftige ich mich seit anfang 2010 mit dem Metatrader und mql4. Ich bin noch weit davon entfern von meinen Gewinnen Leben zu können und möglicherweise komme ich nie an den Punkt aber das stört mich nicht,mir macht einfach der Handel spaß. Von Beruf bin ich Hochsee Fischer auf einem Fabrikschiff und meist im Nordatlantik unterwegs wir haben Internet an Bord zwar langsam aber Internet Es wird öfter mal vorkommen bei mir das ich mich nicht melde das liegt gelegendlich an problemen mit dem Internet oder ganz einfach zu wenig Zeit. Dafür möchte ich mich schon mal im vorraus entschuldigen. So nun zu meinem Problem Ich programiere grade einen indikator der im 5 min Chart läuft und mir den unterschied von Open und Open vorx Tagen zeigen soll das ganze soll er mit mehreren Symbolen und auf einem Tages Chart machen. Mein Problem besteht darin das er öfter mal ganz andere Werte zeigt als er eigendlich zeigen sollte zum beispiel zeigt er für gestern + 2 an, eine Stunde später -1 und irgendwann stimmen die Werte dann mal wieder. Herzlichen Dank schon mal für eure Hilfe. int start() { int timeframe=1440; int tbar1; int tbar2; int tbar3; int tbar4; int tbar5; string symbol1="Ger30Jun10"; string symbol2="Usa500Jun10"; string symbol3="Euro50Jun10"; string symbol4="UK100Jun10"; string symbol5="Swi20Jun10"; double trend1; double trend2; double trend3; double trend4; double trend5; int vergleich; for (int i=Bars-1;i>0;i--) { tbar1 = iBarShift(symbol1,timeframe,Time[i]); tbar2 = iBarShift(symbol2,timeframe,Time[i]); tbar3 = iBarShift(symbol3,timeframe,Time[i]); tbar4 = iBarShift(symbol4,timeframe,Time[i]); tbar5 = iBarShift(symbol5,timeframe,Time[i]); trend1 = iOpen(symbol1,timeframe,tbar1) - iOpen(symbol1,timeframe,i+10); trend2 = iOpen(symbol2,timeframe,tbar2) - iOpen(symbol2,timeframe,i+10); trend3 = iOpen(symbol3,timeframe,tbar3) - iOpen(symbol3,timeframe,i+10); trend4 = iOpen(symbol4,timeframe,tbar4) - iOpen(symbol4,timeframe,i+10); trend5 = iOpen(symbol5,timeframe,tbar5) - iOpen(symbol5,timeframe,i+10); vergleich=0; if (trend1>0) vergleich++; if (trend1<0) vergleich--; if (trend2>0) vergleich++; if (trend2<0) vergleich--; if (trend3>0) vergleich++; if (trend3<0) vergleich--; if (trend4>0) vergleich++; if (trend4<0) vergleich--; if (trend5>0) vergleich++; if (trend5<0) vergleich--; ExtMapBuffer1[i] = vergleich; } int lasterror = GetLastError(); if (lasterror != 0 )Alert("Indikator Fehler ",lasterror); if (lasterror == 4054 )Alert("Falsches Symbol "); return(0); } Bearbeitet 25. Mai 201016 Jr. von WernerH. Melden
Geschrieben 25. Mai 201016 Jr. comment_99341 Hallo Werner, auch von mir ein Herzliches Willkommen.Du gehst ja gleich in die Vollen Zu deinem Code.Ich seh da ein Problem und eine Unschönheit. Zum Problem. Du rechnest mit 5 verschiedenen Symbolen. Deren Kurshistorie wird vermutlich nicht gleich lange sein, so dass du wohl bei den Vergleichen Probleme bekommen wirst (wenn's denn überhaupt richtig läuft).Probier mal lieber sowas:... int nb_Bars[5]; nb_Bars[0]=iBars(symbol1, timeframe); nb_Bars[1]=iBars(symbol2, timeframe); nb_Bars[2]=iBars(symbol3, timeframe); nb_Bars[3]=iBars(symbol4, timeframe); nb_Bars[4]=iBars(symbol5, timeframe); int minBars=0; for (int a=0; a<5; a++) { minBars=MathMin(minBars, nb_Bars[a]); } for (int i=minBars;i>0;i--) ...Somit stellst du schon mal sicher, dass die Zeitreihe mit den wenigsten Kurswerten ausschlaggebend für die zeitliche Länge der Berechnung ist. Dann noch zur Unschönheit.Du berechnest hier die komplette Historie bei jedem Tick. Das sollte nicht nötig sein.Du könntest beispielsweise nach der Analyse der Bars (code oben) noch über IndicatorCounted() nur die neu hinzugekommenen Bars berechnen. Dann müsstest du aber das erste Symbol (symbol1) als das Underlying aus dem aktuellen Chart definieren (Symbol()). Nochwas, du schreibst dein Indikator läuft im M5-Timeframe, hast aber bei timeframe 1440, also einen Tag definiert... Wenn ich später mal dazukomme schau ich mir das Problem mit den unterschiedlichen Ergebnissen mal direkt an. Vielleicht hilft ja schon das Vereinheitlichen der Zeitreihenlänge um das Problem zu lösen. Hab leider gerade nur wenig Zeit Gruss,Wogo Melden
Geschrieben 25. Mai 201016 Jr. comment_99347 Ähm... mein Beispiel ist natürlich Unfug und kann nicht funktionieren. Man darf minBars natürlich nicht mit 0 initialisieren, da das Minimum von 0 und irgendwas positives immer 0 sein sollte... Schande über mich Richtig ist es so:... int nb_Bars[5]; nb_Bars[0]=iBars(symbol1, timeframe); nb_Bars[1]=iBars(symbol2, timeframe); nb_Bars[2]=iBars(symbol3, timeframe); nb_Bars[3]=iBars(symbol4, timeframe); nb_Bars[4]=iBars(symbol5, timeframe); int minBars=nb_Bars[0]; //<== geändert for (int a=1; a<5; a++) { minBars=MathMin(minBars, nb_Bars[a]); } for (int i=minBars;i>0;i--) ...Was ich jetzt nicht so ganz versteh ist, warum du beim Vergleich von 2 um 10 Bars auseinanderliegenden Kerzen den Umweg über iBarShift gehst. Mach's doch einfach so: for (int i=minBars;i>=0;i--) { //tbar1 = iBarShift(symbol1,timeframe,Time[i]); //tbar2 = iBarShift(symbol2,timeframe,Time[i]); //tbar3 = iBarShift(symbol3,timeframe,Time[i]); //tbar4 = iBarShift(symbol4,timeframe,Time[i]); //tbar5 = iBarShift(symbol5,timeframe,Time[i]); trend1 = iOpen(symbol1,timeframe,i/*tbar1*/) - iOpen(symbol1,timeframe,i+10); trend2 = iOpen(symbol2,timeframe,i/*tbar2*/) - iOpen(symbol2,timeframe,i+10); trend3 = iOpen(symbol3,timeframe,i/*tbar3*/) - iOpen(symbol3,timeframe,i+10); trend4 = iOpen(symbol4,timeframe,i/*tbar4*/) - iOpen(symbol4,timeframe,i+10); trend5 = iOpen(symbol5,timeframe,i/*tbar5*/) - iOpen(symbol5,timeframe,i+10); vergleich=0; if (trend1>0) vergleich++; if (trend1<0) vergleich--; if (trend2>0) vergleich++; if (trend2<0) vergleich--; ...i läuft durch alle Bars und du bekommst in trendX immer den Unterschied des Preises von Open und Open[i-10]. Denke darauf kommt's dir an, oder. Ich hab das mal ausprobiert und das Ergebnis scheint plausible Werte zu liefern (auch wenn ichs jetzt nicht im Detail kontrolliert hab ). Gruss,Wogo Melden
Geschrieben 25. Mai 201016 Jr. Autor comment_99359 Vielen Dank für die schnelle Hilfe und dafür dass ihr mich so herzlich empfangen habt Es tut mir sehr leid ich habe einen großen Fehler gemacht und zwar hatte ich zu Versuchszwecken den Code etwas verändert und dann wie soll es anders sein den falschen Code gepostet. Nun habt ihr euch den ganzen Tag den Kopf darüber zerbrochen was ich eigendlich will dafür möchte ich mich vielmals entschuldigen. Mein Fehler war trend1 = iOpen(symbol1,timeframe,tbar1) - iOpen(symbol1,timeframe,i+10); Stehen hätte da sollen trend1 = iOpen(symbol1,timeframe,tbar1) - iOpen(symbol1,timeframe,tbar1+10); Dadurch ergibt sich natürlich ein ganz anderes Bild im Indikator und ich hoffe es wird jetzt ein bisschen klarer was ich erreichen will.Eigendlich soll mir der Indikator nur zeigen ob die mehrzahl der Symbole einen aufsteigenden Trend aufweist, einen fallenden oder ob sie sich gegeneinander aufwiegen. Hier nun noch einmal der richtige Code int start() { int timeframe=1440; int tbar1; int tbar2; int tbar3; int tbar4; int tbar5; string symbol1="Ger30Jun10"; string symbol2="Usa500Jun10"; string symbol3="Euro50Jun10"; string symbol4="UK100Jun10"; string symbol5="Swi20Jun10"; double trend1; double trend2; double trend3; double trend4; double trend5; int vergleich; for (int i=Bars;i>0;i--) { tbar1 = iBarShift(symbol1,timeframe,Time[i]); tbar2 = iBarShift(symbol2,timeframe,Time[i]); tbar3 = iBarShift(symbol3,timeframe,Time[i]); tbar4 = iBarShift(symbol4,timeframe,Time[i]); tbar5 = iBarShift(symbol5,timeframe,Time[i]); trend1 = iOpen(symbol1,timeframe,tbar1) - iOpen(symbol1,timeframe,tbar1+10); trend2 = iOpen(symbol2,timeframe,tbar2) - iOpen(symbol2,timeframe,tbar2+10); trend3 = iOpen(symbol3,timeframe,tbar3) - iOpen(symbol3,timeframe,tbar3+10); trend4 = iOpen(symbol4,timeframe,tbar4) - iOpen(symbol4,timeframe,tbar4+10); trend5 = iOpen(symbol5,timeframe,tbar5) - iOpen(symbol5,timeframe,tbar5+10); vergleich=0; if (trend1>0) vergleich++; if (trend1<0) vergleich--; if (trend2>0) vergleich++; if (trend2<0) vergleich--; if (trend3>0) vergleich++; if (trend3<0) vergleich--; if (trend4>0) vergleich++; if (trend4<0) vergleich--; if (trend5>0) vergleich++; if (trend5<0) vergleich--; ExtMapBuffer1[i] = vergleich; } int lasterror = GetLastError(); if (lasterror != 0 )Alert("Indikator Fehler ",lasterror); if (lasterror == 4054 )Alert("Falsches Symbol "); return(0); } Melden
Geschrieben 25. Mai 201016 Jr. comment_99360 Herzlich willkommen! Sind die Internetverbindungen auf hoher See stabil? Für hoch gehebelte Positionen traue ich mich nochnichtmal per WLAN ins Internet - habe da schon böse Überraschungen erlebt. Ich denke, dass die letztgenannte Lösung von WOGO das Ergebnis bringt, was beabsichtigt ist - ohne jetzt Gedanken lesen zu können. Mal von dem von dir genannten Additionsfehler abgesehen, lese ich den Code wie folgt: Die for-Schleife iteriert durch alle Bars des 5min-Charts (und das sogar bei jedem Tick). Die Funktion iBarShift liefert die Nummer der Kerze (Tageschart), die (zeitlich) am nächsten an der 5min-Kerze der for-Schleife liegt. Mit diesem Ergebnis bildest du dann die Differenz zur 10 Tage entfernten Kerze. Das heißt: für viele 5min-Kerzen wird iBarShift immer dieselbe Kerzennummer zurückliefern und ich kann mir sehr gut vorstellen, dass du daher andere Ergebnisse als erwartest bekommt, weil die neue 5min-Kerze vielleicht näher an einem anderen Tag liegt. Ich habe hier auf dem verwendeten Computer kein MT4 installiert, daher weiß ich nicht genau, ob iBarShift nicht sogar "in die Zukunft" schauen würde (vielleicht in der Hilfe nachzulesen). Das heißt, eine weitere 5min-Kerze ist plötzlich näher am nächsten Tag dran, sodass daraus die 10-Tage-Differenz gezogen wird... Daher wundert es mich, dass es anscheinend funktioniert... Egal, das Ergebnis zählt Die Perfomancetipps von WOGO solltest du dir allerdings nochmals anschauen. RAiNWORM Melden
Geschrieben 25. Mai 201016 Jr. comment_99361 Erstmal willkommen an Board Werner! Ist wirklich eine interessante Kombi die du da hast ;) Es tut mir sehr leid ich habe einen großen Fehler gemacht und zwar hatte ich zu Versuchszwecken den Code etwas verändert und dann wie soll es anders sein den falschen Code gepostet. *mist* ich wollte dich gerade auf den "Fehler" aufmerksam machen ;) Zu deinem Problem: ehrlich gesagt seh ich so auf die Schnelle nicht warum es falsch sein sollte (abgesehen davon das du, wie schon erwähnt, bei jedem Tick alles unnötig neu berechnest). kannst du genauer beschreiben welche Fehler auftreten? Treten die Fehler nur beim laufenden Bar auf oder auch in der Historie? Melden
Geschrieben 26. Mai 201016 Jr. Autor comment_99367 Wiedermal ein wenig Zeit gefunden um den aktuellen Vortschritt zu posten Herzlich willkommen! Sind die Internetverbindungen auf hoher See stabil? Für hoch gehebelte Positionen traue ich mich nochnichtmal per WLAN ins Internet - habe da schon böse Überraschungen erlebt. Die Internet Verbindung hier ist leider so unzuverlässig das es wirklich unverantwortlich währe hier ein System laufen zu lassen und so langsam wie zu Zeiten als man den PC noch in die Telefondose gesteckt hat. Ich habe zu Hause einen Rechner laufen auf den ich via Remote Control zugreife das funktioniert ganz gut. Wogo hat meinen fehler auch entdeckt und sich wohl gefragt was soll der quatsch Der letzte Lösungsweg lässt dann nur noch die Tages Bars berechnen und zwar ab dem kürzesten Chart er hat mit der Berechnung iopen - iopen genau das getroffen was ich wollte und die Performance starkverbessert. Allerdings läuft der Indicator im 5 min Chart und füllt grade einen Tag aus weil er denkt eine Tagesbar = eine 5 min. Bar. Das wollte ich vermeiden daher der ganze aufwand über ibarshift. Aber ich lasse es erstmal eine Zeit so laufen um zu testen ob so der Fehler verschwindet. Mir erscheint noch die Ausführung von RAiNWORM möglich. Das heißt: für viele 5min-Kerzen wird iBarShift immer dieselbe Kerzennummer zurückliefern und ich kann mir sehr gut vorstellen, dass du daher andere Ergebnisse als erwartest bekommt, weil die neue 5min-Kerze vielleicht näher an einem anderen Tag liegt. Und dann werde ich das Gefühl nicht los das es möglicherweise mit iOpen und dem Symbol zusammen hängt vieleicht kann er nicht immer auf jedes Symbol zugreifen und verursacht dadurch fehler in der Historie Melden
Erstmal ein freundliches hallo an die Community.
Ich bin neu hier im Forum daher möchte ich mich erstmal vorstellen.
Ich bin Werner 25J. und beschäftige mich seit ca.2 Jahren mit der schönen Welt des Handelns.
Nachdem ich mich durch einiges an Literatur geschlagen habe und einige Märkte erkundet habe.
bin ich mitlerweile zu dem Schluss gekommen das cfd´s und möglicherweise der Forex markt
speziell der automatisierte Handel mir am ehesten liegt.
Daher beschäftige ich mich seit anfang 2010 mit dem Metatrader und mql4.
Ich bin noch weit davon entfern von meinen Gewinnen Leben zu können und
möglicherweise komme ich nie an den Punkt aber das stört mich nicht,
mir macht einfach der Handel spaß.
Von Beruf bin ich Hochsee Fischer auf einem Fabrikschiff und meist im Nordatlantik unterwegs
wir haben Internet an Bord zwar langsam aber Internet
Es wird öfter mal vorkommen bei mir das ich mich nicht melde das liegt gelegendlich an problemen
mit dem Internet oder ganz einfach zu wenig Zeit.
Dafür möchte ich mich schon mal im vorraus entschuldigen.
So nun zu meinem Problem
Ich programiere grade einen indikator der im 5 min Chart läuft und mir den unterschied von Open und Open vor
x Tagen zeigen soll das ganze soll er mit mehreren Symbolen und auf einem Tages Chart machen.
Mein Problem besteht darin das er öfter mal ganz andere Werte zeigt als er eigendlich zeigen sollte zum beispiel
zeigt er für gestern + 2 an, eine Stunde später -1 und irgendwann stimmen die Werte dann mal wieder.
Herzlichen Dank schon mal für eure Hilfe.
int start() { int timeframe=1440; int tbar1; int tbar2; int tbar3; int tbar4; int tbar5; string symbol1="Ger30Jun10"; string symbol2="Usa500Jun10"; string symbol3="Euro50Jun10"; string symbol4="UK100Jun10"; string symbol5="Swi20Jun10"; double trend1; double trend2; double trend3; double trend4; double trend5; int vergleich; for (int i=Bars-1;i>0;i--) { tbar1 = iBarShift(symbol1,timeframe,Time[i]); tbar2 = iBarShift(symbol2,timeframe,Time[i]); tbar3 = iBarShift(symbol3,timeframe,Time[i]); tbar4 = iBarShift(symbol4,timeframe,Time[i]); tbar5 = iBarShift(symbol5,timeframe,Time[i]); trend1 = iOpen(symbol1,timeframe,tbar1) - iOpen(symbol1,timeframe,i+10); trend2 = iOpen(symbol2,timeframe,tbar2) - iOpen(symbol2,timeframe,i+10); trend3 = iOpen(symbol3,timeframe,tbar3) - iOpen(symbol3,timeframe,i+10); trend4 = iOpen(symbol4,timeframe,tbar4) - iOpen(symbol4,timeframe,i+10); trend5 = iOpen(symbol5,timeframe,tbar5) - iOpen(symbol5,timeframe,i+10); vergleich=0; if (trend1>0) vergleich++; if (trend1<0) vergleich--; if (trend2>0) vergleich++; if (trend2<0) vergleich--; if (trend3>0) vergleich++; if (trend3<0) vergleich--; if (trend4>0) vergleich++; if (trend4<0) vergleich--; if (trend5>0) vergleich++; if (trend5<0) vergleich--; ExtMapBuffer1[i] = vergleich; } int lasterror = GetLastError(); if (lasterror != 0 )Alert("Indikator Fehler ",lasterror); if (lasterror == 4054 )Alert("Falsches Symbol "); return(0); }Bearbeitet von WernerH.