Ab 8:00 anfangen zu scannen
Hallo Leute,
ich habe einen EA der darauf basiert die letzen 3 Kerzen nach der aktuell offenen Kerze zu scannen. Wichtig wäre es für mich das er erst ab 8 Uhr anfängt die Kerzen zu scannen, ich habe mir einige Gedanken gemacht und einige Sachen versucht zu programmieren allerdings gingen die komplett in die falsche Richtung. Hat jemand von euch vielleicht Ideen wie man das ganze angehen kann. Danke an euch im Voraus <3 |
Zeit abfragen:
void OnTick() { string Zeit = TimeToStr(TimeCurrent(),TIME_MINUTES); if (Zeit > "22:59" || Zeit < "08:00") { Print ("Kein Handel. Zeit: ",Zeit); return; } hier das was du machen willst bei OnTick } |
Zitat:
Aber das würde gehen: if (TimeCurrent() > StringToTime(TimeToStr(TimeCurrent(), TIME_DATE) + " 22:59") || TimeCurrent() < StringToTime(TimeToStr(TimeCurrent(), TIME_DATE) + " 08:00")) { ... } traderdoc |
äh, sorry, Traderdoc. Das geht aber bei mir. Machen meine EA's schon immer so und traden schön in der Zeit, die ich will.
|
Zitat:
Man lernt nie aus. traderdoc |
Wie bist Du darauf gekommen, dass zwei Zeitstrings vergleichbar sind
oder wo hast Du das gelesen? Ich google derzeitig, finde aber nur die Versionen der vorherigen Wandlung der Angabe "HH:MM" in int oder datetime. traderdoc |
Dss ist ja irre, selbst solche Abfragen werden korrekt beantwortet:
string Zeit = "05.16.2020 07:58:00"; if (Zeit > "04.16.2020 22:59" || Zeit < "03.16.2020 08:00") { Print ("Kein Handel. Zeit: ",Zeit); return; } Print ("Handel. Zeit: ",Zeit); } Das lässt doch nur den Schluss zu, dass der Compiler, warum auch immer, aus dem String einer Zeitangabe die Variable vorher in den gewohnten int- bzw. datetime-Typ umwandelt. Selbst diese Angabe-Form der Zahl funktioniert: string Zeit = "09"; if (Zeit > "10" || Zeit < "05") { Print ("Kein Handel. Zeit: ",Zeit); return; } Print ("Handel. Zeit: ",Zeit); } Die wiederum aber nicht: string Zeit = "6"; if (Zeit > "10" || Zeit < "5") { Print ("Kein Handel. Zeit: ",Zeit); return; } Print ("Handel. Zeit: ",Zeit); } Das string Zeit = "45"; if (Zeit > "99" || Zeit < "5") { Print ("Kein Handel. Zeit: ",Zeit); return; } Print ("Handel. Zeit: ",Zeit); } ergibt ein true!? Aber das string Zeit = "55"; if (Zeit > "99" || Zeit < "5") { Print ("Kein Handel. Zeit: ",Zeit); return; } Print ("Handel. Zeit: ",Zeit); } ergibt ein false, was in gewisser Weise evtl. noch logisch wäre, weil 55 zwischen 99 und 5 liegt. (Nur 45 ja auch!) Aber warum der boolsche Logikwechsel zwischen 45 und 55?? Das wird wiederum richtig erkannt: string Zeit = "160"; if (Zeit > "199" || Zeit < "150") { Print ("Kein Handel. Zeit: ",Zeit); return; } Print ("Handel. Zeit: ",Zeit); } Das wiederum auch nicht: void OnTick() { //string Zeit = TimeToStr(TimeCurrent(),TIME_MINUTES); string Zeit = "160"; if (Zeit > "99" || Zeit < "15") { Print ("Kein Handel. Zeit: ",Zeit); return; } Print ("Handel. Zeit: ",Zeit); } Es scheint also so, dass die Strings immer vergleichbar ist, wenn die Zahlen dieselbe Anzahl Stellen besitzen. Sehr merkwürdig! traderdoc |
Woher ich das habe, weiss ich auch nicht mehr. Ich habs grad nochmals ausprobiert
string Zeit = TimeToStr(TimeCurrent(),TIME_MINUTES); Print (Zeit); bringt sauber 12:00 2 Strings vergleichen habe ich wohl einfach gewohnheitsmässig gemacht. Ich programmiere schon seit Urzeiten oft auf VAX, Alphas und OpenVMS-Systemen in einem Basic-Dialekt. Da kann man ohne weiteres Strings vergleichen und so wird das wohl in meine EAs gerutscht sein. Aber warum soll man Strings nicht vergleichen können? Der Compiler macht das doch einfach Byte für Byte. Seh grad, du hast dich sehr damit beschäftigt. Ich guck das mal genauer an, aber nciht grad jetzt. Muss einer Alpha was beibringen |
Zitat:
https://docs.mql4.com/dateandtime/minute |
Ich habe mal einen reinen String versucht:
Code:
extern string Name1 = "Emil"; // 1. Name AVT |
Ja klar, der nimmt doch den ASCII-Wert Byte um Byte.
Dann ist eben 2 > 1 2 = ASCII 50, 1 = ASCII 49 B > A B = ASCII 60 A = ASCII 65 a > A a = ASCII 97 A = ASCII 65 Damals, in Assemblerzeiten oder noch früher, in Maschinensprache (ja, habe ich noch gemacht), haben wir das doch auch so programmiert. @Traderdoc: Ich denke nicht, dass der Compiler den String analysiert und in ein Datumsformat umwandelt. Dann spielt es auch keine Rolle, wie lang die Strings sind. Das erste Zeichen, auf das die Bedingung zutrifft, bezw. nicht zutrifft, gibt dann true oder false. Wenn du jetzt die Zeit in einen String umwandelst und dafür schaust, dass die Stellen stimmen (also nicht 10:00 mit 9:00 vergleichen), dann gibt das doch keine Probleme. Oder irre ich mich da? |
Zitat:
|
Zitat:
|
Da bin ich mir nicht so sicher, ob bei MT4 Strings immer UTF-Zeichen sind, also zwischen 2 und 4 Byte pro Zeichen. Da müsste ich mich schon genauer damit beschäftigen. Ist aber egal, dann wird halt UTF-Zeichen um UTF-Zeichen verglichen, nicht Byte um Byte.
|
In der Tat:
string Zeit = "6"; if (Zeit > "10" || Zeit < "5") { Print ("Kein Handel. Zeit: ",Zeit); return; } Print ("Handel. Zeit: ",Zeit); } Hier ist die 6 aber größer als die 1 der 10 und somit als Ergbnis false. string Zeit = "45"; if (Zeit > "99" || Zeit < "5") { Print ("Kein Handel. Zeit: ",Zeit); return; } Print ("Handel. Zeit: ",Zeit); } ergibt ein true, weil die 4 der 45 kleiner ist als die 5. Ok, ich habe das Prinzip verstanden, man muß aber höllisch aufpassen und damit ist die Methode extrem fehleranfällig. Gut zu wissen, aber außer beim Zeitvergleich im Format HH:MM werde ich die Strings nicht vergleichen. traderdoc |
Klar Traderdoc, du kommst aus einer andern Ecke der Programmierwelt. Bei mir waren Stringvergleiche jahrzehntelang mein täglich Brot. Da passieren dann mit der Zeit keine Fehler mehr :).
Wir haben oft mit indizierten Dateien gearbeitet, da haben wir die Keyfelder immer in Strings gespeichert. War halt einfach zum Debuggen, wenn man bei zusammengesetzten Keys alle Werte in Strings hatte. Und funktionieren tuts, ich betreue heute noch Software, die ich mal vor bald 40 Jahren geschrieben habe. Ist immer noch in Betrieb, mit einem biologischen Ablaufdatum (bin 71 Jahre alt). Strings sind aber auch nicht sehr effizient. Wer Wert darauf legt, solls besser bleiben lassen. |
Ich denke auch da steckt intern sowas wie ein strcmp() und damit ASCII dahinter, ist also Lexikographisch vergleichbar.
https://www.geeksforgeeks.org/strcmp-in-c-cpp/ "Zweckmäßigerweise sind die Inhalte zweier Speicherstellen (Bytes) auf der untersten Maschinenebene immer miteinander (im Sinne einer Totalordnung) vergleichbar. Zweckmäßigerweise sind die Ziffern resp. Buchstaben den Bitkombinationen eines Bytes so zugeordnet, dass diese Ordnung mit der üblichen Ordnung im Ziffernsystem resp. Alphabet übereinstimmt. Aufbauend auf diesem Grundbaustein eines Vergleichs lassen sich durch lexikographische Zusammensetzung zusammengesetzte Datentypen, beispielsweise mehrstellige Zeichenketten, miteinander vergleichen. Korreliert die lexikographische Indizierung mit den Speicheradressen, hat also das beim Vergleichen höherrangige Byte die niedrigere Adresse, dann geschieht der Vergleich im Big-Endian-Stil, und im Little-Endian-Stil, wenn das höherrangige Byte die höhere Adresse hat. Da sich der lexikographische Vergleich im günstigsten Fall schon im ersten, höchstrangigen Byte entscheidet, ist er schneller, wenn dieses erste Byte im unmittelbaren Zugriff liegt. " https://de.wikipedia.org/wiki/Lexiko...der_Informatik Zitat:
|
Ja, der Vergeich an sich geht natürlich schnell, aber heute werden Strings doch über Stringconstructors angesprochen und die sind mit Aufwand verbunden (erstellen des Constructors, Platz wieder freigeben etc.)
Das war zu Anfangszeiten einfacher. Man wusste den Anfang des Strings, konnte das entsprechende Byte direkt ansprechen und Ende des Strings war das erste ASCII 0. Nichts mit geschützen Speicherbereichen und pipapo. Und man hatte alle Möglichkeiten für fiese Spielchen :) Aber ich habe nur eine vage Ahnung davon, wie das heute genau gehandhabt wird. Ist schon lange, sehr lange her, dass ich da eingehend Bescheid wusste. Wenn ich mir manchmal neue Programme anschaue wird mir schwindelig, wie grosszügig mit Ressourcen umgegangen wird. Kostet ja auch nichts mehr. Nicht mehr 2000$ pro 1 bis 2 KB, wie zu meinen Anfangszeiten. Ja Kilobyte, nicht Giga oder sowas. Und das waren erst noch viel teurere Dollars. |
Alle Zeitangaben in WEZ +2. Es ist jetzt 19:07 Uhr. |
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum