Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 212

 
geratdc:

Hallo,


Ich suche die folgenden Informationen:

1. hinsichtlich der Implementierung von SMS-Benachrichtigungen bei der Verarbeitung von Schlüsselereignissen in der Arbeit des Expert Advisors.

Über die Durchführung der Eröffnung und Schließung des Handels von 12-00 PST bis 18-00 PST (natürlich mit SMS-Benachrichtigung :) über den Beginn und das Ende einer wöchentlichen Handelssitzung).

Über die Implementierung einer E-Mail-Benachrichtigung nach Abschluss des Handels (18-00 PTN) - Senden eines Berichts über die Arbeit des Beraters für eine wöchentliche Handelssitzung, im Tester, mit einem Diagramm und Angabe der Daten der Eröffnung, Schließung, Preise, Gewinne/Verluste nach Schließung der Positionen. Oder werden die Berichte im txt-Format vorliegen?


Welche Funktionen oder Skripte werden dies umsetzen? Wie kann ich das machen? Vielleicht gibt es ein Thema dazu - SMS- und E-Mail-Benachrichtigungen und Berichte.

https://www.mql5.com/ru/articles/1454

Hier ist etwas in dieser Art, aber um es einfacher zu machen)))


https://www.mql5.com/ru/forum/53920

Der Algorithmus der SMS-Benachrichtigungen ist nicht schlecht, unser EA schickt uns eine E-Mail, und der E-Mail-Betreiber schickt uns den Text des Briefes. Alles genial einfach. Alles, was wir brauchen, ist die Registrierung unseres Mobiltelefons. Jetzt ist es einfacher.

Ich werde lesen gehen, ich fand eine ähnliche Funktion - SendMail().Ich frage mich, wie kompliziert es ist?

All das ist schon so lange her, dass es einen solchen Standard gibt. Verwenden Sie Push-Nachrichten anstelle von SMS, SendMail() hat sie bereits gefunden.
 

Guten Tag zusammen!

Machen Sie diesen Code - löschen Sie alle Bestellungen auf einmal.

//===================================================================
void delete_all_orders()
{
bool err;
int ot;
for(int iss=OrdersTotal()-1; iss>=0; iss--)
   {
    if(OrderSelect(iss, SELECT_BY_POS, MODE_TRADES))
      {
       if(OrderSymbol()==Symbol())
         {
          if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
           {
            ot=OrderTicket();
            Print("Удаляем ордер тикет - ",OrderTicket());
            err=OrderDelete(OrderTicket(),clrNONE);
            if(err==false) error(GetLastError());
            Print("Удален ордер тикет - ",ot);
           }
          if(OrderType()==OP_BUY)
           {
            ot=OrderTicket();
            Print("Удаляем ордер тикет - ",OrderTicket());
            err=OrderClose(OrderTicket(),OrderLots(),Bid,10,clrNONE);
            if(err==false) error(GetLastError());
            Print("Удален ордер тикет - ",ot);
           }
          if(OrderType()==OP_SELL)
           {
            ot=OrderTicket();
            Print("Удаляем ордер тикет - ",OrderTicket());
            err=OrderClose(OrderTicket(),OrderLots(),Ask,10,clrNONE);
            if(err==false) error(GetLastError());
            Print("Удален ордер тикет - ",ot);
           }
         }
      }
   }
return;
}

Das Problem ist, dass fast alle Aufträge abgeschlossen sind. Aber wir haben immer noch 1-2 Bestellungen, die nicht gelöscht werden.

Und egal, wie oft ich diese Funktion aufrufe, die Funktion schließt die verbleibenden Aufträge nicht.

Ich erhalte eine Fehlermeldung mit einem falschen Preis.

Ich dachte, dass es sich um Requotes handelt, aber wenn wir diese Funktion bereits 500000 Mal angefordert haben, was können dann Requotes sein?

Was kann nicht der falsche Preis sein?

So einen Unsinn habe ich bei anderen EAs noch nie erlebt.

 
Valerius:

Guten Tag zusammen!

Machen Sie diesen Code - löschen Sie alle Bestellungen auf einmal.

Das Problem ist, dass fast alle Aufträge abgeschlossen sind. Aber wir haben immer noch 1-2 Bestellungen, die nicht gelöscht werden.

Und egal, wie oft ich diese Funktion aufrufe, die Funktion schließt die verbleibenden Aufträge nicht.

Ich erhalte eine Fehlermeldung mit einem falschen Preis.

Ich dachte, dass es sich um Requotes handelt, aber wenn wir diese Funktion bereits 500000 Mal angefordert haben, was können dann Requotes sein?

Was kann nicht der falsche Preis sein?

So einen Unsinn habe ich bei anderen EAs noch nie erlebt.

Wenn es viele Bestellungen gibt, hat der Preis Zeit, sich zu veralten. Fügen Sie RefreshRates() hinzu und es sollte alles in Ordnung sein.
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
 
Alexey Viktorov:
Wenn es viele Bestellungen gibt, hat der Preis Zeit, sich zu veralten. Fügen Sie RefreshRates() hinzu, und es sollte alles in Ordnung sein.

Das ist die Sache: Ein oder zwei Aufträge sind noch übrig.

Ich habe einen Zyklus von Aufrufen dieser Funktion durchgeführt, bis alle Aufträge gelöscht sind.

Wenn es sich um einen Kaufauftrag handelt, sollte er mit Bid geschlossen werden, und es spielt keine Rolle, welchen Preis er jetzt hat.

Es sollte bis zum Gebot zu jedem Preis schließen.

Und wenn wir diese Funktion viele tausend Mal angesprochen haben, sollte sich der Preis sowieso schließen.

Oder verstehe ich vielleicht etwas nicht?

 
Valerius:

Das ist die Sache: Ein oder zwei Aufträge sind noch übrig.

Ich habe einen Zyklus von Aufrufen dieser Funktion durchgeführt, bis alle Aufträge gelöscht sind.

Theoretisch sollte ein Kaufauftrag durch Bid geschlossen werden, und es spielt keine Rolle, welchen Preis er jetzt hat.

Es sollte bis zum Gebot zu jedem Preis schließen.

Und wenn wir diese Funktion viele tausend Mal angesprochen haben, sollte sich der Preis sowieso schließen.

Oder gibt es etwas, das ich nicht verstehe?

Gibt es beim Löschen Fehler im Protokoll?

Der Preis kann während des Zyklus weit genug steigen. Ask und Bid sind Konstanten, die entweder zwangsweise (beim Aufruf von RefreshRates()) oder bei der Verarbeitung eines neuen Ticks aktualisiert werden. Rufen Sie also nach jedem Schleifendurchlauf RefreshRates() auf und sehen Sie, was passiert.

 
Danke, ich werde es ausprobieren.
 
Valerius:
Das ist es ja, es gibt noch ein oder zwei Bestellungen.
Ich habe eine Schleife von Aufrufen dieser Funktion gemacht, bis alle Aufträge gelöscht sind.
Theoretisch sollte ein Kaufauftrag durch Bid geschlossen werden, und es spielt keine Rolle, welcher Preis zu diesem Zeitpunkt gilt.
Es sollte bis zum Gebot zu jedem Preis schließen.
Und wenn wir diese Funktion viele tausend Mal angesprochen haben, sollte sich der Preis sowieso schließen.
Oder verstehe ich vielleicht etwas nicht?

Versuchen Sie 1) Print durch Alert zu ersetzen, um das Ergebnis sofort auf dem Bildschirm zu sehen - das ist schneller 2) Sie erhalten dort den Fehlercode. Drucken Sie es aus und sehen Sie 3) Holen Sie den Fehlercode der Funktion OrderSelect und sofort OrderSymbol(), OpderType(), OrderTicket() ein und drucken Sie ihn aus

if (! OrderSelect(.......))
{
  Alert(GetLastError());
  continue;
}
Alert("OrderSymbol = ",OrderSymbol(), "   OpderType = ", OpderType(), "   OrderTicket = ", OrderTicket());
 
STARIJ:

Versuchen Sie 1) Print durch Alert zu ersetzen, um das Ergebnis sofort auf dem Bildschirm zu sehen - das ist schneller. 2) Sie erhalten den Fehlercode dort. Drucken Sie es aus und sehen Sie 3) Holen Sie den Fehlercode der Funktion OrderSelect und sofort OrderSymbol(), OpderType(), OrderTicket() ein und drucken Sie ihn aus.


Ich habe auch RefreshRates() ausprobiert. Es hat sich nichts geändert. Alert - wie Print, gibt - falsche Parameter aus.

Fehler 3.

Ich stand am Morgen auf und sah, dass der EA ausgelöst hatte und die Funktion zum Löschen aller Aufträge der ganzen Nacht anzeigte.

