"MQL5 Tarif Defteri Pozisyon Parametrelerini MetaTrader 5 Strateji Test Cihazında Analiz Etme" makalesi için tartışma

 

Yeni makale MQL5 Tarif Defteri Pozisyon Parametrelerini MetaTrader 5 Strateji Test Cihazında Analiz Etme yayınlandı:

"MQL5 Tarif Defteri: Özel Bilgi Panelindeki Pozisyon Özellikleri" adlı önceki makalesinden Uzman Danışmanın değiştirilmiş bir versiyonunu sunacağız. Ele alacağımız sorunlardan bazıları, çubuklardan veri alma, mevcut sembol üzerindeki yeni çubuk olaylarını kontrol etme, Standart Kitaplığın bir alım satım sınıfını bir dosyaya ekleme, alım satım sinyallerini aramak için bir fonksiyon ve alım satım işlemlerini yürütmek için bir fonksiyon oluşturmanın yanı sıra OnTrade() fonksiyonundaki alım satım olaylarını belirlemeyi içerir.

Temel olarak, her şey hazır ve teste geçebiliriz. Strateji Test Cihazı, görselleştirme modunda bir test yapmanızı ve varsa hataları bulmanızı sağlar. Strateji Test Cihazının kullanımı, piyasaların kapalı olduğu hafta sonlarında bile programınızı geliştirmeye devam edebilmeniz nedeniyle faydalı görülebilir.

Strateji Test Cihazını kurun, görselleştirme modunu etkinleştirin ve Başlat seçeneğine tıklayın. Uzman Danışman, Strateji Test Cihazında alım satım yapmaya başlayacak ve aşağıda gösterilene benzer bir resim ortaya çıkacaktır:

Şekil 2. MetaTrader 5 Strateji Test Cihazında Görselleştirme modu.

Yazar: Anatoli Kazharski

 

İyi akşamlar, lütfen bana yardımcı olun, CheckNewBar fonksiyonunda new_bar statik değişkeni ilk satırda sıfırlanıyor ve daha sonra fonksiyonun mantığı sıfıra eşit olup olmadığına dayanıyor. Lütfen anlamadığım yeri söyler misiniz?!?!!!?!

bool CheckNewBar()
  {
//--- Geçerli bar açılış zamanı için değişken
   static datetime new_bar=NULL;
//--- Geçerli bar açılış zamanını elde etmek için dizi
   static datetime time_last_bar[1]={0};
//--- Geçerli çubuğun açılış zamanını alır
// Alım sırasında bir hata oluştuysa, bunu rapor edeceğiz
   if(CopyTime(_Symbol,Period(),0,1,time_last_bar)==-1)
     { Print(__FUNCTION__,": Bar açılış saati kopyalanırken hata oluştu: "+IntegerToString(GetLastError())+""); }
//--- Eğer bu ilk fonksiyon çağrısı ise
   if(new_bar==NULL)
     {
      // Saati ayarlayın
      new_bar=time_last_bar[0];
      Print(__FUNCTION__,": Başlatma ["+_Symbol+"][TF: "+TimeframeToString(Period())+"]["
            +TimeToString(time_last_bar[0],TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"]");
      return(false); // Yanlış döndür ve çık 
     }
//--- Zaman farklıysa
   if(new_bar!=time_last_bar[0])
     {
      new_bar=time_last_bar[0]; // Saati ayarlayın ve çıkın 
      return(true); // Zamanı hatırlayın ve true değerini döndürün
     }
//--- Bu noktaya geldik - yani çubuk yeni değil, false döndürelim
   return(false);
  }
 
Sergey Voytsekhovsky:

İyi akşamlar, lütfen bana yardımcı olun, CheckNewBar fonksiyonunda new_bar statik değişkeni ilk satırda sıfırlanıyor ve daha sonra fonksiyonun mantığı sıfıra eşit olup olmadığına dayanıyor. Lütfen anlamadığım yeri söyler misiniz?!?!!!?!

Yardım diyor ki:

static anahtar sözcüğüyle bildirilenyerel değişkenler, işlevin var olduğu süre boyunca değerlerini korur. İşlevin her bir sonraki çağrısında, bu tür yerel değişkenler bir önceki çağrıda sahip oldukları değerleri içerir.

Yani, CheckNewBar() fonksiyonunun yeni bir çağrısında, new_bar değişkeni fonksiyonun bir önceki çağrısında aldığı değeri koruyacaktır, ancak ilk satırda yeni bir değer atanacaktır NULL...... ve sonra tüm bunların nedenini ve nasıl çalıştığını anlamıyorum. Lütfen kafa karışıklığımı giderin, büyük olasılıkla aptal bir yerdeyim, ama NEREDE ?????

 
Sergey Voytsekhovsky:

İyi akşamlar, lütfen bana yardımcı olun, CheckNewBar fonksiyonunda new_bar statik değişkeni ilk satırda sıfırlanıyor ve daha sonra fonksiyonun mantığı sıfıra eşit olup olmadığına dayanıyor. Lütfen anlamadığım yeri söyler misiniz?!?!!!?!

Yardımı doğru anladıysam,static datetimenew_bar=NULL; satırında" Başlangıç değerleri belirtilmezse, statik bellek sınıfının değişkenleri sıfır başlangıç değeri alır". Yani hiç null ile başlatılmamalıydı ve o zaman mantık kusursuz olurdu. Ya da değil ????

 
Sergey Voytsekhovsky:

Yardımı doğru anladıysam,static datetimenew_bar=NULL; " Başlangıç değerleri belirtilmezse, statik bellek sınıfı değişkenleri sıfır başlangıç değeri alır." Yani hiç null ile başlatılmamalıydı ve o zaman mantık kusursuz olurdu. Ya da değil mi?

Değişkenler her zaman başlatılmalıdır. Bu yazılı olmayan bir yasadır. Bunu yerine getirmeyenler er ya da geç bulunması çok zor hatalar yakalarlar :)


