Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Стохастический Осциллятор (Stochastic Oscillator). 14 страница




Второй индекс массива (столбцы) соответствует характеристикам ордеров. Каждый элемент массива со вторым индексом, равным 1, содержит значение курса открытия ордера, с индексом 2 - значение StopLoss ордера, 3 - TakeProfit ордера и т.д. (см. Таблицу 4). Элемент массива с индексом [0][0] имеет значение, равное общему количеству ордеров, содержащихся в массиве. Все элементы массива с первым или вторым индексом, равным 0, не используются (кроме элемента с индексом [0][0]).

В таблице 4 показано состояние массива, содержащего информацию о двух ордерах, в некоторый момент времени одновременно присутствующих в торговле. Элемент массива Mas_Ord_New[0][0] имеет значение 2.0 - общее количество ордеров - два. Элементы первой строки массива содержат значения характеристик рыночного ордера Sell (Mas_Ord_New[1][6] = 1.0, см. Типы торговых операций), открытого на 1.4 лота (Mas_Ord_New[1][5] =1.4), имеющего номер 123456 (Mas_Ord_New[1][4] =123456.0). Значение элемента Mas_Ord_New[1][8] =1.0 означает, что этот ордер имеет непустой комментарий. Во второй строке массива содержатся значения, характеризующие второй ордер. В частности, элемент массива Mas_Ord_New[2][6] имеет значение 2.0, - значит, это ордер BuyLimit.

Массив Mas_Tip отражает количество ордеров каждого типа. Значения индексов этого массива поставлены в соответствие типам торговых операций (см. Типы торговых операций). Это означает, что элемент массива Mas_Tip с индексом 0 содержит количество одновременно присутствующих в торговле рыночных ордеров типа Buy, с индексом 1 - ордеров типа Sell, с индексом 2 - типа BuyLimit и т.д. Для ситуации, отражённой в таблице 4, элементы массива Mas_Tip будут иметь следующие значения:

Таблица 5. Соответствие элементов массива Mas_Tip количеству ордеров различных типов.

  Buy Sell BuyLimit SellLimit BuyStop SellStop
Индекс            
Значение            

В данном случае значения элементов массива Mas_Tip означают следующее: Mas_Tip[1] равно 1, значит в торговле имеется один ордер Sell; Mas_Tip[2] также равно 1, значит в торговле есть один отложенный ордер BuyLimit. Остальные элементы массива имеют нулевые значения, значит ордеров этого типа в торговле нет. В случае, если в торговле присутствуют одновременно несколько ордеров одного типа, то соответствующий элемент массива будет иметь значение, равное количеству таких ордеров. Например, если в торговле имеется три ордера BuyStop, то элемент Mas_Tip[4] будет иметь значение 3.

Предлагаемая здесь функция учёта ордеров Terminal() оформлена в виде включаемого файла Terminal.mqh.

Пользовательская функция Terminal()

int Terminal()

Функция выполняет учёт рыночных и отложенных ордеров. В результате исполнения функции изменяются значения следующих глобальных массивов:

Mas_Ord_New - массив характеристик ордеров, имеющихся на момент исполнения функции;

Mas_Ord_Old - массив характеристик ордеров, имеющихся на момент предыдущего исполнения функции;

Mas_Tip - массив количества ордеров всех типов.

Включаемый файл Terminal.mqh, содержащий описание функции учёта ордеров Terminal():

//--------------------------------------------------------------------

// Terminal.mqh

// Предназначен для использования в качестве примера в учебнике MQL4.

//--------------------------------------------------------------- 1 --

// Функция учёта ордеров

// Глобальные переменные:

// Mas_Ord_New[31][9] // Массив ордеров последний известный

// Mas_Ord_Old[31][9] // Массив ордеров предыдущий (старый)

// 1й индекс = порядковый номер ордера

// [][0] не определяется

// [][1] курс откр. ордера (абс.знач.курса)

// [][2] StopLoss ордера (абс.знач.курса)

// [][3] TakeProfit ордера (абс.знач.курса)

// [][4] номер ордера

// [][5] колич. лотов орд. (абс.знач.курса)

// [][6] тип орд. 0=B,1=S,2=BL,3=SL,4=BS,5=SS

