Fragen zu OOP (Objektorientierte Programmierung)

 

Hallo zusammen!

Ich denke, es ist an der Zeit, diesen Thread zu erstellen, da es nirgendwo eine gute OOP-Ausbildung gibt, wir aber lernen müssen und wollen.

Den Zweig "Fragen von Neulingen" mit komplizierteren und für Neulinge unverständlichen Code-Beispielen zu übersäen, ist wahrscheinlich nicht sinnvoll.

Nachdem ich die beiden Artikel "Grundlagen der objektorientierten Programmierung undOOP in MQL5 by Example: Error and Warning Code Handling" gelesen habe, habe ich einen Beispielcode geschrieben, den ich gerne im Detail zeigen möchte.

Ich habe einen Beispielcode geschrieben und möchte ihn im Detail studieren. Ich schlage auch vor, dass Sie Ihre eigenen Codes veröffentlichen und sie gemeinsam diskutieren.

Ich interessiere mich für Folgendes:

  • Ist dieser Code korrekt?
  • Wie kann der Code verbessert werden?
  • Wie lässt sich der Code beschleunigen?
Mein Code für die Eröffnung von Aufträgen:

#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;
  }
//+------------------------------------------------------------------+
 
OOP ist also nur eine Funktion, die man in eine Klasse packt? Produktiv, es wird bald lustig im Forum.
 
VOLDEMAR:


  • Ist der Code korrekt?
  • Wie kann der Code verbessert werden?
  • Wie lässt sich der Code beschleunigen?


Was meinen Sie mit richtig oder falsch? Wenn es richtig funktioniert, ist es richtig. Wenn es nicht funktioniert, ist es falsch.

Verbessern. Verbessern Sie, wenn etwas ein Bedürfnis nicht befriedigt. Welche Bedürfnisse es nicht erfüllt, sollten Sie es in dieser Richtung verbessern.

Warum beschleunigen? Die Aufträge werden nicht so oft geöffnet, sogar selten im Vergleich zur Gesamtzahl der Ticks im Tester.

Aber das war Philosophie.

Praxis. Warum brauchen wir diese Klasse, wenn es eine große Standardklasse gibt? Es ist wahr, es ist für MT5 und ich weiß nicht, ob es für MT4 verfügbar ist. Haben Sie keins?

Es gibt einen Nachteil in Ihrem Code - das Fehlen von Stop Loss und Take Profit.

 
TheXpert:
OOP ist also nur eine Funktion, die man in eine Klasse packt? Produktiv, es wird bald lustig im Forum.

Wenn Sie so schlau sind, dann schreiben Sie richtig, das Thema wurde nicht für Sarkasmus geschaffen ....
 
VOLDEMAR:

Wenn Sie so schlau sind, dann schreiben Sie richtig, das Thema ist nicht für Sarkasmus geeignet ....


Es kommt darauf an, was Sie wollen, was Sie brauchen und was Ihr Programmierstil ist.

Sie können eine Klasse als eine Reihe von Funktionen mit Parametern erstellen, wie in Ihrem Fall.

Sie können Methoden erstellen, um Parameter zu setzen, und den Auftrag direkt öffnen, indem Sie die Methode ohne Parameter aufrufen.

Es wäre besser, wenn es einfacher wäre - in diesem Fall wird es in verschiedenen Fällen besser anwendbar sein. Der Versuch, etwas super-perfektes Universelles zu machen, ist der Traum eines Idioten, eine Verschwendung von Zeit und geistiger Anstrengung.

Mehr. Solange man nicht 20 Mal dasselbe Problem lösen musste, sollte man besser nicht versuchen, einen universellen Ansatz zu entwickeln.

 
Integer:


Was bedeutet das: richtig oder falsch? Wenn es richtig funktioniert, ist es richtig. Wenn es nicht funktioniert, ist es falsch.

Verbessern. Sie sollten sich verbessern, wenn etwas einem Bedürfnis nicht entspricht. Welche Bedürfnisse sind nicht erfüllt, in diese Richtung zu verbessern.

Warum beschleunigen? Die Aufträge werden nicht so oft geöffnet, sogar selten im Vergleich zur Gesamtzahl der Ticks im Tester.

Aber das war Philosophie.

Praxis. Warum brauchen wir diese Klasse, wenn es eine große Standardklasse gibt? Es ist wahr, es ist für MT5 und ich weiß nicht, ob es für MT4 verfügbar ist. Haben Sie keins?

Es gibt einen Nachteil in Ihrem Code - das Fehlen von Stop Loss und Take Profit.


Stop-Loss und Take-Away für Aufträge werden separat festgelegt, da wir nicht wissen, mit welcher Art von Konto wir arbeiten werden ....
 
Integer:

Sie können Methoden erstellen, um Parameter zu setzen und einen Auftrag direkt zu öffnen, indem Sie eine Methode ohne Parameter aufrufen.

Können Sie dies anhand meines Beispiels demonstrieren?

 

Ich habe keine Lust zu programmieren. Wie auch immer... Im privaten Bereich deklarieren Sie Variablen für Stop Loss, Take Profit und Lot-Werte. Diese Variablen werden in den Auftragseröffnungsmethoden verwendet, natürlich ist das Los wie es ist und die Preisniveaus werden anhand dieser Variablen berechnet. Aber wir sollten Werte für diese Variablen festlegen. Das heißt, wir brauchen Methoden wie: SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value).

In den meisten EAs müssen die Methoden SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value) nur einmal in der Inite aufgerufen werden. Der Aufruf von Methoden zum Öffnen von Aufträgen ohne Parameter beschleunigt die Ausführungszeit erheblich.

 
VOLDEMAR:
Wenn Sie so schlau sind, schreiben Sie es richtig auf, das Thema wurde nicht für Sarkasmus geschaffen ....
Ziehen Sie OOP nicht an Stellen, wo es nicht notwendig ist. Das bloße Vorhandensein von Objekten macht den Code nicht schneller, effizienter usw.
 

Wie immer wollte ich etwas lernen, aber es gibt sicher einige, die nichts mehr zu sagen haben, außer dass sie schlau sind...

Ich habe ein einfaches Beispiel geschrieben, um es zu zerlegen, ich weiß nicht, wie man kompetenter mit OOP schreiben kann ... Es ist nur ein Beispiel, wenn Sie wissen, wie man einen ähnlichen Code korrekt und OOP schreiben, dann schreiben Sie bitte, so dass ich und andere lernen könnten ...

 
VOLDEMAR:

Wie immer wollte ich etwas lernen, aber es gibt sicher einige, die nichts weiter zu sagen haben, als dass sie schlau sind...

Ich habe ein einfaches Beispiel geschrieben, um es zu zerlegen, ich weiß nicht, wie man kompetenter mit OOP schreiben kann ... Es ist nur ein Beispiel, wenn Sie wissen, wie man einen solchen Code korrekt und OOP schreiben, dann schreiben Sie bitte, so dass ich und andere lernen könnten ...


Kümmern Sie sich nicht um mich.

* * *

Sie sollten darauf achten, dass die wichtigsten und am häufigsten verwendeten Methoden ohne Übergabe von Parametern aufgerufen werden. Dies würde die Leistung erhöhen. Aber es wird die Benutzerfreundlichkeit beeinträchtigen.