//Пример слушателя событий графика
//+------------------------------------------------------------------+//| 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 |//+------------------------------------------------------------------+intOnInit()
{
//--- выведем значение константы CHARTEVENT_CUSTOMPrint("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 |//+------------------------------------------------------------------+voidOnTick()
{
//--- счетчик тиков для генерации пользовательского события staticint tick_counter=0;
//--- будем делить накопленные тики на это числоint simple_number=113;
//---
tick_counter++;
//--- отправляем пользовательское событие, если счетчик тиков кратен simple_numberif(tick_counter%simple_number==0)
{
//--- сформируем идентификатор пользовательского события в диапазоне от 0 до 65535ushort 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 |//+------------------------------------------------------------------+voidOnChartEvent(constint id,
constlong &lparam,
constdouble &dparam,
conststring &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);
//--- изменен текст в поле ввода графического объекта Editif(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 keyreturn(res);
}
どうすればいいのか、具体的に何がうまくいかないのか。
MQL5プログラミングはまだ勉強中です。私はビギナーです。私は独学です。私はいくつかの問題を解決しようとしています。それらを解決するために、キーボードから配列を入力する機能があるはずだと考え、1桁ずつ入力したことがない。まあ、問題は問題集C++からなんですけどね。
143.キーボードから5個の整数からなる1次元の配列を入力するプログラムを作成する。
の数を表示します。
の非ゼロ要素の各要素が入力される前に、プロンプトが表示されます
と表示し、その要素の番号をツールチップで表示します。
整数の配列を入力します。
各番号を入力したら、<Enter>を押します。
а[1]->12
а[2]->0
а[3]->3
а[4] -> -1
а[5] -> 0
配列に0でない要素が3つある
MQL5プログラミングはまだ勉強中です。私はビギナーです。独学です。問題を解決しようとしているのです。配列を1桁ずつ入力する機能があってもいいのではと思いました。まあ、問題は問題集C++からなんですけどね。
143.キーボードから5個の整数からなる1次元の配列を入力するプログラムを作成する。
の数を表示します。
の非ゼロ要素の各要素が入力される前に、プロンプトが表示されます
と表示し、その要素の番号をツールチップで表示します。
整数の配列を入力します。
各番号を入力したら、<Enter>を押します。
а[1]->12
а[2]->0
а[3]->3
а[4] -> -1
а[5] -> 0
配列に0でない要素が3つある
しかし、これでは配列が動的なものになってしまうので、ArrayResize()でサイズを変更することができません。
しかし、これでは配列が動的になってしまい、ArrayResize()でサイズを変更することができません。
さて、問題はC++の問題集に載っているものです。
mqlではキーボードから配列を埋めることもできますが、その必要はありません)))
mqlでは、キーボードから配列を埋めることもできますが、その必要はありません)))
アンドレイ! プログラミングクリエイティビティ。飛翔する想いと妄想。灰白質という細胞の中に留めておくのではなくキーボードから外して欲しい。見せかけではありません。ただ、私の欲望は想像の産物なのです。キーボードからこんな風に
簡単に説明します。質問は、専門のトピック/フォーラムで行うのが適切です。
簡単に説明します。質問は専門のスレッド/フォーラムで行うのが適切です。
Andreyさん、もしかしたらこの質問は、私のようなフォーラムで提起されたものかもしれませんね。もしフォーラムに何かあれば、リンクを教えてください。それとも、この議論をフォーラムで開くべきでしょうか?
いずれにせよ、ありがとうございました。
アンドレイ! プログラミングクリエイティビティ。思考と妄想の飛翔。灰白質の細胞内に保持できない。キーボードから外して欲しい。見せかけではありません。ただ、私の欲望は想像の産物なのです。キーボードからこんな風に
ファイルから配列を読み込む。そして、任意のテキストエディタでファイルを編集してください :-)
"こうしろ" "方法は教えない"
なぜ、自分で考えなかったのですか?そして、その方法をユーザーであるvladeimiramiに教えてあげて ください 。全てはドキュメントに書かれています。
https://www.mql5.com/ru/docs/event_handlers/onchartevent
定数のリストを必要なものに拡張する。
定数の値を取得する場所:。C++キーコード」でググってみてください(さっきも言ったけど)。そして、それを処理する。
Printによる文字列の代わりに、押されたキーに応じた値を配列に追加する関数を挿入します。何がそんなに難しいのでしょうか?
なぜ、自分で考えなかったのですか?そして、その方法をユーザーであるvladeimiramiに教えてあげて ください 。何しろ、すべてがドキュメントに書かれているのですから。
https://www.mql5.com/ru/docs/event_handlers/onchartevent
定数リストを必要な定数に拡張する。
定数の値を取得する場所:。C++キーコード」でググってみてください(さっきも言ったけど)。そして、それを処理する。
Printによる文字列の代わりに、押されたキーに応じた値を配列に追加する関数を挿入します。何がそんなに複雑なんだ?
少なくとも、急いでキーを打つ前に、自分が何を答えているのか、誰が誰に何を答えているのか、読んでおく必要があります。