//-------------------------------------------------------------------- // Events.mqh // Предназначен для использования в качестве примера в учебнике MQL4. //--------------------------------------------------------------- 1 -- // Функция слежения за событиями. // Глобальные переменные: // Level_new Новое значение минимальной дистанции // Level_old Предыдущее значение минимальной дистанции // Mas_Ord_New[31][9] Массив ордеров последний известный // Mas_Ord_Old[31][9] Массив ордеров предыдущий (старый) //--------------------------------------------------------------- 2 -- int Events() // Пользовательская функция { bool Conc_Nom_Ord; // Совпадение ордеров в .. //.. старом и новом массивах //--------------------------------------------------------------- 3 -- Level_new=MarketInfo(Symbol(),MODE_STOPLEVEL );// Последн.известное if (Level_old!=Level_new) // Новое не равно старому.. { // значит изменились условия Level_old=Level_new; // Новое "старое значение" Inform(10,Level_new); // Сообщение: новая дистанц. } //--------------------------------------------------------------- 4 -- // Поиск пропавших, поменявших тип, частично закрытых и переоткрытых for(int old=1;old<=Mas_Ord_Old[0][0];old++)// По массиву старых { // Исходим из того, что.. Conc_Nom_Ord=false; // ..ордера не совпадают //--------------------------------------------------------- 5 -- for(int new=1;new<=Mas_Ord_New[0][0];new++)//Цикл по массиву .. { //..новых ордеров //------------------------------------------------------ 6 -- if (Mas_Ord_Old[old][4]==Mas_Ord_New[new][4])// Совпал номер { // Тип ордера стал .. if (Mas_Ord_New[new][6]!=Mas_Ord_Old[old][6])//.. другим Inform(7,Mas_Ord_New[new][4]);// Сообщение: преобраз.:) Conc_Nom_Ord=true; // Ордер найден, .. break; // ..значит выходим из .. } // .. внутреннего цикла //------------------------------------------------------ 7 -- // Не совпал номер ордера if (Mas_Ord_Old[old][7]>0 && // MagicNumber есть, совпал Mas_Ord_Old[old][7]==Mas_Ord_New[new][7])//.. со старым { //значит он переоткрыт или частично закрыт // Если лоты совпадают,.. if (Mas_Ord_Old[old][5]==Mas_Ord_New[new][5]) Inform(8,Mas_Ord_Old[old][4]);// ..то переоткрытие else // А иначе это было.. Inform(9,Mas_Ord_Old[old][4]);// ..частичное закрытие Conc_Nom_Ord=true; // Ордер найден, .. break; // ..значит выходим из .. } // .. внутреннего цикла } //--------------------------------------------------------- 8 -- if (Conc_Nom_Ord==false) // Если мы сюда дошли,.. { // ..то ордера нет:( if (Mas_Ord_Old[old][6]==0) Inform(1, Mas_Ord_Old[old][4]); // Ордер Buy закрыт if (Mas_Ord_Old[old][6]==1) Inform(2, Mas_Ord_Old[old][4]); // Ордер Sell закрыт if (Mas_Ord_Old[old][6]> 1) Inform(3, Mas_Ord_Old[old][4]); // Отложен. ордер удалён } } //--------------------------------------------------------------- 9 -- // Поиск новых ордеров for(new=1; new<=Mas_Ord_New[0][0]; new++)// По массиву новых орд. { if (Mas_Ord_New[new][8]>0) //Это не новый,а переоткр continue; //..или частично закрытый Conc_Nom_Ord=false; // Пока совпадения нет for(old=1; old<=Mas_Ord_Old[0][0]; old++)// Поищем этот ордерок { // ..в массиве старых if (Mas_Ord_New[new][4]==Mas_Ord_Old[old][4])//Совпал номер.. { //.. ордера Conc_Nom_Ord=true; // Ордер найден, .. break; // ..значит выходим из .. } // .. внутреннего цикла } if (Conc_Nom_Ord==false) // Если совпадения нет,.. { // ..то ордер новый :) if (Mas_Ord_New[new][6]==0) Inform(4, Mas_Ord_New[new][4]); // Ордер Buy открыт if (Mas_Ord_New[new][6]==1) Inform(5, Mas_Ord_New[new][4]); // Ордер Sell открыт if (Mas_Ord_New[new][6]> 1) Inform(6, Mas_Ord_New[new][4]); // Установлен отлож.ордер } } //-------------------------------------------------------------- 10 -- return; } //-------------------------------------------------------------- 11 --