MQL5'te birlikte öğrenme ve yazma - sayfa 35

 

Sınıf dışı bir üye işlevi, herhangi bir sınıfın üyesi olmayan başka bir işleve bir referans (adres) argümanı olarak iletip iletemeyeceğimi kim bilebilir?

Veya, herhangi bir sınıfın üyesi olmayan başka bir işleve bir referans (adres) argümanı olarak bir sınıf üyesi işlevi iletebilir miyim?

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 
victorg :

Sınıf dışı bir üye işlevi, herhangi bir sınıfın üyesi olmayan başka bir işleve bir referans (adres) argümanı olarak iletip iletemeyeceğimi kim bilebilir?

Veya, herhangi bir sınıfın üyesi olmayan başka bir işleve bir referans (adres) argümanı olarak bir sınıf üyesi işlevi iletebilir miyim?

Numara. Numara.

Yapamazsın. MQL5'te "fonksiyon adresi" veya "fonksiyon referansı" kavramı yoktur.

 

Teşekkür ederim!

Başka bir soru.

mql 5 koduna sahip iki dosya vardır.İlk dosya ana dosyadır - bir gösterge veya bir komut dosyası. İkinci mqh dosyası .

// f_01.mqh
double extfunc( int a);
//-------------------------------------
double example( void )
  {
   double a;
  a=extfunc( 35 );
   return (a);
  }
//-------------------------------------
İkinci mqh dosyası esas olarak en başta bağlanır. Ana dosyanın derlenmesi hatasız veya uyarısız devam eder. Ancak mqh dosyasını ayrı ayrı derlemeye çalıştığımızda - ' işlevini elde ederiz. mutlak sahip olmak a vücut '. Soru, derleyiciye işlevde her şeyin yolunda olduğunu, sadece gövdesinin başka bir dosyada olduğunu nasıl söyleyeceğidir?
Документация по MQL5: Файловые операции / FileMove
Документация по MQL5: Файловые операции / FileMove
  • www.mql5.com
Файловые операции / FileMove - Документация по MQL5
 
victorg :

İkinci mqh dosyası esas olarak en başta bağlanır. Ana dosyanın derlenmesi hatasız veya uyarısız devam eder. Ancak mqh dosyasını ayrı ayrı derlemeye çalıştığımızda - ' işlevini elde ederiz. mutlak sahip olmak a vücut '. Soru, derleyiciye işlevde her şeyin yolunda olduğunu, sadece gövdesinin başka bir dosyada olduğunu nasıl söyleyeceğidir?
Mümkün değil. Geçim için yırtmayın, kodu okurken anlamayı kolaylaştırmaz.
 
Yedelkin :

Belki fazla düşünüyorum ama başka bir sorum var. Bir piyasa emri verme talebi göndermeden önce (pozisyon açmak için), işlem biletini sıfırlarım, yani. Sonuç.deal=0 yapıyorum. Sunucunun MqlTradeResult yanıt yapısında sıfır ticaret bileti döndürmesi mümkün mü, ancak aynı zamanda ticaret biraz daha sonra tamamlanacak ve pozisyon açılacak mı? Yoksa sıfır ticaret biletinin sunucu tarafından iade edilmesi, bu isteğe bağlı olarak pozisyonun açılamadığını ve gelecekte açılmayacağını garanti eder mi?

Tamam, bir cevap olmamasından ve bu satırdan dolayı

yapı MqlTradeResult
{
uzun anlaşma; // Anlaşma bileti, tamamlandıysa
};

Bu talebe dayanarak, sunucu tarafından sıfır anlaşma biletinin iade edilmesinin, pozisyonun açılamadığı ve gelecekte açılmayacağı anlamına geleceği sonucuna varıyorum.

 

Forumun yapısını tam olarak anlamadım, yoksa lütfen beni doğru yöne yönlendirin.

çünkü Uzman bir uzman değilim, ancak programlamaya ilgi duyuyorum ve öğrenme sürecindeki kendi eğilimlerime dayanarak, mevcut kodu analiz ederek anlamaya çalışıyorum.

