Beta derleme 530'da dizi yeniden boyutlandırma hatası - sayfa 6

 
ubzen :
***Not: (Bunu unutmak istemiyorum). Elbette çoğumuz kullandığımız kodların içinde ne olduğunu bilmemekten hoşlanmıyoruz. Ya da bir başkasından gelen kodları anlamaya çalışmakla kendimizi tüketiyoruz, yoksa muhtemelen kullanmazdık. Ancak, mql4'teki Yerel işlevlerin çoğu (örnek OrderSend() ) bizim bakış açımızdan Nesnelerdir. Kodlarını görmüyoruz, ancak kabul ediyoruz. Diğer insanların kitaplıklarının bu kabulünün, büyük projeler üzerinde çalışan bir profesyonel_oop_programcının kabul etmesi ve üzerine inşa etmesi gereken bir şey olduğuna inanıyorum. Aksi takdirde, tekerleği yeniden yaratmakta mahsur kalırsınız.
Evet, bu şekilde ifade ettiğinizde, mql4'te hepimiz tekerleği her zaman yeniden icat ediyoruz.
 
ubzen :

Bir program akışını tanımladığınıza inanıyorum. OOP'nin arkasındaki big_idea'nın bu olduğunu sanmıyorum. (imo) OOP aşağıdaki sorunları çözmeye çalışır. Ben bir OOP noob'um, ancak dünya görüşümü bunun üzerine oluşturuyorum.

1) Fonksiyonlarınız global_variables'dan bağımsız mı? other_words'de, işlevleriniz tek başına nesneler mi? kapsülleme

2) İşleviniz local_variable_names gibi ayrıntıları gizliyor mu? Ekrandaki kodların hacmini basitleştiriyor mu? Soyutlama

3) Değişiklikler için kendisinin kopyalarını oluşturma yeteneği var mı? Kendi veri türlerinizi oluşturma yeteneği gibi mi? Miras.

4) Anında değişme özelliği var mı? Örnek: İşlev, tamsayı_dizinin yanı sıra çift_dizileri de işleyebilir mi? polimorfizm.

OOP'nin ea oluşturmada yardımcı olabileceği yollar, bir ea_builder'ın programcı olmayan bir uzman_advisor oluşturmasına nasıl yardımcı olduğuna benzer. En sevdiğiniz Order_Accounting_Function -> Data_Function -> Event Tracking Function -> Volume Defining Function -> Trading Criteria Defining Function -> Trade Functions -> Hata İşleme Fonksiyonunuzu alın. Ve patlama, bir Expert_Advisor'ınız var. Yıllar içinde geliştirdiğiniz tüm İşlem Kriterlerini Tanımlayan İşleviniz kolayca içeri veya dışarı değiştirilebilir.

Örnek olarak ben, eğer uzman danışmanımı değiştirmek isterseniz, global değişkenlerimin nerede uygulandığını ve buna başka hangi işlevin bağlı olduğunu (durum veya durum dizilerinizde olduğu gibi) incelemeniz gerekir. OOP onu as_simple_as Accounting(Option_3) yapar; Görüntüle(Seçenek_1); Altyazı(Seçenek_5); TradingSys(Option_7); HacimBoyutu(Seçenek2); OrderType(Option_2) ve tüm uzman bu.

Bu, bir başkasının kitaplık setinizi kullanmasını kolaylaştırır ve genellikle bir başkası için işe yarayan şey, gelecekte bir süre sizin için de işe yarar. Başka bir şey değilse, bir montaj hattındaki bağımsız nesneleri düşünün :)

Bunu kısa ve öz bir şekilde anlattığınız için teşekkürler, bunu daha önce araştırdım ve genellikle her şey hakkında o kadar uzun soluklu bir romana giriyorlar ki, hiçbir zaman asıl meseleyi anlamadım.
 
SDC : Bunu bu kadar kısa ve öz bir şekilde anlattığınız için teşekkürler, bunu daha önce araştırmıştım ve genellikle her şey hakkında o kadar uzun soluklu bir romana giriyorlar ki, hiçbir zaman asıl meseleyi anlayamadım.
Rica ederim.
 
RaptorUK : Bir fark var. . . Sipariş vermek istersem OrderSend() kullanmaktan başka seçeneğim yok. . . Başka birinin kitaplığını kullanma ya da kullanmama seçeneğim var. . . Kaynağa saygı duyulsa bile, kullanmaya çalışmadan önce onu anlamaya çalışırım, bazı hatalar bu şekilde bulunur ve düzeltilir: https://www.mql5.com/en/forum/133792/page3 " Ve benim düzeltmem RaptorUK's yorum : "
Burada tartışma yok. OOP, kodlardaki hata sorununu çözmez ve sizi başka birinin kitaplığını kullanmaya zorlamaz.
 
RaptorUK :
mql5 ile biraz uğraştım ve yazdığım kodda herhangi bir OOP kullanmama gerek kalmadı

Sınıflar ve OOP, MQL5'te çok fazla isteğe bağlı bir eklentidir. Platform çerçevesi bunları kendisi kullanmaz. Örneğin, platformun Order nesnelerinin bir listesini içeren Orders koleksiyonu gibi bir şeye sahip olmasını ve aşağıdaki gibi bir kod yazmanıza izin vermesini bekleyebilirsiniz:

 for ( int i = 0 ; i < Orders.length; i++) {
  Order O = Orders.getByIndex(i);
   if (O.symbol == "EURUSD" && O.magicNumber = 12345 ) {
  }
}

Ama durum böyle değil. Bunun yerine, bunu yapma şekliniz temelde MQL4 ve MQL5 arasında aynıdır:

 for ( int i = 0 ; i < OrdersTotal (); i++) {
   if ( OrderGetTicket (i)) {
     if ( OrderGetString ( ORDER_SYMBOL ) == "EURUSD" && OrderGetInteger ( ORDER_MAGIC ) == 12345 ) {
    }
  }
}

(Yazdığınız herhangi bir EA'nın, bildiriminde sanal OnTick ve OnInit işlevleri gibi şeylere sahip bir ExpertAdvisor sınıfından türetilen bir sınıf olmasını da bekleyebilirsiniz. Ancak durum böyle değil. MQL5 çerçevesi temelde OOP dışı kalır, ancak yararlı olduğu herhangi bir görev için OOP'yi kendiniz kullanma seçeneği ile.)

Sonuç olarak, string OrderSymbol() {return OrderGetString(ORDER_SYMBOL);} gibi bir dizi yardımcı işlev aracılığıyla MQL5'te MQL4 kodunu kullanmaya devam edebilirsiniz. Bunun bozulduğu tek alan zaman serisi erişimidir, çünkü bu MQL5'te çok farklı şekilde düzenlenmiştir. https://www.mql5.com/en/articles/81 adresindeki iOpenMQL4() gibi bir işlev çalışır, ancak tekrarlanan kullanım için korkunç derecede yavaş ve verimsizdir.

 

(Hâlâ umursayan varsa, bu ileti dizisini başlatan hata raporu hala derleme 535'te geçerlidir. https://forum.mql4.com/56885/page20#861740 da geçerlidir, ancak MetaQuotes'un düzeltme girişimi başarısız olmuş gibi görünüyor Şu.)

 
Geç cevap verdiğim için kusura bakmayın ama bazen uyumak ve çalışmak zorunda kalıyorum.

RaptorUK ile aynı fikirdeyim, mql5.com'daki OOP hakkındaki belgeler en azından kusurlu. Ama ne yazık ki oop hakkında iyi bir referans bilmiyorum. Okuduklarım ya çok soyut ya da çok basit, armut ve elmayı nesnelere ve meyveyi sınıf olarak alıyorum.

OOP programlama yalnızca büyük projeniz varsa kullanışlıdır. Büyük bir proje mutlaka 1 EA değildir, projeniz göstergeli bir dizi EA inşa etmek olabilir, vb... başka bir programda kolayca yeniden kullanılabilir. Ne yazık ki şimdi bununla derinlemesine gitmek için zamanım yok. Ama planımda bununla ilgili bazı makaleler yazmak var.

Büyük bir projenin bir örneği, Metaquotes tarafından oluşturulan MQL5 Sihirbazıdır. Bazı kullanıcı girdileriyle 5 dakikada bir EA oluşturmanıza olanak tanır. Bir EA oluşturmak için gerekli tüm unsurları sağlayan mql5 Standard Libray'e dayanmaktadır. Aynı sihirbaz muhtemelen prosedürel bir şekilde yapılabilir, ancak bence çok daha zor olurdu. Ve sonra bu kodu korumanız gerekir. Ancak bu Standart kitaplık, iyi belgelenmediği ve tanımlanmadığı için anlaşılması zordur. Konuda mevcut olan her şeyi merkezileştirmek için bir konu oluşturdum (mql5 sihirbazı oop değil).

 
ubzen :

Bir program akışını tanımladığınıza inanıyorum. OOP'nin arkasındaki big_idea'nın bu olduğunu sanmıyorum. (imo) OOP aşağıdaki sorunları çözmeye çalışır. Ben bir OOP noob'um, ancak dünya görüşümü bunun üzerine oluşturuyorum.

1) Fonksiyonlarınız global_variables'dan bağımsız mı? other_words'de, işlevleriniz tek başına nesneler mi? kapsülleme

2) İşleviniz local_variable_names gibi ayrıntıları gizliyor mu? Ekrandaki kodların hacmini basitleştiriyor mu? Soyutlama

3) Değişiklikler için kendisinin kopyalarını oluşturma yeteneğine sahip mi? Kendi veri türlerinizi oluşturma yeteneği gibi mi? Miras.

4) Anında değişme özelliği var mı? Örnek: İşlev, tamsayı_dizinin yanı sıra çift_dizileri de işleyebilir mi? polimorfizm.

OOP'nin ea oluşturmada yardımcı olabileceği yollar, bir ea_builder'ın programcı olmayan bir uzman_advisor oluşturmasına nasıl yardımcı olduğuna benzer. En sevdiğiniz Order_Accounting_Function -> Data_Function -> Event Tracking Function -> Volume Defining Function -> Trading Criteria Defining Function -> Trade Functions -> Hata İşleme Fonksiyonunuzu alın. Ve patlama, bir Expert_Advisor'ınız var. Yıllar içinde geliştirdiğiniz tüm İşlem Kriterlerini Tanımlayan İşleviniz kolayca içeri veya dışarı değiştirilebilir.

Örnek olarak ben, eğer uzman danışmanımı değiştirmek isterseniz, global değişkenlerimin nerede uygulandığını ve buna başka hangi işlevin bağlı olduğunu (durum veya durum dizilerinizde olduğu gibi) incelemeniz gerekir. OOP onu as_simple_as Accounting(Option_3) yapar; Görüntüle(Seçenek_1); Altyazı(Seçenek_5); TradingSys(Option_7); HacimBoyutu(Seçenek2); OrderType(Option_2) ve tüm uzman bu.

Bu, bir başkasının kitaplık setinizi kullanmasını kolaylaştırır ve genellikle bir başkası için işe yarayan şey, gelecekte bir süre sizin için de işe yarar. Başka bir şey değilse, bir montaj hattındaki bağımsız nesneleri düşünün :)

Polimorfizm dışında iyi bir genel bakış. "İşlev integer_array ve double_arrays'i işleyebilir mi" dediğinizde, bu polimorfizmle ilgili değil, işlevin aşırı yüklenmesidir . Ayrıca mql5'te operatör aşırı yüklemesine sahip olabilirsiniz (yanlış bir şekilde aşırı işlem yüklemesine çevrilmiştir). OOP ve polimorfizm bundan daha fazlasıdır. Detaylandırmaya vaktim yok (özellikle İngilizce), bu yüzden mql5 polimorfizm girişini okumanızı öneririm.
 
cyclops993 :

Sınıflar ve OOP, MQL5'te çok fazla isteğe bağlı bir eklentidir. Platform çerçevesi bunları kendisi kullanmaz. Örneğin, platformun Order nesnelerinin bir listesini içeren Orders koleksiyonu gibi bir şeye sahip olmasını ve aşağıdaki gibi bir kod yazmanıza izin vermesini bekleyebilirsiniz:

Ama durum böyle değil. Bunun yerine, bunu yapma şekliniz temelde MQL4 ve MQL5 arasında aynıdır:

(Yazdığınız herhangi bir EA'nın, bildiriminde sanal OnTick ve OnInit işlevleri gibi şeylere sahip bir ExpertAdvisor sınıfından türetilen bir sınıf olmasını da bekleyebilirsiniz. Ancak durum böyle değil. MQL5 çerçevesi temelde OOP dışı kalır, ancak yararlı olduğu herhangi bir görev için OOP'yi kendiniz kullanma seçeneği ile.)

Sonuç olarak, string OrderSymbol() {return OrderGetString(ORDER_SYMBOL);} gibi bir dizi yardımcı işlev aracılığıyla MQL5'te MQL4 kodunu kullanmaya devam edebilirsiniz. Bunun bozulduğu tek alan zaman serisi erişimidir, çünkü bu MQL5'te çok farklı şekilde düzenlenmiştir. https://www.mql5.com/en/articles/81 adresindeki iOpenMQL4() gibi bir işlev çalışır, ancak tekrarlanan kullanım için korkunç derecede yavaş ve verimsizdir.

Katılıyorum. Mql5'in mql4'ten daha fazla "düşük" düzey işlev sağladığını eklerdim. Örneğin, birçok insan iBarShift()'in mql5'te bulunmamasından şikayet ediyor. Ancak mql5 daha ayrıntılı işlevler sağlar, böylece kendi iBarShift()'inizi oluşturabilirsiniz ve ayrıca herhangi bir projede kolayca yeniden kullanabilmeniz için oop sağlar (elbette yeniden kullanmak için oop zorunlu değildir). İngilizcem henüz biraz ilkel olduğu için açıklamamın net olup olmadığından emin değilim.
 
Ovo :

OOP şu anda oldukça yaygın ve MQL'ye daha fazla gerçek kodlayıcı çekecek. Ama not defteri benzeri editör, çoğunu itecek, eminim.

mql5 meta düzenleyicisini (veya aynı olan yeni mql4 düzenleyicisini) denediniz mi? Pek çok iyileştirme var.