Советник «Болтун»

Советник «Болтун»

Сначала немного теории.
В 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/

You May Also Like