Новая версия платформы MetaTrader 5 build 1525: Представление истории в виде позиций и улучшение тестера - страница 7

 
Vitaly Muzichenko:

Подымает расход памяти до 6G, связано с тем, что создаётся и удаляется около 3000шт графических объектов в цикле, они создаются и удаляются по требованию пользователя, это графический безбуферный индикатор. Одновременно может создаваться 5-8 пачек объектов, в каждой до 3000шт, и вот со временем работы терминал начинает подвисать, и приходиться перезагружать, не так часто, но раз в сутки точно. Хорошо, как только найду закономерность - сразу сделаю заявку.

А что за надобность создавать столько объектов ??? Конечно, если создавать сотни тысяч графических примитивов - память можно исчерпать, даже если с ней работать корректно.

Можно привести пример, когда бы пользователю реально столько потребовалось ?

По-моему, уже при сотне объектов - нормальный человек начинает большую часть из них игнорировать...

 

Почему бы не добавить информацию о стакане (на глубину пусть 100 лотов хотя бы) на первый тик? Если торгуем мало ликвидный актив, то это может быть очень значимым показателем. Пусть не на каждой минуте, а начиная с 15 минутки.

 
George Merts:

А что за надобность создавать столько объектов ??? Конечно, если создавать сотни тысяч графических примитивов - память можно исчерпать, даже если с ней работать корректно.

Можно привести пример, когда бы пользователю реально столько потребовалось ?

По-моему, уже при сотне объектов - нормальный человек начинает большую часть из них игнорировать...

~1800 на кнопку при увеличенном графике, если уменьшить бары, то будет в два раза больше. На скрине нажато всего 2 кнопки (пачки) из 28, итого объектов = 3665шт. Тут игнорировать то нечего)

 

 
Vitaly Muzichenko:

~1800 на кнопку при увеличенном графике, если уменьшить бары, то будет в два раза больше. На скрине нажато всего 2 кнопки (пачки) из 28, итого объектов = 3665шт. Тут игнорировать то нечего)

 

У вас на 1 пиксель по объекту чтоли?
 
Renat Fatkhullin:
У вас на 1 пиксель по объекту чтоли?

Рисуется трендовыми линиями, как нарисовать бары, другого решения не нашёл. Сейчас расставил флаги, то пока работает очень даже хорошо, вот только с удалением и первоначальным рисование тормоза, но это не важно, 1-2 секунда ничего не решает в этом случае.

А вот так паршиво рисует в пятом терминале - отправил просьбу в СД

  

 
Vitaly Muzichenko:
Рисуется трендовыми линиями, как нарисовать бары, другого решения не нашёл. Сейчас расставил флаги, то пока работает очень даже хорошо, вот только с удалением и первоначальным рисование тормоза, но это не важно, 1 секунда ничего не решает в этом случае.

Так что вы рисуете? Бары или кнопки? Вы же постоянно повторяете про кнопка-кнопка-кнопка.

Если кнопки, то их эффективнее рисовать канвас объектами - всего один объект на кнопку. Сделали два битмапа в памяти для нажатой и отжатой кнопки и все.

 
Renat Fatkhullin:

Так что вы рисуете? Бары или кнопки? Вы же постоянно повторяете про кнопка-кнопка-кнопка.

Если кнопки, то их эффективнее рисовать канвас объектами - всего один объект на кнопку. Сделали два битмапа в памяти для нажатой и отжатой кнопки и все.

Рисуются кнопки единоразово в самом начале, ну а потом уже бары, свечи и линии через буфера.

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

 

Возьмите один объект канвас на весь экран и сами в нем линии рисуйте.

Это категорически эффективнее попыток управлять тысячами мелких объектов.

 
Renat Fatkhullin:

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

Я трейдер и этого не просил. Более того, рациональность "одной строчки" если и прослеживается, то только в приведенном примере. Чтобы не быть голословным, привожу советник для тестера (выходные)

// Для Netting-счета

input int Amount = 5;       // Количество OrderSend
input int Interval = 10000; // Через сколько тиков делать очередной OrderSend

