Hallo! Könnten Sie mir bitte sagen, warum ich manchmal einen ifle-Operator habe, der nicht funktioniert? Hier ist ein Beispiel:
Wobei: H3 ist der Preiswert des Levels price ist der aktuelle Preis
Das Ergebnis ist, dass der Preis dieses Level erreicht (manchmal sogar an ihm stoppt), aber der Alarm nicht ausgelöst wird. Können Sie mir sagen, was der Fehler ist?
Der Fehler besteht darin, dass der Preis selten genau mit dem Wert des Niveaus übereinstimmt. Entweder Preis >= H3 oder einen Fehlerbereich definieren.
8 - Ich habe die Arbeit unterbrochen, indem ich das Prüfgerät geschlossen habe.
Als nächstes sehen wir uns das "Journal" an:
2014.10.31 07:46:44.837 GBPUSD,M15: 4453 Tick-Ereignisse (5608 Balken, 340128 Balkenzustände) innerhalb von 312876 ms verarbeitet (Gesamtzeit 324436 ms) 2014.10.31 07:46:44.837 2014.08.26 13:13 Tester: Auftrag #4 ist abgeschlossen 2014.10.31 07:46:44.798 2014.08.26 13:13 Visueller Prüfer gestoppt 2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: ORDER OPEN 4 2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: open #4 buy 0.10 GBPUSD at 1.6590 ok 2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: Open #4 buy 0.10 GBPUSD at 1.6590 ok 2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: Ich glaube nicht, dass er geschlossen wurde. Hier ist es: 4108 2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: OrderClose Fehler 4108 2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: unbekanntes Ticket 3 für OrderClose-Funktion 2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: close #3 buy 0.10 GBPUSD at 1.6576 at price 1.6586 2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: HOLD OPEN #3 2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: open #3 buy 0.10 GBPUSD at 1.6576 ok 2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: Position #1 eröffnen 2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: Was ist los? Hier ist es: 4108 2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: OrderClose Fehler 4108 2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: unbekanntes Ticket 2 für OrderClose-Funktion 2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: close #2 buy 0.10 GBPUSD at 1.6564 at price 1.6574 2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: HOLD OPEN 2 2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: open #2 buy 0.10 GBPUSD at 1.6564 ok 2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: Eröffnung der ersten Position 2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: Was ist los? Hier ist es: 4108 2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: OrderClose Fehler 4108 2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: unbekanntes Ticket 1 für OrderClose-Funktion 2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: close #1 buy 0.10 GBPUSD at 1.6550 at price 1.6562 2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: ORDER OPEN 1 2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: open #1 buy 0.10 GBPUSD at 1.6550 ok 2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: open #1 buy 0.10 GBPUSD at 1.6550 ok 2014.10.31 07:41:31.958 Ozero Eingaben: gLot=0.1; gPoint=0.001;
Jetzt bin ich völlig ratlos. Einerseits werden die Aufträge geschlossen, wie Sie im Chart und in den Ergebnissen sehen können, andererseits wird der Code mit Fehlern ausgeführt, wie im Log zu sehen ist: (((((((((((
//ResetLastError();//if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());
Guten Morgen.
Zwei Zeilen wurden gestrichen. Alles funktioniert. Und alles wird korrekt im Diagramm, in den Ergebnissen und in den Protokollen angezeigt.
Frage: Beim Kompilieren gibt es eine
'Ozero.mq4'Ozero.mq4 1 1 Rückgabewert von 'OrderClose' sollte überprüft werden Ozero.mq4 46 13 0 Fehler, 1 Warnung(en) 1 2
Wovor warnt mich der Compiler? Die 46. Zeile ist OrderClose(OrderTicket(),OrderLots(),_Bid,15);
Könnt ihr mir sagen, was die Ursache für die heute aufgetretene Störung sein könnte?
Der EA hat die Option, den Handel 15 Minuten vor Börsenschluss am Freitag zu beenden.
Wenn ein neuer Tag erscheint, prüft der EA, ob es Freitag ist, dann beenden wir heute den Handel in StringToTime("23:59")-15*60
Im Strategietester funktioniert diese Funktion korrekt, aber im realen Handel sehe ich eine völlig andere Situation - der Expert Advisor stoppt den Handel mit dem ersten Tick, wenn der Freitag kommt.
Hier sind die Ausdrucke aus dem Journal von Expert Advisor:
Broker #1, Demo:
0 05:59:47.731 Scalper GBPAUDpt,M1: Finish In Friday = 2014.10.23 23:44:00
Makler 2, real:
0 03:00:11.999 Scalper EURUSD,M1: Finish In Freitag = 2014.10.23 23:44:00
Das heißt, wenn der Tagesbalken von heute (Freitag, 24. Oktober) auf dem ersten Tick erscheint, wird der EA
konvertiert die Zeile "23:59" in die Uhrzeit von gestern, anstatt den heutigen Tag zuzuordnen.
Wenn der Expert Advisor jedoch am Freitag mitten am Tag neu gestartet wird, bestimmt er den Zeitpunkt der Fertigstellung korrekt.
Ich habe die Ursache für dieses Problem gefunden: https://forum.mql4.com/33023
Wie erwartet, handelt es sich praktisch um einen Fehler in der Funktion StringToTime. Die Symptome sind alle ähnlich. Diese Funktion konvertiert den String "23:59" in datetime mit dem Datum des lokalen PCs, aber nicht mit dem Datum von MT4. Und im Tester wird, wie wir wissen, das Datum des lokalen PCs emuliert und mit der Terminalzeit gleichgesetzt. Das ist der Grund, warum im Tester alles richtig funktioniert, aber in der Demo/Echtzeit kommt es zu Pannen und Verlusten. Natürlich steht in der Dokumentation nicht, woher das Datum kommt, und der obige Link zeigt, dass dieses Problem vor 4 Jahren gemeldet wurde, aber anscheinend ist es den Methaquotes egal.
RefreshRates(); // Обновим данные
_Bid=MarketInfo( "GBPUSD",MODE_BID);
if (_Bid>=gPoint1)
{
for(pos=OrdersTotal();pos>=0;pos--)
{
OrderClose(OrderTicket()-1,OrderLots(),_Bid,15);
}
}
Eine andere Frage. Verstehe ich das richtig?
1. Die Auftragsnummerierung beginnt bei "0".
2. dieser Code absolut alle Aufträge schließt, unabhängig davon, ob ich sie manuell oder programmatisch öffne? D.h., wir werden nie einen Auftrag finden, den dieser Teil des Programms nicht abschließen kann?
Hat schon jemand einen Lauftext auf dem Bildschirm erstellt? Zum Beispiel - Auftrag so und so geöffnet/geschlossen/geändert, etc. Neuigkeiten gibt es so und so... ?
Wenn Sie nichts dagegen haben, zeigen Sie mir bitte einen Teil des Codes.
Hat schon jemand einen Lauftext auf dem Bildschirm erstellt? Zum Beispiel - Auftrag so und so geöffnet/geschlossen/geändert, etc. Neuigkeiten gibt es so und so... ?
Wenn Sie nichts dagegen haben, zeigen Sie mir bitte einen Teil des Codes.
//+------------------------------------------------------------------+// Если bool print = true или нет окна индикатора, то функция будет выводить сообщения в журналvoid iPrint(string mess1, int sz=9, color color1=clrDarkGray,
string mess2="", color color2=clrDarkGray,
string mess3="", color color3=clrDarkGray,
string mess4="", color color4=clrDarkGray,
bool draws=true) {
string NameGrafText, message, nm;
int i, y, k, shift, Win_Num=-1, num=0;
color cl;
Win_Num=WindowFind("Win_Inform");
if (mess1=="") {
//Print("Func iPrint: Передана пустая строка, выходим");return;
}
if (!draws || Win_Num<0) {
message=mess1+mess2+mess3+mess4;
Print(message);
return;
}
k=ArraySize(Mass_Name_Message)-1;
if (StringLen(mess1)>0) num++;
if (StringLen(mess2)>0) num++;
if (StringLen(mess3)>0) num++;
if (StringLen(mess4)>0) num++;
// Смещение и перекрашивание старых сообщений for (i=k; i>=0; i--) {
NameGrafText=Mass_Name_Message[i];
if (StringLen(NameGrafText)>0) {
if (ObjectFind(NameGrafText)==Win_Num) {
if (i+num>k) { // Удаляем самую верхнюю строчкуObjectDelete(NameGrafText);
Mass_Name_Message[i]="";
}
elseif (i+num<=k) { // Сдвигаем и перекрашиваем старые сообщения
Mass_Name_Message[i+num]=Mass_Name_Message[i];
y=(int)ObjectGet(NameGrafText, OBJPROP_YDISTANCE); // старая координата Y
ObjectSet (NameGrafText, OBJPROP_YDISTANCE, y+(sz+1)*num); // новая координата Y
ObjectSet (NameGrafText, OBJPROP_COLOR, clrDimGray); // новый цвет
}
}
}
}
// Вывод новых сообщений
shift=num;
uint v=GetTickCount();
for (i=0; i<num; i++) {
shift--;
NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v); // Уникальное имя объектаint app=0;
while (ObjectFind(NameGrafText)==Win_Num) { // Если всё-таки такой объект есть
app++;
NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v)+"_"+IntegerToString(app); // добавим к его имени "хвостик"
}
Mass_Name_Message[num-1-i]=NameGrafText;
switch (i) {
case0: message=mess1; cl=color1; break;
case1: message=mess2; cl=color2; break;
case2: message=mess3; cl=color3; break;
case3: message=mess4; cl=color4; break;
default:message=mess1; cl=color1; break;
}
ObjectCreate (NameGrafText, OBJ_LABEL, Win_Num, 0, 0);
ObjectSetText(NameGrafText, message, sz, "Courier New", cl);
ObjectSet (NameGrafText, OBJPROP_COLOR, cl); // цвет
ObjectSet (NameGrafText, OBJPROP_CORNER, 2); // угол
ObjectSet (NameGrafText, OBJPROP_XDISTANCE, 150); // координата Х
ObjectSet (NameGrafText, OBJPROP_YDISTANCE, 2+(sz+1)*shift); // координата Y
WindowRedraw();
}
}
//+------------------------------------------------------------------+
Als Beispiel für die Verwendung einer einfarbigen Nachricht (Sie können 4 Farben in einer Zeile für verschiedene Wörter verwenden):
if(get.BarOpenLastPos(sy,PERIOD_H4,OP_SELL,mn)!=0) {
string mess1="На D1 вниз, на H4 ниже SAR, M15 сигнал. Продаём";
iPrint(mess1,9,clrBlue);
trade.OpenS(sy,lots,mn,0.0,0.0,co);
}
Im Diagramm sollte ein leerer Indikator mit dem Namen Win_Inform vorhanden sein.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
Hallo! Könnten Sie mir bitte sagen, warum ich manchmal einen ifle-Operator habe, der nicht funktioniert?
Hier ist ein Beispiel:
Wobei:
H3 ist der Preiswert des Levels
price ist der aktuelle Preis
Das Ergebnis ist, dass der Preis dieses Level erreicht (manchmal sogar an ihm stoppt), aber der Alarm nicht ausgelöst wird.
Können Sie mir sagen, was der Fehler ist?
Guten Morgen.
Das Programm sieht folgendermaßen aus.
Beim Kompilieren gibt es einen Fehler:
Ozero.mq4'Ozero.mq4 1 1
Rückgabewert von 'OrderClose' sollte überprüft werden Ozero.mq4 46 13
implizite Umwandlung von 'Zahl' in 'String' Ozero.mq4 49 117
0 Fehler, 2 Warnung(en) 1 3
Die Registerkarte "Ergebnisse" zeigt an, dass Aufträge geöffnet und geschlossen werden.
1 2014.08.25 00:00 kaufen 1 0.10 1.6550 0.0000 0.0000 0.00 10000.00
2 2014.08.25 06:30 close 1 0.10 1.6562 0.0000 0.0000 0.12 10000.12
3 2014.08.25 06:31 kaufen 2 0.10 1.6564 0.0000 0.0000 0.00 10000.12
4 2014.08.25 10:00 close 2 0.10 1.6574 0.0000 0.0000 0.10 10000.22
5 2014.08.25 10:00 kaufen 3 0.10 1.6576 0.0000 0.0000 0.00 10000.22
6 2014.08.25 12:58 close 3 0.10 1.6586 0.0000 0.0000 0.10 10000.32
7 2014.08.25 12:58 kaufen 4 0.10 1.6590 0.0000 0.0000 0.00 10000.32
8 2014.08.26 13:13 close at stop 4 0.10 1.6576 0.0000 0.0000 -0.14 10000.18
8 - Ich habe die Arbeit unterbrochen, indem ich das Prüfgerät geschlossen habe.
Als nächstes sehen wir uns das "Journal" an:
2014.10.31 07:46:44.837 GBPUSD,M15: 4453 Tick-Ereignisse (5608 Balken, 340128 Balkenzustände) innerhalb von 312876 ms verarbeitet (Gesamtzeit 324436 ms)
2014.10.31 07:46:44.837 2014.08.26 13:13 Tester: Auftrag #4 ist abgeschlossen
2014.10.31 07:46:44.798 2014.08.26 13:13 Visueller Prüfer gestoppt
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: ORDER OPEN 4
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: open #4 buy 0.10 GBPUSD at 1.6590 ok
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: Open #4 buy 0.10 GBPUSD at 1.6590 ok
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: Ich glaube nicht, dass er geschlossen wurde. Hier ist es: 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: OrderClose Fehler 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: unbekanntes Ticket 3 für OrderClose-Funktion
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: close #3 buy 0.10 GBPUSD at 1.6576 at price 1.6586
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: HOLD OPEN #3
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: open #3 buy 0.10 GBPUSD at 1.6576 ok
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: Position #1 eröffnen
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: Was ist los? Hier ist es: 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: OrderClose Fehler 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: unbekanntes Ticket 2 für OrderClose-Funktion
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: close #2 buy 0.10 GBPUSD at 1.6564 at price 1.6574
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: HOLD OPEN 2
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: open #2 buy 0.10 GBPUSD at 1.6564 ok
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: Eröffnung der ersten Position
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: Was ist los? Hier ist es: 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: OrderClose Fehler 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: unbekanntes Ticket 1 für OrderClose-Funktion
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: close #1 buy 0.10 GBPUSD at 1.6550 at price 1.6562
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: ORDER OPEN 1
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: open #1 buy 0.10 GBPUSD at 1.6550 ok
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: open #1 buy 0.10 GBPUSD at 1.6550 ok
2014.10.31 07:41:31.958 Ozero Eingaben: gLot=0.1; gPoint=0.001;
Jetzt bin ich völlig ratlos. Einerseits werden die Aufträge geschlossen, wie Sie im Chart und in den Ergebnissen sehen können, andererseits wird der Code mit Fehlern ausgeführt, wie im Log zu sehen ist: (((((((((((
Ozero.
Sie versuchen, denselben Auftrag zweimal abzuschließen. Entfernen Sie den oberen Teil.
Guten Morgen.
Zwei Zeilen wurden gestrichen. Alles funktioniert. Und alles wird korrekt im Diagramm, in den Ergebnissen und in den Protokollen angezeigt.
Frage: Beim Kompilieren gibt es eine
'Ozero.mq4'Ozero.mq4 1 1
Rückgabewert von 'OrderClose' sollte überprüft werden Ozero.mq4 46 13
0 Fehler, 1 Warnung(en) 1 2
Wovor warnt mich der Compiler? Die 46. Zeile ist OrderClose(OrderTicket(),OrderLots(),_Bid,15);
Ozero.
Könnt ihr mir sagen, was die Ursache für die heute aufgetretene Störung sein könnte?
Der EA hat die Option, den Handel 15 Minuten vor Börsenschluss am Freitag zu beenden.
Wenn ein neuer Tag erscheint, prüft der EA, ob es Freitag ist, dann beenden wir heute den Handel in StringToTime("23:59")-15*60
Im Strategietester funktioniert diese Funktion korrekt, aber im realen Handel sehe ich eine völlig andere Situation - der Expert Advisor stoppt den Handel mit dem ersten Tick, wenn der Freitag kommt.
Hier sind die Ausdrucke aus dem Journal von Expert Advisor:
Broker #1, Demo:
0 05:59:47.731 Scalper GBPAUDpt,M1: Finish In Friday = 2014.10.23 23:44:00
Makler 2, real:
0 03:00:11.999 Scalper EURUSD,M1: Finish In Freitag = 2014.10.23 23:44:00
Das heißt, wenn der Tagesbalken von heute (Freitag, 24. Oktober) auf dem ersten Tick erscheint, wird der EA
konvertiert die Zeile "23:59" in die Uhrzeit von gestern, anstatt den heutigen Tag zuzuordnen.
Wenn der Expert Advisor jedoch am Freitag mitten am Tag neu gestartet wird, bestimmt er den Zeitpunkt der Fertigstellung korrekt.
Ich habe die Ursache für dieses Problem gefunden: https://forum.mql4.com/33023
Wie erwartet, handelt es sich praktisch um einen Fehler in der Funktion StringToTime. Die Symptome sind alle ähnlich. Diese Funktion konvertiert den String "23:59" in datetime mit dem Datum des lokalen PCs, aber nicht mit dem Datum von MT4. Und im Tester wird, wie wir wissen, das Datum des lokalen PCs emuliert und mit der Terminalzeit gleichgesetzt. Das ist der Grund, warum im Tester alles richtig funktioniert, aber in der Demo/Echtzeit kommt es zu Pannen und Verlusten. Natürlich steht in der Dokumentation nicht, woher das Datum kommt, und der obige Link zeigt, dass dieses Problem vor 4 Jahren gemeldet wurde, aber anscheinend ist es den Methaquotes egal.
Eine andere Frage. Verstehe ich das richtig?
1. Die Auftragsnummerierung beginnt bei "0".
2. dieser Code absolut alle Aufträge schließt, unabhängig davon, ob ich sie manuell oder programmatisch öffne? D.h., wir werden nie einen Auftrag finden, den dieser Teil des Programms nicht abschließen kann?
Ozero.
Hat schon jemand einen Lauftext auf dem Bildschirm erstellt? Zum Beispiel - Auftrag so und so geöffnet/geschlossen/geändert, etc. Neuigkeiten gibt es so und so... ?
Wenn Sie nichts dagegen haben, zeigen Sie mir bitte einen Teil des Codes.
Danke!
Die untere ist besser. Die Reihenfolge muss im Voraus festgelegt werden.
So ist es besser:
Hat schon jemand einen Lauftext auf dem Bildschirm erstellt? Zum Beispiel - Auftrag so und so geöffnet/geschlossen/geändert, etc. Neuigkeiten gibt es so und so... ?
Wenn Sie nichts dagegen haben, zeigen Sie mir bitte einen Teil des Codes.
Senx!
Vertikales Scrollen im leeren Anzeigefenster. Hier ist die Funktion:
Als Beispiel für die Verwendung einer einfarbigen Nachricht (Sie können 4 Farben in einer Zeile für verschiedene Wörter verwenden):
Im Diagramm sollte ein leerer Indikator mit dem Namen Win_Inform vorhanden sein.