Новая версия платформы MetaTrader 5 build 4040: Улучшения и исправления - страница 2

 
Renat Fatkhullin #:

Ваш новый пример не имеет отношения к предыдущему.

Плюс я не расположен заниматься расшифровкой ваших мыслей.

Придал смысл переменной.

 
fxsaber #:

Придал смысл переменной.

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

Так как основной кейс его работы - это расширенно помогать в заведомо неполном заполнении текста/кода.

 
b4048, огромные тормоза HistoryOrderGetInteger.
// Демонстрация сверх-низкой скорости работы HistoryOrderGetInteger.
// В Тестере Deposit=10000000, длина интервала - неделя.

input int inMod = 5; // Через сколько тиков торговля

// Открывает и сразу закрывает позицию.
bool OpenClose()
{
  MqlTradeRequest Request = {};

  Request.action = TRADE_ACTION_DEAL;
  Request.symbol = _Symbol;
  Request.volume = 1;
  Request.price = SymbolInfoDouble(Request.symbol, SYMBOL_ASK);
  Request.type_filling = ORDER_FILLING_IOC; // Поставьте сюда поддерживаемый Filling.
  
  MqlTradeResult Result;  
  bool Res = OrderSend(Request, Result);
  
  if (Res)
  {
    Request.type = (ENUM_ORDER_TYPE)!Request.type;
    Request.position = Result.order;
    Request.price = (Result.price == Result.bid) ? Result.ask : Result.bid;
    
    Res = OrderSend(Request, Result);
  }
  
  return(Res);
}

void OnTick()
{  
  static int i = 0;
  
  if (!(i++ % inMod))
    OpenClose();
    
  History();
}

// Демонстрация тормозов HistoryOrderGetInteger.
void History()
{
  if (HistorySelect(0, INT_MAX))
  {
    const ulong DealTicket = HistoryDealGetTicket(HistoryDealsTotal() - 1);    
    const ulong OrderTicket = HistoryDealGetInteger(DealTicket, DEAL_ORDER);
    
    HistoryOrderGetInteger(OrderTicket, ORDER_TYPE); // Без этой строки бэктест проходит в несколько раз быстрее.
  }
}


HistoryOrderGetInteger присутствует.

final balance 9971903.00 pips
EURUSD,M1: 159744 ticks, 4317 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:00:15.970 (including ticks preprocessing 0:00:00.015).
EURUSD,M1: total time from login to stop testing 0:00:15.993 (including 0:00:00.023 for history data synchronization)


HistoryOrderGetInteger отсутствует.

final balance 9971903.00 pips
EURUSD,M1: 159744 ticks, 4317 bars generated. Environment synchronized in 0:00:00.024. Test passed in 0:00:01.212 (including ticks preprocessing 0:00:00.016).
EURUSD,M1: total time from login to stop testing 0:00:01.236 (including 0:00:00.024 for history data synchronization)


Разница более, чем в 10 раз. Угробил уйму своего времени на выяснение причин медленной работы.

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

 
fxsaber #:
b4048, огромные тормоза HistoryOrderGetInteger.


HistoryOrderGetInteger присутствует.


HistoryOrderGetInteger отсутствует.


Разница более, чем в 10 раз. Угробил уйму своего времени на выяснение причин медленной работы.

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

Спасибо, проверим.

Но в основе тормозов конечно же попытка хака через HistorySelect(0, INT_MAX) на каждом тике, а потом стимуляция пересортировки 50к ордеров для извлечения нужного ордера.

 
Renat Fatkhullin #:

Спасибо, проверим.

Но в основе тормозов конечно же попытка хака через HistorySelect(0, INT_MAX) на каждом тике, а потом стимуляция пересортировки 50к ордеров для извлечения нужного ордера.

В коде есть HistoryDealGetInteger - не тормозит.

 

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

Новая версия платформы MetaTrader 5 build 4040: Улучшения и исправления

fxsaber, 2023.10.29 01:13

void History()
{
  if (HistorySelect(0, INT_MAX))
  {
    const ulong DealTicket = HistoryDealGetTicket(HistoryDealsTotal() - 1);    
    const ulong OrderTicket = HistoryDealGetInteger(DealTicket, DEAL_ORDER);
    
    HistoryOrderGetInteger(OrderTicket, ORDER_TYPE);
  }
}

Эта функция ничего не возвращает, поэтому компилятор мог бы выкинуть полностью тело if, оставив только HistorySelect. Это не делается из-за возможного влияния на _LastError?

 
fxsaber #:

Эта функция ничего не возвращает, поэтому компилятор мог бы выкинуть полностью тело if, оставив только HistorySelect. Это не делается из-за возможного влияния на _LastError?

Эти функции серьезно меняют кеши ордеров и сделок. Это системно значимые функции, не помеченные как const.

Я специально проверил оптимизацию - функции не выкидываются.

Но вообще это хорошая и смелая мысль пометить их константными и спровоцировать оптимизацию.

 
fxsaber #:

В коде есть HistoryDealGetInteger - не тормозит.

У него свой кеш, отличающийся от ордеров. 

Постоянный HistorySelect убивает кеши. Будем думать над оптимизацией.


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

 
Renat Fatkhullin #:

Постоянный HistorySelect убивает кеши. Будем думать над оптимизацией. 

В свое время вызов только HistorySelect(0, INT_MAX) (именно с такими входными параметрами) не убивал кеши, чтобы можно было быстро работать.
 
Renat Fatkhullin #:

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

Обещаний много было.

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

MT5 и скорость в боевом исполнении

Renat Fatkhullin, 2020.09.01 14:18

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

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

MT5 и скорость в боевом исполнении

Renat Fatkhullin, 2020.08.28 00:51

OrderExist и PositionExist - это специальные оптимизированные функции, которые позволяют избежать тупых переборов в цикле всех ордеров или позиций в поисках записей по символу, типу операции и меджику.

Результатом получаете массив с тикетами.


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

В будущем мы реализуем более эффективные функции доступа к массивным данным торговых операций.

Язык тоже кардинально усилится и упростится с более мощным функционалом.

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

Новая версия платформы MetaTrader 5 build 3800: ордера Book or Cancel, помощь AI при написании кода и расширенная поддержка ONNX

fxsaber, 2023.06.07 14:38

Тот же перебор в цикле по символам вызывает коллизии, схожие с перебором ордеров и позиций.

// Заполняет соответствующие массивы данными Обзора рынка.
// Возвращает количество записей.
int SymbolInfoTick( string &Symbols[], MqlTick &Ticks[] );
Надо делать штатную в виде текущего снимка Обзора рынка.

Это все нереализованный базовый функционал нормальной торговой платформы.

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