Der Zähler der Anfragen zeigt mehrere Millionen Anfragen an. Das bedeutet, dass die Aufträge nicht gelöscht werden.

Dieser EA prüft auch, ob alle Aufträge gelöscht sind, er ist wie eine Versicherung. Wenn es Aufträge gibt, rufen wir die

Die Funktion des Löschens wird gefordert. Das Programm bleibt stecken. Das bedeutet, dass die Schleife nicht aufhört, bis alle Aufträge gelöscht sind.

Solche Probleme treten bei 2 Währungspaaren auf. Ich habe bereits meinen Verstand verloren. Was ist zu tun?

 
Valerius:


Ich habe RefreshRates() ausprobiert. Es hat sich nichts geändert. Alert - wie bei print, es heißt - falsche Parameter.

Fehler 3.

Ich bin heute Morgen aufgewacht und habe gesehen, dass der EA ausgelöst hat und die ganze Nacht einen Aufruf zum Löschen aller Aufträge anzeigt.

Der Zähler der Anfragen zeigte mehrere Millionen Anfragen an. Das bedeutet, dass die Aufträge nicht gelöscht werden.

Dieser EA prüft auch, ob alle Aufträge gelöscht sind, er ist wie eine Versicherung. Wenn es Aufträge gibt, rufen wir die

Die Funktion des Löschens wird gefordert. Das Programm bleibt stecken. Das bedeutet, dass die Schleife nicht aufhört, bis alle Aufträge gelöscht sind.

Solche Probleme treten bei 2 Währungspaaren auf. Ich habe bereits meinen Verstand verloren. Was ist zu tun?

Und was ist die Funktion error()?

            if(err==false) error(GetLastError());
            Print("Удален ордер тикет - ",ot);

Das könnte das Problem sein.

 
Alexey Viktorov:

Was ist die Funktion error()?

Es ist möglich, dass dies das Problem ist.


Die Funktion error() zeigt lediglich einen Fehlercode an. Es gibt kein Problem mit dieser Funktion, ich habe sie in vielen EAs und ich ändere sie nie.

Es ist also definitiv nicht das Problem.

Die Funktion selbst ist hier zu finden:

//====================================================================
int error(int errr)
{
string descr;
switch(errr)
  {
  // Коды ошибок, возвращаемые торговым сервером или клиентским терминалом:
  case 0:    descr= ""; return(0);
  case 1:    descr= "Нет ошибки, но результат не известен"; break;
  case 2:    descr= "Общая ошибка"; break;
  case 3:    descr= "Неправильные параметры"; break;
  case 4:    descr= "Торговый сервер занят"; break;
  case 5:    descr= "Старая версия клиентского терминала"; break;
  case 6:    descr= "Нет связи с торговым сервером"; break;
  case 7:    descr= "Недостаточно прав"; break;
  case 8:    descr= "Слишком частые запросы"; break;
  case 9:    descr= "Недопустимая операция нарушающая функционирование сервера"; break;
  case 64:   descr= "Счет заблокирован"; break;
  case 65:   descr= "Неправильный номер счета"; break;
  case 128:  descr= "Истек срок ожидания совершения сделки"; break;
  case 129:  descr= "Неправильная цена"; break;
  case 130:  descr= "Неправильные стопы"; break;
  case 131:  descr= "Неправильный объем"; break;
  case 132:  descr= "Рынок закрыт"; break;
  case 133:  descr= "Торговля запрещена"; break;
  case 134:  descr= "Недостаточно денег для совершения операции"; break;
  case 135:  descr= "Цена изменилась"; break;
  case 136:  descr= "Нет цен"; break;
  case 137:  descr= "Брокер занят"; break;
  case 138:  descr= "Новые цены"; break;
  case 139:  descr= "Ордер заблокирован и уже обрабатывается"; break;
  case 140:  descr= "Разрешена только покупка"; break;
  case 141:  descr= "Слишком много запросов"; break;
  case 145:  descr= "Модификация запрещена, так как ордер слишком близок к рынку"; break;
  case 146:  descr= "Подсистема торговли занята"; break;
  case 147:  descr= "Использование даты истечения ордера запрещено брокером"; break;
  case 148:  descr= "Количество открытых и отложенных ордеров достигло предела, установленного брокером"; break;
  case 149:  descr= "Попытка открыть противоположную позицию к уже существующей, если хеджирование запрещено"; break;
  case 150:  descr= "Попытка закрыть позицию по инструменту в противоречии с правилом FIFO"; break;
  case 4000: /*descr= "Нет ошибки";*/ return(0);
  case 4001: descr= "Неправильный указатель функции"; break;
  case 4002: descr= "Индекс массива - вне диапазона"; break;
  case 4003: descr= "Нет памяти для стека функций"; break;
  case 4004: descr= "Переполнение стека после рекурсивного вызова"; break;
  case 4005: descr= "На стеке нет памяти для передачи параметров"; break;
  case 4006: descr= "Нет памяти для строкового параметра"; break;
  case 4007: descr= "Нет памяти для временной строки"; break;
  case 4008: descr= "Неинициализированная строка"; break;
  case 4009: descr= "Неинициализированная строка в массиве"; break;
  case 4010: descr= "Нет памяти для строкового массива"; break;
  case 4011: descr= "Слишком длинная строка"; break;
  case 4012: descr= "Остаток от деления на ноль"; break;
  case 4013: descr= "Деление на ноль"; break;
  case 4014: descr= "Неизвестная команда"; break;
  case 4015: descr= "Неправильный переход"; break;
  case 4016: descr= "Неинициализированный массив"; break;
  case 4017: descr= "Вызовы DLL не разрешены"; break;
  case 4018: descr= "Невозможно загрузить библиотеку"; break;
  case 4019: descr= "Невозможно вызвать функцию"; break;
  case 4020: descr= "Вызовы внешних библиотечных функций не разрешены"; break;
  case 4021: descr= "Недостаточно памяти для строки, возвращаемой из функции"; break;
  case 4022: descr= "Система занята"; break;
  case 4050: descr= "Неправильное количество параметров функции"; break;
  case 4051: descr= "Недопустимое значение параметра функции"; break;
  case 4052: descr= "Внутренняя ошибка строковой функции"; break;
  case 4053: descr= "Ошибка массива"; break;
  case 4054: descr= "Неправильное использование массива-таймсерии"; break;
  case 4055: descr= "Ошибка пользовательского индикатора"; break;
  case 4056: descr= "Массивы несовместимы"; break;
  case 4057: descr= "Ошибка обработки глобальныех переменных"; break;
  case 4058: descr= "Глобальная переменная не обнаружена"; break;
  case 4059: descr= "Функция не разрешена в тестовом режиме"; break;
  case 4060: descr= "Функция не подтверждена"; break;
  case 4061: descr= "Ошибка отправки почты"; break;
  case 4062: descr= "Ожидается параметр типа string"; break;
  case 4063: descr= "Ожидается параметр типа integer"; break;
  case 4064: descr= "Ожидается параметр типа double"; break;
  case 4065: descr= "В качестве параметра ожидается массив"; break;
  case 4066: descr= "Запрошенные исторические данные в состоянии обновления"; break;
  case 4099: descr= "Конец файла"; break;
  case 4100: descr= "Ошибка при работе с файлом"; break;
  case 4101: descr= "Неправильное имя файла"; break;
  case 4102: descr= "Слишком много открытых файлов"; break;
  case 4103: descr= "Невозможно открыть файл"; break;
  case 4104: descr= "Несовместимый режим доступа к файлу"; break;
  case 4105: descr= "Ни один ордер не выбран"; break;
  case 4106: descr= "Неизвестный символ"; break;
  case 4107: descr= "Неправильный параметр цены для торговой функции"; break;
  case 4108: descr= "Неверный номер тикета"; break;
  case 4109: descr= "Торговля не разрешена"; break;
  case 4110: descr= "Длинные позиции не разрешены"; break;
  case 4111: descr= "Короткие позиции не разрешены"; break;
  case 4200: descr= "Объект уже существует"; break;
  case 4201: descr= "Запрошено неизвестное свойство объекта"; break;
  case 4202: descr= "Объект не существует"; break;
  case 4203: descr= "Неизвестный тип объекта"; break;
  case 4204: descr= "Нет имени объекта"; break;
  case 4205: descr= "Ошибка координат объекта"; break;
  case 4206: descr= "Не найдено указанное подокно"; break;
  case 4207: descr= "Ошибка при работе с объектом"; break;
  }
Comment("Ошибка!  ",descr); 
Print("Ошибка!  ",descr);
return(errr);
}