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

 
Vladimir Karputov:
Старая болезнь - вот просто уже сильно сильно надоела: при визуальном тестировании НЕ ОТОЬБРАЖАЮТСЯ индикаторы, которые используются в советнике. Причем можно раз десять делать запуск тестирования - стоп - и снова запуск чтобы индикаторы появились. Пожалуйста сделайте что-то с этим - я уже не знаю как оправдываться перед людьми.

Пока пытался воспроизвести проблему пропадающих индикаторов, наткнулся на еще одну, регулярно встречающуюся. Через несколько прогонов в визуальном тестировании, тестер перестает запускаться. В журнал выдает такое:

В настройках ничего не меняю.Лечиться перезагрузкой терминала или один раз запустил минут через 10, пока пошел кофе попил, все прошло.

Посмотрите, это начинается с 46-й секунды. У кого-то еще бывало?

Ссылка на видео.

 
Vasiliy Pushkaryov:

У кого-то еще бывало?

Бывало. И не только с визуальным тестированием (очень редко использую). Но лечится элементарно - перезагрузка. Поэтому хлопот не доставляло.

 

сортировка символов в "Обзор рынка"  вроде наконец заработала через - Набор символов, и уже почти месяц опять не работает

каждый новый счет или смена ДЦ, опять вручную двигать символы

 
Slava:

Не подтверждается.

Нужны чёткие шаги по воспроизведению

В видео несколько раз подряд запускаю визуальное тестирование и останавливаю. Смотрите с 01:30, смог воспроизвести эту ситуацию. Индикатор вызывается через iCustom() из папки \MQL5\Indicators\.

Лог из последнего прогона в видео - 20210615_NonDrawing.

Сделал следующий запуск, индикатор снова отрисовывается - его лог 20210615_Drawing.

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

Ссылка на видео

Файлы:
 
Vasiliy Pushkaryov:

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

Ссылка на видео

Также на видео видно, при остановке тестирования линия Зигзага смещена относительно свечных баров. Если тыкнуть мышкой по графику или дернуть колесико мыши, они совмещаются как положено. Как-то не очень красиво смотрится.

И еще просьба, можно ли окно визуального тестирования разворачивать полностью. Или сохранять его последнее состояние/положение и в след.раз запускать таким. А то окно тестирования всегда на пару миллиметров меньше окна терминала. Тянешься мышкой вверх, чтобы закрыть его и уже несколько раз терминал закрывал, вместо тестера.

 
Комментарии, не относящиеся к этой теме, были перенесены в "Разные сделки в разных терминалах".
 

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

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

fxsaber, 2021.06.11 09:47

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

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

#property script_show_inputs

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

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

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{  
  Print("------------\n" + (string)inFlag); // Отделили строки разных запусков скрипта.
  
  if (inFlag) // Проверка на новых ордерах.
  {
    // Попытка сформировать кеш на случай, если начальная дата будет всегда постоянной, но ненулевой.
    HistorySelect(inFrom, INT_MAX);
    
    Print("Create/Delete orders.");
    
    // Создали первый ордер.
    const TICKET_TYPE Ticket1 = OrderSend(_Symbol, OP_BUYLIMIT, 0.1, Ask - 1000 * _Point, 0, 0, 0);
    
    Sleep(2000); // Подождали и создали второй ордер.
    const TICKET_TYPE Ticket2 = OrderSend(_Symbol, OP_BUYLIMIT, 0.1, 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)); // Распечатываем тикеты в конце таблицы. 
  }
}


Скрипт сначала открывает Ticket1, затем Ticket2. Удаляет в обратной последовательности. При правильном формировании HistorySelect-таблицы последние записи в ней должны быть в обратном порядке: сначала Ticket2, затем Ticket1.


Запуск с дефолтными параметрами (inFlag/inFrom = true/0) показывает, что все верно отрабатывает.

------------
true
Create/Delete orders.
2252156086
2252156092
Check the History. inFrom = 1970.01.01 00:00:00
2252156092
2252156086


Тут же запуск без открытия новых ордеров  (inFlag/inFrom = false/0) выдает неправильно сформированную историю.

------------
false
Check the History. inFrom = 1970.01.01 00:00:00
2252156086
2252156092


Запуск с открытием ордеров, но запросом HistorySelect не от нуля (inFlag/inFrom = true/D'2021.06.11') , дает ту же ошибку.

------------
true
Create/Delete orders.
2252156973
2252156985
Check the History. inFrom = 2021.06.11 00:00:00
2252156973
2252156985