// [][7] магическое число ордера

// [][8] 0/1 факт наличия комментария

// Mas_Tip[6] // Массив колич. ордеров всех типов

// [] тип орд: 0=B,1=S,2=BL,3=SL,4=BS,5=SS

//--------------------------------------------------------------- 2 --

int Terminal()

{

int Qnt=0; // Счётчик количества ордеров

 

//--------------------------------------------------------------- 3 --

ArrayCopy(Mas_Ord_Old, Mas_Ord_New);// Сохраняем предыдущую историю

Qnt=0; // Обнуление счётчика ордеров

ArrayInitialize(Mas_Ord_New,0); // Обнуление массива

ArrayInitialize(Mas_Tip, 0); // Обнуление массива

//--------------------------------------------------------------- 4 --

for(int i=0; i<OrdersTotal(); i++) // По рыночн. и отлож. ордерам

{

if((OrderSelect(i,SELECT_BY_POS)==true) //Если есть следующ.

&& (OrderSymbol()==Symbol())) //.. и наша вал.пара

{

//------------------------------------------------------ 5 --

Qnt++; // Колич. ордеров

Mas_Ord_New[Qnt][1]=OrderOpenPrice(); // Курс открытия орд

Mas_Ord_New[Qnt][2]=OrderStopLoss(); // Курс SL

Mas_Ord_New[Qnt][3]=OrderTakeProfit(); // Курс ТР

Mas_Ord_New[Qnt][4]=OrderTicket(); // Номер ордера

Mas_Ord_New[Qnt][5]=OrderLots(); // Количество лотов

Mas_Tip[OrderType()]++; // Кол. ордеров типа

Mas_Ord_New[Qnt][6]=OrderType(); // Тип ордера

Mas_Ord_New[Qnt][7]=OrderMagicNumber(); // Магическое число

if (OrderComment()=="")

Mas_Ord_New[Qnt][8]=0; // Если нет коммент

else

Mas_Ord_New[Qnt][8]=1; // Если есть коммент

//------------------------------------------------------ 6 --

}

}

Mas_Ord_New[0][0]=Qnt; // Колич. ордеров

//--------------------------------------------------------------- 7 --

return;

}

//--------------------------------------------------------------- 8 --

В блоке 1-2 приводится комментарий описания глобальных массивов, используемых в функции. Глобальные массивы объявлены во включаемом файле Variables.mqh. В блоке 3-4 содержание массива Mas_Ord_New копируется в массив Mas_Ord_Old. Таким образом, ранее известное состояние ордеров запоминается и в дальнейшем может использоваться в программе. Далее значения элементов массивов Mas_Ord_New и Mas_Tip, отражающих новое состояние ордеров, обнуляется перед обновлением данных в блоке 4-7.

Блок 4-7 содержит цикл for, в котором последовательно опрашиваются все рыночные и отложенные ордера по финансовому инструменту, в окно которого прикреплён эксперт. Отбор ордеров производится с помощью функции OrderSelect() в соответствии с параметром MODE_TRADES, заданным по умолчанию. В блоке 5-6 вычисляются все необходимые характеристики для отобранных ордеров, и полученные значения заносятся в массив новых ордеров Mas_Ord_New. Одновременно производится подсчёт количества ордеров всех типов и полученные значения присваиваются соответствующим элементам массива Mas_Tip. По окончании цикла общее количество ордеров по финансовому инструменту присваивается элементу Mas_Ord_New[0][0].

Отдельно нужно заметить, что анализ закрытых рыночных и удалённых отложенных ордеров (исполнение функции OrderSelect() с параметром MODE_HISTORY) не выполняется. Как правило, сведения о закрытых и удалённых ордерах в торгующих экспертах не используются. Сведения о закрытых и отложенных ордерах представляют историю по торговому счёту. Эти сведения могут быть использованы, например, для построения диаграмм, отражающих динамику вложения средств и фактических результатов торгов, однако не могут принести какую бы то ни было пользу для принятия новых торговых решений. Технически учёт этой части ордеров может быть выполнен аналогичным способом, однако, это - отдельная задача, которая не имеет отношения к торговле.

