Получение списка сделок из истории относящиеся к позиции

 

Господа написал скрипт с целью получения системного списка позиций и относящейся к ней сделок (входов и выходов)

void OnStart()
  {
//+------------------------------------------------------------------+
   ulong deal_ticket;            // тикет сделки
   ulong deal_ID;                // тикет сделки по идентификатору позиции
   ulong order_ticket;           // тикет ордера,по которому была совершена сделка
   datetime transaction_time;    // время совершения сделки 
   long deal_type ;              // тип торговой операции
   long position_ID;             // идентификатор позиции
   long position_ID_prev;
   string deal_description;      // описание операции
   double volume;                // объем операции
   string symbol;                // по какому символу была сделка
   string deals_list;
//--- установим начальную и конечную дату для запроса истории сделок
   datetime from_date=0;          // с самого начала
   datetime to_date=TimeCurrent();// по текущий момент
//--- запросим историрю сделок в указанном интервале
   HistorySelect(from_date,to_date);
//--- общее количество в списке сделок
   int deals_total=HistoryDealsTotal();
   Print("Deals Total: ",deals_total);
//--- теперь обработаем каждую сделку
   for(int i=0;i<deals_total;i++) {
      //--- try to get deals ticket
      deal_ticket=HistoryDealGetTicket(i);
   //   Print("Ticket_Deals: ",deal_ticket);
      if(deal_ticket) {
         position_ID = HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID); // определили позицию для выбранной сделки
         if(position_ID == position_ID_prev) continue;// если такая позиция уже была, продолжаем цикл выбирая другую сделку
         if(HistorySelectByPosition(position_ID)) {            
            int deals=HistoryDealsTotal();            // количество сделок относящиеся к выбранной позиции
       //     Print("PosID: ",position_ID," TotalDeals for this Position: ",deals);
            deals_list="";
            for(int k=deals; k<0; deals--) {          // выбираем тикеты сделок к конкретно выбранной позиции
               deal_ID=HistoryDealGetTicket(k);   Print("Deals_ID: ",deal_ID);
               if(deal_ID)
               deals_list = deals_list + ", "+(string) deal_ID;
            }
         position_ID_prev = position_ID; 
         Print("Position_ID: ",position_ID," Deals_List: ",deals_list);         
         } 
      }
   }
}

 

ID_Position: 123458      Deals (Ticket): 12345(in), 12348(in), 2378(out);

                   123888                           12555(in), 12873(out);

и так далее, но что то не получается, кто подскажет что не так.

Заранее благодарен

Сергей  

 
GSB:

Сергей  

А вы отладкой пользоваться не пробовали?
 
mrProF:
А вы отладкой пользоваться не пробовали?

Нет не пробовал. Я не профессиональный программист, а в МТ4 такого инструмента не было.

 
GSB:

Нет не пробовал. Я не профессиональный программист, а в МТ4 такого инструмента не было.

Так пора попробовать :)

Это сэкономит Вам и нам кучу времени и даст Вам понимание как выполняется программа.

Суть отладки:

Последовательное построчное выполнение программы.
Поставьте точку остановки около любой строчки, и нажмите кнопку начало отладки, затем кнопками "шаг с заходом/шаг с обходом" выполняйте программу.
Так же в окне watcher добавьте переменную, значение которой хотите посмотреть.

P.S. Если не получится воспользоваться отладкой, напишите здесь, я вам со скриншотами все объясню.

 
mrProF:
Так пора попробовать :)

Это сэкономит Вам и нам кучу времени и даст Вам понимание как выполняется программа.

Суть отладки:

Последовательное построчное выполнение программы.
Поставьте точку остановки около любой строчки, и нажмите кнопку начало отладки, затем кнопками "шаг с заходом/шаг с обходом" выполняйте программу.
Так же в окне watcher добавьте переменную, значение которой хотите посмотреть.

P.S. Если не получится воспользоваться отладкой, напишите здесь, я вам со скриншотами все объясню.

mrProF:
Так пора попробовать :)

Это сэкономит Вам и нам кучу времени и даст Вам понимание как выполняется программа.

Суть отладки:

Последовательное построчное выполнение программы.
Поставьте точку остановки около любой строчки, и нажмите кнопку начало отладки, затем кнопками "шаг с заходом/шаг с обходом" выполняйте программу.
Так же в окне watcher добавьте переменную, значение которой хотите посмотреть.

P.S. Если не получится воспользоваться отладкой, напишите здесь, я вам со скриншотами все объясню.

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

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

Вобщем предела совершенству нет.

Выявил ряд ошибок, в частности что во-втором цикле стирался список сделок по главному циклу.

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

                                     position_ID_prev = position_ID;

Не хочет он присваивать  position_ID_prev  значение  position_ID. Почему непонятно.

  

long position_ID_prev;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//+------------------------------------------------------------------+
   ulong deal_ticket;            // тикет сделки
   ulong deal_ID;                // тикет сделки по идентификатору позиции
//   ulong order_ticket;           // тикет ордера,по которому была совершена сделка
//   datetime transaction_time;    // время совершения сделки 
//   long deal_type ;              // тип торговой операции
   long position_ID;             // идентификатор позиции
   
   string deal_description;      // описание операции
//   double volume;                // объем операции
   string symbol;                // по какому символу была сделка
   string deals_list;
//--- установим начальную и конечную дату для запроса истории сделок
   datetime from_date=0;          // с самого начала
   datetime to_date=TimeCurrent();// по текущий момент
//--- запросим историрю сделок в указанном интервале
   HistorySelect(from_date,to_date);
//--- общее количество в списке сделок
   int deals_total=HistoryDealsTotal();
   Print("Deals Total: ",deals_total);
//--- теперь обработаем каждую сделку
   for(int i=0;i<deals_total;i++) {
      //--- try to get deals ticket
      HistorySelect(0,TimeCurrent());        // заполняем список сделок, поскольку во втором цикле он сбросился
      deal_ticket=HistoryDealGetTicket(i);
      Print("Ticket_Deals: ",deal_ticket);
      if(deal_ticket) {
         position_ID = HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID);
         if(position_ID == position_ID_prev) continue;
         if(HistorySelectByPosition(position_ID)) {            
            int deals=HistoryDealsTotal();
            Print("PosID: ",position_ID," TotalDeals for this Position: ",deals);
            deals_list="";
            for(int k=0; k<deals; k++) {
               deal_ID=HistoryDealGetTicket(k);   Print("Deals_ID: ",deal_ID);
               if(deal_ID)
               deals_list = deals_list + ", "+(string) deal_ID;
            }
         position_ID_prev = position_ID; 
         Print("Position_ID: ",position_ID," Deals_List: ",deals_list);         
         } else Print("Position for ticket: ",deal_ticket," Not found, PosID: ",position_ID);
      }
   }
}

 

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