basitlik için özel bir MA kod parçası aldım ve içinde neler olduğunu anlamaya çalışıyorum (yorumlara yansıdı)

Genel olarak, zor değilse, lütfen kod hakkında yorum yapın, her komuttan sonra ne olduğunu anlamak istiyorum. Teşekkür ederim.

void CalculateSimpleMA( int oranlar_toplam, int önceki_hesaplanmış, int başlangıç, const double &fiyat[]) // sıralanmış &fiyat[]

  {
   int i,limit;
//--- first calculation or number of bars was changed
   if (prev_calculated== 0 ) // first calculation
     {
      limit=InpMAPeriod+begin;                                                //почему переменная begin=0 ???
       //--- set empty value for first limit bars
       for (i= 0 ;i<limit- 1 ;i++) ExtLineBuffer[i]= 0.0 ;                             //здесь инициализируются значения индикатора на барах с индексами от 0 до limit-1 ??? крайне правых на графике???
       //--- calculate first visible value
       double firstValue= 0 ;                                                     //при инициализации переменной имеющей тип double не обязательно использовать значения типа double???
       for (i=begin;i<limit;i++)
         firstValue+=price[i];                                                //разобрался, здесь идет накопление переданной цены
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit- 1 ]=firstValue;                                      
     }
   else limit=prev_calculated- 1 ;                                              //в результате чего prev_calcutated не должно равняться 0, если индикатор поместили на оффлайн график?
//--- main loop
   for (i=limit;i<rates_total && ! IsStopped ();i++)                              //цикл для индикатора на баре с индексами от limit до последнего на графике
      ExtLineBuffer[i]=ExtLineBuffer[i- 1 ]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
//---
  }

Çıktıda görüntüleniyor ve ExtLineBuffer'daki değerin limit -1 indeksinden Rate_total-1 indeksine atandığını ve grafikte göstergenin tüm alana çizildiğini görüyorum, hmm, o zaman değer burada atanan değerdir. 1'den limit- 1'e kadar olan aralıkta gösterge tamponu ??? ?

Документация по MQL5: Основы языка / Операции и выражения / Операции присваивания
Документация по MQL5: Основы языка / Операции и выражения / Операции присваивания
  • www.mql5.com
Основы языка / Операции и выражения / Операции присваивания - Документация по MQL5
 
Profi_R :

Forumun yapısını tam olarak anlamadım, yoksa lütfen beni doğru yöne yönlendirin.

çünkü Uzman bir uzman değilim, ancak programlamaya ilgi duyuyorum ve öğrenme sürecindeki kendi eğilimlerime dayanarak, mevcut kodu analiz ederek anlamaya çalışıyorum.

basitlik için özel bir MA kod parçası aldım ve içinde neler olduğunu anlamaya çalışıyorum (yorumlara yansıdı)

Genel olarak, zor değilse, lütfen kod hakkında yorum yapın, her komuttan sonra ne olduğunu anlamak istiyorum. Teşekkür ederim.

Ayrıntılı olarak yorum yapmayacağım, belki de algınızın ana hatasını düzeltmeniz yeterli olacaktır ve sonra bulmacayı kendiniz bir araya getireceksiniz - bu çok daha kullanışlı.

Dolayısıyla, kafa karışıklığınızın temeli, mql5'teki (özellikle bu göstergedeki) birçok göstergenin, gösterge arabelleklerinin indekslenmesini tersine çevirmeden yazılmasıdır, yani. AsSeries=false olduğunda.

Bu, geçmişteki en eski çubuğun indeksinin = 0 ve "en taze" olanın = RatesTotal-1 olduğu anlamına gelir.

// Bir şeyi temizlemek mi??..

Bu yaklaşımın anlamı, ateş hızında bir miktar kazançtır, çünkü. arabelleğe erişirken indeksleme [gizli] yeniden hesaplama gerektirmez ("donanım" olarak kalır)

// Kafa karışıklığınız muhtemelen gösterge arabellekleri için indekslemenin DAİMA tarihin sonundan başlangıca kadar gerçekleştiği inancından (hatalı) kaynaklanmıştır. Bu, mql4'te her zaman doğrudur, ancak mql5'te mutlaka olması gerekmez .

// Burada varsayılan indeksleme yönü her zaman geçmişin başından sonuna kadardır, indekslemeyi tersine çevirmek için SetAsSeries(...) fonksiyonunu açıkça kullanmanız gerekir.

// Ayrıca, yardımda geliştiriciler genellikle varsayılanlara güvenmeyi önermezler (değişmeleri durumunda) ve indeksleme yönünü ayarlamak için DAİMA SetAsSeries() işlevini kullanırlar .

void CalculateSimpleMA( int oranlar_toplam, int önceki_hesaplanmış, int başlangıç, const double &fiyat[]) // sıralanmış &fiyat[]

Çıktıda görüntüleniyor ve ExtLineBuffer'daki değerin limit -1 indeksinden Rate_total-1 indeksine atandığını ve grafikte göstergenin tüm alana çizildiğini görüyorum, hmm, o zaman değer burada atanan değerdir. 1'den limit- 1'e kadar olan aralıkta gösterge tamponu ??? ?

Yukarıdakilerin ışığında kendin anlayacağını düşünüyorum ama her ihtimale karşı yarın şubeye bakacağım.
 
MetaDriver : ..

Cevap verdiğiniz için teşekkürler)

Ara veriler değişkenlerde yazdırıldıktan sonra ortadan kaldırılan şüpheler olsa da, dizilerdeki yönlülük sırasını ve yardımda yönlülüğü açıkça belirtmek için önerileri okudum.

Şimdiye kadar sadece yön belirlendi, yani. başlatma ile ilgili yorum hatalıydı, gösterge arabellek değerleri grafiğin sol tarafında belirtilen aralıkta başlatıldı.

hakkında sorular var

1. değişken start, olay işleyiciye iletilen değerinden terminal sorumlu mu? değeri nereden geliyor?

2. double türünde bir değişken int türünde bir değer olabilir mi?

3. görünüşe göre, terminal aynı zamanda prev_hesaplanan değişkenin değerinden de sorumludur.

4. net değil mi? göstergenin 0'dan limit-1'e kadar olan aralıkta hesaplandığı yer

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Profi_R :

hakkında sorular var

1. değişken start, olay işleyiciye iletilen değerinden terminal sorumlu mu? değeri nereden geliyor?

3. görünüşe göre, terminal aynı zamanda prev_hesaplanan değişkenin değerinden de sorumludur.

Büyük olasılıkla, tartışılan işlev, OnCalculate() işlevini çağırmanın ilk biçimi için yazılmıştır. El Kitabına bakın.

Profi_R :

hakkında sorular var

2. double türünde bir değişken int türünde bir değer olabilir mi?

Evet yapabilirsin. Örtük tip döküm ile ilgili bölüme bakın. Derleyici, örtük döküm kullanıldığında genellikle veri kaybı potansiyeli hakkında bir uyarı verir.

Profi_R :

hakkında sorular var

4. net değil mi? göstergenin 0'dan limit-1'e kadar olan aralıkta hesaplandığı yer

Bu satırlar sorunuza cevap veriyor mu:

 //--- set empty value for first limit bars
       for (i= 0 ;i<limit- 1 ;i++) ExtLineBuffer[i]= 0.0 ;                            
//--- calculate first visible value
... и далее по коду
?
 
Profi_R :

Cevap verdiğiniz için teşekkürler)

Ara veriler değişkenlerde yazdırıldıktan sonra ortadan kaldırılan şüpheler olsa da, dizilerdeki yönlülük sırasını ve yardımda yönlülüğü açıkça belirtmek için önerileri okudum.

Şimdiye kadar sadece yön belirlendi, yani. başlatma ile ilgili yorum hatalıydı, gösterge arabelleğinin değerleri grafiğin sol tarafında belirtilen aralıkta başlatıldı.

TAMAM.

hakkında sorular var

1. değişken start, olay işleyicisine iletilen değerinden terminal sorumlu mu?

Evet, göstergeye aktarılmasından terminal sorumludur.


Burada bu parametrenin amacına dikkat etmek önemlidir. Bu parametre, göstergeye, giriş serisinin kaç başlangıç tarihsel değerinin yanlış olduğunu ve hesaplamalarda kullanılmaması gerektiğini yoksayılacağını (atlayacağını) söyler. Böyle bir yanlışlık nereden gelebilir, kökeni nedir? Fiyat verileriyle değil, diğer göstergeler tarafından sağlanan verilerle hesaplanan gösterge oluşturma olasılığı ile bağlantılıdır. MT5'te gösterge girişi olarak başka bir göstergeden veri almanızı sağlayan üç mekanizma vardır.

İlk yol. Adımların sırası:

1. iIndicator(...) serisinin işlevlerinden birini kullanarak bir giriş göstergesi tutamacı oluşturun. veya IndicatorCreate(...) işlevi.

2. Gerektiğinde CopyBuffer(...) işlevini kullanarak değerlerini tamponlarından alın.

İkinci yol. İlkinin bir uzantısıdır. İlk yöntemle, girdi göstergesinin girişine bir fiyat dizisi değil, bir gösterge dizisi sunulması gerekiyorsa gereklidir. Onlar. bu durumda giriş göstergesi (2) tarafından hesaplanan değerleri başka bir göstergenin (1) verilerini kendi girişi olarak alarak programa almayı amaçlıyoruz. Onlar. göstergeden bir gösterge zinciri oluşturun.

Adımların sırası:

1. iIndicator(...) serisinin işlevlerinden birini kullanarak ilk (1) giriş göstergesinin tutamağını oluşturun. veya IndicatorCreate(...) işlevi.

2. İkinci (2) göstergenin tutamağını aynı şekilde oluşturun, ancak bunu son parametre olarak belirtin ( application_price ) ilk (1) tutamacı.

3. Gerektiğinde CopyBuffer(...) işlevini kullanarak değerlerini tamponlarından alın.

Üçüncü yol. Ayrıca göstergeden gösterge zincirleri oluştururken de kullanılır. Ancak önceki sürümden farklı olarak, veri kaynağı (giriş satırı) derlemeden önce sabitlenmez, ancak kullanıcı tarafından doğrudan terminalde ayarlanabilir. Göstergenin başlatıldığı anda uygun parametreyi belirleyerek.

Size bu mekanizmaları bağımsız olarak anlama fırsatı veriyorum. Önceki metinde, size bu konuda yardımcı olacak belgelerdeki önemli yerlere doğrudan birkaç doğrudan bağlantı belirttim.

Sadece OnCalculate() çağrısının kısa formunun parametreleri üzerinde duralım. Böyle:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])

Amaçları iyi belgelenmiştir. Burada sadece onların bu işleve geçişlerinin gerekliliğini (gerekçesini) açıklamak istiyorum. İlk ve son parametre ile umarım her şey yeterince açıktır. Hesaplamalar için, girdi verileriyle (fiyat[]) bir arabelleğe sahip olmamız ve mevcut uzunluğunu bilmemiz gerekir. (tırnaklar terminale ulaştıkça uzunluğunun arttığını unutmayın).

Ancak ek olarak, girdi serisinin en başından itibaren verilerinin kesinlikle doğru olup olmadığını veya (olası veya garantili) yanlışlıkları nedeniyle ilk değerlerin göz ardı edilmesi gerekip gerekmediğini de bilmemiz gerekir. Girdi verileri başka bir göstergenin çıktısı olduğunda çoğu durumda yanlışlığın ortaya çıkması garanti edilir . Peki, başka nasıl? Herhangi bir çubuktaki değeri hesaplamak için çoğu gösterge, bir miktar geçmiş veri kullanmalıdır. Ve "zamanın başlangıcında" nereye gidiyorlar? Orada değiller ve bu nedenle, başlangıç tarihsel çubuğundan değil, biraz sonra (sağa), çubuktan, daha önce (sola) zaten gerekli olan çıktı değerleri üretmeye başlamak zorunda kalıyorlar. tarihsel veri miktarı.

