PİNE EDİTOR'DE İNDİCATÖRÜ MT5'DE KODLAMA

 

Merhaba. Tradingview'daki "Range Filter 5min" indicatörünü metatrader5'de kodlamak istiyorum. Çözemediğim bir sorun var. Pine Editor'de aşağıdaki kodu anlayamadım.


rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r :
       x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
    rngfilt
filt = rngfilt(src, smrng)



Bu kodu uzman danışmanda nasıl kodlayabilirim yardımcı olur musunuz.

 

Merhaba! 

Pine Script'teki bu kod, bir range filter (aralık filtresi) oluşturuyor. Kod karmaşık görünse de, mantığı şöyle:

Pine Script Mantığı:

pine

rngfilt(x, r) => rngfilt = x rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r rngfilt



  • x = kaynak fiyat (örn: close)
  • r = range değeri
  • nz(rngfilt[1]) = önceki filtre değeri (null ise 0)

Mantık adım adım:

  1. Eğer x > önceki_değer ise (fiyat yükseliyorsa):
    • x - r değeri önceki değerden küçükse → önceki değeri koru
    • Değilse → x - r kullan
  2. Değilse (fiyat düşüyorsa veya eşitse):
    • x + r değeri önceki değerden büyükse → önceki değeri koru
    • Değilse → x + r kullan

MQL5 Kodu:


mql5

        //+------------------------------------------------------------------+
//| Range Filter fonksiyonu                                           |
//+------------------------------------------------------------------+
double RangeFilter(double x, double r, double &prev_rngfilt)
{
   double rngfilt;
   
   // İlk hesaplama (önceki değer yoksa)
   if(prev_rngfilt == 0.0 || prev_rngfilt == EMPTY_VALUE)
   {
      rngfilt = x;
   }
   else
   {
      // Pine Script mantığını MQL5'e çevirme
      if(x > prev_rngfilt)
      {
         // Fiyat yükseliyorsa
         if((x - r) < prev_rngfilt)
            rngfilt = prev_rngfilt;  // Önceki değeri koru
         else
            rngfilt = x - r;          // x - r kullan
      }
      else
      {
         // Fiyat düşüyorsa veya eşitse
         if((x + r) > prev_rngfilt)
            rngfilt = prev_rngfilt;  // Önceki değeri koru
         else
            rngfilt = x + r;          // x + r kullan
      }
   }
   
   // Sonraki kullanım için güncelle
   prev_rngfilt = rngfilt;
   
   return rngfilt;
}