Erreurs, bugs, questions - page 37

 
kirill190982:
Je vais probablement l'ignorer pour l'instant, mais dans MQL4 le compilateur ne produisait pas de telles remarques
C'est un tout autre problème, il y avait beaucoup de choses qui n'étaient pas là... :)
 
Interesting:

Les variables sont probablement correctes. Veuillez consulter mon message ci-dessus...

Je ne sais pas, si vous convertissez double en int, il y aura certainement une perte, et si vice versa, il y aura très probablement une erreur lors de la normalisation, puisque la deuxième valeur de la fonction est de type int.
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
Interesting:

Question aux développeurs concernant les événements "utilisateurs" et plusieurs experts travaillant sur le même terminal.

Je veux savoir si je veux arranger les choses ou pas ?


L'idée est la suivante

Au cours de la pièce, nous devons informer les experts "voisins" de certains des processus en cours.

...

S'il s'agit d'une bonne idée, elle peut être terminée et formatée comme un article. Ou l'ajouter à la section d'aide consacrée aux événements des utilisateurs ?

Il existe un exemple pour la fonction EventChartCustom:

//+------------------------------------------------------------------+
//|                                            ButtonClickExpert.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
 
string buttonID="Button";
string labelID="Info";
int broadcastEventID=5000;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- создадим кнопку, для передачи пользовательских событий
   ObjectCreate(0,buttonID,OBJ_BUTTON,0,100,100);
   ObjectSetInteger(0,buttonID,OBJPROP_COLOR,White);
   ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,Gray);
   ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,100);
   ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,200);
   ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,50);
   ObjectSetString(0,buttonID,OBJPROP_FONT,"Arial");
   ObjectSetString(0,buttonID,OBJPROP_TEXT,"Кнопка");
   ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10);
   ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0);
 
//--- создадим метку для вывода информации
   ObjectCreate(0,labelID,OBJ_LABEL,0,100,100);
   ObjectSetInteger(0,labelID,OBJPROP_COLOR,Red);
   ObjectSetInteger(0,labelID,OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,labelID,OBJPROP_YDISTANCE,50);
   ObjectSetString(0,labelID,OBJPROP_FONT,"Trebuchet MS");
   ObjectSetString(0,labelID,OBJPROP_TEXT,"Нет информации");
   ObjectSetInteger(0,labelID,OBJPROP_FONTSIZE,20);
   ObjectSetInteger(0,labelID,OBJPROP_SELECTABLE,0);
 
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectDelete(0,buttonID);
   ObjectDelete(0,labelID);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- проверим событие на нажатие кнопки мышки
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string clickedChartObject=sparam;
      //--- если нажатие на объекте с именем buttonID
      if(clickedChartObject==buttonID)
        {
         //--- состояние кнопки - нажата кнопка или нет
         bool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE);
         //--- выведем в лог отладочное сообщение
         Print("Кнопка нажата =",selected);
         int customEventID; // номер пользовательского события для отправки
         string message;    // сообщение для отправки в событии
         //--- если кнопка нажата
         if(selected)
           {
            message="Кнопка нажата";
            customEventID=CHARTEVENT_CUSTOM+1;
           }
         else // кнопка не нажата
           {
            message="Кнопка отжата";
            customEventID=CHARTEVENT_CUSTOM+999;
           }
         //--- отправим пользовательское событие "своему"графику
         EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,message);
         //--- отправим сообщение всем открытым графикам
         BroadcastEvent(ChartID(),0,"Broadcast Message");
         //--- отладочное сообщение
         Print("Отправлено событие с ID =",customEventID);
        }
      ChartRedraw();// принудительно перерисуем все объекты на графике
     }
 
//--- проверим событие на принадлежность к пользовательским событиям
   if(id>CHARTEVENT_CUSTOM)
     {
      if(id==broadcastEventID)
        {
         Print("Получили широковещательное сообщение от графика с id="+lparam);
        }
      else
        {
         //--- прочитаем текстовое сообщение в событии
         string info=sparam;
         Print("Обрабатывается ПОЛЬЗОВАТЕЛЬСКОЕ событие с ID =",id);
         //--- выведем сообщение в метке
         ObjectSetString(0,labelID,OBJPROP_TEXT,sparam);
         ChartRedraw();// принудительно перерисуем все объекты на графике
        }
     }
  }
//+------------------------------------------------------------------+
//| послать широковещательное сообщение всем открытм графикам        |
//+------------------------------------------------------------------+
void BroadcastEvent(long lparam,double dparam,string sparam)
  {
   int eventID=broadcastEventID-CHARTEVENT_CUSTOM;
   long currChart=ChartFirst();
   int i=0;
   while(i<CHARTS_MAX)          // у нас наверняка не больше CHARTS_MAX открытых графиков
     {
      EventChartCustom(currChart,eventID,lparam,dparam,sparam);
      currChart=ChartNext(currChart); // на основании предыдущего получим новый график
      if(currChart==0) break;  // достигли конца списка графиков
      i++;                     // не забудем увеличить счетчик
     }
  }
//+------------------------------------------------------------------+

Essayez-le.

 
kirill190982:
Je ne sais pas, si nous convertissons double en int, il y aura certainement une perte, mais si c'est l'inverse, il y aura très probablement une erreur lors de la normalisation, car la deuxième valeur de la fonction de type int

Si vous écrivez int en double, tout est traité normalement, le compilateur élimine simplement la partie fractionnaire (selon la règle).

Dans la situation inverse, cependant, le compilateur commence à douter, et donne un avertissement sur les problèmes possibles (comme il lui semble).

