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

 
VOLDEMAR :

şimdi sınıfımı yeniden yaptım

 class vr_trade
  {
private :
   int                openorders( string sy, int typ, double lot, double price);
   string             tip( int typ);
   int                m_magic;
   int                m_slip;
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);
   void               MagSlip( int mag=- 1 , int slip= 0 );
   vr_MarketInfo    *Log;
                     vr_trade();
                    ~vr_trade();
  };
MqlTick st;
//+------------------------------------------------------------------+
vr_trade:: vr_trade()
  {
   Log= new vr_MarketInfo;
   MagSlip(- 1 , 0 );
  }
Ve vr_MarketInfo sınıfından kalıtım eklendi ... (yanılmış olabileceğimden şüpheleniyorum)

vr_MarketInfo sınıfı , bir sembol için Nokta, Rakamlar hakkında bilgi verir ve ayrıca çok sayıda hata olup olmadığını ve Excel'de ve çizelgede oturum açmak da dahil olmak üzere çalışmam gereken çok daha fazlasını kontrol eder.

Yukarıdaki yöntemi kullanırken, Primer.Primer.Primer() Expert Advisor'da çalışırken bir liste döndürülür.

Daha kısaltılmış bir şey yapmak istiyorum...

Miras nerede? Bir işaretçinin amacı nedir?

 
Zhunko :

Miras nerede? Bir işaretçinin amacı nedir?


MQL4+ hakkında bir eğitim yazın. İşbirliği yapın, uzmanlar ve yazın. 50 dolar bayanlar :)
 
Ama aslında, eğer gerçekten, o zaman ders kitabında ve belgelerde, işaretçilerin kullanımı veya yeni operatör hakkında hiçbir ayrıntı yoktur. Ya tahmin etmek ya da denizden havayı beklemek kalır. Veya birisi yanlışlıkla bir yerde bir şey söylediğinde. Bunun nasıl olduğuna tamamen şok oldum. Ben ve topik başlatıcı Vladimir dışında kimsenin bir şeye ihtiyacı yokmuş gibi görünmesi de ilginç. Her ne kadar hala birçoğunun bu konuya bağlı kalmadığına inanıyorum. Bu yüzden bu tür sorulara girmezler.
 
tara :

MQL4+ hakkında bir eğitim yazın. İşbirliği yapın, uzmanlar ve yazın. 50 dolar bayanlar :)

Her şey uzun zamandır yazılıyor.

MQL4 == C++ küçük kısıtlamalarla.

 
hoz :
Ama aslında, eğer gerçekten, o zaman ders kitabında ve belgelerde, işaretçilerin kullanımı veya yeni operatör hakkında hiçbir ayrıntı yoktur. Ya tahmin etmek ya da denizden havayı beklemek kalır. Veya birisi yanlışlıkla bir yerde bir şey söylediğinde. Bunun nasıl olduğuna tamamen şok oldum. Ben ve topik başlatıcı Vladimir dışında kimsenin bir şeye ihtiyacı yokmuş gibi görünmesi de ilginç. Her ne kadar hala birçoğunun bu konuya bağlı kalmadığına inanıyorum. Bu yüzden bu tür sorulara girmezler.


Hangi özelliklere ihtiyacınız var? Her yerde bir ilke vardır: her şey mümkün olduğunca basit yapılmalıdır. Sadece vahşi doğada olmak için vahşi doğaya tırmanmaya gerek yok. Bir problem basitçe çözülebiliyorsa, o zaman basitçe çözülmelidir.

Program nesnelerle dinamik çalışmayı gerektiriyorsa dinamik işaretçiler gereklidir: programın çalışması sırasında oluşturma, silme. Programda hangi nesnelerin ve hangi miktarda gerekli olacağı önceden biliniyorsa, dinamik işaretçilere gerek yoktur. Ancak çok sayıda nesne olduğu durum dışında, bu durumda onları yeni bir döngüde oluşturmak daha kolaydır.

 
VOLDEMAR :
Örneğin, teori çalışmak, bir örnek göstermek ve fonksiyonun bir daire, kare, yamuk veya üçgeni nasıl belirleyeceğini açıklamak benim için zor ???

İlk mesajda linkleri verilen makalelerden birinde böyle bir örnek var.

Sanal yöntemle temel sınıf. Nesilde, hesaplamaların gerçekte yapıldığı aynı adı taşıyan bir yöntem vardır.

 
VOLDEMAR :
Örneğin, teori çalışmak, bir örnek göstermek ve fonksiyonun bir daire, kare, yamuk veya üçgeni nasıl belirleyeceğini açıklamak benim için zor ???


Bağımsız çalışma için yamuk ve üçgeni bırakıyorum:

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CShape
  {
  
public :
   virtual string Type()      { return ( "" ); }
   virtual double Perimeter() { return (- 1 ); }
   virtual double Square()    { return (- 1 ); }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CCircle : public CShape
  {
   double          m_r;
  
public :
                  CCircle( double r):m_r(r) { }
   virtual string Type()      { return ( "circle" );     }
   virtual double Perimeter() { return ( 2 * M_PI *m_r);   }
   virtual double Square()    { return ( M_PI *m_r*m_r); }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CRectangle : public CShape
  {
   double          m_a;   
   double          m_b;
   
public :
                  CRectangle( double a, double b):m_a(a),m_b(b) { }
   virtual string Type()      { return ( "rectangle" );  }
   virtual double Perimeter() { return (m_a* 2 +m_b* 2 );  }
   virtual double Square()    { return (m_a*m_b);      }   
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
  {
   CShape *shape[ 10 ];
//--- создаём объекты
   for ( int n= 0 ;n< 10 ;n++)
     {
       if (( MathRand ()& 1 )== 1 )
         shape[n]= new CCircle( MathRand ()% 10 + 1 );
       else
         shape[n]= new CRectangle( MathRand ()% 10 + 1 , MathRand ()% 10 + 1 );
     }
//--- выводим данные по объектам
   for ( int n= 0 ;n< 10 ;n++)
       PrintFormat ( "%s p=%.3f s=%.3f" ,shape[n].Type(),shape[n].Perimeter(),shape[n].Square());
//--- удаляем объекты
   for ( int n= 0 ;n< 10 ;n++)
       delete shape[n];
  }
//+------------------------------------------------------------------+
 
Integer :

Dinamik işaretçiler iyi;ys, eğer program nesnelerle dinamik çalışmayı gerektiriyorsa: oluşturma, program işlemi sırasında silme. Programda hangi nesnelerin ve hangi miktarda gerekli olacağı önceden biliniyorsa, dinamik işaretçilere gerek yoktur. Ancak çok sayıda nesne olduğu durum dışında, bu durumda onları yeni bir döngüde oluşturmak daha kolaydır.

Aynen öyle! Ve bu durumda bile, işaretçiler olmadan yapabilirsiniz.
 
VOLDEMAR :
 #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 ENUM_ORDER_TYPE type)
  {
   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;
  }
//+------------------------------------------------------------------+


Sınıfınız %90 gereksiz. Ana işi sadece iki fonksiyon yapar, bunlar openorder ve ipucu Neden Sel, SelStop Satın Al vs. kullanasınız ki, aslında hepsi sadece Openorders diyorlar? Ayrıca, emir türü int olarak iletilir, yani korunmaz. int yerine, kendi numaralandırmanızı veya standart ENUM_ORDER_TYPE kullanmak daha iyidir. Ve genel olarak, "1", "2" vb. sihirli sayıları asla kullanmamak, yalnızca numaralandırmaları kullanmamak daha iyidir. Bu, siparişin sol değerinin fonksiyona gönderilmesini önleyecektir. Openorders işlevinin kendisi çok büyük. Anlaşma yapmak için bir blok ve koşulları kontrol etmek için bir blok olmak üzere iki bloktan oluştuğu açıktır. Her biri ayrı bir özel fonksiyon şeklinde olmalıdır.

Fena bir başlangıç değil, ama daha öğrenecek çok şey var. İpucu işlevi şu şekilde yeniden yazılabilir:

 string vr_trade::tip( ENUM_ORDER_TYPE orderType)
{
   return EnumToString (orderType);
}
 
Integer :


Hangi özelliklere ihtiyacınız var? Her yerde bir ilke vardır: her şey mümkün olduğunca basit yapılmalıdır. Sadece vahşi doğada olmak için vahşi doğaya tırmanmaya gerek yok. Bir problem basitçe çözülebiliyorsa, o zaman basitçe çözülmelidir.

Program nesnelerle dinamik çalışmayı gerektiriyorsa dinamik işaretçiler gereklidir: programın çalışması sırasında oluşturma, silme. Programda hangi nesnelerin ve hangi miktarda gerekli olacağı önceden biliniyorsa, dinamik işaretçilere gerek yoktur. Ancak çok sayıda nesne olduğu durum dışında, bu durumda onları yeni bir döngüde oluşturmak daha kolaydır.

İşaretçiler, dinamik tür tanımlaması gerektiren karmaşık nesne dönüştürmeleri için vazgeçilmezdir.