Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1868

 
Andrey Sokolov #:

Come si fa, e cosa esattamente non funziona?

Sto ancora imparando la programmazione MQL5. Sono un principiante. Sono un autodidatta. Sto cercando di risolvere alcuni problemi. Sto cercando di risolverli. Allora, ho pensato che ci dovrebbe essere una funzione per inserire un array dalla tastiera, e non ho inserito l'array con una cifra alla volta. Beh, il problema viene dal libro dei problemi C++.

143. Scrivete un programma che immette da tastiera un array unidimensionale di 5 interi.

di 5 interi, poi stampa il numero di

di elementi non nulli. Prima che ogni elemento sia inserito, un prompt

e poi visualizza un tooltip con il numero dell'elemento.

Inserisci un array di numeri interi.

Dopo aver inserito ogni numero, premere <Enter>.

а[1] -> 12

а[2] -> 0

а[3] -> 3

а[4] -> -1

а[5] -> 0


Ci sono 3 elementi non nulli nella matrice

 
vladeimirami #:

Sto ancora imparando la programmazione MQL5. Sono un principiante. Autodidatta. Sto cercando di risolvere i problemi. Ho pensato che ci dovrebbe essere una funzione per inserire un array di una cifra. Beh, il problema viene dal libro dei problemi C++.

143. Scrivere un programma che immette da tastiera un array unidimensionale di 5 interi.

di 5 interi, poi stampa il numero di

di elementi non nulli. Prima che ogni elemento sia inserito, un prompt

e poi visualizza un tooltip con il numero dell'elemento.

Inserisci un array di numeri interi.

Dopo aver inserito ogni numero, premere <Enter>.

а[1] -> 12

а[2] -> 0

а[3] -> 3

а[4] -> -1

а[5] -> 0


Ci sono 3 elementi non nulli nella matrice

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

Ma questo trasforma l'array in uno dinamico, quindi non può essere ridimensionato usando la funzione ArrayResize().

 
Alexey Viktorov #:

Ma questo rende l'array dinamico, e non si può cambiare la sua dimensione con ArrayResize().

Alexey, non sono così stupido. Mi dispiace, posso riempire un array anche in questo modo. Devo solo riempirlo dalla tastiera. È quello che sto cercando di capire.
 
vladeimirami #:

Beh, il problema viene dal libro dei problemi C++.

In mql si può anche riempire l'array dalla tastiera, ma non è necessario)))

 
Andrey Sokolov #:

In mql si può anche riempire un array dalla tastiera, ma non è necessario)))

Andrei! Programmazione. Creatività. Il volo dei pensieri e delle fantasie. Non può trattenerli nelle cellule della materia grigia. Lo voglio fuori dalla tastiera. Non è una pretesa. È solo che il mio desiderio è frutto della mia immaginazione. Mi piacerebbe così, dalla tastiera.
 
vladeimirami #:
Andrei! Programmazione. Creatività. Pensieri e fantasie volanti. Non tenendoli nelle cellule della materia grigia. Lo voglio fuori dalla tastiera. Non è una pretesa. È solo che il mio desiderio è frutto della mia immaginazione. Mi piacerebbe così, dalla tastiera.

La farò semplice. Le domande sono appropriate nei topic/forum specializzati.

 
Andrey Sokolov #:

La farò semplice. Le domande sono appropriate nei thread/forum specializzati.

Andrey, forse questa domanda è stata sollevata nel forum come la mia? Se c'è qualcosa sul forum per favore datemi un link. O dovremmo aprire questa discussione sul forum?

In ogni caso grazie mille!

 
vladeimirami #:
Andrei! Programmazione. Creatività. Il volo dei pensieri e delle fantasie. Non può tenerli nelle cellule della materia grigia. Lo voglio fuori dalla tastiera. Non è una pretesa. È solo che il mio desiderio è frutto della mia immaginazione. Mi piacerebbe così, dalla tastiera.

leggere l'array dal file. E modificare il file in qualsiasi editor di testo :-)

 
Andrey Sokolov #:

"Fai questo - non ti dirò come".

Perché non l'hai capito da solo? E dire all'utentevladeimirami come fare. È tutto nella documentazione:

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

Estendere l'elenco delle costanti a quelle richieste:

#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

Dove ottenere i valori per le costanti:. Cerca su Google "C++ key codes" (come ho detto prima). Ed elaborarlo:

//--- нажатие кнопки на клавиатуре
   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("Нажата какая-то неперечисленная клавиша");
        }
     }

Al posto della stringa con Print, inserire una funzione che aggiunge un valore all'array a seconda del tasto premuto. Cosa c'è di così difficile?

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

Perché non l'hai capito da solo? E dire all'utentevladeimirami come fare. Dopo tutto, tutto è nella documentazione:

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

Estendere l'elenco delle costanti a quelle richieste:

Dove ottenere i valori per le costanti:. Cerca su Google "C++ key codes" (come ho detto prima). Ed elaborarlo:

Al posto della stringa con Print, inserire una funzione che aggiunge un valore all'array a seconda del tasto premuto. Cosa c'è di così complicato?

Almeno leggi cosa stai rispondendo e chi stava rispondendo cosa a chi prima di precipitarsi a colpire i tasti