bool MyOrderSend( double Lots )
{
  MqlTick Tick;

  SymbolInfoTick(_Symbol, Tick);  

  MqlTradeRequest Request = {0};
  
  Request.action = TRADE_ACTION_DEAL;
  Request.symbol = _Symbol;
  
  if (Lots > 0)
  {
    Request.volume = Lots;
    Request.price = Tick.ask;
    Request.type = ORDER_TYPE_BUY;    
  }
  else
  {
    Request.volume = -Lots;
    Request.price = Tick.bid;
    Request.type = ORDER_TYPE_SELL;    
  }

  MqlTradeResult Result;

  return(OrderSend(Request, Result));
}

void OnInit()
{
  MyOrderSend(1); // Открываем начальную BUY-позицию
}

void OnTick()
{
  static int i = 1;
  static int Count = 0;
    
  if ((Count < Amount) && (i % Interval == 0))
    if (MyOrderSend((Count %2 == 0) ? -0.99 : 0.99)) // попеременно уменьшаем и увеличиваем BUY-позу на 0.99 лота
      Count++;
  
  i++;
}

Отчет

Ордера
Время открытияОрдерСимволТипОбъемЦенаS / LT / PВремяСостояниеКомментарий
2017.01.27 00:00:002EURUSDbuy1.00 / 1.001.068172017.01.27 00:00:00filled
2017.01.27 02:01:213EURUSDsell0.99 / 0.991.068152017.01.27 02:01:21filled
2017.01.27 03:14:274EURUSDbuy0.99 / 0.991.068112017.01.27 03:14:27filled
2017.01.27 04:05:505EURUSDsell0.99 / 0.991.068512017.01.27 04:05:50filled
2017.01.27 05:18:016EURUSDbuy0.99 / 0.991.068032017.01.27 05:18:01filled
2017.01.27 06:42:477EURUSDsell0.99 / 0.991.067492017.01.27 06:42:47filled
2017.01.27 23:59:598EURUSDsell0.01 / 0.011.069682017.01.27 23:59:59filledend of test
Сделки
ВремяСделкаСимволТипНаправлениеОбъемЦенаОрдерКомиссияСвопПрибыльБалансКомментарий
2017.01.27 00:00:001balance0.000.0010 000 000.0010 000 000.00
2017.01.27 00:00:002EURUSDbuyin1.001.0681720.000.000.0010 000 000.00
2017.01.27 02:01:213EURUSDsellout0.991.0681530.000.00-1.859 999 998.15
2017.01.27 03:14:274EURUSDbuyin0.991.0681140.000.000.009 999 998.15
2017.01.27 04:05:505EURUSDsellout0.991.0685150.000.0037.0010 000 035.15
2017.01.27 05:18:016EURUSDbuyin0.991.0680360.000.000.0010 000 035.15
2017.01.27 06:42:477EURUSDsellout0.991.0674970.000.00-50.169 999 984.99
2017.01.27 23:59:598EURUSDsellout0.011.0696880.000.001.549 999 986.53end of test
0.000.00-13.479 999 986.53

 В тестере, к сожалению, новое представление не реализовано, но по отчету не сложно понять, что это будет в виде "одной строчки". Какую инфу и удобство несет эта одна строчка в данной ситуации - понять не могу. Можно месяцами очень активно торговать в режиме only BUY, при этом вместо полного закрытия позиции, оставлять мин. лот (0.01), который никакого риска не несет (копейки). И в итоге будет ОДНА строчка! Вместо того, чтобы показать, что здесь было куплено на 0.99, а здесь эти 0.99 были закрыты.

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

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

Уберите тогда упоминание MT4-соответствия. Это все совсем из другой оперы, и на каком-нибудь ECN, где частичное исполнение на больших лотах случается в 90% случаев, такой стейт даже вреден.
 
Vitaly Muzichenko:

Рисуется трендовыми линиями, как нарисовать бары, другого решения не нашёл. 

А зачем рисовать график трендовыми линиями? Самый простой способ нарисовать график - через индикатор. Там можно и барами и свечами нарисовать. И будет это без создания кучи графических объектов! А самое главное - чтобы написать код такого индикатора не нужно много времени.
Причина обращения: