OOP (Nesneye Yönelik Programlama) hakkında sorular

 

Herkese selam!

Bence bu konuyu oluşturmanın zamanı geldi çünkü hiçbir yerde mantıklı bir OOP eğitimi yok, ancak öğrenmeye ihtiyacınız var ve öğrenmek istiyorsunuz.

Yeni başlayanlar için daha karmaşık ve anlaşılmaz kod örnekleriyle "yeni başlayanlardan gelen sorular" dizisini tıkamaya muhtemelen değmez.

Örneklerle birlikte MQL5'te Nesne Yönelimli Programlamanın Temelleri ve OOP adlı iki makaleyi okuduktan sonra: Hata ve Uyarı Kodlarını İşleme

Bir kod örneği yazdım ve detaylı olarak ele almak istiyorum ayrıca kodlarınızı yayınlayıp birlikte ayrıştırmanızı da öneririm.

Aşağıdakilerle ilgileniyor:

  • Kod doğru yazılmış mı?
  • Kod nasıl geliştirilir?
  • Kod nasıl hızlandırılır?
Açılış siparişleri için kodum:

 #property strict
input int Slip= 30 ;
input int Magic= 0 ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
class vr_trade
  {
private :
   int                openorders( string sy, int typ, double lot, double price);
   string             tip( int typ);
public :
   int                Buy( string sy, double lot);
   int                Sel( string sy, double lot);
   int                BuyLimit( string sy, double lot, double price);
   int                SelLimit( string sy, double lot, double price);
   int                BuyStop( string sy, double lot, double price);
   int                SelStop( string sy, double lot, double price);
                     vr_trade(){}
                    ~vr_trade(){}
  };
MqlTick st;
vr_trade trade;
//+------------------------------------------------------------------+
void OnTick ()
  {
trade.Buy( "EURUSD" , 0.01 ); // Пример открытия позиции возвращающей тиккет ордера.
  }
//+------------------------------------------------------------------+  
int vr_trade :: Buy( string sy, double lot)
{
return openorders(sy, 0 ,lot);
}
//+------------------------------------------------------------------+  
int vr_trade :: Sel( string sy, double lot)
{
return openorders(sy, 1 ,lot);
}
//+------------------------------------------------------------------+  
int vr_trade :: BuyLimit( string sy, double lot, double price)
{
return openorders(sy, 2 ,lot,price);
}
//+------------------------------------------------------------------+  
int vr_trade :: SelLimit( string sy, double lot, double price)
{
return openorders(sy, 3 ,lot,price);
}
//+------------------------------------------------------------------+  
int vr_trade :: BuyStop( string sy, double lot, double price)
{
return openorders(sy, 4 ,lot,price);
}
//+------------------------------------------------------------------+  
int vr_trade :: SelStop( string sy, double lot, double price)
{
return openorders(sy, 5 ,lot,price);
}
//+------------------------------------------------------------------+
int vr_trade :: openorders( string sy= "" , int typ= 0 , double lot= 0 , double price= 0 )
  {
   int tik=- 2 ;
   double di= NormalizeDouble ( 500 * _Point , _Digits );
   if (sy== "" ){sy= _Symbol ; Print ( "Установлен символ текущего графика " ,sy);}
   if (lot< MarketInfo (sy, MODE_MINLOT )){lot= MarketInfo (sy, MODE_MINLOT ); Print ( "Советник скорректировал лот " ,lot);}
   if (! SymbolInfoTick (sy,st)) Print ( "Не удалось прогрузить цены для символа " ,sy);
   if (price== 0 )
     {
       if (typ== 0 )price=st.ask;
       if (typ== 1 )price=st.bid;
       if (typ== 2 )price=st.ask-di;
       if (typ== 3 )price=st.bid+di;
       if (typ== 4 )price=st.ask+di;
       if (typ== 5 )price=st.bid-di;
     }
   if ( IsTradeAllowed ()== true )
     {
       RefreshRates ();
      tik= OrderSend (sy,typ,lot,price,Slip, 0 , 0 , "" ,Magic, 0 , clrRed );
       if (tik> 0 ) Print ( "Успешно открыт ордер Ticket " ,tik, " Typ " ,tip(typ), " Symbol " ,sy, " Lot " ,lot, " Price " ,price);
       else Print ( "Ошибка открытия ордера N" ,GetLastError());
     }
   else
       Print ( "Торговый поток занят" );
   return tik;
  }
//+------------------------------------------------------------------+
string vr_trade :: tip( int typ)
  {
   string txt= "" ;
   switch (typ)
     {
       case 0 : txt= "BUY" ;         break ;
       case 1 : txt= "SELL" ;       break ;
       case 2 : txt= "BUY LIMIT" ;   break ;
       case 3 : txt= "SELL LIMIT" ; break ;
       case 4 : txt= "BUY STOP" ;   break ;
       case 5 : txt= "SELL STOP" ;   break ;
       default : txt= "Ошибка типа ордера" ;
     }
   return txt;
  }
//+------------------------------------------------------------------+
 
Onlar. OOP sadece işlevleri bir sınıfa mı dolduruyor? Üretken, yakında muhtemelen forumda eğlenceli olacak.
 
VOLDEMAR :


  • Kod doğru yazılmış mı?
  • Kod nasıl geliştirilir?
  • Kod nasıl hızlandırılır?