Анализ событий, связанных с ордерами, в программе выполняется на основе сравнения данных, имеющихся в рассмотренных массивах. Например, если массив Mas_Ord_Old содержит сведения о некотором отложенном ордере, номер которого 246810, а массив Mas_Ord_New содержит сведения о том же ордере 246810, но при этом ордер имеет уже другой тип, значит отложенный ордер был преобразован в рыночный. Анализ ордеров необходим также при осуществлении торговых операций (рассматривается в последующем изложении).

Перед самым первым исполнением функции Terminal() массивы Mas_Ord_Old и Mas_Ord_New пустые, т.е. каждый элемент обоих массивов имеет нулевое значение. Это значит, что после первого исполнения функции массив Mas_Ord_Old в строке

ArrayCopy(Mas_Ord_Old, Mas_Ord_New);// Сохраняем предыдущую историю

наследует от массива Mas_Ord_New "нулевое" состояние, в результате чего при исполнении функции обработки событий могут появиться ложные сигналы о событиях. Для того чтобы этого не происходило, самое первое исполнение функции Terminal() осуществляется на этапе инициализации, и обработка событий после этого исполнения функции не производится (см. функцию init() в эксперте usualexpert.mq4).

Информационная функция

 

Обычный эксперт, используемый в практической работе, выгодно отличается от своих простых аналогов тем, что предоставляет трейдеру качественное информационное сопровождение.

Во время торгов ситуация всё время меняется, происходят различные события. Для того чтобы принимать правильные торговые решения, трейдеру необходимо быть в полной мере информированным. С этой целью в экспертах используются различные функции, назначение которых - довести до сведения пользователя некоторый набор информации.

В простых экспертах, как правило, такую роль выполняет стандартная функция Comment(), которая выводит заданный текст в левый верхний угол окна финансового инструмента. Такой метод вывода информации не очень удобен, т.к. текст зачастую накладывается на ценовой график, поэтому может использоваться лишь в ограниченной части случаев для вывода небольших сообщений.

Здесь рассматривается принципиально иной метод вывода информации - все сообщения выводятся в отдельное окно, а для формирования текстов сообщений используются графические объекты. Применение графических объектов даёт ощутимое преимущество, т.к. объекты (в отличие от текстов, выводимых с помощью Comment()) можно перемещать, создавая, таким образом, историю сообщений.

Отдельное подокно для вывода информации создаётся с помощью пользовательского индикатора с соответствующей настройкой. Единственным назначением этого индикатора является создание подокна, поэтому в индикаторе не выполняются никакие вычисления, не ставится также цель построения индикаторных линий. Код индикатора Inform.mq4 может выглядеть так:

//--------------------------------------------------------------------
// Inform.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
#property indicator_separate_window // Отдельное окно индикатора
//--------------------------------------------------------------------
int start() // Специальная функция start()
{
}
//--------------------------------------------------------------------

В общем случае программист по своему усмотрению может добавить в индикатор необходимый код, наделив его, таким образом, дополнительными свойствами. Например, в некоторой части подокна индикатора можно выводить индикаторные линии. В данном примере предлагается простой код индикатора, в окне которого будут отображаться графические объекты.

 

Пользовательская функция Inform()

int Inform(int Mess_Number,int Number=0,double Value=0.0)

Функция выводит сообщения, созданные с помощью графических объектов, в подокно индикатора Inform.mq4. Функция управляет положением графических объектов в подокне индикатора: каждое новое сообщение выводится в нижнюю часть окна (нижнюю строку) и окрашивается нужным цветом, при этом ранее выведенные сообщения перемещаются в верхнюю часть окна (на одну строку выше). Если в течение 15 секунд не было выведено новых сообщений, то при обращении к функции все ранее выведенные сообщения окрашиваются в серый цвет (чтобы не отвлекать внимание пользователя).

Параметры:

Mess_Number -номер сообщения, может принимать следующие значения:

(ноль) 0 - сообщение не выводится, режим используется для сброса счётчика времени;

(минус единица) -1 - все графические объекты, созданные функцией, удаляются;

(единица и более) - номер сообщения, которое необходимо вывести в подокно индикатора;

Number - целое число, используемое в некоторых сообщениях;

Value -действительное число, используемое в некоторых сообщениях.

