MT5 и скорость в боевом исполнении - страница 56

 
Renat Akhtyamov:
Господа прогеры...
Почитайте сначала про распределение памяти в компе, затем как и какими средствами осуществляется, затем как чистить и читать от и до не составит труда. По кр. мере возможны более обоснованные предложения разработчикам

Тебе бы и не знать про это, на мт4 ?
Сам же пользуешься предопределёнными Ask Bid ?
В мт5 для всей структуры MqlTick их почему то нет.
Вызвать функцию, заполнить структуру, и только потом получить значение.
Или сразу получить значение, есть разница?

Или это не в мою сторону?
Хоть бы обозначил кому писал ))

 
Roman:

Предопределённые переменные, для текущего тика, наверно было бы лучше.

Разработчики ранее уже поясняли, что есть принципиальное ограничение на прямой доступ

void f()
{
        MqlTick t1 = _Tick;
        MqlTick t2 = _Tick;
}

и в общем случае t1 не равно t2. Более того значения полей внутри самих как t1 так и t2 могут в итоге относится вообще к разным тикам

 
A100:

Разработчики ранее уже поясняли, что есть принципиальное ограничение на прямой доступ

и в общем случае  t1 не равно t2. Более того значения полей внутри самих как t1 так и t2 могут относится вообще к разным тикам, при том что там связанные поля (должны относится к одному тику)

Брр, какое принципиальное ограничение?
Структура в вашем примере тут лишняя, её не нужно заполнять.

Из сокета пришло значение, записали в переменную _Ask, _Bid  и т.д. по структуре.
_Ask != _Ask по вашему?
Ограничение возникает если заполнять структуру, что занимает какое то время.
Не нужно её заполнять, а отдавать напрямую _Ask, _Bid  и т.д.

 
Roman:

Брр, какое принципиальное ограничение?
Структура в вашем примере тут лишняя, её не нужно заполнять.

void f()
{
        double ask1 = _Ask;
        double ask2 = _Ask;
}

Можно и без структуры переписать. В общем случае ask1 не равен ask2

 
A100:

Можно и без структуры переписать. В общем случае ask1 не равен ask2

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

 
A100:

Можно и без структуры переписать. В общем случае ask1 не равен ask2

Так не нужно 100500 диджитс использовать, где вещественное число последней цифрой отличается  0.0000000000000000000001
Для каждой переменной свой диджитс, для цен double максимум 8. 

 
Renat Fatkhullin:

Выпустили бету 2652, из важного:

  • улучшено прерывание компиляции (на 22%)
  • кардинальное ускорение доступа к SymbolInfoTick

22% - отлично.

SymbolInfoTick - на домашней машине на глаз заметил, что не алертит. Однако, сделал в Журнале фильтр по этим алертам и увидел, что их стало гораздо больше, чем за тот же период сутки назад выдал 2650.

Отправил оба лога в ЛС.

 
Valeriy Yastremskiy:

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

Да.

 
Renat Fatkhullin:

Для массовой работы с тиками ставьте больше памяти.

4 гб (цена 20 евро) - это никуда не годится в 2020 году, если речь идет об аналитике и исследованиях.

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

Как компромисс, предлагаю после CopyTicks, вызванных в OnInit, сразу освобождать память в Терминале. Тогда можно не вводить функцию принудительного охлаждения CopyTicks.

Сейчас Sleep-вариант охлаждения - очень костыльный. Но выше показал, как этот костыль экономит память.


Сейчас получается так, что 20 советников даже на медленном VPS пашут быстро. Но их старт - серьезная проблема.


Вот советник, показывающий проблему.

// Демонстрация 10-ти секундного удержания в памяти ненужных данных CopyTicks.
#define PRINT(A) Print(#A + " = " + (string)(A))

input datetime inFrom = D'2020.06.01'; // С какой даты анализировать историю

int OnInit()
{
  MqlTick Ticks[];
  
  Print("Before CopyTicks:");
  PRINT(MQLInfoInteger(MQL_MEMORY_USED));     
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
  
  PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (long)inFrom * 1000));
  ArrayFree(Ticks);
  
  Print("After CopyTicks:");
  
  for (int i = 0; i < 10; i++)
  {
    PRINT(i);
    PRINT(MQLInfoInteger(MQL_MEMORY_USED));    
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
    
    Sleep(1000);
  }
  
  return(INIT_FAILED);
}


Результат.

2020.10.14 08:49:24.016 Before CopyTicks:
2020.10.14 08:49:24.016 MQLInfoInteger(MQL_MEMORY_USED) = 0
2020.10.14 08:49:24.031 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 864
2020.10.14 08:49:25.399 CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 14372119
2020.10.14 08:49:25.465 After CopyTicks:
2020.10.14 08:49:25.465 i = 0
2020.10.14 08:49:25.465 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:25.499 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:26.594 i = 1
2020.10.14 08:49:26.594 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:26.630 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:27.729 i = 2
2020.10.14 08:49:27.729 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:27.762 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:28.852 i = 3
2020.10.14 08:49:28.852 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:28.884 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:29.977 i = 4
2020.10.14 08:49:29.977 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:30.009 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:31.102 i = 5
2020.10.14 08:49:31.102 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:31.136 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:32.224 i = 6
2020.10.14 08:49:32.225 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:32.257 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:33.348 i = 7
2020.10.14 08:49:33.348 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:33.381 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:34.468 i = 8
2020.10.14 08:49:34.468 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:34.501 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:35.593 i = 9
2020.10.14 08:49:35.593 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:35.605 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 860
 
fxsaber:

22% - отлично.

SymbolInfoTick - на домашней машине на глаз заметил, что не алертит. Однако, сделал в Журнале фильтр по этим алертам и увидел, что их стало гораздо больше, чем за тот же период сутки назад выдал 2650.

Отправил оба лога в ЛС.

Ускорение в десятки раз в случаях массового параллельного доступа.

Для остальных случаев только апгрейд процессора, памяти и операционки.