//Пример слушателя событий графика
//+------------------------------------------------------------------+//| 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编程。我是一个初学者。我是自学成才。我正试图解决一些问题。我想解决这些问题。 所以,我想应该有一个从键盘上输入数组的功能,我还没有通过一个个数字来输入数组。好吧,这个问题来自问题书C++。
143.编写一个程序,从键盘输入5个整数的一维数组。
5个整数的数组,然后打印出
的非零元素。在每个元素被输入之前,都会有一个提示
然后显示一个带有该元素编号的工具提示。
输入一个整数的数组。
输入每个数字后,按<Enter>键。
а[1]->12
а[2]->0
а[3]->3
а[4] -> -1
а[5] -> 0
数组中有3个非零元素
我还在学习MQL5编程。我是一个初学者。自学成才。我正在努力解决问题。我认为应该有一个函数来输入一个数组的一个数字。好吧,这个问题来自问题书C++。
143.编写一个程序,从键盘输入5个整数的一维数组。
5个整数的数组,然后打印出
的非零元素。在每个元素被输入之前,都会有一个提示
然后显示一个带有该元素编号的工具提示。
输入一个整数的数组。
输入每个数字后,按<Enter>键。
а[1]->12
а[2]->0
а[3]->3
а[4] -> -1
а[5] -> 0
数组中有3个非零元素
但是,这就把数组变成了一个动态数组,所以你不能用ArrayResize()来改变它的大小。
但是,这使得数组是动态的,你不能用ArrayResize()改变它的大小。
好吧,这个问题是来自C++问题书。
在mql中,你也可以从键盘上填充数组,但你不需要这样做)))
在mql中,你也可以从键盘上填充一个数组,但你不需要这样做)))
安德烈!编程。创造性。飞翔的思想和幻想。而不是把它们放在灰质的细胞中。我想让它离开键盘。这不是一个幌子。只是我的欲望是我想象中的产物。我希望是这样的,从键盘上看。
我就简单说说吧。问题适合在专业主题/论坛上提出。
我就简单说说吧。问题适合在专业线程/论坛上提出。
安德烈,也许这个问题和我一样是在论坛上提出的?如果论坛上有什么,请给我一个链接。或者我们应该在论坛上公开讨论这个问题?
在任何情况下,都非常感谢!
安德烈!编程。创造性。思想和幻想的飞行。不能把它们放在灰质的细胞中。我想让它离开键盘。这不是一个幌子。只是我的欲望是我想象出来的。我希望是这样的,从键盘上看。
从文件中读取数组。并在任何文本编辑器中编辑该文件 :-)
"做这个--我不会告诉你怎么做。"
你为什么不自己想办法呢?并告诉用户vladeimirami 如何做到这一点。 这一切都在文件中。
https://www.mql5.com/ru/docs/event_handlers/onchartevent
将常数列表扩展到所需的常数。
从哪里获得常数的值:。谷歌 "C++密钥代码"(如我之前所说)。并对其进行处理。
用Print代替字符串,插入函数,根据按下的键向数组添加值。什么事这么难?
你为什么不自己想办法呢?并告诉用户vladeimirami 如何做到这一点。 毕竟,一切都在文件中。
https://www.mql5.com/ru/docs/event_handlers/onchartevent
将常数列表扩展到所需的常数。
从哪里获得常数的值:。谷歌 "C++密钥代码"(如我之前所说)。并对其进行处理。
取代带有Print的字符串,插入函数,根据按下的键向数组添加值。什么事这么复杂?
在急于敲击键盘之前,至少要阅读你所回答的内容以及谁在回答谁的问题。