"MQL5 Standart Kitaplığını Genişletme ve Kodu Yeniden Kullanma" makalesi için tartışma - sayfa 2

 
Tango_X:


Gösterge arabellek dizisinin indeksleme yönünün burada nasıl ayarlandığını anlamama yardımcı olun, yani ArraySetAsSeries ile aynı. Varsayılan yön şimdiki zamandan geçmişe doğrudur, ancak bunu geçmişten günümüze yapmam gerekiyor. Dünden beri bu soruyla uğraşıyorum! Yardım edin!

Standart ZigZag kullandığı için buna ihtiyacı yoktur.

//--- oluştur
   m_handle=iCustom(symbol,period,"zigzag",depth,deviation_create,backstep);

Bu ZigZag 'da yönün ayarlandığı yeri arayın, ancak buna neden ihtiyaç duyduğunuz hala belirsiz - indeksleme yönünü istediğiniz zaman kendiniz değiştirebilirsiniz - https://www.mql5.com/tr/docs/series.

Документация по MQL5: Доступ к таймсериям и индикаторам
Документация по MQL5: Доступ к таймсериям и индикаторам
  • www.mql5.com
Доступ к таймсериям и индикаторам - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Rashid Umarov:

Standart ZigZag kullandığı için buna ihtiyacı yoktur.

Bu ZigZag 'da, yönün ayarlandığı yeri arayın. Ancak buna neden ihtiyaç duyduğunuz hala belirsiz - indeksleme yönünü istediğiniz zaman kendiniz değiştirebilirsiniz - https://www.mql5.com/tr/docs/series.


Bilgi için teşekkürler, bunu inceleyeceğiz!

 
Rashid Umarov:

Standart ZigZag kullandığı için buna ihtiyacı yoktur.

Bu ZigZag 'da yönün ayarlandığı yeri arayın. Ancak buna neden ihtiyaç duyduğunuz hala net değil - indeksleme yönünü istediğiniz zaman kendiniz değiştirebilirsiniz - https://www.mql5.com/tr/docs/series.


Üzgünüm, ancak örneğin Zigzag kaynağına erişiminiz yoksa indeksleme yönünü nasıl değiştireceğiniz hala net değil. Dizinleme yönü ArraySetAsSeries() tarafından ayarlanır - burada giriş parametresi referansa göre bir dizidir,

ancak bu diziye sahip değiliz, sadece gösterge tampon dizisine bir işaretçi şeklinde

