Новая версия платформы MetaTrader 5 build 2980: Push-уведомления о торговых операциях - страница 4

 

что-то непонятное с ENUM_INIT_RETCODE в OnDeinit индикатора.

Код для воспроизведения:

#property strict
#property description "bugs onInit?"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot 0
#property indicator_label1  "Value"
#property indicator_type1   DRAW_LINE
#property indicator_color1  RoyalBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//-----------------------------------
//--- input parameters ------
input bool params=false;   // condition
//--- indicator buffers
double         Means[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  Print ("ENUM_INIT_RETCODE:");
  for (int i=0;i<9;i++)
  {
   printf ("ENUM [%i] -  '%s'",i,EnumToString((ENUM_INIT_RETCODE)i));
  }
  
  Print ("---------- STANDART ENUM_INIT_RETCODE:");
     printf ("ENUM INIT_AGENT_NOT_SUITABLE   - '%s'",EnumToString((ENUM_INIT_RETCODE)INIT_AGENT_NOT_SUITABLE));
     printf ("ENUM INIT_PARAMETERS_INCORRECT - '%s'",EnumToString((ENUM_INIT_RETCODE)INIT_PARAMETERS_INCORRECT));
     printf ("ENUM INIT_SUCCEEDED            - '%s'",EnumToString((ENUM_INIT_RETCODE)INIT_SUCCEEDED));
  
  
//------------------------------   
   if (!params)
    {
     Alert ("not true conditions.");
     return(INIT_FAILED);
    }
//--- indicator buffers mapping
   SetIndexBuffer (0,Means,INDICATOR_DATA);
   ArraySetAsSeries(Means,true);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,Digits());    
//---------------
   printf ("init started.");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| DEINIT                                                           |
//+------------------------------------------------------------------+
void OnDeinit(const int code)
  { 
    printf ("Deinit: %i-%s",code,EnumToString((ENUM_INIT_RETCODE)code));
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   // ....
   return(rates_total);
  }

в результате некорректно отрабатывает ожидаемая выгрузка индикатора.

PE      0       15:04:24.782    bugONinit (EURUSD,M5)   ENUM_INIT_RETCODE:
IQ      0       15:04:24.782    bugONinit (EURUSD,M5)   ENUM [0] -  'INIT_SUCCEEDED'
NF      0       15:04:24.782    bugONinit (EURUSD,M5)   ENUM [1] -  'INIT_FAILED'
DM      0       15:04:24.782    bugONinit (EURUSD,M5)   ENUM [2] -  'ENUM_INIT_RETCODE::2'
LK      0       15:04:24.782    bugONinit (EURUSD,M5)   ENUM [3] -  'ENUM_INIT_RETCODE::3'
DR      0       15:04:24.782    bugONinit (EURUSD,M5)   ENUM [4] -  'ENUM_INIT_RETCODE::4'
LH      0       15:04:24.782    bugONinit (EURUSD,M5)   ENUM [5] -  'ENUM_INIT_RETCODE::5'
DG      0       15:04:24.782    bugONinit (EURUSD,M5)   ENUM [6] -  'ENUM_INIT_RETCODE::6'
LM      0       15:04:24.782    bugONinit (EURUSD,M5)   ENUM [7] -  'ENUM_INIT_RETCODE::7'
DD      0       15:04:24.782    bugONinit (EURUSD,M5)   ENUM [8] -  'ENUM_INIT_RETCODE::8'
CR      0       15:04:24.782    bugONinit (EURUSD,M5)   ---------- STANDART ENUM_INIT_RETCODE:
KF      0       15:04:24.782    bugONinit (EURUSD,M5)   ENUM INIT_AGENT_NOT_SUITABLE   - 'INIT_AGENT_NOT_SUITABLE'
CJ      0       15:04:24.782    bugONinit (EURUSD,M5)   ENUM INIT_PARAMETERS_INCORRECT - 'INIT_PARAMETERS_INCORRECT'
GK      0       15:04:24.782    bugONinit (EURUSD,M5)   ENUM INIT_SUCCEEDED            - 'INIT_SUCCEEDED'
HR      0       15:04:24.782    bugONinit (EURUSD,M5)   Alert: not true conditions.
DH      0       15:04:24.782    bugONinit (EURUSD,M5)   Deinit: 8-ENUM_INIT_RETCODE::8

т.е. явный возврат INIT_FAILED дошел до OnDeinit как 8, а не 1.

Индикатор не выгрузился и остался на чарте! 

LH      0       12:31:28.093    Terminal        Swissquote Bank MT5 Client Terminal x64 build 2981 started for Swissquote Bank SA
NS      0       12:31:28.094    Terminal        Windows 10 build 19043, Intel Core i5-4200U  @ 1.60GHz, 3 / 7 Gb memory, 90 / 913 Gb disk, IE 11, UAC, GMT+2
 
Mikhail Dovbakh:

что-то непонятное с ENUM_INIT_RETCODE в OnDeinit индикатора.

Код для воспроизведения:

в результате некорректно отрабатывает ожидаемая выгрузка индикатора.

т.е. явный возврат INIT_FAILED дошел до OnDeinit как 8, а не 1.

Индикатор не выгрузился и остался на чарте! 

Что-то вы запутались  https://www.mql5.com/ru/docs/constants/namedconstants/uninit

Причины деинициализации

Коды причины деинициализации эксперта, возвращаемые функцией UninitializeReason(). Могут иметь любые из следующих значений:

Константа

Значение

Описание

REASON_PROGRAM

0

Эксперт прекратил свою работу, вызвав функцию ExpertRemove()

REASON_REMOVE

1

Программа удалена с графика

REASON_RECOMPILE

2

Программа перекомпилирована

REASON_CHARTCHANGE

3

Символ или период графика был изменен

REASON_CHARTCLOSE

4

График закрыт

REASON_PARAMETERS

5

Входные параметры были изменены пользователем

REASON_ACCOUNT

6

Активирован другой счет либо произошло переподключение к торговому серверу вследствие изменения настроек счета

REASON_TEMPLATE

7

Применен другой шаблон графика

REASON_INITFAILED

8

Признак того, что обработчик OnInit() вернул ненулевое значение

REASON_CLOSE

9

Терминал был закрыт

Код причины деинициализации передается также в качестве параметра предопределенной функции OnDeinit(const int reason).

Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Причины деинициализации
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Причины деинициализации
  • www.mql5.com
Причины деинициализации - Именованные константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Да, согласен (иное, чем в ОnInit, перечисление используется в OnDeinit) - код возврата не нулевой и передача 8-ки в OnDeinit это корректно.

Однако, я, по наивности, ожидал поведения - индикатор будет выгружен.

Этого не происходит. Я опять что-то упустил. Как в таком случае выгружать индикатор?

 
Читайте наконец справку https://www.mql5.com/ru/docs/runtime/running
Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Выполнение программ - Программы MQL5 - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Rashid Umarov:
Читайте наконец справку https://www.mql5.com/ru/docs/runtime/running

Ваш ответ следует интерпретировать - "Выгрузка индикатора с кодом возврата в его OnInit - INIT_FAILED не предусмотрена."

Или все же, следует ожидать, что такой индикатор будет выгружен?  Это логично.

В последнем релизе (2981) это не происходит.

 

Обнаружил, что на всех 5 компьютерах стоит Win10 x64 и MT5 x32. Переустановил на одном x64.

Как бы побыстрее на остальных? Скопировать *.exe будет достаточно?

 
Konstantin Erin:

Обнаружил, что на всех 5 компьютерах стоит Win10 x64 и MT5 x32. Переустановил на одном x64.

Как бы побыстрее на остальных? Скопировать *.exe будет достаточно?

Вполне достаточно. Я обновляю только так. Да и устанавливаю в новые папки так-же.

 

b2981, просьба исправить поведение на прежнее (b2958).

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 2940: Перенос витрин MQL5-сервисов в рабочую область и обновление дизайна

fxsaber, 2021.06.19 14:39

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

#property script_show_inputs

input bool inFlag = true;  // Проверка истории с открытием ордеров
input datetime inFrom = 0; // Не ноль приведет к ошибке и с новыми ордерами

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