Et comme nous sommes tous au courant du fait que, lorsqu'il est nécessaire de CRÉER dans une situation similaire, nous lui "conseillons" de le faire. :)

PS

Peut-être qu'à l'avenir les développeurs désactiveront TOUTES les alertes, et alors, comme dans MQL4, le compilateur arrêtera de crier pour des choses insignifiantes...

 
Interesting:

Question aux développeurs concernant les événements "utilisateurs" et plusieurs experts travaillant sur le même terminal.

Donc je veux demander si je veux arranger les choses ou pas ?


Voici une idée.

Au cours de la pièce, nous devons informer les conseillers experts "voisins" de certains processus qui se déroulent.

Par exemple, les processus suivants doivent être surveillés en premier :

1. Verrouillage expert ;

2. Déchargement de l'Expert Advisor ;

3. Fin des opérations commerciales ;

4. Reprendre les opérations commerciales.


Mettre en œuvre

I. Créer 4 identifiants d'événements :

1 - CHARTEVENT_CUSTOM+1//Démarrage du Conseiller Expert

2 - CHARTEVENT_CUSTOM+2// Déchargement de l'Expert Advisor

3 - CHARTEVENT_CUSTOM+3 //Arrêt des opérations de trading

4 - CHARTEVENT_CUSTOM+4//Redémarrage des opérations de trading


II. Suivi des événements

Lorsqu'une certaine situation se produit, le conseiller expert génère un message WIDE en utilisant EventChartCustom.

Ce faisant, le conseiller expert écrit dans sparam un commentaire (son nom et le type d'événement, ou d'autres informations) , etlparam son propre identifiant graphique.

Les Expert Advisors des autres graphiques (s'ils peuvent identifier correctement la nature d'un événement) répondront à cet EA spécifique.


PS

Si l'idée est bonne, elle peut être finalisée et transformée en article. Ou l'ajouter à la section d'aide dédiée aux événements personnalisés ?

Et je ne vois pas l'intérêt d'utiliser plusieurs EA à la fois, surtout si vous jouez avec plusieurs outils - vous pouvez facilement faire avec un seul EA, la modification, l'ouverture et la fermeture peuvent aussi être faites par un seul EA, l'analyse d'indicateurs également
 
Rosh:

Il existe un exemple de la fonction EventChartCustom:

Essayez-le.

Oui, j'ai déjà vu cet exemple (je ne sais même pas depuis combien de temps). Je voulais demander si mon idée est correcte et intéressante en termes de mise en œuvre.

PS

Si cela ne convient pas à l'aide, alors peut-être que quelqu'un acceptera de l'affiner et d'écrire un article sur cette application des événements.

Il serait également intéressant d'utiliser des événements personnalisés sous la forme d'ordres d'un EA à un autre (ou à d'autres). Si vous résumez tout cela, cela donnerait à mon avis un article très intéressant.

Malheureusement, je n'ai pas le temps de m'en occuper...

 
kirill190982:
Et je ne vois pas l'intérêt d'utiliser plusieurs EA à la fois, surtout si vous jouez plusieurs symboles - vous pouvez facilement faire avec un seul EA, la modification, l'ouverture et la fermeture peuvent également être faites par un seul EA, l'analyse des indicateurs, aussi

Il y a toujours un sens, d'autant plus que tous les EA ne sont pas multidevises a priori (d'après l'expérience de MQL4).

Cela signifie qu'il n'est pas facile pour les débutants et pour beaucoup de ceux qui pratiquaient auparavant le trading mécanique d'organiser correctement les multidevises...


Dieu seul sait ce qui se passera si quelqu'un veut exécuter, disons, 2-3 copies de MACD Sample sur un compte.


En plus des situations différentes, d'autres Expert Advisors peuvent jouer un rôle secondaire en recevant des ordres du premier.

En outre, cette variante sera acceptable lorsque d'autres EA ("voisins") ne font pas de transactions, mais se contentent de traiter des données ou d'effectuer certaines tâches.

Des choses similaires peuvent également être mises en œuvre dans la communication entre les indices et les EA (avec une certaine approche).

PS

C'est pourquoi j'ai proposé de travailler sur cette question et si un progammeur expérimenté serait prêt à écrire un article. Je serais particulièrement heureux que les développeurs eux-mêmes consacrent un peu de leur temps à cette question.

Je pense qu'il y a assez de matière pour plus d'un article...

 
Interesting:
............

Malheureusement, je n'ai pas le temps de le faire...

Nous comprenons. Trop de temps passé à commenter tout et n'importe qui....
 
AM2:

Je regarde vMA et Close[]. Dans wotch, ça compte bien. J'ai aussi essayé comme ça :

Je reçois à nouveau une autre erreur. Il existe peut-être une autre façon de calculer la moyenne mobile simple. Ou prendre le handle iMA et CopyBuffer là où il devrait être ?

1. Dans le wotcha, vous devez spécifier soit le nom du tableau Close (vous ne verrez que des informations générales) soit une valeur spécifique de Close[1], Close[2],..., Close[i].

2. Vous ne pouvez pas voir comment votre code remplit le tableau mrate

3. Consultez la bibliothèque standard MovingAverages.mqh - vous y trouverez un exemple de calcul de MA.

 
joo:
Nous comprenons. On passe trop de temps à commenter tout et n'importe quoi. ....


Il y a aussi suffisamment de temps pour commenter et pour mettre en œuvre certaines idées.

C'est juste que je n'aborderai probablement pas la question assez sérieusement pour couvrir l'ensemble du domaine (et je m'occupe déjà de certaines des applications de l'idée, purement pour moi-même).

Mais de toute façon, je n'écrirai probablement pas d'articles sur ce sujet (pour diverses raisons)...