Statik değişken nasıl çalışır:

//+------------------------------------------------------------------+
//|Test EA.mq5 |
//|Telif Hakkı © 2018, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Telif Hakkı © 2018, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
//+------------------------------------------------------------------+
//| Uzman başlatma işlevi|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Uzman başlangıçtan kaldırma işlevi|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Uzman tik fonksiyonu|
//+------------------------------------------------------------------+
void OnTick()
  {
//--- sadece yeni çubuğun doğumu sırasında çalışırız
   static datetime PrevBars=0;
   Print("PrevBars ",PrevBars);
   datetime time_0=iTime(Symbol(),Period(),0);
   if(time_0==PrevBars)
      return;
   PrevBars=time_0;
   Print("New bar. PrevBars ",PrevBars);
  }
//+------------------------------------------------------------------+


Uzmanlar sekmesine yazdırın. OnTick() işlevinin ilk girdisi, yeni bir çubuk olan statik bir değişkenin başlatılmasıdır.

2018.01.08 00:00:00   PrevBars 1970.01.01 00:00:00
2018.01.08 00:00:00   New bar. PrevBars 2018.01.08 00:00:00
2018.01.08 00:00:30   PrevBars 2018.01.08 00:00:00
2018.01.08 00:00:59   PrevBars 2018.01.08 00:00:00
2018.01.08 00:01:00   PrevBars 2018.01.08 00:00:00
2018.01.08 00:01:00   New bar. PrevBars 2018.01.08 00:01:00
2018.01.08 00:01:30   PrevBars 2018.01.08 00:01:00
2018.01.08 00:02:00   PrevBars 2018.01.08 00:01:00
Dosyalar:
Test_EA.mq5  4 kb
 
Vladimir Karputov:

Değişkenler her zaman başlatılmalıdır. Bu yazılı olmayan bir yasadır. Bunu yerine getirmeyenler er ya da geç bulunması çok zor hataları yakalıyor :)


Statik değişken nasıl çalışır?


Uzmanlar sekmesine çıktı. OnTick() işlevinin ilk girdisi, yeni bir çubuk olan statik bir değişkenin başlatılmasıdır.

Tamam, anladım, kısa ve anlaşılır cevabınız için teşekkürler.