MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1868

 
Andrey Sokolov #:

どうすればいいのか、具体的に何がうまくいかないのか。

MQL5プログラミングはまだ勉強中です。私はビギナーです。私は独学です。私はいくつかの問題を解決しようとしています。それらを解決するために、キーボードから配列を入力する機能があるはずだと考え、1桁ずつ入力したことがない。まあ、問題は問題集C++からなんですけどね。

143.キーボードから5個の整数からなる1次元の配列を入力するプログラムを作成する。

の数を表示します。

の非ゼロ要素の各要素が入力される前に、プロンプトが表示されます

と表示し、その要素の番号をツールチップで表示します。

整数の配列を入力します。

各番号を入力したら、<Enter>を押します。

а[1]->12

а[2]->0

а[3]->3

а[4] -> -1

а[5] -> 0


配列に0でない要素が3つある

 
vladeimirami #:

MQL5プログラミングはまだ勉強中です。私はビギナーです。独学です。問題を解決しようとしているのです。配列を1桁ずつ入力する機能があってもいいのではと思いました。まあ、問題は問題集C++からなんですけどね。

143.キーボードから5個の整数からなる1次元の配列を入力するプログラムを作成する。

の数を表示します。

の非ゼロ要素の各要素が入力される前に、プロンプトが表示されます

と表示し、その要素の番号をツールチップで表示します。

整数の配列を入力します。

各番号を入力したら、<Enter>を押します。

а[1]->12

а[2]->0

а[3]->3

а[4] -> -1

а[5] -> 0


配列に0でない要素が3つある

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

しかし、これでは配列が動的なものになってしまうので、ArrayResize()でサイズを変更することができません。

 
Alexey Viktorov #:

しかし、これでは配列が動的になってしまい、ArrayResize()でサイズを変更することができません。

アレクセイ、私はそんなに馬鹿じゃない。すみません、私もその方法で配列を埋めることができます。キーボードから埋めていくだけなので。それを見極めたいんです。
 
vladeimirami #:

さて、問題はC++の問題集に載っているものです。

mqlではキーボードから配列を埋めることもできますが、その必要はありません)))

 
Andrey Sokolov #:

mqlでは、キーボードから配列を埋めることもできますが、その必要はありません)))

アンドレイ! プログラミングクリエイティビティ。思考と妄想の飛翔。灰白質の細胞内に保持できない。キーボードから外して欲しい。見せかけではありません。ただ、私の欲望は想像の産物なのです。キーボードからこんな風に
 
vladeimirami #:
アンドレイ! プログラミングクリエイティビティ。飛翔する想いと妄想。灰白質という細胞の中に留めておくのではなくキーボードから外して欲しい。見せかけではありません。ただ、私の欲望は想像の産物なのです。キーボードからこんな風に

簡単に説明します。質問は、専門のトピック/フォーラムで行うのが適切です。

 
Andrey Sokolov #:

簡単に説明します。質問は専門のスレッド/フォーラムで行うのが適切です。

Andreyさん、もしかしたらこの質問は、私のようなフォーラムで提起されたものかもしれませんね。もしフォーラムに何かあれば、リンクを教えてください。それとも、この議論をフォーラムで開くべきでしょうか?

いずれにせよ、ありがとうございました。

 
vladeimirami #:
アンドレイ! プログラミングクリエイティビティ。思考と妄想の飛翔。灰白質の細胞内に保持できない。キーボードから外して欲しい。見せかけではありません。ただ、私の欲望は想像の産物なのです。キーボードからこんな風に

ファイルから配列を読み込む。そして、任意のテキストエディタでファイルを編集してください :-)

 
Andrey Sokolov #:

"こうしろ" "方法は教えない"

なぜ、自分で考えなかったのですか?そして、その方法をユーザーであるvladeimiramiに教えてあげて ください 。全てはドキュメントに書かれています。

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

定数のリストを必要なものに拡張する。

#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

定数の値を取得する場所:。C++キーコード」でググってみてください(さっきも言ったけど)。そして、それを処理する。

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

Printによる文字列の代わりに、押されたキーに応じた値を配列に追加する関数を挿入します。何がそんなに難しいのでしょうか?

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

なぜ、自分で考えなかったのですか?そして、その方法をユーザーであるvladeimiramiに教えてあげて ください 。何しろ、すべてがドキュメントに書かれているのですから。

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

定数リストを必要な定数に拡張する。

定数の値を取得する場所:。C++キーコード」でググってみてください(さっきも言ったけど)。そして、それを処理する。

Printによる文字列の代わりに、押されたキーに応じた値を配列に追加する関数を挿入します。何がそんなに複雑なんだ?

少なくとも、急いでキーを打つ前に、自分が何を答えているのか、誰が誰に何を答えているのか、読んでおく必要があります。