Нужен совет!

 

 Хочу отрисовать линиями со стрелкой историю сделок.

Смог написать вот так.

Рисует очень долго если большой период.

Как сделать быстрее...........................

   double    ARROWED_LINE_HISTORY(int _mag, datetime date = 0)     //СТРЕЛКИ ИСТОРИИ//     |
//+------------------------------------------------------------------+
     {
      for(int i = HistoryDealsTotal() - 1; i >= 1; i--) // Размер списка сделок
        {
         HistorySelect(0, TimeCurrent()); // Запрашивает историю сделок и ордеров за указанный период серверного времени
         ulong dticket = HistoryDealGetTicket(i);// Перебор элементов списка сделок
         if(HistoryDealGetInteger(dticket, DEAL_ENTRY) == DEAL_ENTRY_IN) // Если сделка на вход начинаем цикл заново
            continue;
         if(HistoryDealGetInteger(dticket, DEAL_TIME) > D'17.03.2021 13:00' && HistoryDealGetInteger(dticket, DEAL_TIME) < D'18.03.2021 03:00') // Если сделка 17-18 марта то не рисуем
            continue;
         if(HistoryDealGetString(dticket, DEAL_SYMBOL) == _Symbol)
           {
            if(HistoryDealGetInteger(dticket, DEAL_MAGIC) == MAGIC + _mag)
              {
               datetime time1 = -1;
               double price1  = -1.0;
               datetime time2 = -1;
               double price2  = -1.0;
               int dealMAG = HistoryDealGetInteger(dticket, DEAL_MAGIC);
               //---
               long position_id = HistoryDealGetInteger(dticket, DEAL_POSITION_ID);// Возвращает запрошенное свойство сделки. Свойство сделки должно быть типа datetime, int
               bool res = HistorySelectByPosition(position_id);// Запрашивает историю сделок и ордеров, имеющих указанный идентификатор позиции
               for(int y = 0; y < HistoryDealsTotal(); y++)// Размер списка сделок
                 {
                  ulong d_ticket = HistoryDealGetTicket(y);// Выбирает сделку для дальнейшей обработки и возвращает тикет сделки в истории
                  if(HistoryDealGetInteger(d_ticket, DEAL_ENTRY) == DEAL_ENTRY_IN) // Возвращает запрошенное свойство сделки. Свойство сделки должно быть типа datetime, int
                    {
                     time1 = HistoryDealGetInteger(d_ticket, DEAL_TIME);
                     price1 = HistoryDealGetDouble(d_ticket, DEAL_PRICE);
                    }
                  if(HistoryDealGetInteger(d_ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
                    {
                     time2 = HistoryDealGetInteger(d_ticket, DEAL_TIME);
                     price2 = HistoryDealGetDouble(d_ticket, DEAL_PRICE);
                    }
                 }
               if(time1 > 0 && time2 > 0 && price1 > 0 && price2 > 0) // ВСЕ ПЕРЕМЕННЫЕ ПОЛУЧИЛИ КОР-ЫЕ ДАННЫЕ???
                 {
                  if(HistoryDealGetInteger(dticket, DEAL_TYPE) == DEAL_TYPE_SELL)
                    {
                     if(dealMAG == MAGIC + 4)
                        ARROWED_LINE("H_line_B " + (string)dticket, time1, price1, time2, price2, clrWhite);
                     if(dealMAG == MAGIC + 3)
                        ARROWED_LINE("H_line_B " + (string)dticket, time1, price1, time2, price2, clrChartreuse);
                     if(dealMAG == MAGIC + 2)
                        ARROWED_LINE("H_line_B " + (string)dticket, time1, price1, time2, price2, clrGreen);
                     if(dealMAG == MAGIC + 1)
                        ARROWED_LINE("H_line_B " + (string)dticket, time1, price1, time2, price2, clrNavy);
                     if(dealMAG == MAGIC + 0)
                        ARROWED_LINE("H_line_B " + (string)dticket, time1, price1, time2, price2, clrBlack);
                    }
                  if(HistoryDealGetInteger(dticket, DEAL_TYPE) == DEAL_TYPE_BUY)
                    {
                     if(dealMAG == MAGIC + 4)
                        ARROWED_LINE("H_line_S " + (string)dticket, time1, price1, time2, price2, clrWhite);
                     if(dealMAG == MAGIC + 3)
                        ARROWED_LINE("H_line_S " + (string)dticket, time1, price1, time2, price2, clrPurple);
                     if(dealMAG == MAGIC + 2)
                        ARROWED_LINE("H_line_S " + (string)dticket, time1, price1, time2, price2, clrRed);
                     if(dealMAG == MAGIC + 1)
                        ARROWED_LINE("H_line_S " + (string)dticket, time1, price1, time2, price2, clrNavy);
                     if(dealMAG == MAGIC + 0)
                        ARROWED_LINE("H_line_S " + (string)dticket, time1, price1, time2, price2, clrBlack);
                    }
                 }
              }
           }
        }
      return (0) ;
     }
 
HistorySelect(0, TimeCurrent()); // Запрашивает историю сделок и ордеров за указанный период серверного времени

Зачем это выполнять в цикле?

Дальше смотреть не стал, если есть еще что-либо не зависящее от итерации цикла, то вынесите за пределы цикла.

 
NGMsakh:

 Хочу отрисовать линиями со стрелкой историю сделок.

Смог написать вот так.

Рисует очень долго если большой период.

Как сделать быстрее...........................

Посмотрите как сделано. Делайте по такому же принципу. 

History of trade
History of trade
  • www.mql5.com
Перенос истории сделок на график.
 
NGMsakh:

 Хочу отрисовать линиями со стрелкой историю сделок.

Рисует очень долго если большой период.

Как сделать быстрее...........................

Каждый объект на графике это затраты памяти у терминала.

Долго это явный признак нехватки памяти, скорее всего, у терминала (вынужденная работа со свопом).

Напрашивается решение показывать стрелки за период, например:

  • При сбросе скрипта на график, определите дату сброса dt = ChartTimeOnDropped()
  • Нарисуйте стрелки за период [dt - месяц, dt + месяц], удалив стрелки предыдущего сброса скрипта
 
PapaYozh:

Зачем это выполнять в цикле?

Дальше смотреть не стал, если есть еще что-либо не зависящее от итерации цикла, то вынесите за пределы цикла.

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

 
Dmitiry Ananiev:

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

Я бы одним циклом собрал коллекцию идентификаторов позиций, а потом другим циклом отрисовал.