Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 212

 
geratdc:

Здравствуйте,


Ищу следующую информацию:

1. О реализации смс-уведомлений при отработке ключевых событий в работе советника

2. О реализации открытия и закрытия торговли с 12-00 ПНД по 18-00 ПТН (с смс уведомлением ессно :) о начале и завершении недельной торговой сессии ).

3. О реализации email уведомления после завершения торговли (18-00 ПТН) - высылка отчёта о работе советника за недельную торговую сессию, в тестере  которые с графиком и указанием дат открытия позиций, дат закрытия, цен позиций, профитов/убытков по результатам закрытия позиций. Или там отчёты будут в формате txt ?


Подскажите какие функции или скрипты реализуют это? Как это всё закодить, может была у же тема какая на этот счёт - смс и емейл уведомлений и отчётах.

https://www.mql5.com/ru/articles/1454

Вот что-то типа этого, только чтобы попроще было)))


https://www.mql5.com/ru/forum/53920

Вот на форуме неплохой алгоритм смс уведомления обсуждали- советник высылает емейл, а емейл оператор отправляет смску с текстом письма. Всё гениальное просто. Там только мобильный надо будет зарегистрировать. Уже попроще стало.

Пойду почитаю, нашёл какую то функцию похожую - SendMail() .интересно сложная она?

Давно уже всё такое есть штатно. Вместо смс используйте push-сообщения, SendMail() уже сами нашли.
 

Всем добрый день!

Сделал вот такой код - удаление всех ордеров разом.

//===================================================================
void delete_all_orders()
{
bool err;
int ot;
for(int iss=OrdersTotal()-1; iss>=0; iss--)
   {
    if(OrderSelect(iss, SELECT_BY_POS, MODE_TRADES))
      {
       if(OrderSymbol()==Symbol())
         {
          if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
           {
            ot=OrderTicket();
            Print("Удаляем ордер тикет - ",OrderTicket());
            err=OrderDelete(OrderTicket(),clrNONE);
            if(err==false) error(GetLastError());
            Print("Удален ордер тикет - ",ot);
           }
          if(OrderType()==OP_BUY)
           {
            ot=OrderTicket();
            Print("Удаляем ордер тикет - ",OrderTicket());
            err=OrderClose(OrderTicket(),OrderLots(),Bid,10,clrNONE);
            if(err==false) error(GetLastError());
            Print("Удален ордер тикет - ",ot);
           }
          if(OrderType()==OP_SELL)
           {
            ot=OrderTicket();
            Print("Удаляем ордер тикет - ",OrderTicket());
            err=OrderClose(OrderTicket(),OrderLots(),Ask,10,clrNONE);
            if(err==false) error(GetLastError());
            Print("Удален ордер тикет - ",ot);
           }
         }
      }
   }
return;
}

Проблема вот в чём, ордера почти все закрываются. Но остаются не удалёнными 1-2 ордера.

И сколько бы я не обращался к этой функции, эта функция не закрывает оставшиеся ордера.

Ошибка выходит - не правильная цена.

Думал реквоты, но если идёт обращение к данной функции уже 500000 раз, то какой может быть реквот.

И какая может быть неправильная цена?

С другими советниками такой ерунды не было.

 
Valerius:

Всем добрый день!

Сделал вот такой код - удаление всех ордеров разом.

Проблема вот в чём, ордера почти все закрываются. Но остаются не удалёнными 1-2 ордера.

И сколько бы я не обращался к этой функции, эта функция не закрывает оставшиеся ордера.

Ошибка выходит - не правильная цена.

Думал реквоты, но если идёт обращение к данной функции уже 500000 раз, то какой может быть реквот.

И какая может быть неправильная цена?

С другими советниками такой ерунды не было.

Если ордеров достаточно много, то цена успевает устареть. Добавь RefreshRates() и должно быть нормально.
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
 
Alexey Viktorov:
Если ордеров достаточно много, то цена успевает устареть. Добавь RefreshRates() и должно быть нормально.

В том-то и дело, что ордера остаётся один или два.

Сделал цикл обращений к этой функции, пока не удалятся все ордера.

По идее если ордер на бай, то должно закрываться по Bid и не важно какая сейчас цена.

Закрыться должен по Bid по любой цене.

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

Или я что-то не понимаю?

 
Valerius:

В том-то и дело, что ордера остаётся один или два.

Сделал цикл обращений к этой функции, пока не удалятся все ордера.

По идее если ордер на бай, то должно закрываться по Bid и не важно какая сейчас цена.

Закрыться должен по Bid по любой цене.

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

Или я что-то не понимаю?

Ошибки есть в журнале при удалении?

