Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
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?
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ı .
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[]
Çı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 ??? ?
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 ??? ?
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
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.
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.
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 ... и далее по коду
?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ı.
hakkında sorular var
1. değişken start, olay işleyicisine iletilen değerinden terminal sorumlu mu?
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.
4. net değil mi? göstergenin 0'dan limit-1'e kadar olan aralıkta hesaplandığı yer
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.