Функция Inform(), создающая графические объекты, как и другие функции в обычном эксперте, оформлена в виде включаемого файла Inform.mqh:

//--------------------------------------------------------------------

// Inform.mqh

// Предназначен для использования в качестве примера в учебнике MQL4.

//--------------------------------------------------------------- 1 --

// Функция вывода на экран графических сообщений.

//--------------------------------------------------------------- 2 --

int Inform(int Mess_Number, int Number=0, double Value=0.0)

{

// int Mess_Number // Номер сообщения

// int Number // Передаваемое целое значение

// double Value // Передаваемое действит. знач.

int Win_ind; // Номер окна индикатора

string Graf_Text; // Строка сообщения

color Color_GT; // Цвет строки сообщения

static int Time_Mess; // Время последней публикации сообщ.

static int Nom_Mess_Graf; // Счётчик графических сообщений

static string Name_Grf_Txt[30]; // Массив имён графич. сообщений

//--------------------------------------------------------------- 3 --

Win_ind= WindowFind("inform"); // Ищем номер окна индикатора

if (Win_ind<0)return; // Если такого окна нет, уходим

//--------------------------------------------------------------- 4 --

if (Mess_Number==0) // Это происходит в каждом тике

{

if (Time_Mess==0) return; // Если уже крашено серым

if (GetTickCount()-Time_Mess>15000)// За 15 сек цвет устарел

{

for(int i=0;i<=29; i++) // Красим cтроки серым

ObjectSet(Name_Grf_Txt[i], OBJPROP_COLOR, Gray);

Time_Mess=0; // Флажок: все строки серые

WindowRedraw(); // Перерисовываем объекты

}

return; // Выход из функции

}

//--------------------------------------------------------------- 5 --

if (Mess_Number==-1) // Это происходит при deinit()

{

for(i=0; i<=29; i++) // По индексам объектов

ObjectDelete(Name_Grf_Txt[i]);// Удаление объекта

return; // Выход из функции

}

//--------------------------------------------------------------- 6 --

Nom_Mess_Graf++; // Счётчик графических сообщ.

Time_Mess=GetTickCount(); // Время последней публикации

Color_GT=Lime;

//--------------------------------------------------------------- 7 --

switch(Mess_Number) // Переход на сообщение

{

case 1:

Graf_Text="Закрыт ордер Buy "+ Number;

PlaySound("Close_order.wav"); break;

case 2:

Graf_Text="Закрыт ордер Sell "+ Number;

PlaySound("Close_order.wav"); break;

case 3:

Graf_Text="Удалён отложенный ордер "+ Number;

PlaySound("Close_order.wav"); break;

case 4:

Graf_Text="Открыт ордер Buy "+ Number;

PlaySound("Ok.wav"); break;

case 5:

Graf_Text="Открыт ордер Sell "+ Number;

PlaySound("Ok.wav"); break;

case 6:

Graf_Text="Установлен отложенный ордер "+ Number;

PlaySound("Ok.wav"); break;

case 7:

Graf_Text="Ордер "+Number+" преобразовался в рыночный";

PlaySound("Transform.wav"); break;

case 8:

Graf_Text="Переоткрыт ордер "+ Number; break;

PlaySound("Bulk.wav");

case 9:

Graf_Text="Частично закрыт ордер "+ Number;

PlaySound("Close_order.wav"); break;

case 10:

Graf_Text="Новая минимальная дистанция: "+ Number;

PlaySound("Inform.wav"); break;

case 11:

Graf_Text=" Не хватает денег на "+

DoubleToStr(Value,2) + " лотов";

Color_GT=Red;

PlaySound("Oops.wav"); break;

case 12:

Graf_Text="Попытка закрыть ордер "+ Number;

PlaySound("expert.wav"); break;

case 13:

if (Number>0)

Graf_Text="Попытка открыть ордер Sell..";

else

Graf_Text="Попытка открыть ордер Buy..";

PlaySound("expert.wav"); break;

case 14:

Graf_Text="Неправильный пароль. Эксперт не работает.";

Color_GT=Red;

PlaySound("Oops.wav"); break;

case 15:

switch(Number) // Переход на номер ошибки

{

case 2: Graf_Text="Общая ошибка."; break;

case 129: Graf_Text="Неправильная цена. "; break;

case 135: Graf_Text="Цена изменилась. "; break;

case 136: Graf_Text="Нет цен. Ждём новый тик.."; break;

case 146: Graf_Text="Подсистема торговли занята";break;

case 5: Graf_Text="Старая версия терминала."; break;

case 64: Graf_Text="Счет заблокирован."; break;

case 133: Graf_Text="Торговля запрещена"; break;

default: Graf_Text="Возникла ошибка " + Number;//Другие

}

Color_GT=Red;

PlaySound("Error.wav"); break;

case 16:

Graf_Text="Эксперт работает только на EURUSD";

Color_GT=Red;

PlaySound("Oops.wav"); break;

default:

Graf_Text="default "+ Mess_Number;

Color_GT=Red;

PlaySound("Bzrrr.wav");

}

//--------------------------------------------------------------- 8 --

ObjectDelete(Name_Grf_Txt[29]); // 29й(верхний) объект удаляем

for(i=29; i>=1; i--) // Цикл по индексам массива..

{ //.. графических объектов

Name_Grf_Txt[i]=Name_Grf_Txt[i-1];// Поднимаем объекты:

ObjectSet(Name_Grf_Txt[i], OBJPROP_YDISTANCE, 2+15*i);

}

Name_Grf_Txt[0]="Inform_"+Nom_Mess_Graf+"_"+Symbol(); // Имя объект

ObjectCreate (Name_Grf_Txt[0],OBJ_LABEL, Win_ind,0,0);// Создаём

ObjectSet (Name_Grf_Txt[0],OBJPROP_CORNER, 3); // Угол

ObjectSet (Name_Grf_Txt[0],OBJPROP_XDISTANCE, 450);// Коорд. Х

ObjectSet (Name_Grf_Txt[0],OBJPROP_YDISTANCE, 2); // Коорд. Y

// Текстовое описание объекта

ObjectSetText(Name_Grf_Txt[0],Graf_Text,10,"Courier New",Color_GT);

WindowRedraw(); // Перерисовываем все объекты

return;

}

