Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

WOGO

Developer
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von WOGO

  1. Na klar, fangen wir doch gleich mal an... Mx=0; for(int a=1; a<=TimeFrame; a++) { Mx=Mx+a; } Mx=Mx/TimeFrame; Die Berechnung von Mx muss nur 1x durchgeführt werden, da sie nur von deinem externen Parameter TimeFrame abhängt. Deshalb findet die Berechnung auch nur beim Aufruf der Inti-Funktion statt. In der for-Schleife wird a von 1 bis TimeFrame durchlaufen und jeweils zu Mx addiert, also Mx = 1 + 2 + 3 + 4 + 5+...+TimeFrame. Dann noch geteilt durch TimeFrame und schon ist Mx fertig... int Index, Index_2; int counted_bars = IndicatorCounted(); //---- //---- check for possible errors if(counted_bars < 0) return(-1); Index=Bars-counted_bars-1; Index_2=Index; Variablen Deklaration sollte klar sein. Index und Index_2 werden nur lokal in Start() verwendet und sind darum nur lokal deklariert. IndicatorCounted() liefert die Anzahl der Bars zurück, die sich nicht verändert haben seit dem letzten Aufruf. Das ist für den ersten Durchlauf natürlich 0 und dann jeweils 1 (oder 2 wenn sich gerade ein neuer Bar gebildet hat). counted_bars Dann wird die Anzahl der noch abzuarbeitenden Bars Index zugewiesen. Standardmässig berechnet man einen Bar mehr um unliebsame Timingeffekte auszuschalten. In Index_2 speichere ich diese Zahl um sie nach der While-Schleife noch zur Verfügung zu haben. while(Index>0) { if(Index<Bars-TimeFrame) //damit an Chartanfang nicht ohne Werte gerechnet wird { ... } else LineareRegression[Index]=EMPTY_VALUE; Index--; } Weitergehts mit der Berechnung. In der While-Schleife wird der Indikatorwert für alle noch nicht berechneten Bars abgearbeitet. Die Schleife wird solange durchlaufen, bis die Bedingung (Index>0) nichtmehr erfüllt ist. Nehmen wir also mal an dein Chart hat 1000 Bars, dann startet Index mit 1000 (eigentlich mit 999, da ja 1 abgezogen wird). Am Ende der While-Schleife wird Index um 1 heruntergezählt, also 999, 998, 997,...,1. Der aktuellste Bar wird hier nicht mitberechnet. Ist das gewollt, so müsste die Bedingung heissen (Index>=0). Die Berechnung wird also ganz links im Chart begonnen und läuft dann immer weiter Richtung Gegenwart. Da die Berechnungsformel ja Werte verwendet, die um TimeFrame Bars noch weiter zurück liegen können als der zu berechnende Bar, wird die Berechnung nur durchgeführt, wenn Index einen Wert hat, indem die ges. Historie gefüllt werden kann. Also bei einem Wert von TimeFrame=5 wird der Indikatorbuffer erst gefüllt, wenn Index mindestens um 5 Bars rechts vom Chartstart liegt. Ansonsten bekommt der Indikatorbuffer den Initialisierungswert (EMPTY_VALUE). Dann zur Berechnung: My=0; Mxy=0; Mx2=0; for(int a=1; a<=TimeFrame; a++) { My=My+Close[Index+a-1]; Mxy=Mxy+a*Close[Index+(TimeFrame-a)]; Mx2=Mx2+a^2; } Mxy=Mxy/TimeFrame; My=My/TimeFrame; Mx2=Mx2/TimeFrame; Mx_2=Mx*Mx; //Berechnung der Steigung: Steigung = (M(xy) – Mx * My) / (M(x^2) – M(x)^2) LineareRegression[Index]=(Mxy-Mx*My)/(Mx2-Mx_2)*Amplify; Die Berechnungsformeln kennst du ja wohl besser als ich... Da bei jedem Durchlauf der Schleife ein komplett neuer Wert berechnet wird, werden die Zwischengroessen Mx, Mxy, Mx2 erst mal mit 0 initialisiert. In der For-Schleife laeuft a von 1 bis TimeFrame. Zu My werden dabei die TimeFrame letzten Werte addiert. Bei der Mxy-Berechnung ist die Gewichtung mit a ja so, dass die Schlusskurse der "jüngeren" Werte mit dem höheren a gewichtet werden. Deshalb laufen die Schlusskurse von links nach rechts (TimeFrame-a) und a von 1...TimeFrame. Der Rest ist einfach Einsetzten in deine Formel. Wie schon gesagt, damit man im Indikator mehr sieht skaliere ich das Endergebnis mit dem Faktor Amplify hoch. Nach der While-Schleife ist der LinearRegression-Buffer also schon fertig. Jetzt wird in einer 2. Schleife noch der MA über diesen Buffer gerechnet: if(Index_2<Bars-(TimeFrame+PeriodeMA)) //damit an Chartanfang nicht ohne Werte gerechnet wird { MovingAverage[Index_2]= iMAOnArray(LineareRegression,0,PeriodeMA,0,MODE_SMA,Index_2); } else MovingAverage[Index_2]=EMPTY_VALUE; Hier wieder selbes Prinzip wie oben: if(Index_2Ob die Bedingung "Bars-(TimeFrame+PeriodeMA)" 100%ig stimmt, bin ich nicht ganz sicher. Habs nicht im Detail durchgedacht. Spielt aber für die Funktion des Indikators keine Rolle und ist nur 'ne Fleissaufgabe. Mit iMAOnArray wird nun der gleitende Durchschnitt über das Array LinearRegression berechnet. die Parameter hierzu sind einfach: 1) Arrayname 2) Anzahl der Arraywerte, die berechnet werden sollen. Bei "0" werden alle berechnet 3) Periode des MA 4) MA-shift 5) Die MA-Methode. Ich hab hier den einfachen MA gewählt 6) Der Berechnungsshift, also welcher Array-Wert berechnet werden soll. Da die While-Schleife ja für alle (noch nicht abgearbeiteten) Bars durchlaufen wird, wird die Formel also für alle Werte von LinearRegression aufgerufen. RefreshRates() bewirkt dann nur, dass der Indikator im Chart aktualisiert wird. Hoffe das war jetzt halbwegs verständlich
  2. Der verrechnet sich wenigstens nicht Hab deinen Indikator mal quick & dirty etwas mit Leben gefüllt. Schau's dir mal an! Nur am Rande: 15/5=3 Das Problem an dem Indikator ist, dass er bei "normalen" Kursverläufen EURUSD fast immer "0" liefert. Die Zahlen in deinem Beispiel haben halt eine sehr hohe Dynamik. Damit man was sieht hab ich noch einen Parameter "Amplify=1000" eingefügt. Was die Parameter PeriodeLR und BerechnungMA hab ich nicht verstanden. Ich hab sie einfach mal ignoriert. lineare_Regression.mq4
  3. Hört sich sehr futuristisch an. Naja, im 23. Jahrhundert, wenn wir mal die Vereinigte Föderation der Planeten haben, dann wird eh alles besser. Da gibt's dann nur noch goldgepresstes Latinum und Wohlstand für alle.
  4. Heute sind alle so philosophisch hier... Liegt das an den Sternen??? Ich würd's eher so bezeichnen. Jeder will für sich das maximale rausholen. Dabei ist viel niemals genug. Das geht solange gut, wie man durch immer fragwürdigere Methoden das Viele immer noch steigern kann, natürlich auf Kosten der Anderen. Wenn das nicht mehr geht dann knallt's halt wieder und der Staat springt ein. Fragt sich nur wieviele solche Zyklen wir noch zu verkraften ...
  5. Jetzt bin ich aber doch neugierig. Wie soll denn ein "besseres" System aussehen? Im Grunde beruht doch jedes bisher dagewesene System darauf, dass es einer begrenzten Anzahl an Leuten gut geht und das aber auf Kosten der Anderen. Wenn ich jetzt mal ein paar "Systeme", die ich persönlich kenne, vergleiche, dann kommen wir meiner Meinung nach mit unserer (Sozialen) Marktwirschaft recht gut weg. Ich würde jetzt ungern im chinesischen Kommunismus leben. Da lässt es sich für einen Teil der Bevölkerung sicherlich recht angenehm leben. Wohnt man aber in einer Gegend, wo ein neuer Staudamm entstehen soll, so ist man ziemlich schnell von der Bildfläche verschwunden (so geschehen bei einer Familie, für die mein Chef eine Patenschaft übernommen hatte). Auch die Schweiz mit ihrer direkten Demokratie ist eher ein Brutofen für, naja, ich nenne es mal Gedankengut, jenseits der Mitte und bei uns!? Da hat doch selbst jeder Harz IV Empfänger noch ein mehr als angenehmes Leben. Also welches System dann???
  6. Was auf den ersten Blick wohl ganz vernünftig erscheint ist so wohl kaum durchzuziehen. Griechenland ist nur die Spitze des Eisbergs. Würde man die Griechen jetzt fallen lassen, so wären als nächstes wohl Spanien und Portugal dran und wer weiss, wie das weitergehen würde. Eine neue Kriese auf den Finanzmärkten würde wohl kaum so relativ glimpflich überstanden werden, wie die letzte, die ja immer noch ihre Nachwirkungen zeigt. Das Problem ist doch, dass sich das Griechenlandproblem schon einige Zeit andeutete. Wie bitte sollte das funktionieren, dass die Bevölkerung eines weit weniger produktiven Landes seine Arbeiter über 5 Jahre früher in die Rente schickt als dies bei uns der Fall ist, dass sich ein Beamtenapparat geleistet wird, der die Grenzen jeder Vernunft sprengt und eine Schattenwirtschaft in einer Grössenordnung von 30% des BIP duldet? In der Tat ist es doch so, dass fast alle Länder, nicht zu letzt wir hier, weit über ihren Verhältnissen leben. Jeder ist sich bewusst, dass das nicht so weiter gehen will und doch wird nichts dagegen getan. Die Regierung verabschiedet zwar eine Schuldenbremse, setzt den Startzeitpunkt aber auf 2016/2020, um wenns dann ernst wird nicht mehr in der Verantwortung zu sein. Wenn dann aber doch mal einer sparen will, dann ist das Geschrei der Betroffenen gross. Wie war das z.B. mit Harz IV oder der Rentenaltererhöhung auf 67, das die SPD mitgetragen hat. Auf einmal besteht das ganze Land nur noch aus Dachdeckern, der Wähler bestraft das und schon rudert die Partei wider jeder Vernunft zurück. Wie sollen also Länder wie Deutschland, die selbst nicht reformfähig sind, ein Land wie Griechenland zu Solchigen zwingen. Jetzt ist zumindest die Chanze gegeben, dass Griechenland durch tiefgreifende Reformen einen Weg zurück in den grünen Bereich findet. Die Alternative, das Land bankrott gehen zu lassen, würde einen Sturm an den Finanzmärkten erzeugen, den von uns sicher keiner gebrauchen könnte. Dass Reformen möglich sind hat in jüngster Vergangenheit auch Lettland gezeigt. Auch hier hat das Land über seinen Verhältnissen gelebt und wurde von der Finanzkrise an den Rande des Staatsbankrotts gebracht und hat durch vernünftige Reformen seine Ausgaben wieder in den Griff bekommen...
  7. Hab's gefunden! Man soll halt keine while-Schleife einbauen, bei der (unter sehr seltenen Umständen) die Abbruchbedingung nie erreicht wird. Was hab ich aus der Aktion gelernt? *Der Strategietester lädt im Betrieb KEINE Bars nach *Ein Log-file über eine Sekunde Test kann schnell mal 50MB haben *zum loggen von Daten die FileWrite()-Funktion zu verwenden ist eher unzuverlässig Danke allen, die mitgeholfen haben, Wogo
  8. Das Problem besteht auch, wenn ich offline teste. Hab jetzt noch die Anzahl der Bars mitgeloggt. Das frustrierende ist, wenn die Bedingung counted_bars==0 && downloadhistory erfüllt ist, sind genau soviele Bars im Chart wie im vorhergehenden Durchlauf. counted_bars wird am Anfang vom Start() über counted_bars = IndicatorCounted(); aktualisiert. Irgendwas bringt IndicatorCounted() dazu sporadisch "0" zurückzugeben. Hab jetzt mal mit unterschiedlichen Timeframes und verschiedenen Underlyings getestet. Erst dachte ich, der Effekt tritt bei M1 nicht auf, dann hab ich meine Indikatorparameter aber eingeengt und schwupps, schon hing er wieder. Es muss also noch irgendein logischer Fehler im Indikator sein. Mittlerweile glaub ich auch, dass das Problem nichts mit IndicatorCounted() zu tun hat, sondern dass das Null-Setzen hier nur ein zusätzlicher Nebeneffekt des Fehlers ist. Ich such also mal weiter, ächtz
  9. Hallo Tommyknocker, danke für den Tip. Das komische ist, ich hab das Problem auch dann, wenn ich nicht im visuellen Modus teste und den Chart nicht offen habe. Hab auch schon probiert, ob es was bringt vor dem Test im Chart durch alle Timeframes zu schalten um sicherzugehen, dass wirklich nichtsmehr nachgeladen wird, das scheint aber keinen Einfluss auf den Strategietester zu haben. Dein Code funktioniert so leider nicht. Wenn ich bei counted_bars==0 den Indikator nicht berechne, so berechne ich ja nie die komplette History. Auch beim ersten Durchlauf nicht. Ich werd heute nochmal ausprobieren, ob es was hilft, wenn ich die Anzahl der berechneten Bars begrenze, also nicht die komplette Historie neu auswerte, sondern nur ein paar hundert Bars. Trotzdem würd ich gerne genauer verstehen wie das mit dem Nachladen der Bars funktioniert. So komplex ist mein Indikator nun auch wieder nicht, darum versteh ich nicht, dass andere dieses Problem nicht auch haben. Vielleicht mach ich ja noch irgenwo was falsch...
  10. Das echt zum Davonlaufen Bekomme das Problem inzwischen auch für andere Daten als den beiden bisher bekannten. Hab das Problem jetzt auch eingegrenzt. In meinem Indikator berechne ich den markttechnischen Trend basierend auf einer 1-2-3 Erkennung und schreibe hierbei die gefundenen lokalen Hochs/Tiefs in einen Buffer. Vom Prinzip her sieht die Struktur des Programmes so aus: int init() { downloadhistory=false; } int start() { counted_bars = IndicatorCounted(); //---- check for possible errors if(counted_bars < 0) return(-1); Index=Bars-counted_bars-1; if (counted_bars==0 && downloadhistory) { //dieser Codeteil wird nur ausgeführt, wenn beim Chart-Start die historischen Daten noch nachgeladen werden. //dabei ergibt nämlich IndicatorCOunted() immer 0 if(ArraySize(ZigZagBuffer)>0) ArrayInitialize(ZigZagBuffer,0.0); Print("History wird nachgeladen"); } else Print("History OK"); if (counted_bars==0) { downloadhistory=true; } while(Index>=0) { //Hier wird der Indikator für alle Bars berechnet EvaluateMarkttechnik(); //Diese Funktion wertet den Trend aus Index--; } Ich hab festgestellt, dass der Strategietester immer bei dem Durchlauf hängenbleibt, wenn die historischen Daten nachgeladen werden, also wenn Print("History wird nachgeladen") ausgegeben wird. Zu diesem Zeitpunkt dauert die Indikatorberechnung natürlich besonders lange, da die While-Schleife nicht nur 1x sondern tausendemale durchlaufen wird. Zudem hat die Funktion EvaluateMarkttechnik() auch noch for-Schleifen, die dann jeweils auch noch über 100x durchlaufen werden müssen. Ich vermute mal, der Strategietester kommt zu diesen Zeiten einfach mit der langen Programmlaufzeit nicht zurecht. Ich habe allerdings noch kein Muster erkennen können, wann die historischen Daten nachgeladen werden. Dies scheint auch von den Parametern abhängig zu sein, die ich meinem Indikator übergebe. Mein Verständnis war immer folgendes: Ich öffne einen Chart, lade einen Indikator und bis dann alle Balken geladen sind kann IndicatorCounted() mehrmals "0" liefern. Dann sollte es aber gut sein. Kann mir jemand erklären, nach welchem Muster der Metatrader die Kurshistorie nachlädt? Vielleicht bin ich auch komplett auf dem Holzweg, aber alle Indizien sprechen dafür, dass der geschilderte Umstand mein Problem verursacht... Bin für jeden Tip dankbar.
  11. Naja, das ist eigentliche genau das, was ich mit meinen FileWrite()-Anweisungen gemacht hab. Hab's der Einfachheithalber nochmal mit Print gemacht: ... 13:29:11 2010.03.01 12:39 EA_Wogo_Markttechnik_201004 EURUSD,M5: 14VorCalculateSignal 13:29:11 2010.03.01 12:39 EA_Wogo_Markttechnik_201004 EURUSD,M5: 14In CalculateSignal vor 2. Aufruf von iCustom 13:29:11 2010.03.01 12:39 EA_Wogo_Markttechnik_201004 EURUSD,M5: 14In CalculateSignal nach 2. Aufruf von iCustom 13:29:11 2010.03.01 12:39 EA_Wogo_Markttechnik_201004 EURUSD,M5: 14Nach CalculateSignal 13:29:11 2010.03.01 12:39 EA_Wogo_Markttechnik_201004 EURUSD,M5: 15VorCalculateSignal 13:29:12 2010.03.01 12:39 EA_Wogo_Markttechnik_201004 EURUSD,M5: 15In CalculateSignal vor 2. Aufruf von iCustom 13:29:12 2010.03.01 12:39 EA_Wogo_Markttechnik_201004 EURUSD,M5: 15In CalculateSignal nach 2. Aufruf von iCustom Der letzte ausgegebene Print-Aufruf ist direkt in der letzten Zeile von CalculateSignal(). Danach sollte CalculateSignal verlassen werden und Start() weiter abgearbeitet werden. Der nächste Aufruf wäre dann die Print-Anweisung mit "Nach CalculateSignal". D.h. es ist eigentlich keine Code mehr dazwischen, der schiefgehen könnte. Aus meiner Programmiererfahrung weiss ich aber, dass man meistens an der falschen Stelle sucht. Ich werd mir jetzt den Indikator nochmal genauer ansehen, den ich per iCustom aufrufe. Das verdächtige ist, dass an beiden Stellen, an denen der EA hängen bleibt ein relativ langer Bar zu sehen ist...
  12. Das ist nur ein Kommentar für das Forum. Im Code steht hier ein FileWrite-Anweisung mit der ich dann in ein csv-file schreibe. Nein, der Indikator arbeitet schon im selben Timeframe. Die M5 stammen noch aus der Phase, wo ich die Funktion debuggt hab. Hab ich vergessen rauszunehmen, sollte aber wie du schon sagst keinen Einfluss haben. Ja schon. Der Indikator selbst benutzt 7 Buffer. 0 bereitet das Signal auf, 1 und 2 dienen als Long/Short-Einstiegsschwellen und werden im EA verwendet 3-6 dienen der Trenderkennung und als Stop-Schwellen, werden aber im EA nicht verwendet. Ja, das hatte ich anfangs auch nicht drin. Hab's nur beim Rumprobieren mal eingefügt... Nun, ich hab früher beruflich programmiert, so dass ich mich hierzu schon auskenne. Mit MQL befass ich mich aber erst seit ein paar Monaten und hab hier sicher noch viele Wissenslücken. Soweit reicht mein Wissen leider nicht. Kannst du das kurz erklären? .Hmm, eine Symbol.sel kann ich im Installationsverzeichnis garnicht finden. Ich benutze das XTB-Installationspacket und hab dabei auch nichts verändert Wo sollte diese Datei denn sein?
  13. Houston, habe ein Problem! Bin mir nicht sicher, ob ich im Einsteigerthread richtig bin, in den Experts-Thread komm ich aber leider nicht rein. Also... Bin dabei meinen EA mit dem Strategietester zu testen. Das funktioniert soweit recht gut, es gibt allerdings zwei Stellen, da stellt der Tester ganz einfach seine Arbeit ein. Der EA läuft auf M5 Basis. Ich teste ihn mit EURUSD-Kursen von Maerz 2010 im visuellen Mode. Am und am 1.3.10 12:42:20 und 26.3.10 14:49:45 bleibt der Test hängen, d.h. der Vortschrittsbalken bleibt stehen und es werden keine neuen Bars mehr im Chart gezeichnet. Teste ich zwischen 2.3 und 25.3. hab ich kein Problem. Ich hab jetzt mal soweit möglich debuggt, d.h. mir in Ausgabefiles an verschiedenen Positionen des EAs Werte ausgeben lassen um rauszufinden, wo ich hängen bleib und bin dabei auf folgendes gestossen: Start() ... if (Bedingung für Signalberechnung) { Ausgabe in Log-File1a CalculateSignal(); //liefert die Long- und Short-Einstiegsschwellen Ausgabe in Log-File1d EvaluateSignal(); //wertet die Einstiegsschwellen aus setzt EA_OrderToPlace, ORDERINPRICE, ORDERSL_INIT und ORDERTYPE } ... Dabei stell ich fest, dass ich zu besagtem Zeitpunkt immer in die Funktion CalculateSignal() rein, aber nichtmehr raus springe. Also hab ich die Ausgabe in's Log-Fiel um CalculateSignal() erweitert. void CalculateSignal() { /*Diese Funktion liefert LongThresh und ShortThresh zurück, die dann in der Funktion EvaluateSignal ausgewertet werden*/ LongThresh =iCustom(Symb,M5,"Indikatorname",Parameter,1,1); Ausgabe in Log-File1b ShortThresh =iCustom(Symb,M5,"Indikatorname",Parameter,2,1); Ausgabe in Log-File1c return(0); } Zusätzlich generiere ich mir noch bei jedem Indikatoraufruf ein Log-File um zu sehen, ob der Indikator sauber abgearbeitet wird. Über eine Globale Variable lass ich einen Zähler mitlaufen, der bei jedem Start-Durchlauf des EAs um 1 hochgezählt wird und den ich zur Synchronisation in alle Log-Files mitausgebe. In die Log-Files lass ich mir auch noch die Werte von LongThresh und ShortThresh ausgeben, um zu sehen ob hier etwas merkwürdiges passiert. Das Ergebnis ist, das Programm gibt noch die Ausgabe Log-File1c aus 1d erscheint dann aber nichtmehr. D.h. die Funktion CalculateSignal() wird bis zum Ende durchlaufen, das Programm springt aber nichtmehr zurück zu Start(). Ich hab auch noch folgendes probiert: *historische Daten über "Vollständige Historie" gecheckt, ob die Kurse zu besagten Zeitpunkten merkwürdig sind ==> alles normal *visuellen Modus abgeschaltet ==> Problem bleibt bestehen *Funktion CalculateSignal() auskommentiert ==> dann funktionierts *Funktion EvaluateSignal() auskommentiert ==> Problem bleibt bestehen *return(0) in Funktion CalculateSignal rausgenommen ==> Problem bleibt bestehen Ich hab also ein Problem in der Funktion CalculateSignal(), mir gehen aber langsam die Ideen aus, was ich noch probieren könnte. Fakt ist, der Indikator funktioniert, wenn ich ihn nur in einem Chart anzeigen lasse und alle ausgegebenen Werte scheinen plausibel zu sein. Hat irgendjemand eine Idee, welcher Umstand in einem Programm den Strategietester dazu bringt seine Arbeit einzustellen? Vielen Dank, Wogo
  14. Scheinbar ist der Handel mit Traum-EAs ein richtig boomender Markt. Von XTB bekomm ich jeden 2. Tag eine Werbemail für ein neues noch besseres System. Diese Woche wars eins, das eine Trefferquote von 99,6% (!!!) verspricht. Das nette bei solchen Werbeaktionen ist immer, dass man gerade jetzt noch das System für einen unschlagbaren Vorzugspreis von nicht mal 2500€ kaufen kann. Natürlich nur für kurze Zeit und nur für eine begrenzte Anzahl von Interessenten. Ich frag mich echt, was mach ich hier eigentlich noch. Schnell zuschlagen, Hypothek auf's Haus aufnehmen und alles Geld in das Handelssystem stecken. Dann wird morgens zum Frühstück nichtmehr die Tageszeitung gelesen, sondern der Immobilienmarkt von Nassau studiert.
  15. WOGO antwortete auf cago's Thema in Welcome @ tom-next
    Und auch ein Willkommen von meiner Seite! Wirf's wieder weg und stöber lieber etwas hier im Forum rum! Das bringt mehr Gruss, Wogo
  16. Denk auch, dass wir da ganzschön was an Erklärung rausgeholt haben Das Problem kenn ich auch. Lag bei mir am Nachladen der historischen Daten. Das ist ein ganz gemeiner Effekt, der mich Tage gekostet hat und den ich nur mit Hilfe hier aus dem Forum lösen konnte. Es ist so, wenn du einen Chart öffnest und der Indikator berechnet wir, dann sind noch nicht alle Balken des Charts geladen. Dein Indikator wird also schon mal für die geladenen Balken berechnet und dein Buffer wird gefüllt. Sind dann alle Balken geladen, so liefert IndicatorCounted() wieder 0 und die Indikatorberechnung startet nochmal auf's neue für alle Balken. Im Indikatorbuffer sind aber noch die Werte aus dem ersten Durchlauf und es kommen zeitverschoben die Werte aus dem 2. Durchlauf dazu. Das sieht dann im Chart so aus, als hätte jemand deinen Indikator geschüttelt. Zumindest war das bei mir das Problem.
  17. Hallo NikkChade, ich hab jetzt auch nochmal einwenig rumgespielt und widerrufe meine Aussage , dass SetIndexEmptyValue keinen Einfluss auf den Wert des Buffers hat. Füg ich z.B. in einem Indikator die Anweisung SetIndexEmptyValue(0,10000); ein, so wird wirklich jeder nichtbeschriebene Bufferwert auf 10000 gesetzt. Zeichne ich den Indikator dann in einen Chart ein, so werden aber die 10000er Werte nicht dargestellt. Setz ich dann noch einige Werte auf EMPTY_VALUE, so werden diese auf 0x7FFFFFFF, also 2147483647 gesetzt. Weder 0x7FFFFFFF noch 10000 wird im Chart angezeigt. Frag ich den Indikator aber (z.B. über iCustoms) ab, so werden diese Werte sehr wohl zurückgeliefert. Generell lässt sich also sagen: 1) Werte, die durch SetIndexEmptyValue() festgelegt werden, werden im Chart nicht eingezeichnet 2) Ein nicht aktiv geschriebener Bufferwert wird auf den durch SetIndexEmptyValue() festgelegten Wert gesetzt 2a) Ist kein SetIndexEmptyValue() vorhanden, so wird der Wert auf EMPTY_VALUE gesetzt. 3) Bufferwerte, die den Wert EMPTY_VALUE haben, werden auch nicht in den Chart eingezeichnet 4) Man kann nur einen SetIndexEMptyValue festlegen. Ruft man die Funktion im selben Indikator 2x hintereinander auf, so wird nur der 2. Wert als Empty-Value (nicht zu verwechseln mit EMPTY_VALUE) übernommen Zu deinem Beispiel. Das bestätigt, soweit ich das sehe, das oben geschriebene. Weist du TrendUp EMPTY_VALUE zu, so ist der Wert 2147483647. Weist du dann 0.0 zu, so wird dieser Wert übernommen und in den Chart eingezeichnet, solange SetIndexEmptyValue(0,0.0) nicht aktiv ist. Sobald SetIndexEmptyValue(0,0.0) aktiv ist, sollte der Wert 0.0 nichmehr im Chart eingezeichnet werden. Schön sieht man das beispielsweise, wenn man sich den Indikator im Chart mit DRAW_LINE anstelle mit DRAW_SECTION zeichnen lässt. Dann werden wirklich nur zugewiesene Bufferwerte gezeichent, bei 0-Werten entstehen Lücken. Als Anwendung für SetIndexEmptyValue fällt mir z.B. ein, dass du 2 Kurven in deinem Indikator hast. Eine für einen Long-Einstieg und eine für einen Short-Einstieg. Die für den Long-Einstieg kann als Empty-Wert den Wert EMPTY_VALUE haben, die für den Short-Einstieg besser 0.0. Solltest du noch zusätzliche Erkenntnisse haben, oder solltest du herausfinden, dass was von meinem geistigen Erguss nicht stimmt, lass es mich bitte wissen. Schönen Sonntag noch, WOGO
  18. #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Green int Index; double Testbuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators IndicatorBuffers(1); SetIndexBuffer(0,Testbuffer); SetIndexStyle(0,DRAW_SECTION); //---- SetIndexEmptyValue(0,6288.0); return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); if(counted_bars < 0) return(-1); Index=Bars-counted_bars-1; //--- while(Index>=0) { if(High[index]>High[index+1]) Testbuffer[index]=High[index]; Index--; } //--- } Der Indikator verbindet alle Kerzen-Hochs wenn sie höher sind, als das Hoch des vorherigen Bars. http://img36.imageshack.us/img36/3674/hoechstkurse.jpg In meinem Beispiel hat der DAX am 21.4. um 08:05 den Höchstkurs 6288.0. Obwohl der Kurs eigentlich den Kriterien des Indikators entsprechen würde, wird er nicht im Indikator eingezeichnet, da ich 6288.0 von der Zeichnung ausnehme. SetIndexEmptyValue(0,6288.0); Zu deiner zweiten Frage. Hier bin ich nicht ganz sicher, ob ich das richtig verstanden hab. Wenn du iCustom aufrufst, dann gibt dir die Funktion ja einen Wert zurück. Mit der Variablen "Periode" in deinem Beispiel übergibst du dem Indikator "NameIndi" ja einen anderen Parameter. Abhängig von der Funktion des Indikators wird dir also wohl auch ein anderer Wert zurückgegeben. Hoffe ich lieg hier mit meiner Interpretation deiner Frage nicht total daneben
  19. Find den thread auch recht interessant. Warum wurde der eigenlich nicht weitergeführt?
  20. Hab da auch noch eine nützliche Info zum Thema iCustom-Aufruf: Wird beim Aufruf auf einen ungültigen Index zugegriffen, d.h. gibt es die Buffernummer im aufgerufenen Indikator nicht, so liefert dir iCustom einen Wert von 2147483647 zurück. Das passiert auch, wenn zum gegenwärtigen Zeitindex noch kein Wert für den Indikator-Buffer existiert. Einfaches Beispiel: Du legst in deinem Indikatorbuffer (warum auch immer) nur dann einen Wert ab, wenn innerhalb der letzten 5 Candles ein neues Maximum auftrat. Wurde dann beim aktuellen Bar kein Wert abgelegt, so liefert dir iCustom ohne Fehlermeldung den Wert 2147483647. Dies kann dann ärgerlich sein, wenn du dann short gehst wenn dass der aktuelle Kurs kleiner ist, als das was iCustom zurückliefert...
  21. Aha! dass historische Daten zu Beginn des Umschaltens nachgeladen werden, hab ich mir schon gedacht, dass allerdings dabei IndicatorCounted() 0 zurück liefert war mir komplett neu. Das erklärt auch ein Problem mit einem Indikator, das ich seit längerer Zeit zu lösen versuche. Ich fülle einen Buffer mit Werten aus den Extremas des Charts und zeichne dann die Verbindung mit DRAW_SECTION. Werte zwischen den Extremas bleiben im Buffer leer. Nun hatte ich immer das Problem, dass beim Aufmachen des Charts die Kurve kurzzeitig korrekt war, dann aber komplett verschoben wurde und neue, völlig unpassende, Punkte eingefügt wurden. Das kam einfach daher, dass mein Index-Handling nicht bedachte, dass IndicatorCounted mehrmals 0 sein kann und alle Werte basierend auf den "verschobenen" Chart neu berechnet wurden. Es kamen somit Werte in den Buffer, die real garnicht existent waren. Vielen Dank titanfx, du hast mir wirklich sehr geholfen! Wogo
  22. Stimmt! Das war ein Denkfehler meinerseits. IndicatorCounted() gibt ja die Anzahl der sich nicht geänderten Bars seit dem letzten Indikatoraufruf -1 zurück. Dann nochmal: Wenn mein Indikator also 1x durchlaufen wurde steht counted_bars beim nächsten Tick auf Bars - 1. downloadhistory ist hier bereits true. Schalt ich nun aber die Zeitbasis um wird doch counted_bars wieder auf 0 gesetzt und da alle Variable ja neu initialisiert werden ist doch downloadhistory wieder false. Wie kann dann aber if (counted_bars==0 && downloadhistory) erfüllt sein???
  23. Hallo titanfx, vielen Dank für die schnelle äußerst Kompetente Hilf. Bin echt baff. Ich faß nochmal zusammen. Der Indikator wird gestartet, Init wird ausgeführt, dann springt das Program zu Start. IndicatorCounted() liefert 0. Dann wird der Indikator für alle historischen Daten berechnet z.B. mit : for(shift=limit; shift>=0; shift--) { //Indikatorberechnung } Danach wartet der Indikator auf einen neuen Tick. Wenn der kommt sollte IndicatorCounted() Bars entsprechen. Bildet sich dann eine neue Kerze, erhöht sich IndicatorCounted() um 1. Die obrige Schleife wird dabei jeweils 1x durchlaufen. So, jetzt schalte ich die Zeitbasis um z.B. von M30 auf M1. Daraufhin wird deinit() ausgeführt, dann wieder init() und dann Start() Genau hier sollte IndicatorCounted() wieder 0 sein. Soweit klar. Alle Variablen und Arrays sind jetzt zurückgesetzt. In meinem Eingangsbeispiel wird nun downloadhistory auf true gesetzt (weil counted_bars ja auf 0 steht) und der Indikator wieder für alle historischen Werte von M1 neu berechnet. Start wird dann verlassen und beim nächsten Tick wieder gestartet. Hier setzt es bei mir leider aus. Jetzt sollte IndicatorCounted doch auf Bars stehen. Warum wird dann aber beim nächsten Durchlauf die Bedingung (counted_bars==0 && downloadhistory) erfüllt. Irgendwo hab ich da einen Denkfehler. Vielleicht kannst du mir nochmal einen Tip geben. Danke, Wogo
  24. Hallo, was passiert eigenlich mit Arrays/Variablen in Indikatoren, wenn ich in einem Chart die Zeitbasis ändere? Hintergrund meiner Frage: Ich habe im ZigZag-Indikator folgendes Konstrukt gefunden: if (counted_bars==0 && downloadhistory) { ArrayInitialize(ZigzagBuffer,0.0); ArrayInitialize(HighMapBuffer,0.0); ArrayInitialize(LowMapBuffer,0.0); } if (counted_bars==0) { limit=Bars-ExtDepth; downloadhistory=true; } downloadhistory wird in der Init-Funktion mit "false" initialisiert. Ich wäre jetzt davon ausgegangen, dass die if-Bedingung von (counted_bars==0 && downloadhistory) nie erfüllt würde. Hab dann aber nach den ArrayInitialize-Aufrufen einen Alert gesetzt und beim Umschalten der Zeitbasis z.B. von H1 auf M1 wird tatsächlich eine Meldung ausgegeben. Ich dachte immer beim Umschalten der Zeitbasis würde die Init-Funktion neu aufgerufen. Kann mir jemand erklären, was hierbei genau abläuft? Was passiert beispielsweise mit meinen verwendeten Variablen? Bleibt deren Wert erhalten? Bleiben die Arrays mit ihren ursprünglichen Werten/Größe erhalten? Vielen Dank, WOGO
  25. Auch noch eine Frage. Muss ich Gewinne/Verluste selbst ausrechnen, oder gibt es bei IGMarkets so eine Art Jahresdepotauszug, wie man das von deutschen Banken kennt?

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.