Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 212

 
geratdc:

Bonjour,


Je recherche les informations suivantes :

1. concernant la mise en œuvre de notifications par SMS lors du traitement d'événements clés dans le travail du conseiller expert.

La réalisation de l'ouverture et de la fermeture du commerce de 12-00 PST à 18-00 PST (avec notification par sms bien sûr :) du début et de la fin d'une session de commerce hebdomadaire).

A propos de la mise en œuvre d'une notification par e-mail après la fin du trade (18-00 PTN) - envoi d'un rapport sur le travail du conseiller pour une session de trading hebdomadaire, dans le testeur, avec un graphique et l'indication des dates d'ouverture, des dates de fermeture, des prix, des profits/pertes après la fermeture des positions. Ou les rapports seront-ils au format txt ?


Veuillez indiquer quelles fonctions ou quels scripts permettront de l'implémenter ? Comment puis-je le faire ? Il existe peut-être un sujet à ce sujet - les notifications et les rapports par SMS et par e-mail.

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

Voici quelque chose comme ça, mais pour faire plus simple)))


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

L'algorithme des notifications par sms n'est pas mauvais, notre EA nous envoie un email, et l'opérateur email nous envoie le texte de la lettre. Tout est brillamment simple. Il suffit d'enregistrer son téléphone portable. C'est plus facile maintenant.

Je vais aller lire, j'ai trouvé une fonction similaire - SendMail().je me demande si c'est bien compliqué ?

Il y a si longtemps que tout cela est devenu une norme. Utilisez les messages push au lieu des sms, SendMail() l'a déjà trouvé.
 

Bonjour à tous !

Faites ce code - supprimez toutes les commandes en une fois.

//===================================================================
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;
}

Le problème est que presque toutes les commandes sont fermées. Mais nous avons encore 1-2 commandes qui ne sont pas supprimées.

Et peu importe le nombre de fois où j'accède à cette fonction, celle-ci ne clôture pas les ordres restants.

Je reçois une erreur indiquant un mauvais prix.

Je pensais que c'était des requotes mais si nous demandons cette fonction 500000 fois déjà, quelles peuvent être les requotes ?

Qu'est-ce qui ne peut pas être le mauvais prix?

Je n'ai jamais eu une telle absurdité avec d'autres EA.

 
Valerius:

Bonjour à tous !

Faites ce code - supprimez toutes les commandes en une fois.

Le problème est que presque toutes les commandes sont fermées. Mais nous avons encore 1-2 commandes qui ne sont pas supprimées.

Et peu importe le nombre de fois où j'accède à cette fonction, celle-ci ne clôture pas les ordres restants.

Je reçois une erreur indiquant un mauvais prix.

Je pensais que c'était des requotes mais si nous demandons cette fonction 500000 fois déjà, quelles peuvent être les requotes ?

Qu'est-ce qui ne peut pas être le mauvais prix ?

Je n'ai jamais eu une telle absurdité avec d'autres EA.

S'il y a beaucoup de commandes, le prix a le temps de se périmer. Ajoutez RefreshRates() et ça devrait être bon.
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
 
Alexey Viktorov:
S'il y a beaucoup de commandes, le prix a le temps de devenir obsolète. Ajoutez RefreshRates() et tout devrait bien se passer.

C'est ça le problème : il reste une ou deux commandes.

J'ai fait un cycle d'appels à cette fonction jusqu'à ce que tous les ordres soient supprimés.

En principe, si l'ordre est d'achat, il doit être clôturé par Bid, et le prix actuel n'a pas d'importance.

Il devrait être fermé par Bid à n'importe quel prix.

Et si nous avons adressé cette fonction plusieurs milliers de fois, le prix devrait se fermer de toute façon.

Ou peut-être que je ne comprends pas quelque chose ?

 
Valerius:

C'est ça le problème : il reste une ou deux commandes.

J'ai fait un cycle d'appels à cette fonction jusqu'à ce que tous les ordres soient supprimés.

En théorie, si l'ordre est d'achat, il devrait être clôturé par Bid et le prix actuel n'a pas d'importance.

