Советник «Болтун»
Сначала немного теории.
В MQL4 есть три способа вывода текстовой информации:
Функция Comment() выводит сообщение в левом верхнем углу графика.
Функция Print() записывает информацию на вкладке терминала «эксперты».
Функция Alert() выводит сообщение в диалоговом окне.
Можете использовать любую которая больше подходит к конкретной ситуации.
Примеры составления строки:
int a = 2;
string text = «открыто «+ a +» ордера. «;
в результате получим строку – открыто 2 ордера.
Можно записать и так:
StringConcatenate(«открыто «,а,» ордера.»);
Результат будет тот же но StringConcatenate делает это быстрее.
Оператор-переключатель switch.
Сравнивает значение с константами во всех вариантах case и передает управление оператору, который соответствует значению выражения. Выражение оператора switch должно быть целого типа.
switch(выражение)
{
case константа: операторы break
case константа : операторы break
…
default : операторы
}
switch(x) { case 4: Print("Открыт Buy ордер"); break case 7 : Print("Закрыт Buy ордер"); break default : Print("Ничего не знаю"); }
Если выражение — х = 4, выполняются операторы связанные с меткой case константа 4.
Если выражение — х = 7, выполняются операторы связанные с меткой case константа 7.
Если выражение — х не 4 и не 7, выполняются операторы связанные с меткой default.
Метка default может отсутствовать, тогда если — х не 4 и не 7 и отсутствует метка default, не выполняется никаких действий.
Оператор break выход из оператора switch.
Пользовательская функция.
В советнике мы уже использовали пользовательские функции (Orders и Expiration), они работали только с глобальными переменными. Теперь рассмотрим способ как передавать данные в функцию для обработки и получении с функции результата этой обработки.
int A, B, C; // объявляем переменные A = 2; // присвоим переменной А значение 2 B = 3; // присвоим переменной В значение 3 C= X(A, B); // вызываем функцию Х и передаем ей параметры А и В для обработки. В переменную С записывается значение которое вернула функция Х после обработки
В функцию X передаются значения переменных A и B. В самой функции их значения будут присвоены переменным E и F соответственно. Так как это переменные не глобальные их можно назвать и одинаково, то есть тоже А и В.
int X(int E, int F) { int H; H = E + F; return(H); }
После обработки в функции X переданных ей данных оператор возврата return вернет результат, и переменой C будет присвоено число 5.
С теорией покончили, перейдем к применению.
Научим советник общаться.
Добавим в советник функцию inf(). С помощью этой функции он будет сообщать нам о своих действиях.
int inf(int Mess_Number, int Number=0, double Value=0.0) { string Graf_Text; // Строка сообщения switch(Mess_Number) // Переход на сообщение { case 1: Graf_Text = StringConcatenate("Попытка открыть ",Text," ордер. Ожидание ответа.."); break; case 2: Graf_Text = StringConcatenate("Открыт ",Text," ордер: № ",Number); break; case 3: Graf_Text = StringConcatenate("Попытка модифицировать ",Text," ордер: № ",Number,". Ожидание ответа.."); break; case 4: Graf_Text = StringConcatenate("Ордер ",Text," модифицирован: № ",Number); break; case 5: Graf_Text = StringConcatenate("Попытка закрыть ",Text," ордер № ",Number,". Ожидание ответа.."); break; case 6: Graf_Text = StringConcatenate("Закрыт ",Text," ордер: № ",Number); break; case 7: Graf_Text = StringConcatenate("Удалён отложенный ",Text," ордер № ",Number); break; case 8: Graf_Text = StringConcatenate("Ордер ",Number," преобразовался в рыночный"); break; case 9: Graf_Text = StringConcatenate("Переоткрыт ордер ",Number); break; case 10: Graf_Text = StringConcatenate("Частично закрыт ордер ",Number); break; case 11: Graf_Text = StringConcatenate("Новая минимальная дистанция: ",Number); break; case 12: Graf_Text = StringConcatenate("Не хватает денег на ",DoubleToStr(Value,2)," лотов"); break; case 15: switch(Number) // Переход на номер ошибки { case 2: Graf_Text = "Общая ошибка."; break; case 4: Graf_Text = "Торговый сервер занят."; break; case 129: Graf_Text = "Неправильная цена. "; break; case 135: Graf_Text = "Цена изменилась."; break; case 136: Graf_Text = "Нет цен. Ждём новый тик.."; break; case 137: Graf_Text = "Брокер занят."; break; case 146: Graf_Text = "Подсистема торговли занята."; break; case 5 : Graf_Text = "Старая версия терминала."; break; case 64: Graf_Text = "Счет заблокирован."; break; case 133: Graf_Text = "Торговля запрещена"; break; case 134: Alert("Недостаточно денег для совершения операции."); return(0); // Выход из функции default: Graf_Text = StringConcatenate("Возникла ошибка ",Number); } default: Graf_Text = StringConcatenate("default ",Mess_Number); } Alert(Graf_Text); }
Вот его джентльменский набор фраз с помощью которых он будет с нами общаться. Его можно увеличить или уменьшить исходя из надобности. Блок обработки ошибок это на будущее.
Эту функцию мы будем вызывать перед вызовом торговой функции OrderSend, сообщим о попытке открыть ордер. И после OrderSend, если нет ошибок сообщим что ордер выставлен. Также вызываем функцию inf() перед OrderDelete, сообщаем о попытке удалить ордер и после успешно удаления функцией OrderDelete сообщаем об этом.
Не забудьте объявить новые переменные (Ticket, Text, answer). Переменная answer типа bool она может иметь только два значения 1 или 0, или true и false соответственно.
Исходник: TradeOnNews-0.2
Волшебство в MQL4 — https://forexlab.ru/mql4-magic/