Цена может уйти на достаточное расстояние во время цикла. Ask и Bid - константы, которые обновляются либо принудительно (при вызове RefreshRates()), либо при обработке нового тика. Так что, после каждого витка цикла вызывайте RefreshRates() и посмотрите, что получится.

 
Спасибо, попробую.
 
Valerius:
В том-то и дело, что ордера остаётся один или два.
Сделал цикл обращений к этой функции, пока не удалятся все ордера.
По идее если ордер на бай, то должно закрываться по Bid и не важно какая сейчас цена.
Закрыться должен по Bid по любой цене.
И если уже обратился к этой функции много тысяч раз, то цена должна хоть как закрыться.
Или я что-то не понимаю?

Попробуйте 1) заменить Print на Alert, чтоб сразу видеть на экране результат - так быстрее   2) Там у Вас получается код ошибка. Выведите его и посмотрите   3)  Получите и выведите код ошибки функции OrderSelect и сразу же OrderSymbol(), OpderType(), OrderTicket()

if (! OrderSelect(.......))
{
  Alert(GetLastError());
  continue;
}
Alert("OrderSymbol = ",OrderSymbol(), "   OpderType = ", OpderType(), "   OrderTicket = ", OrderTicket());
 
STARIJ:

Попробуйте 1) заменить Print на Alert, чтоб сразу видеть на экране результат - так быстрее   2) Там у Вас получается код ошибка. Выведите его и посмотрите   3)  Получите и выведите код ошибки функции OrderSelect и сразу же OrderSymbol(), OpderType(), OrderTicket()


Пробовал и RefreshRates(). Ничего не изменилось. Alert - тоже самое, что и принт, выдаёт - неправильные параметры.

Ошибка 3. 

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

Счетчик обращений показал несколько миллионов обращений. То есть ордера не удаляются.

Там есть ещё проверка на удалённость всех ордеров, это как страховка. Если есть ордера, то идёт обращение к

функции удаления.  Происходит зацикливание программы. То есть пока не удалятся все ордера , из цикла не выйдет.

И такая фигня на 2 валютных парах. Уже всё голову сломал. Что делать?

 
Valerius:


Пробовал и RefreshRates(). Ничего не изменилось. Alert - тоже самое, что и принт, выдаёт - неправильные параметры.

Ошибка 3. 

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

Счетчик обращений показал несколько миллионов обращений. То есть ордера не удаляются.

Там есть ещё проверка на удалённость всех ордеров, это как страховка. Если есть ордера, то идёт обращение к

функции удаления.  Происходит зацикливание программы. То есть пока не удалятся все ордера , из цикла не выйдет.

И такая фигня на 2 валютных парах. Уже всё голову сломал. Что делать?

А что за функция error()

            if(err==false) error(GetLastError());
            Print("Удален ордер тикет - ",ot);

Не исключено, что в ней проблема.

 
Alexey Viktorov:

А что за функция error()

Не исключено, что в ней проблема.


Функция error() - просто выводит надпись с кодом ошибки. С данной функцией проблем нет, она у меня во многих советниках и я её не меняю никогда.

Так что точно не в ней дело.

А сама функция вот она:

