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

 
Andrey Sokolov #:

Comment faites-vous, et qu'est-ce qui ne fonctionne pas exactement ?

Je suis toujours en train d'apprendre la programmation MQL5. Je suis un débutant. Je suis autodidacte. J'essaie de résoudre certains problèmes. J'essaie de les résoudre. Ainsi, j'ai pensé qu'il devrait y avoir une fonction pour entrer un tableau à partir du clavier, et je n'ai pas entré le tableau par un chiffre à la fois. Eh bien, le problème vient du livre de problèmes C++.

143. Écrivez un programme qui saisit au clavier un tableau unidimensionnel de 5 entiers.

de 5 nombres entiers, puis imprime le nombre de

d'éléments non nuls. Avant la saisie de chaque élément, une invite

et affiche ensuite une infobulle avec le numéro de l'élément.

Entrez un tableau d'entiers.

Après avoir saisi chaque numéro, appuyez sur <Enter>.

а[1] -> 12

а[2] -> 0

а[3] -> 3

а[4] -> -1

а[5] -> 0


Il y a 3 éléments non nuls dans le tableau

 
vladeimirami #:

Je suis toujours en train d'apprendre la programmation MQL5. Je suis un débutant. Autodidacte. J'essaie de résoudre des problèmes. Je pensais qu'il devrait y avoir une fonction permettant d'entrer un tableau par un chiffre. Eh bien, le problème vient du livre de problèmes C++.

143. Écrire un programme qui saisit au clavier un tableau unidimensionnel de 5 entiers.

de 5 nombres entiers, puis imprime le nombre de

d'éléments non nuls. Avant la saisie de chaque élément, une invite

et affiche ensuite une infobulle avec le numéro de l'élément.

Saisie d'un tableau d'entiers.

Après avoir saisi chaque numéro, appuyez sur <Enter>.

а[1] -> 12

а[2] -> 0

а[3] -> 3

а[4] -> -1

а[5] -> 0


Il y a 3 éléments non nuls dans le tableau

int a[] = {12, 0, 3, -1, 0};

Mais cela transforme le tableau en un tableau dynamique, qui ne peut donc pas être redimensionné à l'aide de la fonction ArrayResize().

 
Alexey Viktorov #:

Mais, cela rend le tableau dynamique, et vous ne pouvez pas changer sa taille avec ArrayResize().

Alexey, je ne suis pas si stupide. Je suis désolé, je peux remplir un tableau de cette façon aussi. Je dois juste le remplir à partir du clavier. C'est ce que j'essaie de comprendre.
 
vladeimirami #:

Eh bien, le problème vient du livre de problèmes C++.

Dans mql, vous pouvez également remplir le tableau à partir du clavier, mais vous n'êtes pas obligé de le faire))).

 
Andrey Sokolov #:

En mql, vous pouvez également remplir un tableau à partir du clavier, mais ce n'est pas nécessaire))).

Andrei ! La programmation. La créativité. Le vol des pensées et des fantasmes. On ne peut pas les retenir dans les cellules de la matière grise. Je ne veux plus de ça sur le clavier. Ce n'est pas un faux-semblant. C'est juste que mon désir est le fruit de mon imagination. J'aimerais que ce soit comme ça, depuis le clavier.
 
vladeimirami #:
Andrei ! La programmation. La créativité. Pensées et fantasmes volants. Pas en les gardant dans les cellules de la matière grise. Je ne veux plus de ça sur le clavier. Ce n'est pas un faux-semblant. C'est juste que mon désir est le fruit de mon imagination. J'aimerais que ce soit comme ça, depuis le clavier.

Je vais faire simple. Les questions sont appropriées dans les sujets/forums spécialisés.

 
Andrey Sokolov #:

Je vais faire simple. Les questions sont appropriées dans les fils/forums spécialisés.

Andrey, peut-être cette question a-t-elle été soulevée dans le forum comme la mienne ? S'il y a quelque chose sur le forum, veuillez me donner un lien. Ou devrions-nous ouvrir cette discussion sur le forum ?

En tout cas, merci beaucoup !

 
vladeimirami #:
Andrei ! La programmation. La créativité. Le vol des pensées et des fantasmes. On ne peut pas les retenir dans les cellules de la matière grise. Je ne veux plus de ça sur le clavier. Ce n'est pas un faux-semblant. C'est juste que mon désir est le fruit de mon imagination. J'aimerais que ce soit comme ça, depuis le clavier.

lire le tableau à partir du fichier. Et éditez le fichier dans n'importe quel éditeur de texte :-)

 
Andrey Sokolov #:

"Fais ça - je ne te dirai pas comment."

Pourquoi ne l'avez-vous pas découvert vous-même ? Et dites à l'utilisateurvladeimirami comment le faire. Tout est dans la documentation :

https://www.mql5.com/ru/docs/event_handlers/onchartevent

//Пример слушателя событий графика

//+------------------------------------------------------------------+
//|                                          OnChartEvent_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "Пример слушателя событий графика и генератора пользовательских событий"
//--- идентификаторы служебных клавиш
#define  KEY_NUMPAD_5       12
#define  KEY_LEFT           37
#define  KEY_UP             38
#define  KEY_RIGHT          39
#define  KEY_DOWN           40
#define  KEY_NUMLOCK_DOWN   98
#define  KEY_NUMLOCK_LEFT  100
#define  KEY_NUMLOCK_5     101
#define  KEY_NUMLOCK_RIGHT 102
#define  KEY_NUMLOCK_UP    104
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- выведем значение константы CHARTEVENT_CUSTOM
   Print("CHARTEVENT_CUSTOM=",CHARTEVENT_CUSTOM);
//---
   Print("Запущен эксперт с именем ",MQLInfoString(MQL5_PROGRAM_NAME));
//--- установка флага получения событий создания объектов графика
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- установка флага получения событий удаления объектов графика
   ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- включение сообщений о прокрутке колесика мышки
   ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- принудительное обновление свойств графика гарантирует готовность к обработке событий
   ChartRedraw();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- счетчик тиков для генерации пользовательского события 
   static int tick_counter=0;
//--- будем делить накопленные тики на это число
   int simple_number=113;
//--- 
   tick_counter++;
//--- отправляем пользовательское событие, если счетчик тиков кратен simple_number
   if(tick_counter%simple_number==0)
     {
      //--- сформируем идентификатор пользовательского события в диапазоне от 0 до 65535
      ushort custom_event_id=ushort(tick_counter%65535);
      //---  отправим пользовательское событие с заполнением параметров
      EventChartCustom(ChartID(),custom_event_id,tick_counter,SymbolInfoDouble(Symbol(),SYMBOL_BID),__FUNCTION__);
      //--- сделаем вывод в лог для изучения и анализа результатов примера
      Print(__FUNCTION__,": Отправлено пользовательcкое событие ID=",custom_event_id);
     }
//---     
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- нажатие кнопки на клавиатуре
   if(id==CHARTEVENT_KEYDOWN)
     {
      switch((int)lparam)
        {
         case KEY_NUMLOCK_LEFT:  Print("Нажата KEY_NUMLOCK_LEFT");   break;
         case KEY_LEFT:          Print("Нажата KEY_LEFT");           break;
         case KEY_NUMLOCK_UP:    Print("Нажата KEY_NUMLOCK_UP");     break;
         case KEY_UP:            Print("Нажата KEY_UP");             break;
         case KEY_NUMLOCK_RIGHT: Print("Нажата KEY_NUMLOCK_RIGHT");  break;
         case KEY_RIGHT:         Print("Нажата KEY_RIGHT");          break;
         case KEY_NUMLOCK_DOWN:  Print("Нажата KEY_NUMLOCK_DOWN");   break;
         case KEY_DOWN:          Print("Нажата KEY_DOWN");           break;
         case KEY_NUMPAD_5:      Print("Нажата KEY_NUMPAD_5");       break;
         case KEY_NUMLOCK_5:     Print("Нажата KEY_NUMLOCK_5");      break;
         default:                Print("Нажата какая-то неперечисленная клавиша");
        }
     }
//--- нажатие левой кнопкой мышки на графике
   if(id==CHARTEVENT_CLICK)
      Print("Координаты щелчка мышки на графике: x = ",lparam,"  y = ",dparam);
//--- нажатие мышкой на графическом объекте
   if(id==CHARTEVENT_OBJECT_CLICK)
      Print("Нажатие кнопки мышки на объекте с именем '"+sparam+"'");
//--- удален объект
   if(id==CHARTEVENT_OBJECT_DELETE)
      Print("Удален объект с именем ",sparam);
//--- создан объект
   if(id==CHARTEVENT_OBJECT_CREATE)
      Print("Создан объект с именем ",sparam);
//--- изменен объект
   if(id==CHARTEVENT_OBJECT_CHANGE)
      Print("Изменен объект с именем ",sparam);
//--- перемещен объект или изменены координаты точек привязки
   if(id==CHARTEVENT_OBJECT_DRAG)
      Print("Изменение точек привязки объекта с именем ",sparam);
//--- изменен текст в поле ввода графического объекта Edit
   if(id==CHARTEVENT_OBJECT_ENDEDIT)
      Print("Изменен текст в объекте Edit ",sparam,"  id=",id);
