Kütüphaneler: Takvim - sayfa 4

 
fxsaber:

Bu yapılmamış. Bir uzmanla iletişime geçin.

Elbette, ne demek istediğinizi şimdi anladım. Teşekkürler
 
Tüm haber olayları doğru bir şekilde indirilmesine rağmen (BIN dosyası 67mb), geriye dönük testin yaklaşık 5 yılla (2017'den itibaren) sınırlı göründüğünü fark ettim. MT5'in geriye dönük test için bellekte kaç olayı işleyebileceğine dair bir sınır var mı?
 
mqtrader #:
Tüm haber olayları doğru bir şekilde indirilmesine rağmen (BIN dosyası 67mb), geriye dönük testin yaklaşık 5 yılla (2017'den itibaren) sınırlı göründüğünü fark ettim. MT5'in geriye dönük test için bellekte kaç olayı işleyebileceğine dair bir sınır var mı?
#property script_show_inputs

#include <fxsaber\Calendar\Calendar.mqh> // https://www.mql5.com/tr/code/32430

input bool inFromFile = false;

#define  CALENDAR_FILENAME "Calendar.bin" // Takvim'i okumak/yazmak için dosya adı.

void OnStart()
{
  CALENDAR Calendar;
  
  if (inFromFile)
    Calendar.Load(CALENDAR_FILENAME);
  else
  {
    Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // Tüm takvimi aldım.
    Calendar.Save(CALENDAR_FILENAME); // > > 65 MB.
  }
  
  Print(Calendar[0].ToString());
}


Sonuç.

2007.01.06 23:30 USD 1 CFTC Crude Oil Non-Commercial Net Positions(cftc-crude-oil-non-commercial-net-positions), United States(US) | 2.2 K |  | 19.8 K | 

Takvim veritabanındaki ilk olay Ocak 2007'dir.

 
"Tahmin" değerlerinin 2017.05.05'ten başladığını yeni fark ettim, bu nedenle geri test, örneği çalıştırırken yalnızca bu tarihten başlayabilir. Diğer değerler bu tarihten önce kullanılabilir.

Bu çok faydalı kütüphane için bir kez daha teşekkürler fxsaber!
 

Etkinlik takvimi önemli ölçüde geleceğe yönelik olarak öngörülmüştür. Bu nedenle, MT4 verilerinden bir dosyayı önceden kaydetmiş olarak (örneğin bir ay önce) MT5'te bir hatırlatıcı kullanabilirsiniz.

MT4 için yaptığım şey bu.

MT4'te takvim ile çalışma adımları.


1. MT5'te takvimi bir Ortak dosyaya kaydedecek bir komut dosyası çalıştırın.

#include <fxsaber\Calendar\Calendar.mqh> // https://www.mql5.com/tr/code/32430

#define  CALENDAR_FILENAME "Calendar.bin" // Takvim'i okumak/yazmak için dosya adı.

void OnStart()
{
  CALENDAR Calendar;
  
  Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // Tüm takvimi aldım.
  Calendar.Save(CALENDAR_FILENAME, true); // Kaydedilmiş takvim. > 65 MB.
}


2. Takvimi Ortak dosyadan MT4'e yükleyin.


Aşağıda örnek olarak, MT4'te çalışan mevcut sembolün para birimlerindeki önemli olayların bir hatırlatıcısı bulunmaktadır.

#include <fxsaber\Calendar\Calendar.mqh> // https://www.mql5.com/tr/code/32430

#define  CALENDAR_FILENAME "Calendar.bin" // Takvim'i okumak/yazmak için dosya adı.

int OnInit()
{
  return(!EventSetTimer(1));
}

void OnTimer()
{
  static CALENDAR Calendar;

  if (Calendar.GetAmount()) // Eğer takvim boş değilse.
  {
    static int Pos = 0;
    
    Pos = Calendar.GetPosAfter(TimeCurrent(), Pos); // Gelecek Etkinlikler Bulundu.
    
    Comment(Calendar.ToString(Pos, 5, true)); // Çıktılarını aldım.
  }
  else if (Calendar.Load(CALENDAR_FILENAME, true)) // Takvim bir dosyadan yüklendi.
  {
    string Currencies[2];
    
    // Geçerli karakterin para birimlerini alın.
    Currencies[0] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_BASE);
    Currencies[1] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT);
          
    Calendar.FilterByCurrency(Currencies); // Olayları sembolün para birimleri üzerinde bırakır.
    Calendar.FilterByImportance(CALENDAR_IMPORTANCE_HIGH); // Sadece önemli olaylar geride bırakıldı.
  }    
}


Başlattıktan sonra, doğrudan MT4'te sembolün para birimlerindeki önemli olayların grafikle güncellenmiş (geri sayım) bir hatırlatıcısına sahibiz.


Benzer şekilde Takvim MT4-Tester'da çalışabilir.

 
Mark Taylor #:

Yine de bir sorunla karşılaşmaya devam ediyorum, takvim dosyasının standart indirmesini yapıyorum

ardından bir başlangıç zamanı belirleyin ve her para birimi için bir döngü içinde bu zamandan sonraki olayları alın.

Kaynakları okunabilecek şekilde yapıştırmaya çalışın.

 

Güçlü emekleriniz için teşekkürler.

Elbette, bu tür çalışmalar geliştirilmeli ve düzeltilmeli ve dokümantasyon, sadece bir kişi değil, tüm topluluk tarafından açıklanmalıdır. Ancak bazı nedenlerden dolayı yönetimin kendisi bu tür hükümler vermiyor ve uygun organizasyon için aynı GitHub'a bir bağlantı eklemiyor. Projeler olmasına rağmen, kullanımları neredeyse aynı GitHub.

Teşekkürler! kod için, böyle bir kodu okumak çok ilginç, dürüst olmak gerekirse: aşırı yükleme şablonları yorum eksikliği )) bu yaratıcılığa değer nedir, 5 dakika ne olduğunu düşündü? bir sınıf örneği veya veri içeren bir dizi. Genel olarak, beyin gelişimi için her şey.
CALENDAR Calendar;
Calendar[i].time
Tabii ki, iş harika, sadece nasıl çalıştığını anlamalısınız
 

İşlev, birleştirmeden sonra tüm diziyi zamana göre sıralasaydı iyi olurdu

int operator +=( const CALENDAR &Value )
  {
    const int Size1 = this.GetAmount();
    const int Size2 = Value.GetAmount();

    if (!Size1)
      for (int i = ::ArrayResize(this.Events, Size2) - 1; i >= 0; i--)
        this.Events[i] = Value.Events[i];
    else if (Size2)
    {
      EVENT Array[];

      ::ArrayResize(Array, Size1 + Size2);

      int i = 0;
      int j = 0;
      int k = 0;

      while ((i < Size1) && (j < Size2))
        Array[k++] = (this.Events[i] < Value.Events[j]) ? this.Events[i++] : Value.Events[j++];

      while (i < Size1)
        Array[k++] = this.Events[i++];

      while (j < Size2)
        Array[k++] = Value.Events[j++];

    #ifdef __MQL5__
      ::ArraySwap(this.Events, Array);
    #else // #ifdef __MQL5__
      ::ArrayFree(this.Events);

      ::ArrayCopy(this.Events, Array);
    #endif // #ifdef __MQL5__ #else
    }

    return(this.GetAmount());
  }
bool operator <( const EVENT &Value ) const
  {
    return(!Value.time || (this.time < Value.time));
  }
 
BillionerClub #:

İşlev, birleştirmeden sonra tüm diziyi zamana göre sıralasaydı iyi olurdu

Bunu yapmadığı bir örnek verin.

 
fxsaber #:

Bana bunun böyle olmadığı bir örnek verin.

Kodunuzu anlamak zor, ancak yukarıdaki kodda son bir sıralama olduğunu varsayıyorum, ancak kod muhtemelen hatalı. Sık olmamakla birlikte, dizileri birleştirirken, son dizi sıralama eksikliği şeklinde hatalarla birlikte gelir, çünkü dizideki en son öğelerin daha uzun bir süreye sahip olması gerekir.

2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 08:00
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 13:30
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 16:30
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 20:00
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.05 00:00
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.07 00:00
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 00:30
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 00:30
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 00:30
   int totall = Calendar+=Calendar3;

for(int i=0;i<totall;i++)
  {
   Print(TimeToString(Calendar[i].time));
  }