"MQL5 Cookbook: Fiyat Farklılığını Analiz Etmek İçin Çoklu Sembollü Bir Göstergenin Geliştirilmesi" makalesi için tartışma

 

Yeni makale MQL5 Cookbook: Fiyat Farklılığını Analiz Etmek İçin Çoklu Sembollü Bir Göstergenin Geliştirilmesi yayınlandı:

Bu yazıda, belirli bir zaman diliminde fiyat farklılaşmasını analiz etmek için çoklu sembollü bir göstergenin geliştirilmesini ele alacağız. Temel konular, çoklu para birimi göstergelerinin programlanmasıyla ilgili bir önceki makalede tartışılmıştı "MQL5 Yemek Kitabı: MQL5'te Çok Sembollü Bir Volatilite Göstergesi Geliştirme". Bu sefer sadece çarpıcı biçimde değiştirilmiş olan yeni özellikler ve işlevler üzerinde duracağız. Çoklu para birimi göstergelerinin programlanmasında yeniyseniz, önce bir önceki makaleyi okumanızı tavsiye ederim.

Tüm fonksiyonlar hazır. Bu makaleye tüm yorumlarıyla beraber eklenmiş kodu inceleyebilirsiniz.

Neticede ne elde ettiğimizi gösterelim. Varsayılan GBPUSD, AUDUSD, NZDUSD, USDCAD, USDCHF sembolleri harici parametrelerde belirtilir. Aşağıdaki ekran görüntüsünde, ters çevirme devre dışı bırakılmış Dikey çizgi modunda EURUSD için haftalık grafiği görebilirsiniz:

"Dikey çizgi" modunda haftalık zaman dilimi

Şek. 1 - "Dikey çizgi" modunda haftalık zaman dilimi

Yazar: Anatoli Kazharski

 

Bu sadece bir yazım hatası mı yoksa öyle mi olmalı?

Kaç kez denersem deneyeyim, "Copy squad "daki tüm fonksiyonlar asla sıfır döndürmüyor, sadece -1 veya >0 döndürüyor.

//+------------------------------------------------------------------+
//| Tüm karakterler için kullanılabilir veri sayısını kontrol eder ||
//+------------------------------------------------------------------+
bool CheckAvailableData()
  {
   int attempts=100;
   
//---
   for(int s=0; s<SYMBOLS_COUNT; s++)
     {
      //--- Eğer böyle bir karakter varsa
      if(symbol_names[s]!=empty_symbol)
        {
datetime time[];                    // Çubuk sayısını kontrol etmek için dizi
   int      total_period_bars   =0;    // Geçerli dönemin çubuk sayısı
   datetime terminal_first_date =NULL; // Terminaldeki mevcut dönemin mevcut verilerinin ilk tarihi
         //--- Terminaldeki geçerli dönem verilerinin ilk tarihini alın
         terminal_first_date=(datetime)SeriesInfoInteger(symbol_names[s],Period(),SERIES_TERMINAL_FIRSTDATE);
         //--- Belirtilen tarihten itibaren mevcut çubukların sayısını alın
         total_period_bars=Bars(symbol_names[s],Period(),terminal_first_date,TimeCurrent());
         //--- Bu çubukların hazır olup olmadığını kontrol edin
         for(int i=0; i<attempts; i++)
           {
            //--- Belirtilen miktarda veriyi kopyalayın
            if(CopyTime(symbol_names[s],Period(),0,total_period_bars,time))
              {
               //--- Gerekli miktar kopyalanmışsa, döngüyü durdur
               if(ArraySize(time)>=total_period_bars)
                  break;
              }
           }
         //--- Daha az veri kopyalanırsa, başka bir deneme yapılmalıdır.
         if(ArraySize(time)==0 || ArraySize(time)<total_period_bars)
           {
            msg_last=msg_prepare_data;
            ShowCanvasMessage(msg_prepare_data);
            OC_prev_calculated=0;
            return(false);
           }
        }
     }
//--- Fiyat farkının başlangıç noktası için dikey çizgi modundaysa, çıkın
   if(StartPriceDivergence==VERTICAL_LINE)
      return(true);
   else
     {
      datetime time[];                    // Çubuk sayısını kontrol etmek için dizi
      int      total_period_bars   =0;    // Geçerli dönemin çubuk sayısı
      datetime terminal_first_date =NULL; // Terminaldeki mevcut dönemin mevcut verilerinin ilk tarihi
      //--- Terminaldeki geçerli dönem verilerinin ilk tarihini alın
      for(int i=0; i<attempts; i++)
         if((terminal_first_date=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_FIRSTDATE))>0)
            break;
      //--- Belirtilen tarihten itibaren mevcut çubukların sayısını alın
      for(int i=0; i<attempts; i++)
         if((total_period_bars=(int)SeriesInfoInteger(Symbol(),timeframe_start_point,SERIES_BARS_COUNT))>0)
            break;
      //--- Bu çubukların hazır olup olmadığını kontrol edin
      for(int i=0; i<attempts; i++)
         //--- Belirtilen miktarda veriyi kopyalayın
         if(CopyTime(Symbol(),timeframe_start_point,
            terminal_first_date+PeriodSeconds(timeframe_start_point),TimeCurrent(),time)>0)
            break;
      //--- Daha az veri kopyalanırsa, başka bir deneme yapılmalıdır.
      if(ArraySize(time)<=0 || total_period_bars<=0)
        {
         msg_last=msg_prepare_data;
         ShowCanvasMessage(msg_prepare_data);
         OC_prev_calculated=0;
         return(false);
        }
     }
//---
   return(true);
  }
 
Fleder:

Bu sadece bir yazım hatası mı yoksa öyle mi olmalı?

Kaç kez denersem deneyeyim, "Copy squad "daki tüm fonksiyonlar asla sıfır döndürmüyor, sadece -1 veya >0 döndürüyor.

Genel olarak, >0 yapmalısınız. Ancak bu durumda, sonraki kontroller bunu yapmamanıza izin verir.
 
tol64:
Genel olarak, >0 yapmalısınız. Ancak bu durumda, sonraki kontroller bunu yapmamanıza izin verir.

Ancak bu ifade her zaman doğru olacaktır:

if(CopyTime(symbol_names[s],Period(),0,total_period_bars,time))
 
Fleder:

Ancak bu ifade her zaman doğru olacaktır:

if'i tamamen kaldırabilirsiniz. Bu durumda kritik değildir.
 
tol64:
Eğer varsa kaldırabilirsiniz. Bu durumda kritik değildir.
Ben de öyle düşünmüştüm :-)
 

Genel olarak, bir sembole geçmiş verilerin yüklenmesi yardımda yazıldığı şekilde gerçekleşmez.

Aslında, şu şekilde ortaya çıkıyor:

mql5 programından, örneğin CopyTime işlevi kullanılarak bazı zaman serilerinin verileri için bir istek varsa

ve bu veri terminalde değilse (henüz yüklenmemişse), terminal bu veriyi sunucudan istenen miktarda değil (yardım örneğinde 100 bar) indirecektir,

ancak "Grafikteki maksimum çubuklar" parametresinin RAM'e "yerleştirmeye" izin verdiği kadar gerekli zaman serisinin çubuğu.

Tüm geçmiş sunucudan indirileceğinden, PERIOD_W1 gibi daha yüksek bir dönemin yalnızca bir çubuğunu talep etmek yeterlidir.

 
Fleder:

Genel olarak, bir sembole geçmiş verilerin yüklenmesi yardımda yazıldığı şekilde gerçekleşmez.

Aslında, şu şekilde ortaya çıkıyor:

mql5 programından, örneğin CopyTime işlevi kullanılarak bazı zaman serilerinin verileri için bir istek varsa

ve bu veri terminalde değilse (henüz yüklenmemişse), terminal bu veriyi sunucudan istenen miktarda değil (yardım örneğinde 100 bar) indirecektir,

ancak "Grafikteki maksimum çubuklar" parametresinin RAM'e "yerleştirmeye" izin verdiği kadar gerekli zaman serisinin çubuğu.

Tüm geçmiş sunucudan indirileceğinden, PERIOD_W1 gibi daha yüksek bir dönemin yalnızca bir çubuğunu talep etmek yeterlidir.

Yardım istediğiniz her şeyi söyleyebilir. Uygun gördüğünüz gibi yapmakta özgürsünüz. ;)

Yardımdaki örnek başka bir makalede tartışıldı: Diğer programlar için MetaTrader 5 teklifleri nasıl hazırlanır >>>.

 
tol64:

Sertifika, söylemesini istediğiniz her şeyi söyleyebilir. Uygun gördüğünüz gibi yapmakta özgürsünüz. ;)

Yardımdaki örnek başka bir makalede tartışıldı: Diğer programlar için MetaTrader 5 teklifleri nasıl hazırlanır >>>.

Ben de öyle yaptım. Kodunuzda sunucudan kalan "yüklenmemiş çubukların" hesaplanmasını gördüm.

Ve düşündüm ki - terminal umursamıyor, oluşturması gerektiği kadar pompalıyor.

 

Makalenizin sonunda şöyle yazmışsınız:"Bu gösterge daha iyisi için sınırsızca geliştirilebilir".

Bana göre, fiyat farklılaşması üzerine düşünmenin insan gözüne pek faydası yoktur. İnsan bir robot değildir!

Ancak bir robot için ilginç bir konudur.

Birkaç işleme seçeneği önerdiniz:

1. çizgiden.

2. "gün."

Şu anda benzer bir şey üzerinde çalışıyorum, sadece "hafta" modunda.

 
Fleder:

Makalenizin sonunda şöyle yazmışsınız:"Bu gösterge daha iyisi için sınırsızca geliştirilebilir".

Bana göre, fiyat farklılaşması üzerine düşünmenin insan gözüne pek faydası yoktur. İnsan bir robot değildir!

Ancak bir robot için ilginç bir konudur.

Birkaç işleme seçeneği önerdiniz:

1. çizgiden.

2. "gün."

Şu anda benzer bir şey üzerinde çalışıyorum, sadece "hafta" modunda.

Başka sorunlarla uğraştığım için yakın zamanda başka bir şey yazabileceğimden emin değilim. Ancak bu makaleye göre, geliştirmenin hala çoklu para birimi hesaplamalarında ve bu hesaplamaların tuval üzerinde görselleştirilmesinde olması gerekiyordu.

Evet, insan robot değildir, ama bazen bir fikir edinmek için çalışma konusuna başka bir şekilde bakmanız gerekir. ;)