Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2484

 
Tretyakov Rostyslav #:
Это не случайно, как я писал выше Фишер рисует, поэтому сигналы только в моменте.

А, это один из способов красивой рисовки?.. Оригинально

 

Всем добрый день.

Подскажите в чем ошибка. Нашел в истории номер тикета, и хочу посчитать прибыль от этого номера. Но он пишет профит 0. Вывел в принт тикеты, по которым он проходит. А этого номера там нет. Как так, если в истории сделок он есть.

double CalculateProfitHistory1() 
{
   double Res = 0;
   int ototal = HistoryDealsTotal();
   ulong Losttick = 3072553716;
   
   {
   if ( HistorySelect(0, INT_MAX ))
   for(int i = 0; i < HistoryDealsTotal(); i++)
      {
      ulong deal_ticket = HistoryDealGetTicket(i);
      if(HistoryDealGetInteger(deal_ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
        {
           if (HistoryDealGetString(deal_ticket, DEAL_SYMBOL) == Symbol())
           {
               if(( HistoryDealGetInteger(deal_ticket, DEAL_MAGIC) == Magic))
               {
                  if (Losttick <= deal_ticket)
                  {
                     Res += HistoryDealGetDouble(deal_ticket, DEAL_PROFIT) + HistoryDealGetDouble(deal_ticket, DEAL_COMMISSION) + HistoryDealGetDouble(deal_ticket, DEAL_SWAP);
                     Print(deal_ticket);
                  }
               }
            }
         }
      }
   }
     
  return(Res);
}
 
Maksim Burov #:

Всем добрый день.

Подскажите в чем ошибка. Нашел в истории номер тикета, и хочу посчитать прибыль от этого номера. Но он пишет профит 0. Вывел в принт тикеты, по которым он проходит. А этого номера там нет. Как так, если в истории сделок он есть.

А вы уверены, что эта сделка закрытие позиции?

Когда выбрали сделку по тикету, надо выбрать все сделки которые участвовали в открытии, изменении и закрытии позиции

bool  HistorySelectByPosition( 
   long   position_id     // идентификатор позиции - POSITION_IDENTIFIER 
   );

И потом из полученного списка перебрать все сделки и просуммировать комиссии, своп и прибыль.

 
Maksim Burov #:

Всем добрый день.

Подскажите в чем ошибка. Нашел в истории номер тикета, и хочу посчитать прибыль от этого номера. Но он пишет профит 0. Вывел в принт тикеты, по которым он проходит. А этого номера там нет. Как так, если в истории сделок он есть.


Цикл запустите от большего к меньшему - в другую сторону
 
Roman Shiredchenko #:

Цикл запустите от большего к меньшему - в другую сторону

И как это поможет?

 
Alexey Viktorov #:

И как это поможет?

Время потянуть... 
 
Maksim Burov #:

Всем добрый день.

Подскажите в чем ошибка. Нашел в истории номер тикета, и хочу посчитать прибыль от этого номера. Но он пишет профит 0. Вывел в принт тикеты, по которым он проходит. А этого номера там нет. Как так, если в истории сделок он есть.

Зачем вам в коде магик и символ, если вы ищите сделку по тиккету?

Вот скрипт, на скорую руку, но работает. Думаю его достаточно, чтоб понять принцип.

#property script_show_inputs
input ulong inpTicket = 51811815818;
//+------------------------------------------------------------------+
void OnStart()
  {
   Print("Profit = ", GetProfitTicket(inpTicket));
  }
//+------------------------------------------------------------------+
double GetProfitTicket(ulong ticket)
  {
   double result = 0;
   if(HistorySelect(0, TimeCurrent()))
     {
      int total = HistoryDealsTotal();
      for(int i = total - 1; i >= 0; i--)
         if(ticket == HistoryDealGetTicket(i))
           {
            result += HistoryDealGetDouble(ticket, DEAL_PROFIT);
            result += HistoryDealGetDouble(ticket, DEAL_SWAP);
            result += HistoryDealGetDouble(ticket, DEAL_COMMISSION);
            long position_id = HistoryDealGetInteger(ticket, DEAL_POSITION_ID);
            ulong ticket2 = -1;
            for(int j = total - 1; j >= 0; j--)
              {
               ticket2 = HistoryDealGetTicket(j);
               if(ticket2 != ticket && position_id == HistoryDealGetInteger(ticket2, DEAL_POSITION_ID))
                 {
                  result += HistoryDealGetDouble(ticket2, DEAL_PROFIT);
                  result += HistoryDealGetDouble(ticket2, DEAL_SWAP);
                  result += HistoryDealGetDouble(ticket2, DEAL_COMMISSION);
                  return result;
                 }
              }
            return result;
           }
     }
   return result;
  }
//+------------------------------------------------------------------+
 
Aleksandr Slavskii #:

Зачем вам в коде магик и символ, если вы ищите сделку по тиккету?

Вот скрипт, на скорую руку, но работает. Думаю его достаточно, чтоб понять принцип.

Зачем же такой огород городить, если надо по известному тикету сделки, взять все сделки относящиеся к позиции. Ведь достаточно

input ulong inpTicket = 51811815818;
HistoryDealSelect(inpTicket);

и дальше уже взять ID позиции и выбрать список ордеров и сделок по этому ID 

 
Alexey Viktorov #:

Зачем же такой огород городить

Ну бывает)))

Alexey Viktorov #:

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

Логично !

 
Alexey Viktorov #:

Зачем же такой огород городить, если надо по известному тикету сделки, взять все сделки относящиеся к позиции. Ведь достаточно

и дальше уже взять ID позиции и выбрать список ордеров и сделок по этому ID 

Огород получился не намного короче, но этот огород мне нравится больше предыдущего.

//+------------------------------------------------------------------+
double GetProfitTicket(ulong ticket)
  {
   double result = 0;

   if(HistoryDealSelect(ticket))
     {
      long position_id = HistoryDealGetInteger(ticket, DEAL_POSITION_ID);
      if(HistorySelectByPosition(position_id))
        {
         int total = HistoryDealsTotal();
         for(int i = 0; i < total; i++)
           {
            ticket = HistoryDealGetTicket(i);
            result += HistoryDealGetDouble(ticket, DEAL_PROFIT);
            result += HistoryDealGetDouble(ticket, DEAL_SWAP);
            result += HistoryDealGetDouble(ticket, DEAL_COMMISSION);
           }
        }
     }
   return result;
  }
//+------------------------------------------------------------------+

Или можно её короче сделать?