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

 
MessageBox останавливает выполнение советника. Просьба рассмотреть возможность задавать для MessageBox обратный отсчет времени на принятие решения пользователем.
 
fxsaber:
MessageBox останавливает выполнение советника. Просьба рассмотреть возможность задавать для MessageBox обратный отсчет времени на принятие решения пользователем.

Это вопрос 2012 года

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

Вопрос о MessageBox()

Alexey Navoykov, 2012.02.07 15:21

Сейчас попробовал, в MQL4 эта недокументированная функция вызывается без проблем. Вот рабочий пример:

#include <WinUser32.mqh>

#import "user32.dll"
  int MessageBoxTimeoutA(int hWnd, string lpText, string lpCaption, int uType, int wLanguageId, int dwMilliseconds); 

int start()
{ 
  int result=MessageBoxTimeoutA(0,"Are you ok?","Caption",MB_YESNO,0,1000);
  Print(result);
}

 
Alexey Viktorov:

Это вопрос 2012 года


Но нестандартное решение

 

I (b3003) want to change hasChanged to HasChanged firstly in the actual and then in all files. / Я хочу изменить hasChanged на HasChanged сначала в фактическом, а затем во всех файлах

Найти и найти и заменить в одном или нескольких файлах не получится. :(

Find and Find & Replace in one File or more does not work. :(

This is found but not replaced: / Это найдено, но не заменено:


If I want to change that in all file of the actual and the subdirectories I can find them but nothing is replaced:

Если я хочу изменить это во всех файлах фактического и подкаталогов, я могу найти их, но ничего не заменяется:

 

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

// Изменение значения глобальной переменной во время ее незаконченного редактирования.

void OnStart()
{
  GlobalVariableSet("Lots", 1);
  
  Alert(GlobalVariableGet("Lots"));
  
  MessageBox("Нажмите F3 и начните редактировать значение переменной Lots.\n" +
             "Не нажимайте ENTER - конечный результат изменения переменной при редактировании.");
             
  Sleep(10000); // Даем время на редактирование.
  
  Alert("Этим сообщением редактируемая переменная Lots была изменена.");
  
  Sleep(1000);
  
  Alert(GlobalVariableGet("Lots"));
}


Результат.

2021.07.29 12:55:07.837 Alert: 1.0
2021.07.29 12:55:07.837 Нажмите F3 и начните редактировать значение переменной Lots.
2021.07.29 12:55:07.837 Не нажимайте ENTER - конечный результат изменения переменной при редактировании.
2021.07.29 12:55:19.209 Alert: Этим сообщением редактируемая переменная Lots была изменена.
2021.07.29 12:55:20.203 Alert: 1234.0


Эта уязвимость может иметь серьезные последствия во время торговли.

Строка для поиска: Oshibka 030.

 

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

Акцептирование SL/TP-ордеров

traveller00, 2021.07.06 16:34

Столкнулся с аналогичной ситуацией. Дело было так:

1. Был ордер 0.6 buy limit.

2. 0.1 от него частично залились.

3. Оставшиеся 0.5 лимитника лочатся, потому что у брокера срабатывает активация.

4. Я пытаюсь закрыть залитые 0.1 по CloseBy и получаю реджект из-за п.3.

В итоге этот ордер CloseBy исчезает. И его нет нигде, ни на клиенте, ни даже на сервере в истории. При сортировке по тикетам там дыра.


Забагованый сервер МТ5 с пропадающими ордерами-это очень неприятно.


Просьба CloseBy-rejects ордера сохранять в истории торгов.

Не должно быть ситуаций, что ордер выбирается через OrderSelect, а после реджекта его больше никогда нельзя посмотреть через HistoryOrderSelect.

if (OrderSelect(Ticket))
{
  Sleep(10000);

  if (!OrderSelect(Ticket) && !HistoryOrderSelect(Ticket))
    Alert("Bug"); // Ордера нет (и не будет) среди живых и мертвых.
}
 

Никак не получалось закачать тики по символу. Либо ничего, либо только за сегодня.


Когда сменил Access Point, то тики стали закачиваться.

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


Разве доступ к тиковой истории должен зависеть от Access Points? Ну и явный баг, что каждый релогин выбирает точку не с минимальным пингом.

 

У меня сейчас Windows 11 (канал Бета)

Выпуск  Windows 11 Домашняя
Version 21H2
Дата установки  ‎29.‎07.‎2021
Сборка ОС       22000.100
Взаимодействие  Windows Feature Experience Pack 421.18901.0.3

а терминал определяет её как Windows 10

2021.07.30 09:29:15.380 Terminal        Windows 10 build 22000, Intel Core i7-9750H  @ 2.60GHz, 25 / 31 Gb memory, 795 / 947 Gb disk, IE 11, UAC, GMT+2
 

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

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

fxsaber, 2021.07.23 15:49

Build b2982  b3003
Время компиляции 29 секунд 58 секунд
Размер EX5 839 Кб 1100 Кб

Время компиляции и размер EX5 очень сильно выросли при переходе b2982->b3003. Несколько раз перепроверил. Встроенных ресурсов в коде нет.

b3007 - существенное изменение. EX5 стал 658 Кб при времени компиляции 23 секунды.
 

b3007, просьба исправить поведение на прежнее (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-таблицы во время работы и сразу после запуска.

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