//--- tampon oluştur
      ((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
      ((CIndicatorBuffer*)At(1)).Name("HIGH");
      ((CIndicatorBuffer*)At(2)).Name("LOW");
 
//+------------------------------------------------------------------+
//|OOO_ZIGZAG.mq5 |
//| Telif Hakkı 2017, MetaQuotes Software Corp. | |
//|https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#include <..\Include\Indicators\Indicator.mqh>


//--- giriş parametreleri
input ENUM_TIMEFRAMES   EAPeriod=PERIOD_CURRENT; //Program dönemi
input string            CurrencyPair="EURUSD.m"; //Sembol

//+------------------------------------------------------------------+
//| Sınıf CiZigZag.|
//| Amaç: ZigZag gösterge sınıfı. ||
//| CIndicator sınıfından çıktı.|
//+------------------------------------------------------------------+
class CiZigZag : public CIndicator
  {
protected:
   int               m_depth;
   int               m_deviation;
   int               m_backstep;

public:
                     CiZigZag(void);
                    ~CiZigZag(void);
   //--- korunan verilere erişim yöntemleri
   int               Depth(void)          const { return(m_depth);      }
   int               Deviation(void)      const { return(m_deviation);  }
   int               Backstep(void)       const { return(m_backstep);   }
   //--- oluşturma yöntemi
   bool              Create(const string symbol,const ENUM_TIMEFRAMES period,
                            const int depth,const int deviation_create,const int backstep);
   //--- gösterge verilerine erişim yöntemleri
   double            ZigZag(const int index) const;
   double            High(const int index) const;
   double            Low(const int index) const;
   //--- tanımlama yöntemi
   virtual int       Type(void) const { return(IND_CUSTOM); }

protected:
   //--- özelleştirme yöntemleri
   virtual bool      Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam &params[]);
   bool              Initialize(const string symbol,const ENUM_TIMEFRAMES period,
                                const int depth,const int deviation_init,const int backstep);
  };
//+------------------------------------------------------------------+
//| Kurucu|
//+------------------------------------------------------------------+
CiZigZag::CiZigZag(void) : m_depth(-1),
                         m_deviation(-1),
                         m_backstep(-1)
  {
  }
//+------------------------------------------------------------------+
//| Yıkıcı|
//+------------------------------------------------------------------+
CiZigZag::~CiZigZag(void)
  {
  }
//+------------------------------------------------------------------+
//|| "Zig Zag" göstergesini oluşturun|
//+------------------------------------------------------------------+
bool CiZigZag::Create(const string symbol,const ENUM_TIMEFRAMES period,
                      const int depth,const int deviation_create,const int backstep)
  {
//--- geçmişi kontrol et
   if(!SetSymbolPeriod(symbol,period))
      return(false);
//--- oluştur
   m_handle=iCustom(symbol,period,"Examples\\ZigZag",depth,deviation_create,backstep);
//--- sonucu kontrol edin
   if(m_handle==INVALID_HANDLE)
      return(false);
//--- gösterge başarıyla oluşturuldu
   if(!Initialize(symbol,period,depth,deviation_create,backstep))
     {
      //--- başlatma hatası
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- tamam
   return(true);
  }
//+------------------------------------------------------------------+
//| Göstergeyi evrensel parametrelerle başlatın |
//+------------------------------------------------------------------+
bool CiZigZag::Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam &params[])
  {
   return(Initialize(symbol,period,(int)params[0].integer_value,(int)params[1].integer_value,(int)params[2].integer_value));
  }
//+------------------------------------------------------------------+
//| Göstergeyi özel parametrelerle başlatın |
//+------------------------------------------------------------------+
bool CiZigZag::Initialize(const string symbol,const ENUM_TIMEFRAMES period,
                        const int depth,const int deviation_init,const int backstep)
  {
   if(CreateBuffers(symbol,period,3))
     {
      //--- durum satırını oluşturma
      m_name  ="ZigZag";
      m_status="("+symbol+","+PeriodDescription()+","+
               IntegerToString(depth)+","+IntegerToString(deviation_init)+","+
               IntegerToString(backstep)+") H="+IntegerToString(m_handle);
      //--- ayarları kaydet
      m_depth=depth;
      m_deviation=deviation_init;
      m_backstep=backstep;       
      //--- tampon oluştur
      ((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
      ((CIndicatorBuffer*)At(1)).Name("HIGH");
      ((CIndicatorBuffer*)At(2)).Name("LOW");
      //--- tamam
      return(true);
     }
//--- hata
   return(false);
  }
//+------------------------------------------------------------------+
//| "Zig Zag" göstergesinin ZigZag tamponuna erişim |
//+------------------------------------------------------------------+
double CiZigZag::ZigZag(const int index) const
  {
   CIndicatorBuffer *buffer=At(0);
//--- kontrol et
   if(buffer==NULL)
      return(EMPTY_VALUE);
//---
   return(buffer.At(index));
  }
//+------------------------------------------------------------------+
//| "Zig Zag" göstergesinin Yüksek tamponuna erişim |
//+------------------------------------------------------------------+
double CiZigZag::High(const int index) const
  {
   CIndicatorBuffer *buffer=At(1);
   //--- kontrol et
   if(buffer==NULL)
      return(EMPTY_VALUE);
//---
   return(buffer.At(index));
  }
//+------------------------------------------------------------------+
//| "Zig Zag" göstergesinin Düşük tamponuna erişim |
//+------------------------------------------------------------------+
double CiZigZag::Low(const int index) const
  {
   CIndicatorBuffer *buffer=At(2);
//--- kontrol et
   if(buffer==NULL)
      return(EMPTY_VALUE);
//---
   return(buffer.At(index));
  }
//+------------------------------------------------------------------+



CiZigZag *Zig;
//+------------------------------------------------------------------+
//| Özel gösterge başlatma işlevi |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- gösterge tamponları eşleme
   Zig=new CiZigZag;
   Zig.Create(CurrencyPair,EAPeriod,12,5,3);
//---
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
   delete(Zig);
  }  
//+------------------------------------------------------------------+
//| Özel gösterge yineleme işlevi |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit;
   if(prev_calculated==0)limit=0;
   else
     limit=prev_calculated-1; 
     
   for(int i=limit;i<rates_total && !IsStopped();i++)
      {
       Zig.Refresh();
       if (Zig.ZigZag(i)!=0) Print(Zig.ZigZag(i)," ",time[i]);  
      }
//--- sonraki çağrı için prev_calculated değerini döndürür
   return(rates_total);
  }
//+------------------------------------------------------------------+

İşte gösterge değerlerinin çıktısının günümüzden geçmişe olduğu göstergenin tam kodu - ve bunun tersi de gereklidir

 
Tango_X:

Üzgünüm, ancak örneğin kaynak Zigzag'a erişim yoksa indeksleme yönünün nasıl değiştirileceği hala net değil. Dizinleme yönü ArraySetAsSeries() tarafından ayarlanır - burada giriş parametresi referansa göre bir dizidir,

ancak bu diziye sahip değiliz, sadece gösterge tampon dizisine bir işaretçi şeklinde

CIndicator temel sınıfı, gösterge tamponundan veri almak için kullanılabilen bir GetData yöntemine sahiptir.

Başlangıç konumu ve numarasına göre gösterge tamponundan veri alır

int GetData(
const intstart_pos, // pozisyon
const intcount, // sayı
const int buffer_num, // tampon numarası
double&buffer[]// dizi
) const



Bundan sonra, ArraySetAsSeries kullanarak diziniz için istediğiniz dizinleme yönünü ayarlayın

 
Rashid Umarov:

CIndicator temel sınıfı, gösterge tamponundan veri almak için kullanılabilecek bir GetData yöntemine sahiptir.

Gösterge tamponundan başlangıç konumu ve gösterge sayısına göre veri alır.

int GetData(
const intstart_pos, // pozisyon
const intcount, // sayı
const int buffer_num, // tampon numarası
double&buffer[]// dizi
) const



Bundan sonra, diziniz için istediğiniz indeksleme yönünü ayarlayın.

Yani gösterge tamponuna iki kez, ancak farklı şekillerde erişildiği ortaya çıkıyor? Sonuçta, burada aşağıda gösterge tamponunun değerlerine zaten erişimimiz var? Bir ara dizi alıyoruz double &buffer[] Sizi doğru anladım mı?

//+------------------------------------------------------------------+
//| "Zig Zag" göstergesinin ZigZag tamponuna erişim |
//+------------------------------------------------------------------+
double CiZigZag::ZigZag(const int index) const
  {
   CIndicatorBuffer *buffer=At(0);
//--- kontrol et
   if(buffer==NULL)
      return(EMPTY_VALUE);
//---
   return(buffer.At(index));
  }
 
Rashid Umarov:

CIndicator temel sınıfı, gösterge tamponundan veri almak için kullanılabilecek bir GetData yöntemine sahiptir.

Gösterge tamponundan başlangıç konumu ve gösterge sayısına göre veri alır.

int GetData(
const intstart_pos, // pozisyon
const intcount, // sayı
const int buffer_num, // tampon numarası
double&buffer[]// dizi
) const



Bundan sonra, ArraySetAsSeries kullanarak diziniz için istediğiniz dizinleme yönünü ayarlayın

Sizi doğru anladım mı?

CiZigZag *Zig;
double ArrZig[];
//+------------------------------------------------------------------+
//| Özel gösterge başlatma işlevi |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- gösterge tamponları eşleme
   Zig=new CiZigZag;
   Zig.Create(CurrencyPair,EAPeriod,12,5,3);

   SetIndexBuffer(0,ArrZig,INDICATOR_CALCULATIONS);
   ArraySetAsSeries(ArrZig,false);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   delete(Zig);
  }
//+------------------------------------------------------------------+
//| Özel gösterge yineleme işlevi |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit;
   if(prev_calculated==0) limit=0;
   else
      limit=prev_calculated-1;

   Zig.Refresh();
   Zig.GetData(0,rates_total-1,0,ArrZig);

   for(int i=limit;i<rates_total-1 && !IsStopped();i++)
     {

      //if (Zig.ZigZag(i)!=0) Print(Zig.ZigZag(i)," ",time[i]); 
      if(ArrZig[i]!=0) Print(ArrZig[i]," ",time[i]);
     }
//--- sonraki çağrı için prev_calculated değerini döndürür
   return(rates_total);
  }
//+------------------------------------------------------------------+
Görünüşe göre her tikte tüm geçmişi kopyalamanız gerekiyor?
 
Tango_X:

Sizi doğru mu anlıyorum???

Her tikte tüm geçmişi kopyalamak gerektiği ortaya çıkıyor?

1. Bunu yeni bir çubuğun açılışında yapabilirsiniz

2. Neden her seferinde tüm gösterge değerlerini almanız ve aynı zamanda indeksleme yönüne dikkat etmeniz gerekiyor? Görev nedir?

 

Basit bir gösterge daha sonra bir grafikte veya iCustom aracılığıyla kullanılacaksa neden bir sınıfa sarılsın?

Второе решение лучше, потому что является объектно-ориентированным

OOP uğruna OOP, tamam.

 
Rashid Umarov:

1. Yeni bir bar açmak mümkündür

2. Neden her seferinde tüm gösterge değerlerini almanız ve aynı zamanda indeksleme yönünü önemsemeniz gerekiyor? Görev nedir?


Sorun döngü koşulları ile çözüldü, şimdi her şey istendiği gibi çalışıyor. teşekkürler!