//--------------------------------------------------------------- 9 --

В блоке 2-3 описаны используемые в функции переменные. Для хранения имён графических объектов используется массив Name_Grf_Txt. Согласно принятому в функции методу для вывода каждого нового сообщения создаётся новый графический объект. Общее количество объектов - 30, каждый объект представляет текстовую надпись, располагаемую в одной строке. В случае большого разрешения экрана количество выводимых строк сообщений можно увеличить путём увеличения количества создаваемых объектов.

В блоке 3-4 вычисляется номер подокна индикатора "Inform", в которое выводятся сообщения. Если индикатор не установлен, то функция прекращает работу. Отсутствие окна не позволяет выводить сообщения, однако это не влияет на работоспособность эксперта - все другие функции будут работать в обычном режиме, в том числе будут осуществляться торговые операции.

В блоке 4-5 осуществляется анализ расцветки сообщений. Обращение к функции с параметром Mess_Number=0 выполняется в эксперте на каждом тике (см. функцию start() в эксперте usualexpert.mq4). Если в предыдущей истории все объекты уже обесцвечены (т.е. все объекты серого цвета), то функция заканчивает работу. Если же значение переменной Time_Mess не нулевое, то изменяются свойства всех объектов, а именно всем объектам сообщается серый цвет.

В случае (блок 5-6), если при вызове функции указан параметр Mess_Number=-1, то все объекты, ранее созданные при исполнении функции, удаляются. Такая необходимость возникает при отключении эксперта из окна финансового инструмента. В этом случае, в соответствии с общим правилом, каждая прикладная программа должна удалить все объекты, созданные ею в период исполнения (см. функцию deinit() в эксперте usualexpert.mq4).

Если управление в программе передаётся в блок 6-7, значит, необходимо создать новый графический объект с нужными свойствами и расположить его в нижней части подокна индикатора (в нижней строке; здесь термин "строка" - условный, в действительности положение графических объектов определяется заданными координатами). Каждый вновь создаваемый объект имеет уникальное имя. Для формирования имён объектов используется исторический порядковый номер сообщения, поэтому в блоке 6-7 установлен счётчик сообщений (в дальнейшем значение переменной Nom_Mess_Graf используется для формирования уникального имени, блок 8-9). Здесь же учитывается время последней публикации и устанавливается основной цвет для новых сообщений (зелёный).