Şimdi yukarıda çizdiğim detaylar sayesinde sorunun cevabı

değeri nereden geliyor? // start parametresinden bahsediyoruz

ve tam olarak anlaşılmalıdır. Cevap veriyorum: Bu parametrenin fonksiyona terminal tarafından iletilmesine rağmen, içeriği giriş göstergesi tarafından halledilmelidir ! Terminalin kendisi yalnızca fiyat girdi serisini kontrol edebilir (bu durumda, başlangıç değeri 0'a eşit olacaktır ve bu doğru değerdir). Bu nedenle, herhangi bir gösterge yazarken (belki de tamamen deneysel olanlar hariç), terminale çıkış tamponunda doğru verinin başlangıcının indeksini söylemesine dikkat etmelisiniz . Bu temiz? Aksi takdirde bu göstergenin "torunları" çok tatsız yanlış verileri yiyebilir ve hatta bazı durumlarda çok zehirlenebilir... :) Şimdi bunun nasıl yapıldığından bahsedelim. Bunun için, PLOT_DRAW_BEGIN özellik tanımlayıcısını belirten PlotIndexSetInteger() işlevi kullanılır. Önemli! Oluşturulan gösterge özelliğinin %100 doğruluğu için, kendinizi OnInit() içinde PlotIndexSetInteger(...,PLOT_DRAW_BEGIN,...) için tek bir çağrıyla sınırlamanız mümkün değildir! Nedenmiş? Ancak göstergemizin kendisi de, tarihte zaten bir başlangıç girintisi olan başka bir göstergenin verileri üzerinde oluşturulabilir.! Onlar. giriş geçmişinde sıfırdan farklı bir başlangıç değerimiz var ve bunu OnInit()'te almanın bir yolu yok. Yani böyle bir şey yapmalıyız

  PlotIndexSetInteger(MySymbol,PLOT_DRAW_BEGIN,MyBeginPeriod-1+begin);

aramak. Ve bunu (tercihen bir kez) OnCalculate() içinde yapmak zorunda kalıyoruz, çünkü OnInit'teki start değeri bilinmiyor.

Bu da bize ön (çok anlamlı olmasa da) bir çağrı yapma hakkı bırakıyor tabii ki?

  PlotIndexSetInteger(MySymbol,PLOT_DRAW_BEGIN,MyBeginPeriod);

OnInit() içinde.

Bu, çalışma için numunenizi aldığınız göstergede (Custom Moving Average.mq5) tam olarak yapılan şeydir.

2. double türünde bir değişken int türünde bir değer olabilir mi?

Evet, double türünde bir değişken, sabit olarak ayarlanmışsa, int türünde bir değerle oldukça zahmetsizce başlatılabilir. // sizin örneğinizde olduğu gibi

3. görünüşe göre, terminal aynı zamanda prev_hesaplanan değişkenin değerinden de sorumludur.

Burada bir incelik var. Çoğu durumda, bu değer, önceki çağrıda OnCalculate() işlevi tarafından döndürülen değere eşit olacaktır. Yani aslında sizin elinizde.. :) Öte yandan ilk aramada sıfır değeri olacak. Ayrıca , terminal istediği zaman değer (terminal tarafından) sıfırlanabilir . :) Ve bunu, tarihin sonundan itibaren bir çubuktan daha fazla bir mesafede giriş verilerini değiştirme olasılığına dair en ufak bir şüpheyle istiyor. Örneğin, bu, aracı teklifleri ayarlandığında, kesintilerden sonra bağlantı yeniden kurulduğunda, önceki (giriş) göstergesi yeniden başlatıldığında vb. gerçekleşebilir. vb.

Bu durumda bu değerler doğru bir şekilde hesaplanamaz (hesaplanacak yeterli geçmiş yoktur). Bu nedenle, aptalca sıfır değerleri atanırlar.

// Onlara uygun girdileri vermeyi tercih ederim ama bu pek bir fark yaratmıyor.