Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 212

 
geratdc:

Olá,


Procurando as seguintes informações:

1. sobre a implementação de notificações SMS ao processar eventos chave no trabalho do Consultor Especialista.

Sobre a realização de abertura e fechamento de comércio de 12-00 PST até 18-00 PST (com notificação sms, é claro :) sobre o início e o fim de uma sessão de comércio semanal ).

Sobre a implementação de uma notificação por e-mail após a conclusão da negociação (18-00 PTN) - envio de relatório sobre o trabalho do consultor para uma sessão de negociação semanal, no testador, com um gráfico e indicação de datas de abertura, datas de fechamento, preços, lucros/perdas após o fechamento das posições. Ou os relatórios estarão em formato txt ?


Por favor, informe quais funções ou roteiros irão implementá-lo ? Como posso fazer isso? Pode haver um tópico sobre isso - notificações e relatórios por SMS e e-mail.

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

Aqui está algo como isto, mas para tornar mais simples))))


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

O algoritmo de notificações sms não é ruim, nossa EA nos envia e-mail, e o operador de e-mail nos envia o texto da carta. Tudo brilhantemente simples. Tudo o que precisamos é registrar nosso telefone celular. Agora é mais fácil.

Vou ler, encontrei uma função similar - SendMail().Pergunto-me como é complicado?

Tudo isso há muito tempo tem esse padrão. Use mensagens push em vez de sms, o SendMail() já o encontrou.
 

Boa tarde a todos!

Fez este código - apagar todos os pedidos de uma só vez.

//===================================================================
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;
}

O problema é que quase todos os pedidos são fechados. Mas ainda temos 1-2 pedidos que não são eliminados.

E não importa quantas vezes eu acesse esta função, esta função não fecha as ordens restantes.

Eu recebo um erro mostrando um preço errado.

Pensei que fossem solicitações, mas se já solicitamos esta função 500.000 vezes, quais solicitações podem ser?

Qual não pode ser o preço errado?

Nunca tive tanta bobagem com outros EAs.

 
Valerius:

Boa tarde a todos!

Fez este código - apagar todos os pedidos de uma só vez.

O problema é que quase todos os pedidos são fechados. Mas ainda temos 1-2 pedidos que não são eliminados.

E não importa quantas vezes eu acesse esta função, esta função não fecha as ordens restantes.

Eu recebo um erro mostrando um preço errado.

Pensei que fossem solicitações, mas se já solicitamos essa função 500.000 vezes, quais solicitações podem ser?

Qual não pode ser o preço errado?

Nunca tive tanta bobagem com outros EAs.

Se houver muitos pedidos, o preço tem tempo para se desatualizar. Acrescente RefreshRates() e deve estar tudo bem.
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
 
Alexey Viktorov:
Se houver muitos pedidos, o preço tem tempo para ficar desatualizado. Acrescente RefreshRates() e deve ser bom.

O problema é esse: uma ou duas ordens são deixadas.

Fiz um ciclo de chamadas para esta função até que todos os pedidos sejam eliminados.

Em idéia, se o pedido for para compra, deve ser fechado pela Bid, e não importa qual seja o preço agora.

Deve ser fechado pela Bid a qualquer preço.

E se já abordamos esta função muitos milhares de vezes, o preço deve fechar de qualquer forma.

Ou talvez eu não entenda alguma coisa?

 
Valerius:

O problema é esse: uma ou duas ordens são deixadas.

Fiz um ciclo de chamadas para esta função até que todos os pedidos sejam eliminados.

Em teoria, se o pedido é para compra, deve ser fechado por Bid, e não importa o preço que é agora.

Deve ser fechado pela Bid a qualquer preço.

E se já abordamos esta função muitos milhares de vezes, o preço deve fechar de qualquer forma.

Ou há algo que eu não entendo?

Há erros no registro ao apagar?

O preço pode ir longe o suficiente durante o ciclo. Ask e Bid são constantes que são atualizadas à força (ao chamar RefreshRates()) ou ao processar um novo tick. Assim, após cada volta do loop, ligue para RefreshRates() e veja o que acontece.

 
Obrigado, vou tentar.
 
Valerius:
A questão é essa, ainda há uma ou duas ordens.
Fiz um loop de chamadas para esta função até que todos os pedidos sejam eliminados.
Em teoria, se o pedido é para compra, deve ser fechado pela Bid e não importa qual seja o preço naquele momento.
Deve ser fechado pela Bid a qualquer preço.
E se já abordamos esta função muitos milhares de vezes, o preço deve fechar de qualquer forma.
Ou talvez eu não entenda alguma coisa?

Tente 1) substituir Imprimir por Alerta para ver o resultado na tela imediatamente - é mais rápido 2) Você obtém o código de erro lá. Imprima-o e veja 3) Obtenha e imprima o código de erro da função OrderSelect e imediatamente OrderSymbol(), OpderType(), OrderTicket()

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

Tente 1) substituir Imprimir por Alerta para ver o resultado na tela imediatamente - é mais rápido 2) Você obtém o código de erro lá. Imprima-o e veja 3) Obtenha e imprima o código de erro da função OrderSelect e imediatamente OrderSymbol(), OpderType(), OrderTicket().


RefreshRates() também. Nada mudou. Alerta - o mesmo que imprimir, dá - parâmetros errados.

Erro 3.

Levantei-me de manhã e vi que a EA havia acionado e estava mostrando a função de apagar todas as ordens durante toda a noite.

O contador de pedidos mostra vários milhões de pedidos. Isto significa que as ordens não são eliminadas.

Este EA também verifica se todos os pedidos são eliminados, é como um seguro. Se houver ordens, chamaremos o

A função de eliminação é necessária. O programa fica preso. Isto significa que o loop não vai parar até que todas as ordens sejam deletadas.

Tais problemas ocorrem em 2 pares de moedas. Eu já perdi a cabeça. O que fazer?

 
Valerius:


Eu tentei RefreshRates(). Nada mudou. Alerta - o mesmo que imprimir, diz ele - parâmetros errados.

Erro 3.

Acordei esta manhã e vi que a EA havia acionado e estava mostrando uma chamada para apagar todos os pedidos durante toda a noite.

O contador de pedidos mostrou vários milhões de pedidos. Isso significa que as ordens não são eliminadas.

Este EA também verifica se todos os pedidos são eliminados, é como um seguro. Se houver ordens, chamaremos o

A função de eliminação é necessária. O programa fica preso. Isto significa que o loop não vai parar até que todas as ordens sejam deletadas.

Tais problemas ocorrem em 2 pares de moedas. Eu já perdi a cabeça. O que fazer?

E qual é a função do erro()?

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

Pode ser esse o problema.

 
Alexey Viktorov:

Qual é a função erro()?

É possível que este seja o problema.


A função error() exibe apenas um código de erro. Não há problema com esta função, eu a tenho em muitos EAs e nunca a mudo.

Portanto, definitivamente não é este o caso.

A função em si está bem aqui:

//====================================================================
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);
}