void OnTick()
{    
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick) && Tick.ask)
  {
    Print("------------\n" + (string)inFlag); // Отделили строки разных запусков скрипта.
  
    if (inFlag) // Проверка на новых ордерах.
    {
      // Попытка сформировать кеш на случай, если начальная дата будет всегда постоянной, но ненулевой.
      HistorySelect(inFrom, INT_MAX);
      
      Print("Create/Delete orders.");
      
      // Создали первый ордер.
      const TICKET_TYPE Ticket1 = OrderSend(_Symbol, OP_BUYLIMIT, 0.1, Tick.ask - 1000 * _Point, 0, 0, 0);
      
      Sleep(2000); // Подождали и создали второй ордер.
      const TICKET_TYPE Ticket2 = OrderSend(_Symbol, OP_BUYLIMIT, 0.1, Tick.ask - 1000 * _Point, 0, 0, 0);
      
      Print(Ticket1); // Тикет первого.
      Print(Ticket2); // Тикет второго.
      
      OrderDelete(Ticket2); // Удалили второй - попал в историю.
      
      Sleep(2000); // Подождали и удалили первый - попал в историю.
      OrderDelete(Ticket1);
    
      // Проверка последовательности ордеров в истории - последних двух.
      if (HistorySelect(inFrom, INT_MAX))
      {
        Print("Check the History. inFrom = " + (string)inFrom);
        
        const int Total = HistoryOrdersTotal();
        
        for (int i = Total - 2; i < Total; i++)
          Print(HistoryOrderGetTicket(i)); // Распечатываем тикеты в конце таблицы. 
      }
  
      ExpertRemove();  
    }  
  }  
}


Результат Тестера.

2021.06.19 15:30:46.582 Core 1  EURUSD,M1: testing of Experts\Test9.ex5 from 2021.06.18 00:00 to 2021.06.19 00:00 started with inputs:
2021.06.19 15:30:46.582 Core 1    inFlag=true
2021.06.19 15:30:46.582 Core 1    inFrom=0
2021.06.19 15:30:46.582 Core 1  EURUSD : real ticks begin from 2021.03.15 00:00:00
2021.06.19 15:30:46.582 Core 1  2021.06.18 00:00:00   ------------
2021.06.19 15:30:46.582 Core 1  2021.06.18 00:00:00   true
2021.06.19 15:30:46.582 Core 1  2021.06.18 00:00:00   Create/Delete orders.
2021.06.19 15:30:46.582 Core 1  2021.06.18 00:00:00   buy limit 0.1 EURUSD at 1.18097 (1.19057 / 1.19097)
2021.06.19 15:30:46.582 Core 1  2021.06.18 00:00:02   buy limit 0.1 EURUSD at 1.18097 (1.19057 / 1.19069)
2021.06.19 15:30:46.582 Core 1  2021.06.18 00:00:02   2
2021.06.19 15:30:46.582 Core 1  2021.06.18 00:00:02   3
2021.06.19 15:30:46.582 Core 1  2021.06.18 00:00:02   order canceled [#3 buy limit 0.1 EURUSD at 1.18097]
2021.06.19 15:30:46.582 Core 1  2021.06.18 00:00:04   order canceled [#2 buy limit 0.1 EURUSD at 1.18097]
2021.06.19 15:30:46.582 Core 1  2021.06.18 00:00:04   Check the History. inFrom = 1970.01.01 00:00:00
2021.06.19 15:30:46.582 Core 1  2021.06.18 00:00:04   3
2021.06.19 15:30:46.582 Core 1  2021.06.18 00:00:04   2
2021.06.19 15:30:46.582 Core 1  2021.06.18 00:00:04   ExpertRemove() function called

Все четко и правильно в Тестере! Это не повод ломать Тестер. Это повод вернуть хотя бы поведение Терминала к тому, что было еще в b2958. Там работало только для inFrom = 0, но работало. В Тестере работает для любого inFrom правильно. Это абсолютно логично.


Что имеем на данный момент. HistorySelect в Терминале и в Тестере работают разными алгоритмами. При этом в Тестере этот алгоритм удобный и логичный, да еще и супер-быстрый - дозапись всего, что приходит в историю, в конец таблицы. В Терминале же - нет.


Заметьте, не упоминаю сортировку по какому-либо признаку во время работы советника. Просто говорю о дозаписи в конец (а не в середину) новых элементов истории.

Если же говорить о сортировке, то она нужна только один раз - при запуске советника. И сортировка должна быть по ORDER_TIME_DONE_MSC (при совпадающих значениях - по тикету). Тогда будет полная однозначность HistorySelect-таблицы во время работы и сразу после запуска.

 

Не понимаю, почему все время нарываюсь на подобный бред.


 


Это сделано специально, чтобы косвенно повысить цены для пользователей MT5? Тогда вы должны четко написать это на странице VPS и не маскировать это!


Is this intentional to indirectly increase prices for MT5 users? But then you have to write this clearly on the VPS page and not try to hide it!



Причина обращения: