MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 212

 
geratdc :

여보세요,


다음 정보를 찾고 있습니다.

1. 고문 업무 중 주요 사건 처리 시 SMS 알림 구현에 대하여

2. 12-00 PND에서 18-00 PTN 사이의 거래 개시 및 닫기 구현(주간 거래 세션의 시작 및 종료에 대한 SMS 알림 포함).

3. 거래 완료 후 이메일 알림 구현(18-00 PTN) - 주간 거래 세션에 대한 고문의 작업에 대한 보고서 보내기, 일정 및 포지션 개시 날짜 표시와 함께 테스터에서 마감 날짜, 포지션 가격, 포지션 마감 결과에 따른 손익. 아니면 보고서가 txt 형식으로 되어 있습니까?


어떤 기능이나 스크립트가 이것을 구현하는지 알려주십시오. 이 모든 것을 코딩하는 방법, 아마도 이것에 대한 주제가 있었을 것입니다 - SMS 및 이메일 알림 및 보고서.

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

다음은 이것을 쉽게 하기 위한 것입니다.)))


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

여기 포럼에서 좋은 SMS 알림 알고리즘이 논의되었습니다. 고문은 이메일을 보내고 이메일 운영자는 편지 텍스트와 함께 SMS를 보냅니다. 모든 독창적인 것은 간단합니다. 거기에서 모바일 만 등록하면됩니다. 이미 쉬워졌습니다.

가서 읽어보니 비슷한 기능이 있는 SendMail()을 찾았습니다. 흥미롭게 복잡합니까?

그것은 이제 오랫동안 표준이었습니다. SMS 대신 푸시 메시지를 사용하세요. 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개의 주문은 삭제되지 않은 채로 남아 있습니다.

그리고 이 함수를 아무리 불러도 이 함수는 나머지 주문을 닫지 않습니다.

정확한 가격이 아닌 오류가 발생합니다.

requotes라고 생각했는데 이 함수가 이미 500,000번 호출되면 어떤 requotes가 있을 수 있습니까?

그리고 잘못된 가격은 무엇입니까?

다른 고문들에게는 그런 말도 안되는 소리가 없었습니다.

 
Valerius :

좋은 오후에요 여러분!

한 번에 모든 주문을 삭제하는 이 코드를 만들었습니다.

문제는 거의 모든 주문이 마감되었다는 것입니다. 그러나 1-2개의 주문은 삭제되지 않은 채로 남아 있습니다.

그리고 이 함수를 아무리 불러도 이 함수는 나머지 주문을 닫지 않습니다.

정확한 가격이 아닌 오류가 발생합니다.

requotes라고 생각했는데 이 함수가 이미 500,000번 호출되면 어떤 requotes가 있을 수 있습니까?

그리고 잘못된 가격은 무엇입니까?

다른 고문들에게는 그런 말도 안되는 소리가 없었습니다.

주문이 많으면 가격이 쓸모 없게 될 시간이 있습니다. RefreshRates() 를 추가하면 괜찮을 것입니다.
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
RefreshRates - Доступ к таймсериям и индикаторам - Справочник MQL4
 
Alexey Viktorov :
주문이 많으면 가격이 쓸모 없게 될 시간이 있습니다. RefreshRates() 를 추가하면 괜찮을 것입니다.

문제의 사실은 하나 또는 두 개의 주문만 남아 있다는 것입니다.

모든 주문이 삭제될 때까지 이 함수에 대한 호출 주기를 만들었습니다.

이론적으로 주문이 매수인 경우 입찰에 의해 마감되어야 하며 현재 가격이 얼마인지는 중요하지 않습니다.

어떤 가격으로든 입찰가에서 마감되어야 합니다.

그리고 이미 이 기능을 수천 번 적용했다면 가격이 어떻게든 닫혀야 합니다.

아니면 내가 뭔가를 이해하지 못합니까?

 
Valerius :

문제의 사실은 하나 또는 두 개의 주문만 남아 있다는 것입니다.

모든 주문이 삭제될 때까지 이 함수에 대한 호출 주기를 만들었습니다.

이론적으로 주문이 매수인 경우 입찰에 의해 마감되어야 하며 현재 가격이 얼마인지는 중요하지 않습니다.

어떤 가격으로든 입찰가에서 마감되어야 합니다.

그리고 이미 이 기능을 수천 번 적용했다면 가격이 어떻게든 닫혀야 합니다.

아니면 내가 뭔가를 이해하지 못합니까?

삭제할 때 로그에 오류가 있습니까?

가격은 사이클 동안 충분한 거리를 이동할 수 있습니다. Ask 및 Bid는 강제로(RefreshRates()를 호출할 때) 또는 새 틱을 처리할 때 업데이트되는 상수입니다. 따라서 루프를 반복할 때마다 RefreshRates()를 호출하고 어떤 일이 발생하는지 확인하십시오.

 
감사합니다.
 
Valerius :
문제의 사실은 하나 또는 두 개의 주문만 남아 있다는 것입니다.
모든 주문이 삭제될 때까지 이 함수에 대한 호출 주기를 만들었습니다.
이론적으로 주문이 매수인 경우 입찰에 의해 마감되어야 하며 현재 가격이 얼마인지는 중요하지 않습니다.
어떤 가격으로든 입찰가에서 마감되어야 합니다.
그리고 이미 이 기능을 수천 번 적용했다면 가격이 어떻게든 닫혀야 합니다.
아니면 내가 뭔가를 이해하지 못합니까?

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()를 시도했다. 아무것도 바뀌지 않았다. 경고 - 인쇄와 동일하며 잘못된 매개변수를 제공합니다.

실수 3.

오늘 아침에 일어나 보니 어드바이저가 일하고 밤새도록 모든 주문을 삭제하는 기능을 호출했습니다.

조회수 카운터는 수백만 조회수를 보여주었습니다. 즉, 주문이 삭제되지 않습니다.

모든 주문의 원격성에 대한 확인도 있습니다. 마치 보험과 같습니다. 명령이 있으면 항소가 있습니다.

기능을 삭제합니다. 프로그램이 반복됩니다. 즉, 모든 주문이 삭제될 때까지 주기가 종료되지 않습니다.

그리고 2개의 통화 쌍에 있는 그런 쓰레기. 이미 그의 머리가 부러졌습니다. 무엇을 할까요?

 
Valerius :


나는 또한 RefreshRates()를 시도했다. 아무것도 바뀌지 않았다. 경고 - 인쇄와 동일하며 잘못된 매개변수를 제공합니다.

실수 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);
}     
사유: