Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Hier der Code:
Beispielhaft noch die verwendete Tabelle:
Ein großes Dankeschön für eure Ideen und Ratschläge!
Möglicherweise werde ich das auch benötigen, mal sehen. Momentan sind diese Daten nur für Backtests ausgelegt. Wenn ich allerdings live gehe, müsste ich den Indikator oder die Datenbank mit echtzeitdaten speisen. Wenn das ohne andere Programmierebenen (bspw. Python) funktioniert, wäre das eine elegante und saubere Lösung.
Habe versucht, die Datenbankabfrage in einen Indikator umzusetzen. Leider zeigt mir das Journal folgenden Fehler an:
der Error steht dafür, dass die Datei der Datenbank blockiert ist. Was auch immer genau damit gemeint ist.
Laut Debugger wird mir der Buffer mit werten befüllt. Nur zeigt das Indikatorfenster nichts an.
Das hier ist der Indikator
Was sagt ihr dazu? Ich habe noch nicht so oft mit Indikatoren gearbeitet . Ich vermute allerdings, dass es mit der for_Schleife zusammenhängt
Habe versucht, die Datenbankabfrage in einen Indikator umzusetzen. Leider zeigt mir das Journal folgenden Fehler an:
der Error steht dafür, dass die Datei der Datenbank blockiert ist. Was auch immer genau damit gemeint ist.
Laut Debugger wird mir der Buffer mit werten befüllt. Nur zeigt das Indikatorfenster nichts an.
Das hier ist der Indikator
Was sagt ihr dazu? Ich habe noch nicht so oft mit Indikatoren gearbeitet . Ich vermute allerdings, dass es mit der for_Schleife zusammenhängt
Nein Spaß, aber das habe ich mich wirklich gefragt... Du möchtest Zahlen aus der Tabelle holen und in einem "Oszillatorfenster" anzeigen lassen.
Du müsstest dazu mit der Schleife den tradesBuffer[] befüllen. Jedoch nicht immer mit dem selben Wert numberOfTrades. Auch numberOfTrades müsstest Du mit dem Index aus der Tabelle holen, indem Du "Select" wie einen Index verwendest. Dadurch gibst Du die Zeile an. Nur wo das geht ist mir nicht klar.
Das ginge aber erstmal nur für M1 TF. Für M15 müsstest Du immer 15 beieinanderliegende Werte addieren.
Warum hast Du den Index i durch j ersetzt? Der Index im Kopf der Schleife muss der selbe sein wie im Körper.
Dann zählt die Schleife durch:
tradesBuffer[0]= numberOfTrades[0];
tradesBuffer[1]= numberOfTrades[1];
tradesBuffer[2]= numberOfTrades[2];
tradesBuffer[3]= numberOfTrades[3];
tradesBuffer[4]= numberOfTrades[4]; und so weiter. Das macht Alles die Schleife für Dich, wenn Du sie richtig einrichtest. Du musst das halt irgendwie mit dem Databasekram hinbekommen, dass Du mit dem Index die Werte in der Tabelle selektierst. Select wäre die Zeile und die Spalten(Collumn) haben ja Namen. Aber wie das genau geht, weiß ich nicht. Noch nicht. Das Thema SQL ist neu für mich, aber auch interessant.
Du bist da an was dran, aber Du müsstest erstmal noch ein Bisschen sicherer in Schleifen, Arrays und Indikatoren werden. Hast Du schon mal einen MACrossover EA gebaut? Oder wenn Du einen EA machen würdest, der als Kaufbedingung prüft ob der Preis für mindestens dreißig Bars über einem 200er Durchschnitt bleibt.
https://www.mql5.com/de/articles/567 Der ist gut fürs Verständnis von Arrays.
https://www.mql5.com/de/articles/4828 Der ist vielleicht ein Bisschen schwierig aber zeigt gut was man mit Indikatoren Alles machen kann. Der Autor nimmt hier auch einen Count und lässt ihn als Linie im Oszillatorfenster anzeigen, Abschnitt "Buffer für Signalzähler".
Nein Spaß, aber das habe ich mich wirklich gefragt... Du möchtest Zahlen aus der Tabelle holen und in einem "Oszillatorfenster" anzeigen lassen.
Du müsstest dazu mit der Schleife den tradesBuffer[] befüllen. Jedoch nicht immer mit dem selben Wert numberOfTrades. Auch numberOfTrades müsstest Du mit dem Index aus der Tabelle holen, indem Du "Select" wie einen Index verwendest. Dadurch gibst Du die Zeile an. Nur wo das geht ist mir nicht klar.
Das ginge aber erstmal nur für M1 TF. Für M15 müsstest Du immer 15 beieinanderliegende Werte addieren.
Warum hast Du den Index i durch j ersetzt? Der Index im Kopf der Schleife muss der selbe sein wie im Körper.
Dann zählt die Schleife durch:
tradesBuffer[0]= numberOfTrades[0];
tradesBuffer[1]= numberOfTrades[1];
tradesBuffer[2]= numberOfTrades[2];
tradesBuffer[3]= numberOfTrades[3];
tradesBuffer[4]= numberOfTrades[4]; und so weiter. Das macht Alles die Schleife für Dich, wenn Du sie richtig einrichtest. Du musst das halt irgendwie mit dem Databasekram hinbekommen, dass Du mit dem Index die Werte in der Tabelle selektierst. Select wäre die Zeile und die Spalten(Collumn) haben ja Namen. Aber wie das genau geht, weiß ich nicht. Noch nicht. Das Thema SQL ist neu für mich, aber auch interessant.
Du bist da an was dran, aber Du müsstest erstmal noch ein Bisschen sicherer in Schleifen, Arrays und Indikatoren werden. Hast Du schon mal einen MACrossover EA gebaut? Oder wenn Du einen EA machen würdest, der als Kaufbedingung prüft ob der Preis für mindestens dreißig Bars über einem 200er Durchschnitt bleibt.
https://www.mql5.com/de/articles/567 Der ist gut fürs Verständnis von Arrays.
https://www.mql5.com/de/articles/4828 Der ist vielleicht ein Bisschen schwierig aber zeigt gut was man mit Indikatoren Alles machen kann. Der Autor nimmt hier auch einen Count und lässt ihn als Linie im Oszillatorfenster anzeigen, Abschnitt "Buffer für Signalzähler".
Danke für deine Tipps. Werde ich mir direkt ansehen. An sich würd ich aber sagen, läuft:
Tatsächlich bin ich mit dem Indikator weiter gekommen. Allerdings frisst das Auslesen der Datenbank enorm viel Zeit.
In einem anderen Beitrag habe ich dies nochmal etwas genauer erörtert: https://www.mql5.com/de/forum/369221
das j hängt in diesem Fall nicht mit dem i zusammen. Das j wird nur hochgezählt, solange die Datenbank den eingetragenen Wert noch nicht gefunden hat. Der Indikator zeigt mir nur im M1 (wie du auch schon erwähnt hast) die Werte korrekt an, was aber ersteinmal nicht das Problem ist.
Um die Performance des programms zu erhöhen stehen mir zwei Optionen zur Verfügung:
1. Ich lese nur die letzten 20-30 Balken aus, sodass nicht der ganze chart bis 1840 v.Ch. geladen werden muss.
2. Ich speichere bereits in der OnInit() eine gesamt Spalte aus der Datenbank in ein Array ab, sodass es schneller abgerufen werden kann.
Hierzu dachte ich, dass die Funktion DatabaseColumnBlob() eventuell dienlich sein könnte. Bin mir aber bezüglich der Doku garnicht so recht sicher..
request
[in] Handle der Anfrage, das von DatabasePrepare() erhalten wurde.
column
[in] Feldindex der Anfrage. Die Feldnummerierung beginnt bei Null und darf DatenbankColumnsCount() - 1. nicht überschreiten.
data[]
[out] Referenz des Arrays, dem der Feldwert zugewiesen wird.
Vielen Dank Dominik! Denkst du mit der DatabaseColumnBlob () Funktion kann ich mein Vorhaben durchführen?
das j hängt in diesem Fall nicht mit dem i zusammen. Das j wird nur hochgezählt, solange die Datenbank den eingetragenen Wert noch nicht gefunden hat. Der Indikator zeigt mir nur im M1 (wie du auch schon erwähnt hast) die Werte korrekt an, was aber ersteinmal nicht das Problem ist.
Um die Performance des programms zu erhöhen stehen mir zwei Optionen zur Verfügung:
1. Ich lese nur die letzten 20-30 Balken aus, sodass nicht der ganze chart bis 1840 v.Ch. geladen werden muss.
2. Ich speichere bereits in der OnInit() eine gesamt Spalte aus der Datenbank in ein Array ab, sodass es schneller abgerufen werden kann.
Hierzu dachte ich, dass die Funktion DatabaseColumnBlob() eventuell dienlich sein könnte. Bin mir aber bezüglich der Doku garnicht so recht sicher..
request
[in] Handle der Anfrage, das von DatabasePrepare() erhalten wurde.
column
[in] Feldindex der Anfrage. Die Feldnummerierung beginnt bei Null und darf DatenbankColumnsCount() - 1. nicht überschreiten.
data[]
[out] Referenz des Arrays, dem der Feldwert zugewiesen wird.
Huch, da gabs wohl einen Bug beim absenden..
Jedenfalls hast du voll und ganz recht. Die DatabasOpen() muss(!) in die OnInit(), sowie die DatabaseClose() in die OnDeInit() muss. Das erhöht die performance eindeutig, trotzdem scheint mir mein Indikator noch etwas zu träge.
Hier ist nun die Version, indem dies berücksichtig wurde. Außerdem ist nun auch die Unterscheidung der einzelnen Timeframes enthalten.
Selbst der Metatrader bittet darum, den indikator umzuschreiben..
Wie wäre es, wenn ich bereits in der OnInit() alle werte in eine Struct packe?
Huch, da gabs wohl einen Bug beim absenden..
Jedenfalls hast du voll und ganz recht. Die DatabasOpen() muss(!) in die OnInit(), sowie die DatabaseClose() in die OnDeInit() muss. Das erhöht die performance eindeutig, trotzdem scheint mir mein Indikator noch etwas zu träge.
Hier ist nun die Version, indem dies berücksichtig wurde. Außerdem ist nun auch die Unterscheidung der einzelnen Timeframes enthalten.
Selbst der Metatrader bittet darum, den indikator umzuschreiben..
Wie wäre es, wenn ich bereits in der OnInit() alle werte in eine Struct packe?
Würde sich eine newBar Funktion hier lohnen oder brauchst Du die Informationen neu bei jedem Tick?
Du nimmst newBar==true als Bedingung für das Starten der SQL-Rechnerei, somit wird diese auf den ersten Tick innerhalb eines Balkens beschränkt.