Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 212

 
geratdc:

Salve,


Alla ricerca delle seguenti informazioni:

1. per quanto riguarda l'implementazione delle notifiche via SMS durante l'elaborazione di eventi chiave nel lavoro dell'Expert Advisor.

Circa la realizzazione dell'apertura e della chiusura degli scambi dalle 12-00 PST fino alle 18-00 PST (con notifica via sms, naturalmente :) circa l'inizio e la fine di una sessione di trading settimanale).

Circa l'implementazione di una notifica via e-mail dopo il completamento del commercio (18-00 PTN) - l'invio di un rapporto sul lavoro del consulente per una sessione di trading settimanale, nel tester, con un grafico e l'indicazione delle date di apertura, date di chiusura, prezzi, profitti / perdite dopo la chiusura delle posizioni. O i rapporti saranno in formato txt?


Per favore consigliate quali funzioni o script lo implementeranno? Come posso farlo? Forse c'è un argomento su questo - notifiche e rapporti via SMS e e-mail.

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

Ecco qualcosa di simile, ma per renderlo più semplice)))


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

L'algoritmo delle notifiche sms non è male, la nostra EA ci manda l'email, e l'operatore email ci manda il testo della lettera. Tutto brillantemente semplice. Tutto ciò di cui abbiamo bisogno è di registrare il nostro telefono cellulare. Ora è più facile.

Vado a leggere, ho trovato una funzione simile - SendMail().Mi chiedo quanto sia complicato?

Tutto un tempo così lungo ha tutto un tale standard. Usa i messaggi push invece degli sms, SendMail() lo ha già trovato.
 

Buon pomeriggio a tutti!

Fatto questo codice - cancella tutti gli ordini in una volta.

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

Il problema è che quasi tutti gli ordini sono chiusi. Ma abbiamo ancora 1-2 ordini che non vengono cancellati.

E non importa quante volte accedo a questa funzione, questa funzione non chiude gli ordini rimanenti.

Ricevo un errore che mostra un prezzo sbagliato.

Ho pensato che fosse requotes, ma se richiediamo questa funzione già 500000 volte, cosa può essere requotes?

Quale non può essere il prezzo sbagliato?

Non ho mai avuto una tale assurdità con altri EA.

 
Valerius:

Buon pomeriggio a tutti!

Fatto questo codice - cancella tutti gli ordini in una volta.

Il problema è che quasi tutti gli ordini sono chiusi. Ma abbiamo ancora 1-2 ordini che non vengono cancellati.

E non importa quante volte accedo a questa funzione, questa funzione non chiude gli ordini rimanenti.

Ricevo un errore che mostra un prezzo sbagliato.

Ho pensato che fosse requotes, ma se richiediamo questa funzione già 500000 volte, cosa può essere requotes?

Quale non può essere il prezzo sbagliato?

Non ho mai avuto una tale assurdità con altri EA.

Se ci sono molti ordini, il prezzo ha il tempo di diventare obsoleto. Aggiungete RefreshRates() e dovrebbe essere ok.
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
 
Alexey Viktorov:
Se ci sono molti ordini, il prezzo ha il tempo di diventare obsoleto. Aggiungete RefreshRates() e dovrebbe andare bene.

Questo è il punto: sono rimasti uno o due ordini.

Ho fatto un ciclo di chiamate a questa funzione fino a quando tutti gli ordini sono stati cancellati.

Nell'idea, se l'ordine è per comprare, dovrebbe essere chiuso da Bid, e non importa quale prezzo è ora.

Dovrebbe chiudere da Bid a qualsiasi prezzo.

E se abbiamo affrontato questa funzione molte migliaia di volte, il prezzo dovrebbe chiudersi comunque.

O forse non capisco qualcosa?

 
Valerius:

Questo è il punto: sono rimasti uno o due ordini.

Ho fatto un ciclo di chiamate a questa funzione fino a quando tutti gli ordini sono stati cancellati.

In teoria, se l'ordine è di acquisto, dovrebbe essere chiuso da Bid e non importa quale prezzo sia ora.

Dovrebbe chiudere da Bid a qualsiasi prezzo.

E se abbiamo affrontato questa funzione molte migliaia di volte, il prezzo dovrebbe chiudersi comunque.

O c'è qualcosa che non capisco?

Ci sono errori nel registro quando si cancella?

Il prezzo può andare abbastanza lontano durante il ciclo. Ask e Bid sono costanti che vengono aggiornate forzatamente (quando si chiama RefreshRates()) o quando si elabora un nuovo tick. Quindi, dopo ogni giro del ciclo, chiamate RefreshRates() e vedete cosa succede.

 
Grazie, farò una prova.
 
Valerius:
Il fatto è che sono rimasti uno o due ordini.
Ho fatto un ciclo di chiamate a questa funzione fino a quando tutti gli ordini sono stati cancellati.
In teoria, se l'ordine è di acquisto, dovrebbe essere chiuso da Bid e non importa quale sia il prezzo in quel momento.
Dovrebbe chiudere da Bid a qualsiasi prezzo.
E se abbiamo affrontato questa funzione molte migliaia di volte, il prezzo dovrebbe chiudersi comunque.
O forse non capisco qualcosa?

Provate 1) a sostituire Print con Alert per vedere immediatamente il risultato sullo schermo - è più veloce 2) Lì si ottiene il codice di errore. Stamparlo e vedere 3) Ottenere e stampare il codice di errore della funzione OrderSelect e immediatamente OrderSymbol(), OpderType(), OrderTicket()

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

Provate 1) a sostituire Print con Alert per vedere immediatamente il risultato sullo schermo - è più veloce 2) Lì si ottiene il codice di errore. Stamparlo e vedere 3) Ottenere e stampare il codice di errore della funzione OrderSelect e immediatamente OrderSymbol(), OpderType(), OrderTicket().


Ho provato anche RefreshRates(). Non è cambiato nulla. Alert - come la stampa, dà fuori - parametri sbagliati.

Errore 3.

Mi sono alzato la mattina e ho visto che l'EA si era attivato e stava mostrando la funzione di cancellare tutti gli ordini per tutta la notte.

Il contatore delle richieste mostra diversi milioni di richieste. Questo significa che gli ordini non vengono cancellati.

Questo EA controlla anche se tutti gli ordini vengono cancellati, è come un'assicurazione. Se ci sono ordini, chiameremo il

Viene richiesta la funzione di cancellazione. Il programma si blocca. Questo significa che il ciclo non si fermerà finché tutti gli ordini non saranno cancellati.

Tali problemi si verificano su 2 coppie di valute. Ho già perso la testa. Cosa fare?

 
Valerius:


Ho provato con RefreshRates(). Non è cambiato nulla. Alert - come per la stampa, dice - parametri sbagliati.

Errore 3.

Mi sono svegliato questa mattina e ho visto che l'EA si era attivato e mostrava una chiamata per cancellare tutti gli ordini per tutta la notte.

Il contatore delle richieste mostrava diversi milioni di richieste. Significa che gli ordini non vengono cancellati.

Questo EA controlla anche se tutti gli ordini vengono cancellati, è come un'assicurazione. Se ci sono ordini, chiameremo il

Viene richiesta la funzione di cancellazione. Il programma si blocca. Questo significa che il ciclo non si fermerà finché tutti gli ordini non saranno cancellati.

Tali problemi si verificano su 2 coppie di valute. Ho già perso la testa. Cosa fare?

E cos'è la funzione error()?

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

Può essere il problema.

 
Alexey Viktorov:

Cos'è la funzione error()?

È possibile che questo sia il problema.


La funzione error() mostra solo un codice di errore. Non c'è nessun problema con questa funzione, ce l'ho in molti EA e non la cambio mai.

Quindi non è sicuramente il problema.

La funzione stessa è proprio qui:

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