Обсуждение статьи "Ордерa, позиции и сделки в MetaTrader 5" - страница 5

 

Вот инфа от fxsaber по этому вопросу:https://www.mql5.com/ru/forum/366029/page3#comment_22547881  https://www.mql5.com/ru/forum/366029/page3#comment_22547881


@Rashid Umarov

прошу разработчиков откликнуться.

Библиотеки: TradesID
Библиотеки: TradesID
  • 2021.05.21
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: TradesID
 

После публикации тормозов работы с историей была проведена большая работа разработчиками по созданию кешей. Тормоза ушли.

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


ЗЫ Как быстрее всего работать с историей - комментариев нет. На данный момент 100% быстрым способом является везде вызов только такого HistorySelect.

HistorySelect(0, INT_MAX)
 
fxsaber:

После публикации тормозов работы с историей была проведена большая работа разработчиками по созданию кешей. Тормоза ушли.

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


ЗЫ Как быстрее всего работать с историей - комментариев нет. На данный момент 100% быстрым способом является везде вызов только такого HistorySelect.

А почему не
HistorySelect(t, INT_MAX)

где t - произвольная не очень давняя и не меняющаяся от вызова к вызову дата (константа, единая для всей программы)?

 
mktr8591:
А почему не

где t - произвольная не очень давняя и не меняющаяся от вызова к вызову дата (константа, единая для всей программы)?

Не уверен, что от этого кеш уменьшится.

 
fxsaber:

Не уверен, что от этого кеш уменьшится.

Потребление уменьшается. Прописывал такое в начале.

bool HistorySelect2( const datetime From, const datetime To )
{
  static const datetime NewFrom = ::TimeCurrent() - 24 * 3600 & 30; // -Month.
  
  return(::HistorySelect(From ? From : NewFrom, To));
}

#define HistorySelect HistorySelect2

Но пришлось отказаться из-за серьезных проблем.

 
#define PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
  
  if (HistorySelect(0, INT_MAX))
  {
    PRINT(HistoryDealsTotal());
    PRINT(HistoryOrdersTotal());
    
    PRINT(MQLInfoInteger(MQL_MEMORY_USED));
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
  }
}

Результат запуска на Терминале, где один M1 чарт, 5000 баров, один символ, нет ресурсов и графических объектов.

TerminalInfoInteger(TERMINAL_MEMORY_USED) = 426
HistoryDealsTotal() = 134502
HistoryOrdersTotal() = 218740
MQLInfoInteger(MQL_MEMORY_USED) = 1
TerminalInfoInteger(TERMINAL_MEMORY_USED) = 789

Многовато. 10 синхронных (OrderSend) советников съедает 4 гига. Два варианта:

  1. Открыть новый счет, перекинуть на него средства и продолжить торговлю уже на нем. К сожалению, не всегда возможно.
  2. Объединить всех ботов в один через асинхронность (OrderSendAsync). Очень тяжелый вариант отловли багов при супер-активной торговле.
Во втором пункте еще надо писать менеджер (GUI и прочее) ботов, вшитых в единый советник.
 
fxsaber:



  1. Объединить всех ботов в один через асинхронность (OrderSendAsync). Очень тяжелый вариант отловли багов при супер-активной торговле.

По другому никак. (если конечно не отсекать старую историю и переделать полностью алгоритм работы с истрией, но это только если MQ не вернут старую сортировку).

 

Привет, друзья!

Было бы полезно, чтобы @MetaQuotes дополнил эту статью торговыми классами(CAccountInfo, CSymbolInfo, COrderInfo, CHistoryOrderInfo, CPositionInfo, CDealInfo, CTrade, CTerminalInfo). Разработанный советник в объектно-ориентированной парадигме мог бы модифицировать (и упростить) эти операции синхронизации кэша и получения данных о символах, ордерах, позициях, сделках, трейдах и т.д.

Я прав?

Documentation on MQL5: Standard Library / Trade Classes / CAccountInfo
Documentation on MQL5: Standard Library / Trade Classes / CAccountInfo
  • www.mql5.com
CAccountInfo - Trade Classes - Standard Library - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 

подскажите, пожалуйста, как рассчитать комиссию по ордеру с прибылью, чтобы было так

" Прибыль += прибыль + своп + комиссия "

 

Прошу помочь с ответом на вопрос!

Плавающие показатели позиции "Рыночная стоимость" и "Прибыль" в терминале MT5 рассчитываются самим терминалом на основании транслируемых котировок и спецификации символов, или они транслируются сервером MT5 и записываются в кэш на диск?

Если в кэш, то вероятно ли ловить рассинхронизацию между полученными котировками и текущими показателями "Рыночная стоимость" и "Прибыль"?