//====================================================================
int error(int errr)
{
string descr;
switch(errr)
  {
  // Коды ошибок, возвращаемые торговым сервером или клиентским терминалом:
  case 0:    descr= ""; return(0);
  case 1:    descr= "Нет ошибки, но результат не известен"; break;
  case 2:    descr= "Общая ошибка"; break;
  case 3:    descr= "Неправильные параметры"; break;
  case 4:    descr= "Торговый сервер занят"; break;
  case 5:    descr= "Старая версия клиентского терминала"; break;
  case 6:    descr= "Нет связи с торговым сервером"; break;
  case 7:    descr= "Недостаточно прав"; break;
  case 8:    descr= "Слишком частые запросы"; break;
  case 9:    descr= "Недопустимая операция нарушающая функционирование сервера"; break;
  case 64:   descr= "Счет заблокирован"; break;
  case 65:   descr= "Неправильный номер счета"; break;
  case 128:  descr= "Истек срок ожидания совершения сделки"; break;
  case 129:  descr= "Неправильная цена"; break;
  case 130:  descr= "Неправильные стопы"; break;
  case 131:  descr= "Неправильный объем"; break;
  case 132:  descr= "Рынок закрыт"; break;
  case 133:  descr= "Торговля запрещена"; break;
  case 134:  descr= "Недостаточно денег для совершения операции"; break;
  case 135:  descr= "Цена изменилась"; break;
  case 136:  descr= "Нет цен"; break;
  case 137:  descr= "Брокер занят"; break;
  case 138:  descr= "Новые цены"; break;
  case 139:  descr= "Ордер заблокирован и уже обрабатывается"; break;
  case 140:  descr= "Разрешена только покупка"; break;
  case 141:  descr= "Слишком много запросов"; break;
  case 145:  descr= "Модификация запрещена, так как ордер слишком близок к рынку"; break;
  case 146:  descr= "Подсистема торговли занята"; break;
  case 147:  descr= "Использование даты истечения ордера запрещено брокером"; break;
  case 148:  descr= "Количество открытых и отложенных ордеров достигло предела, установленного брокером"; break;
  case 149:  descr= "Попытка открыть противоположную позицию к уже существующей, если хеджирование запрещено"; break;
  case 150:  descr= "Попытка закрыть позицию по инструменту в противоречии с правилом FIFO"; break;
  case 4000: /*descr= "Нет ошибки";*/ return(0);
  case 4001: descr= "Неправильный указатель функции"; break;
  case 4002: descr= "Индекс массива - вне диапазона"; break;
  case 4003: descr= "Нет памяти для стека функций"; break;
  case 4004: descr= "Переполнение стека после рекурсивного вызова"; break;
  case 4005: descr= "На стеке нет памяти для передачи параметров"; break;
  case 4006: descr= "Нет памяти для строкового параметра"; break;
  case 4007: descr= "Нет памяти для временной строки"; break;
  case 4008: descr= "Неинициализированная строка"; break;
  case 4009: descr= "Неинициализированная строка в массиве"; break;
  case 4010: descr= "Нет памяти для строкового массива"; break;
  case 4011: descr= "Слишком длинная строка"; break;
  case 4012: descr= "Остаток от деления на ноль"; break;
  case 4013: descr= "Деление на ноль"; break;
  case 4014: descr= "Неизвестная команда"; break;
  case 4015: descr= "Неправильный переход"; break;
  case 4016: descr= "Неинициализированный массив"; break;
  case 4017: descr= "Вызовы DLL не разрешены"; break;
  case 4018: descr= "Невозможно загрузить библиотеку"; break;
  case 4019: descr= "Невозможно вызвать функцию"; break;
  case 4020: descr= "Вызовы внешних библиотечных функций не разрешены"; break;
  case 4021: descr= "Недостаточно памяти для строки, возвращаемой из функции"; break;
  case 4022: descr= "Система занята"; break;
  case 4050: descr= "Неправильное количество параметров функции"; break;
  case 4051: descr= "Недопустимое значение параметра функции"; break;
  case 4052: descr= "Внутренняя ошибка строковой функции"; break;
  case 4053: descr= "Ошибка массива"; break;
  case 4054: descr= "Неправильное использование массива-таймсерии"; break;
  case 4055: descr= "Ошибка пользовательского индикатора"; break;
  case 4056: descr= "Массивы несовместимы"; break;
  case 4057: descr= "Ошибка обработки глобальныех переменных"; break;
  case 4058: descr= "Глобальная переменная не обнаружена"; break;
  case 4059: descr= "Функция не разрешена в тестовом режиме"; break;
  case 4060: descr= "Функция не подтверждена"; break;
  case 4061: descr= "Ошибка отправки почты"; break;
  case 4062: descr= "Ожидается параметр типа string"; break;
  case 4063: descr= "Ожидается параметр типа integer"; break;
  case 4064: descr= "Ожидается параметр типа double"; break;
  case 4065: descr= "В качестве параметра ожидается массив"; break;
  case 4066: descr= "Запрошенные исторические данные в состоянии обновления"; break;
  case 4099: descr= "Конец файла"; break;
  case 4100: descr= "Ошибка при работе с файлом"; break;
  case 4101: descr= "Неправильное имя файла"; break;
  case 4102: descr= "Слишком много открытых файлов"; break;
  case 4103: descr= "Невозможно открыть файл"; break;
  case 4104: descr= "Несовместимый режим доступа к файлу"; break;
  case 4105: descr= "Ни один ордер не выбран"; break;
  case 4106: descr= "Неизвестный символ"; break;
  case 4107: descr= "Неправильный параметр цены для торговой функции"; break;
  case 4108: descr= "Неверный номер тикета"; break;
  case 4109: descr= "Торговля не разрешена"; break;
  case 4110: descr= "Длинные позиции не разрешены"; break;
  case 4111: descr= "Короткие позиции не разрешены"; break;
  case 4200: descr= "Объект уже существует"; break;
  case 4201: descr= "Запрошено неизвестное свойство объекта"; break;
  case 4202: descr= "Объект не существует"; break;
  case 4203: descr= "Неизвестный тип объекта"; break;
  case 4204: descr= "Нет имени объекта"; break;
  case 4205: descr= "Ошибка координат объекта"; break;
  case 4206: descr= "Не найдено указанное подокно"; break;
  case 4207: descr= "Ошибка при работе с объектом"; break;
  }
Comment("Ошибка!  ",descr); 
Print("Ошибка!  ",descr);
return(errr);
}     
Причина обращения: