Uzman Danışmanlar: Yatırımcılar için MQL5 Programlama - Kitaptan kaynak kodları. Bölüm 6 - sayfa 2

 
Stanislav Korotky #:
Emirler, anlaşmalar, pozisyonlar zaten zaman dilimleriyle ilgili değildir. Ya bir şeyi yanlış anladınız ya da ifadeniz yanlış.
Özür dilerim, sanırım kelime seçimim kafa karıştırıcı"zaman dilimi" ile "tarih aralığını" kastediyorum. Diyelim ki 2025-10-01 00:00:00 ile 2025-10-22 23:59:59 arasındaki Anlaşmalar gibi belirli bir tarih aralığında işlem gören Anlaşmaları / Siparişleri seçmek istiyorum.
 
pauldic #:
Üzgünüm, sanırım kelime seçimim kafa karıştırıcı"zaman çerçevesi" ile "tarih aralığı" demek istiyorum. Diyelim ki 2025-10-01 00:00:00 ile 2025-10-22 23:59:59 arasındaki Fırsatlar gibi belirli bir tarih aralığında işlem gören Fırsatları/Siparişleri seçmek istiyorum.

Bir işlem geçmişinin bir alt aralığını analiz etmek istiyorsanız, filtreleme kodunun kendisini etkilemeden, filtrelemeden önce geçmişin yalnızca bu bölümünü talep etmek daha verimli olduğunda:

input datetime SubrangeFrom = 0;
input datetime SubrangeTo = 0;

...

{
   HistorySelect(SubrangeFrom, SubrangeTo);
   // ... filtre kodu olduğu gibi buraya gider
}

Herhangi bir nedenle, HistorySelect ile uyguladığınız genel aralık içinde (daha dar) bir alt aralık seçmek isterseniz, bunu filtreleme kodunda şu şekilde yapabilirsiniz:

{
      // bunlardan bazıları buraya gider

      // HistorySelect(0, LONG_MAX);
      // HistorySelectByPosition(PositionID);
      ...
      DealTuple deals[];
      if(SubrangeFrom != SubrangeTo && SubrangeFrom < SubrangeTo)
      {
         filter.let(DEAL_TIME, SubrangeFrom - 1, IS::GREATER).let(DEAL_TIME, SubrangeTo + 1, IS::LESS);
      }
      filter.let(DEAL_POSITION_ID, PositionID).select(deals, true);
      ...
}

Sarı renkle vurgulanan satır, IS::GREATER ve IS::LESS ek niteleyicilerini kullanarak tarih-saat aralığı [SubrangeFrom, SubrangeTo] için 2 koşul belirler (varsayılan olarak, let() işlevine yapılan diğer çağrılarda belirtilmezler ve daha sonra IS::EQUAL normalde tek değerli alanlar için kullanılır).

Alt filtreyi tarih aralığına göre uygulamak için tek bir neden biliyorum - bu, emirlerin kurulum zamanı (ORDER_TIME_SETUP) içindir, çünkü HistorySelect emirlerin başka bir tarih-zaman özelliğine uygulanır - yani emir gerçekleştirme zamanı (ORDER_TIME_DONE). Ayrıca, çok sayıda aktif emir varsa, aktif emirlerin bir alt aralığını (geçmişte olmayan) filtrelemek ilginç olabilir.

Başlangıç noktası olarak MQL5/Scripts/MQL5Book/p6/TradeHistoryPrint.mq5 örnek koduna bakabilirsiniz.
 
Stanislav Korotky #:

Bir işlem geçmişinin bir alt aralığını analiz etmek istiyorsanız, filtreleme kodunun kendisini etkilemeden, filtrelemeden önce geçmişin yalnızca bu bölümünü talep etmek daha verimli olduğunda:

Herhangi bir nedenle, HistorySelect ile uyguladığınız genel aralık içinde (daha dar) bir alt aralık seçmek isterseniz, bunu filtreleme kodunda şu şekilde yapabilirsiniz:

Sarı renkle vurgulanan satır, IS::GREATER ve IS::LESS ek niteleyicilerini kullanarak tarih-saat aralığı [SubrangeFrom, SubrangeTo] için 2 koşul belirler (varsayılan olarak, let() işlevine yapılan diğer çağrılarda belirtilmezler ve daha sonra IS::EQUAL normalde tek değerli alanlar için kullanılır).

Alt filtreyi tarih aralığına göre uygulamak için tek bir neden biliyorum - bu, emirlerin kurulum zamanı (ORDER_TIME_SETUP) içindir, çünkü HistorySelect emirlerin başka bir tarih-zaman özelliğine uygulanır - yani emir gerçekleştirme zamanı (ORDER_TIME_DONE). Ayrıca, çok sayıda aktif emir varsa, aktif emirlerin bir alt aralığını (geçmişte olmayan) filtrelemek ilginç olabilir.

Başlangıç noktası olarak MQL5/Scripts/MQL5Book/p6/TradeHistoryPrint.mq5 örnek betiğine bakabilirsiniz.
@StanislavKorotky Bir kez daha teşekkürler... Benim için harika bir başlangıç noktası ve onunla çalışmaya başlayacağım