Блок 7-8 состоит из оператора switch, управление внутри которого передаётся согласно заданному при вызове функции значению параметра Mess_Number. В каждом из вариантов case этого оператора переменной Graf_Text присваивается новое значение, которое и является содержанием выводимого сообщения. Для некоторых сообщений устанавливается собственный цвет, например, в случае вывода важного предупреждения цвет может быть красным. Все сообщения сопровождаются звуком - исполнением стандартной функции PlaySound() (см. Звуковые файлы).

Создание нового графического объекта и перемещение уже имеющихся объектов осуществляется в блоке 8-9. Количество объектов ограничено, поэтому при публикации каждого нового сообщения один их графических объектов (самый старый) удаляется. Все другие, уже имеющиеся, объекты перемещаются на одну строку выше. Перемещение объектов выполняется путём изменения их свойств - координат по вертикали. Координаты объектов по горизонтали остаются неизменными.

После того как выполнены необходимые подготовительные действия (все объекты подняты на одну строку вверх), создаётся новый объект с новым уникальным именем и со свойствами, частично определёнными в блоке 7-8. Тип графического объекта - текстовая метка. Объекты этого типа позиционируются относительно окна финансового инструмента, что позволяет пользователю произвольно перемещать ценовой график, не затрагивая этим действием положение надписей сообщений.

Вызов функции Inform() может осуществляться из любого места программы, где по смыслу необходимо вывести очередное сообщение. В результате длительного использования в окне накапливаются сообщения. Пользователь может посмотреть историю сообщений, изменив размер подокна индикатора (например, подняв его верхнюю границу). По желанию пользователя, можно также установить высоту окна таким образом, чтобы видимого пространства хватало для отображения необходимого количества строк сообщений (рекомендуется три - четыре строки).


Рис. 156. Окно финансового инструмента. Сообщения в подокне индикатора.

Легко заметить, что разнообразие сообщений, выводимых функцией, может быть увеличено. В случае, если предполагается расширять программу, достаточно добавить новый вариант case в операторе switch (блок 7-8).

Функция слежения за событиями

 

В период проведения торгов происходит множество различных событий. Некоторые из них трейдер может наблюдать непосредственно в окне финансового инструмента, например, динамику изменения рыночных цен или пересечение индикаторных линий. Другие события, хотя и представляют интерес для трейдера, но в явном виде нигде не отображаются. Значительная часть этих событий может быть вычислена и обработана средствами языка MQL4.

Например, незадолго до выхода важных новостей или при сильном движении цен дилинговый центр может изменить условия торговли. В подобных случаях может быть увеличен спред или минимально допустимая дистанция для установки ордеров и заявленных цен стоп-приказов. В случае, если это происходит, необходимо, во-первых, обнаружить и принять во внимание новые условия торговли, и во-вторых, поставить в известность трейдера о возникших изменениях.

Для решения этих задач в эксперте используется функция слежения за событиями.

Пользовательская функция Events()

int Events()

Функция вычисляет изменение минимальной дистанции для установки ордеров и их стоп-приказов, а также изменения в составе рыночных и отложенных ордеров. Для исполнения функции требуется применение в программе функции учёта ордеров Terminal(). Используются значения глобальных массивов:

Mas_Ord_New - массив характеристик ордеров на момент последнего исполнения функции Terminal();

Mas_Ord_Old - массив характеристик ордеров на момент предыдущего исполнения функции Terminal().

Используются значения глобальных переменных:
- Level_new - текущее значение минимальной дистанции;
- Level_old - предыдущее значение минимальной дистанции.

Для вывода сообщений функция предполагает использование информационной функции Inform(). В случае, если функция Inform() не включена в эксперт, сообщения не выводятся.

Функция слежения за событиями Events() оформлена в виде включаемого файла Events.mqh:

//--------------------------------------------------------------------

// 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 закрыт




Поделиться с друзьями:


Дата добавления: 2014-12-29; Просмотров: 386; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.