//--- события перемещения мышки
   if(id==CHARTEVENT_MOUSE_MOVE)
      Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
   if(id==CHARTEVENT_MOUSE_WHEEL)
     {
      //--- разберем состояние кнопок и колесика мышки для этого события 
      int flg_keys = (int)(lparam>>32);          // флаг состояний клавиш Ctrl, Shift и кнопок мышки
      int x_cursor = (int)(short)lparam;         // X-координата, в которой произошло событие колесика мышки
      int y_cursor = (int)(short)(lparam>>16);   // Y-координата, в которой произошло событие колесика мышки
      int delta    = (int)dparam;                // суммарное значение прокрутки колесика, срабатывает при достижении +120 или -120
      //--- обработаем флаг 
      string str_keys="";
      if((flg_keys&0x0001)!=0)
         str_keys+="LMOUSE ";
      if((flg_keys&0x0002)!=0)
         str_keys+="RMOUSE ";
      if((flg_keys&0x0004)!=0)
         str_keys+="SHIFT ";
      if((flg_keys&0x0008)!=0)
         str_keys+="CTRL ";
      if((flg_keys&0x0010)!=0)
         str_keys+="MMOUSE ";
      if((flg_keys&0x0020)!=0)
         str_keys+="X1MOUSE ";
      if((flg_keys&0x0040)!=0)
         str_keys+="X2MOUSE ";
 
      if(str_keys!="")
         str_keys=", keys='"+StringSubstr(str_keys,0,StringLen(str_keys)-1)+"'";
      PrintFormat("%s: X=%d, Y=%d, delta=%d%s",EnumToString(CHARTEVENT_MOUSE_WHEEL),x_cursor,y_cursor,delta,str_keys);
     }
//--- изменение размеров графика или изменение свойств графика через диалог свойств
   if(id==CHARTEVENT_CHART_CHANGE)
      Print("Изменение размеров или свойств графика");
//--- пользовательское событие
   if(id>CHARTEVENT_CUSTOM)
      PrintFormat("Пользовательское событие ID=%d, lparam=%d, dparam=%G, sparam=%s",id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+
//| MouseState                                                       |
//+------------------------------------------------------------------+
string MouseState(uint state)
  {
   string res;
   res+="\nML: "   +(((state& 1)== 1)?"DN":"UP");   // mouse left
   res+="\nMR: "   +(((state& 2)== 2)?"DN":"UP");   // mouse right 
   res+="\nMM: "   +(((state&16)==16)?"DN":"UP");   // mouse middle
   res+="\nMX: "   +(((state&32)==32)?"DN":"UP");   // mouse first X key
   res+="\nMY: "   +(((state&64)==64)?"DN":"UP");   // mouse second X key
   res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP");   // shift key
   res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP");   // control key
   return(res);
  }

Étendre la liste des constantes à celles qui sont nécessaires :

#define  KEY_NUMPAD_5       12
#define  KEY_LEFT           37
#define  KEY_UP             38
#define  KEY_RIGHT          39
#define  KEY_DOWN           40
#define  KEY_NUMLOCK_DOWN   98
#define  KEY_NUMLOCK_LEFT  100
#define  KEY_NUMLOCK_5     101
#define  KEY_NUMLOCK_RIGHT 102
#define  KEY_NUMLOCK_UP    104

Où trouver les valeurs des constantes :. Google "C++ key codes" (comme je l'ai déjà dit). Et le traiter :

//--- нажатие кнопки на клавиатуре
   if(id==CHARTEVENT_KEYDOWN)
     {
      switch((int)lparam)
        {
         case KEY_NUMLOCK_LEFT:  Print("Нажата KEY_NUMLOCK_LEFT");   break;
         case KEY_LEFT:          Print("Нажата KEY_LEFT");           break;
         case KEY_NUMLOCK_UP:    Print("Нажата KEY_NUMLOCK_UP");     break;
         case KEY_UP:            Print("Нажата KEY_UP");             break;
         case KEY_NUMLOCK_RIGHT: Print("Нажата KEY_NUMLOCK_RIGHT");  break;
         case KEY_RIGHT:         Print("Нажата KEY_RIGHT");          break;
         case KEY_NUMLOCK_DOWN:  Print("Нажата KEY_NUMLOCK_DOWN");   break;
         case KEY_DOWN:          Print("Нажата KEY_DOWN");           break;
         case KEY_NUMPAD_5:      Print("Нажата KEY_NUMPAD_5");       break;
         case KEY_NUMLOCK_5:     Print("Нажата KEY_NUMLOCK_5");      break;
         default:                Print("Нажата какая-то неперечисленная клавиша");
        }
     }

Au lieu de la chaîne de caractères avec Print, insérez une fonction qui ajoute une valeur au tableau en fonction de la touche pressée. Qu'est-ce qui est si difficile ?

Документация по MQL5: Обработка событий / OnChartEvent
Документация по MQL5: Обработка событий / OnChartEvent
  • www.mql5.com
OnChartEvent - Обработка событий - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mihail Matkovskij #:

Pourquoi ne l'avez-vous pas découvert vous-même ? Et dites à l'utilisateurvladeimirami comment le faire. Après tout, tout est dans la documentation :

https://www.mql5.com/ru/docs/event_handlers/onchartevent

Étendre la liste des constantes aux constantes requises :

Où trouver les valeurs des constantes :. Google "C++ key codes" (comme je l'ai déjà dit). Et le traiter :

Au lieu de la chaîne de caractères avec Print, insérez une fonction qui ajoute une valeur au tableau en fonction de la touche pressée. Qu'est-ce qui est si compliqué ?

Lisez au moins ce à quoi vous répondez et qui répondait à qui avant de vous précipiter sur les touches.