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

Vladimir Deryagin #:
Magic сделки выхода это magic ордера который закрыл позицию. Вы закрыли её вручную поэтому у сделки выхода magic = 0. Чтобы не зависеть от того кто закрыл позицию, для каждой сделки выхода найдите в той же выборке сделку входа с тем же DEAL_POSITION_ID и проверяйте magic уже у неё.

Хороший вариант. Попробывал не помогает. Мож не так реализовал мысль?


// Блок контроля фин.результ за тек. день++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
datetime timeBar5 = iTime(NULL,PERIOD_D1,0); // Указатель времени от начала дня

        HistorySelect(timeBar5,TimeCurrent()); // От начального времени до текущего
        double total_profit=0;
        ulong ticket_out = 0;     
     
        for (int i=0; i<HistoryDealsTotal(); i++)   //создаю цикл проверяет с начала истории
        {
                ulong  deal_ticket = HistoryDealGetTicket(i);
                ulong  deal_ticket2 = HistoryDealGetTicket(i);  // Перебор тикетов (входа)
                          
                if (  HistoryDealGetInteger(deal_ticket2, DEAL_ENTRY) == DEAL_ENTRY_IN // Тип вход
                      && HistoryDealGetInteger(deal_ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT // Тип выход
                      && HistoryDealGetInteger(deal_ticket, DEAL_POSITION_ID) 
                      && HistoryDealGetInteger(deal_ticket2, DEAL_POSITION_ID)          
                      && HistoryDealGetInteger(deal_ticket2, DEAL_MAGIC)==1530 ) 
            
                {
                  ticket_out = deal_ticket;
                  total_profit += HistoryDealGetDouble(ticket_out, DEAL_PROFIT)/_Point/1000;  // суммарный фин.результ за тек. день  
                                                               
}
}

Print("Фин.рез дня ===  ",total_profit);
Alexey Belyakov #:

Хороший вариант. Попробывал не помогает. Мож не так реализовал мысль?


Мысль правильная но реализация нет. deal_ticket и deal_ticket2 берутся по одному и тому же индексу i , то есть это одна и та же сделка, одна сделка не может быть одновременно входом и выходом

HistorySelect(iTime(NULL, PERIOD_D1, 0),TimeCurrent());
double total_profit = 0;

for(int i = 0; i < HistoryDealsTotal(); i++)
{
   ulong deal_ticket = HistoryDealGetTicket(i);

   if(HistoryDealGetInteger(deal_ticket, DEAL_ENTRY) != DEAL_ENTRY_OUT)
      continue;

   long posId = HistoryDealGetInteger(deal_ticket, DEAL_POSITION_ID);

   long posMagic = -1;
   for(int j = 0; j < HistoryDealsTotal(); j++)
   {
      ulong deal_in = HistoryDealGetTicket(j);

      if(HistoryDealGetInteger(deal_in, DEAL_POSITION_ID) == posId &&
         HistoryDealGetInteger(deal_in, DEAL_ENTRY) == DEAL_ENTRY_IN)
      {
         posMagic = HistoryDealGetInteger(deal_in, DEAL_MAGIC);
         break;
      }
   }

   if(posMagic == 1530)
      total_profit += HistoryDealGetDouble(deal_ticket, DEAL_PROFIT);
}

Print("Фин.рез дня ===  ",total_profit);
Деление на _Point/1000 я убрал  DEAL_PROFIT  это уже результат в деньгах.
Vladimir Deryagin #:
Мысль правильная но реализация нет. deal_ticket и deal_ticket2 берутся по одному и тому же индексу i , то есть это одна и та же сделка, одна сделка не может быть одновременно входом и выходом

Деление на _Point/1000 я убрал  DEAL_PROFIT  это уже результат в деньгах.
Интересно! Спасибо!