Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Ab 8:00 anfangen zu scannen (http://www.expert-advisor.com/forum/showthread.php?t=6631)

chesstigran 16.04.20 00:04

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

TogoTiger 16.04.20 06:14

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
}

traderdoc 16.04.20 10:54

Zitat:

Zitat von TogoTiger (Beitrag 43515)
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
}

Ne, das funtioniert so überhaupt nicht. Strings miteinander vergleichen geht nicht.

Aber das würde gehen:

if (TimeCurrent() > StringToTime(TimeToStr(TimeCurrent(), TIME_DATE) + " 22:59")
|| TimeCurrent() < StringToTime(TimeToStr(TimeCurrent(), TIME_DATE) + " 08:00"))
{
...
}

traderdoc

TogoTiger 16.04.20 11:28

ä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.

traderdoc 16.04.20 11:53

Zitat:

Zitat von TogoTiger (Beitrag 43517)
ä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.

Sorry @TogoTiger, ich nehme alles zurück und erweitere damit meinen Horizont, um die Erkenntnis, dass der Compiler, auf welche Weise auch immer, zwei Zeitstrings miteinander vergleichen kann.

Man lernt nie aus.

traderdoc

traderdoc 16.04.20 12:16

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

traderdoc 16.04.20 12:59

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

TogoTiger 16.04.20 13:10

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

MA-EA 16.04.20 13:40

Zitat:

Zitat von chesstigran (Beitrag 43514)
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...

https://docs.mql4.com/dateandtime/hour

https://docs.mql4.com/dateandtime/minute

AVT 16.04.20 13:42

Ich habe mal einen reinen String versucht:
Code:

extern string    Name1 = "Emil";  // 1. Name
extern string    Name2 = "Ludwig";// 2. Name (Ede, Emilia)

  if( Name1 > Name2 )                                    //"Emil">"Ludwig"?
      Print("4. Name1 ",Name1," > ",Name2 );
  else
    Print("4. Name1 ",Name1," <= ",Name2 );
//Resultat Emil Ludwig: Emil <= Ludwig
//Resultat Emil Ede  : Emil > Ede
//Resultat Emil Emilia: Emil <= Emilia

Sieht so aus, als würden selbst strings Buchstabe für Buchstabe analysiert und geordnet. Heißt wir brauchen keine Sortierfunktion ??
AVT

TogoTiger 16.04.20 14:09

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?

AVT 16.04.20 14:16

Zitat:

Zitat von traderdoc (Beitrag 43520)
...
string Zeit = "45";
if (Zeit > "99" || Zeit < "5") {
Print ("Kein Handel. Zeit: ",Zeit);
return;
}
Print ("Handel. Zeit: ",Zeit);
}
ergibt ein true!?
Reihenfolge: 4 - 45 - 99 ==> 45<99 45<5 weil 4(5) vor 5 kommt

string Zeit = "55";
if (Zeit > "99" || Zeit < "5") {
Print ("Kein Handel. Zeit: ",Zeit);
return;
}
Print ("Handel. Zeit: ",Zeit);
}
Reihenfolge: 5 - 55 - 99 ==> 55<99 55>5 weil 5 vor 55 kommt
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??
Es scheint also so, dass die Strings immer vergleichbar ist, wenn die Zahlen dieselbe Anzahl Stellen besitzen.

Wir haben es hier mit einem reinen string Vergleich von links nach rechts zu tun. Reihenfolge: vergleiche 1.Stelle, vergleiche 2.Stelle, vergleiche 3.Stelle ... So sehe ich das. AVT

AVT 16.04.20 14:24

Zitat:

Zitat von TogoTiger (Beitrag 43524)
Ja klar, der nimmt doch den ASCII-Wert Byte um Byte.

Ich glaube nicht, daß hier mit ASCII-Werten gearbeitet wird, MT kann UTF und das geht über ASCII hinaus, aber wie das auf der untersten Ebene (also Maschinencode) gemacht wird, hab ich keine Ahnung. AVT

TogoTiger 16.04.20 15:38

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.

traderdoc 16.04.20 16:44

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

TogoTiger 16.04.20 17:07

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.

Ca$hDigger 16.04.20 19:55

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:

Zitat von TogoTiger (Beitrag 43529)
Strings sind aber auch nicht sehr effizient. Wer Wert darauf legt, solls besser bleiben lassen.

Da es zumindest in dieser Form auf unterer Maschinenebene vergleichbar ist, würde ich sogar sagen das es wahrscheinlich sogar deutlich performanter ist als die Umwandlungen von Strings in Unix-Zeitstempel und der Vergleich darüber. Hinter den Umwandlungen steckt vermutlich sowas wie ein struct tm bzw mktime struct tm - C++ Reference / http://www.cplusplus.com/reference/ctime/mktime/ und das ist auf keinen Fall effizient.

TogoTiger 17.04.20 05:34

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