Il devrait être fermé par Bid à n'importe quel prix.

Et si nous avons adressé cette fonction plusieurs milliers de fois, le prix devrait se fermer de toute façon.

Ou y a-t-il quelque chose que je ne comprends pas ?

Y a-t-il des erreurs dans le journal lors de la suppression ?

Le prix peut aller assez loin au cours du cycle. Ask et Bid sont des constantes qui sont mises à jour soit de manière forcée (en appelant RefreshRates()), soit lors du traitement d'un nouveau tick. Ainsi, après chaque tour de boucle, appelez RefreshRates() et voyez ce qui se passe.

 
Merci, je vais essayer.
 
Valerius:
C'est le problème, il reste une ou deux commandes.
J'ai fait une boucle d'appels à cette fonction jusqu'à ce que tous les ordres soient supprimés.
En théorie, si l'ordre est d'achat, il devrait être clôturé par l'offre et le prix qu'il atteint à ce moment-là importe peu.
Il devrait être fermé par Bid à n'importe quel prix.
Et si nous avons adressé cette fonction plusieurs milliers de fois, le prix devrait se fermer de toute façon.
Ou peut-être que je ne comprends pas quelque chose ?

Essayez 1) de remplacer Print par Alert pour voir le résultat à l'écran immédiatement - c'est plus rapide 2) Vous obtenez le code d'erreur à cet endroit. Imprimez-le et voyez 3) Obtenez et imprimez le code d'erreur de la fonction OrderSelect et immédiatement OrderSymbol(), OpderType(), OrderTicket()

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

Essayez 1) de remplacer Print par Alert pour voir le résultat à l'écran immédiatement - c'est plus rapide 2) Vous obtenez le code d'erreur à cet endroit. Imprimez-le et voyez 3) Obtenez et imprimez le code d'erreur de la fonction OrderSelect et immédiatement OrderSymbol(), OpderType(), OrderTicket().


J'ai également essayé RefreshRates(). Rien n'a changé. Alerte - identique à l'impression, donne - paramètres erronés.

Erreur 3.

Je me suis levé le matin et j'ai vu que l'EA s'était déclenché et affichait la fonction de suppression de tous les ordres de toute la nuit.

Le compteur de demandes affiche plusieurs millions de demandes. Cela signifie que les commandes ne sont pas supprimées.

Cet EA vérifie également si tous les ordres sont supprimés, c'est comme une assurance. S'il y a des commandes, nous appellerons le

La fonction d'effacement est sollicitée. Le programme se bloque. Cela signifie que la boucle ne s'arrêtera pas tant que tous les ordres n'auront pas été supprimés.

De tels problèmes se produisent sur 2 paires de devises. J'ai déjà perdu la tête. Que faire ?

 
Valerius:


J'ai essayé RefreshRates(). Rien n'a changé. Alerte - même chose que pour l'impression, il est dit - mauvais paramètres.

Erreur 3.

Je me suis réveillé ce matin et j'ai vu que l'EA s'était déclenché et affichait un appel pour supprimer tous les ordres de la nuit.

Le compteur de demandes affichait plusieurs millions de demandes. Cela signifie que les commandes ne sont pas supprimées.

Cet EA vérifie également si tous les ordres sont supprimés, c'est comme une assurance. S'il y a des commandes, nous appellerons le

La fonction d'effacement est sollicitée. Le programme se bloque. Cela signifie que la boucle ne s'arrêtera pas tant que tous les ordres n'auront pas été supprimés.

De tels problèmes se produisent sur 2 paires de devises. J'ai déjà perdu la tête. Que faire ?

Et qu'est-ce que la fonction error() ?

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

C'est peut-être le problème.

 
Alexey Viktorov:

Qu'est-ce que la fonction error() ?

Il est possible que le problème vienne de là.


La fonction error() affiche simplement un code d'erreur. Il n'y a aucun problème avec cette fonction, je l'ai dans de nombreux EAs et je ne la modifie jamais.

Donc ce n'est certainement pas le problème.

La fonction elle-même est juste ici :

//====================================================================
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);
}