Выводы.

  • Если работаете ТОЛЬКО с HistorySelect(0, INT_MAX), то во время работы советника новые ордера (что попадают в историю во время работы советника) будут дозаписываться в конец - сортировка по  ORDER_TIME_DONE_MSC.
  • Как только перезагрузите советник, даже HistorySelect(0, INT_MAX) пересортирует таблицу ордеров иначе - по ORDER_TICKET.
  • Любой вызов HistorySelect не от нуля вызывает пересортировку по ORDER_TICKET.
  • Пока ошибку не устранят, работайте только с  HistorySelect(0, INT_MAX). Это будет тянуть за собой большой по памяти кеш, но не будет проблем с новыми ордерами во время работы советника.
Просьба разработчиков не делать сортировку по ORDER_TICKET при вызовах HistorySelect не от нуля и при старте советников. А делать сортировку по  ORDER_TIME_DONE_MSC.

Уважаемые разработчики, вы ЧТО натворили?! Вот такой результат теперь на b2962.

true
Create/Delete orders.
2252500126
2252500129
Check the History. inFrom = 1970.01.01 00:00:00
2252500126
2252500129

Зачем сломали то, что работало правильно? Теперь невозможно синхронизировать. Невозможно во время работы советника узнать по истории, какой ордер был закрыт последним.

Вы не дали ни одного комментария по данному обсуждению, а просто втихую решили вмешаться и полностью сломали весь механизм торговли.

Невозможно торговать! Верните, пожалуйста, прежний вариант. Он позволял торговать.

 
fxsaber:

Уважаемые разработчики, вы ЧТО натворили?! Вот такой результат теперь на b2962.

Зачем сломали то, что работало правильно? Теперь невозможно синхронизировать. Невозможно во время работы советника узнать по истории, какой ордер был закрыт последним.

Вы не дали ни одного комментария по данному обсуждению, а просто втихую решили вмешаться и полностью сломали весь механизм торговли.

Невозможно торговать! Верните, пожалуйста, прежний вариант. Он позволял торговать.

Скорее всего не по тикету сортирует, а в каждом случае по времени, но в одном случае по времени установки, а в другом - по времени удаления. По времени удаления сортировать - неправильно. То есть неправильный самый первый вариант - ордер вытащен из истории и добавлен в конец, а надо просто пометить его удаленным, но чтобы в истории они был в соответствии с порядком установки (чтобы оставался там, где был).

Да и вообще - история установки и удаления отложенных ордеров - слишком зыбкая материя, чтобы ее вообще для чего-то использовать. 

 
Dmitry Fedoseev:

Скорее всего не по тикету сортирует, а в каждом случае по времени, но в одном случае по времени установки, а в другом - по времени удаления. По времени удаления сортировать - неправильно. То есть неправильный самый первый вариант - ордер вытащен из истории и добавлен в конец, а надо просто пометить его удаленным, но чтобы в истории они был в соответствии с порядком установки (чтобы оставался там, где был).

Да и вообще - история установки и удаления отложенных ордеров - слишком зыбкая материя, чтобы ее вообще для чего-то использовать. 

Как считаете, что должен вернуть этот код?

OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY); // MQL4

HistoryOrderGetTicket(HistoryOrdersTotal() - 1); // MQL5


Написание синхронизатора стало возможным именно по той причине, что любой ордер, что шел в историю, дозаписывался в конец, а не в середину. Раньше это было так для HistorySelect(0, INT_MAX) и было очень удобно и эффективно.


Не понимаю, для чего это нужно было ломать? Сломали же торговлю.

 
fxsaber:

Как считаете, что должен вернуть этот код?


Написание синхронизатора стало возможным именно по той причине, что любой ордер, что шел в историю, дозаписывался в конец, а не в середину. Раньше это было так для HistorySelect(0, INT_MAX) и было очень удобно и эффективно.


Не понимаю, для чего это нужно было ломать? Сломали же торговлю.

Ордер уже был в истории, но потом был помечен как удаленный и почему-то перемещен со своего места в конец истории, а потом он опять оказался на своем месте. Поэтому лучше бы вообще не перемещать ордер в массиве истории никогда. 

Удаление ордера - это не ордер.

А что вернет тот код - в этом-то и проблема, что в разных случаях он может вернуть разное.

Отсюда вывод - историей отложенных ордеров вообще не следует пользоваться.

Хорошо хоть, что такой карусели нет со сделками и рыночными ордерами. Хотя, кто знает про рыночные ордера, у них же статус меняется, может при каждой смене статуса он переносится в конец истории, а проблемы этого не возникло, потому-что пока никто не умудрился вклинить какую-нибудь транзакцию между отправкой ордера и его исполнением. А вот между изменениями статуса отложенного ордера можно вклинить много чего.

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