Questions sur la POO (programmation orientée objet)

 

Bonjour à tous !

Je pense qu'il est temps de créer ce fil de discussion, car il n'y a pas de bonne formation à la POO nulle part, mais nous avons besoin et envie d'apprendre.

Il n'est probablement pas utile d'encombrer la branche "questions des débutants" d'exemples de code plus compliqués et non compréhensibles pour les débutants.

Ayant lu deux articles "Les bases de la programmation orientée objet et laPOO dans MQL5 : Gestion des codes d'erreur et d'avertissement" par des exemples

J'ai écrit un exemple de code et je veux l'étudier en détail. Je vous suggère également de publier vos propres codes et d'en discuter ensemble.

Je suis intéressé par les points suivants :

  • Ce code est-il correct ?
  • Comment améliorer le code ?
  • Comment accélérer le code ?
Mon code pour l'ouverture des commandes :

#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;
  }
//+------------------------------------------------------------------+
 
Donc la POO est juste une fonction à fourrer dans une classe ? Productif, ça va bientôt être drôle sur le forum.
 
VOLDEMAR:


  • Le code est-il correct ?
  • Comment améliorer le code ?
  • Comment accélérer le code ?


Qu'entendez-vous par bien ou mal ? S'il fonctionne correctement, c'est qu'il est bon. Si ça ne marche pas, c'est que c'est faux.

Améliorer. Améliorer quand quelque chose ne satisfait pas un besoin. Les besoins auxquels il ne répond pas, vous devez les améliorer dans ce sens.

Pourquoi accélérer ? Les ordres ne s'ouvrent pas si souvent, même rarement par rapport au nombre total de ticks dans le testeur.

Mais c'était de la philosophie.

La pratique. Pourquoi avons-nous besoin de ce cours s'il existe un excellent cours standard ? C'est vrai, il est pour MT5 et je ne sais pas s'il est disponible pour MT4. Vous n'en avez pas ?

Il y a un inconvénient dans votre code - l'absence de Stop Loss et Take Profit.

 
TheXpert:
Donc la POO est juste une fonction à fourrer dans une classe ? Productif, ça va bientôt être drôle sur le forum.

Si vous êtes si intelligent, alors écrivez de la bonne manière, le sujet n'a pas été créé pour le sarcasme .....
 
VOLDEMAR:

Si vous êtes si intelligent, alors écrivez de la bonne façon, le sujet n'est pas pour les sarcasmes ....


Cela dépend de ce que vous voulez, de ce dont vous avez besoin et de votre style de programmation.

Vous pouvez créer une classe comme un ensemble de fonctions avec des paramètres, comme dans votre cas.

Vous pouvez faire des méthodes pour définir des paramètres, et ouvrir directement la commande en appelant la méthode sans paramètres.

Il serait préférable qu'il soit plus simple - dans ce cas, il sera plus applicable dans différents cas. Essayer de faire quelque chose de super-perfectionnellement universel est le rêve d'un idiot, une perte de temps et d'effort mental.

Plus. Tant que vous n'avez pas eu à résoudre le même problème 20 fois, il vaut mieux ne pas essayer de créer une approche universelle.

 
Integer:


Qu'est-ce que ça veut dire, bien ou mal ? S'il fonctionne correctement, c'est qu'il est bon. Si ça ne marche pas, c'est que c'est faux.

Améliorer. Vous devez vous améliorer lorsque quelque chose ne répond pas à un besoin. Quels sont les besoins qui ne sont pas satisfaits, dans cette direction à améliorer.

Pourquoi accélérer ? Les ordres ne s'ouvrent pas si souvent, même rarement par rapport au nombre total de ticks dans le testeur.

Mais c'était de la philosophie.

La pratique. Pourquoi avons-nous besoin de ce cours s'il existe un excellent cours standard ? C'est vrai, il est pour MT5 et je ne sais pas s'il est disponible pour MT4. Vous n'en avez pas ?

Il y a un inconvénient dans votre code - l'absence de Stop Loss et Take Profit.


Les stop loss et les takeaways pour les ordres sont définis séparément, car il se peut que nous ne sachions pas sur quel type de compte nous allons travailler .....
 
Integer:

Vous pouvez créer des méthodes pour définir des paramètres et ouvrir directement une commande en appelant une méthode sans paramètres.

Pouvez-vous le démontrer avec mon exemple ?

 

Je n'ai pas envie de coder. En tout cas... Dans la section privée, déclarez les variables pour le Stop Loss, le Take Profit et les valeurs de lot. Ces variables sont utilisées dans les méthodes d'ouverture des ordres, bien sûr, le lot est tel qu'il est et les niveaux de prix sont calculés à partir de ces variables. Mais nous devons fixer des valeurs pour ces variables. Cela signifie que nous avons besoin de méthodes comme : SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value).

Dans la plupart des EA, les méthodes SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value) ne devront être appelées qu'une seule fois dans l'inite. L'appel de méthodes pour ouvrir des ordres sans paramètres accélère considérablement le temps d'exécution.

 
VOLDEMAR:
Si vous êtes si intelligent, écrivez-le correctement, le sujet n'a pas été créé pour le sarcasme .....
Ne traînez pas la POO dans des endroits où elle n'est pas nécessaire. La simple présence d'objets ne rend pas le code plus rapide, plus efficace, etc.
 

Comme toujours, j'ai voulu apprendre, mais il y a forcément ceux qui n'ont rien d'autre à dire que de faire les malins...

J'ai écrit un exemple simple pour le démonter, je ne sais pas comment écrire de manière plus compétente avec la POO ... C'est juste un exemple, si vous savez comment écrire un code similaire correctement et OOP alors s'il vous plaît écrivez, afin que moi et d'autres puissent apprendre ...

 
VOLDEMAR:

Comme toujours, j'ai voulu apprendre, mais il y a forcément ceux qui n'ont rien d'autre à dire que de faire les malins...

J'ai écrit un exemple simple pour le démonter, je ne sais pas comment écrire de manière plus compétente avec la POO ... C'est juste un exemple, si vous savez comment écrire un tel code correctement et de manière OOP, alors écrivez, afin que moi et d'autres puissent apprendre ...


Peu importe.

* * *

Vous devez vous efforcer de faire en sorte que les méthodes principales et les plus fréquemment utilisées soient appelées sans passer de paramètres. Cela permettrait d'augmenter les performances. Mais cela réduira la facilité d'utilisation.