Doğru ya da yanlış ne anlama geliyor? Hatasız çalışır, doğru demektir. Eğer işe yaramazsa, o zaman yanlıştır.

Geliştirmek. Bir şey ihtiyaçları karşılamadığında geliştirmek gerekir. Hangi ihtiyaçları karşılamaz, bu doğrultuda gelişir ve gelişir.

Neden hızlanmak? Sipariş, test cihazındaki toplam kene sayısına kıyasla nadiren, hatta nadiren açılmaz.

Ama felsefeydi.

Uygulama. Mükemmel bir standart varsa neden bu sınıfa ihtiyaç var? Doğru, MT5 için ama MT4 için mi bilmiyorum. Yok?

Kodunuzda bir dezavantaj var - zararı durdur ve kârı al.

 
TheXpert :
Onlar. OOP sadece işlevleri bir sınıfa mı dolduruyor? Üretken, yakında muhtemelen forumda eğlenceli olacak.

O kadar zekiysen doğru yaz o zaman konu alay için açılmamış...
 
VOLDEMAR :

O kadar zekiysen doğru yaz o zaman konu alay için açılmamış...


Arzularınıza, ihtiyaçlarınıza, programlama stilinize bağlıdır.

Tıpkı sizin yaptığınız gibi, bir sınıfı parametrelerle bir dizi fonksiyon olarak yapabilirsiniz.

Parametreleri ayarlamak için yöntemler oluşturabilir ve parametresiz bir yöntemi çağırarak doğrudan bir sipariş açabilirsiniz.

Daha kalın olduğunda daha iyidir, daha sonra farklı durumlarda daha uygulanabilir olacaktır. İdeal evrenselin ötesinde bir şey yapmaya çalışmak bir aptalın hayalidir, zihinsel çaba kaybıdır.

Daha. 20 kez aynı sorun çözülene kadar evrensel bir yaklaşımın yaratılmasını üstlenmemek daha iyidir.

 
Integer :


Doğru ya da yanlış ne anlama geliyor? Hatasız çalışır, doğru demektir. Eğer işe yaramazsa, o zaman yanlıştır.

Geliştirmek. Bir şey ihtiyaçları karşılamadığında geliştirmek gerekir. Hangi ihtiyaçları karşılamaz, bu doğrultuda gelişir ve gelişir.

Neden hızlanmak? Sipariş, test cihazındaki toplam kene sayısına kıyasla nadiren, hatta nadiren açılmaz.

Ama felsefeydi.

Uygulama. Mükemmel bir standart varsa neden bu sınıfa ihtiyaç var? Doğru, MT5 için ama MT4 için mi bilmiyorum. Yok?

Kodunuzda bir dezavantaj var - zararı durdur ve kârı al.


Ne tür hesaplar üzerinde çalışacağımızı bilmememiz oldukça olası olduğundan, kayıpları durdur ve siparişler için emir al ayrı ayrı belirlenir ....
 
Integer :

Parametreleri ayarlamak için yöntemler oluşturabilir ve parametresiz bir yöntemi çağırarak doğrudan bir sipariş açabilirsiniz.

Bunu benim örneğimle gösterebilir misin?

 

Kodlama isteksizliği. Genel olarak... Özel bölümde zararı durdur, kar al, lot değerleri için değişkenler tanımlayın. Bu değişkenler emir açma yöntemlerinde kullanılır, elbette lot olduğu gibidir ve fiyat seviyeleri bu değişkenler kullanılarak hesaplanır. Ancak bu değişkenlerin değerlere ayarlanması gerekir. Bu yüzden SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value) gibi yöntemlere ihtiyacımız var.

Çoğu Expert Advisor'da SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value) yöntemlerini internetten (bir kez) çağırmanız yeterli olacaktır. Parametresiz siparişleri açmak için çağrı yöntemleri , yürütme süresini önemli ölçüde hızlandırır.

 
VOLDEMAR :
O kadar zekiysen doğru yaz o zaman konu alay için açılmamış...
Gerekmediği yerde OOP'yi çekmek gerekli değildir. Yalnızca nesnelere sahip olmak, kodu daha hızlı, daha verimli vb. yapmaz.
 

Her zaman olduğu gibi, öğrenmek istedim, ama kesinlikle akıllı olmak dışında ve söyleyecek başka bir şeyi olmayanlar olacak ...

Ben ayrıştırmak için basit bir örnek yazdım, OOP ile daha doğru nasıl yazılır bilmiyorum... Bu sadece bir örnek, eğer böyle bir kodu doğru yazmayı ve OOP'yi biliyorsanız lütfen yazın ki ben ve diğerleri öğrenebilir...

 
VOLDEMAR :

Her zaman olduğu gibi, öğrenmek istedim, ama kesinlikle akıllı olmak dışında ve söyleyecek başka bir şeyi olmayanlar olacak ...

Ben ayrıştırmak için basit bir örnek yazdım, OOP ile daha doğru nasıl yazılır bilmiyorum... Bu sadece bir örnek, eğer böyle bir kodu doğru yazmayı ve OOP'yi biliyorsanız lütfen yazın ki ben ve diğerleri öğrenebilir...


Dikkat etme.

* * *

Ana ve en sık kullanılan yöntemlerin parametreleri geçmeden çağrılmasını sağlamak için çaba göstermeliyiz. Bu performansı artıracaktır. Ancak, rahatlığı azaltacaktır.