Domande su OOP (programmazione orientata agli oggetti)

 

Ciao a tutti!

Penso che sia il momento di creare questo thread, perché non c'è una buona formazione OOP da nessuna parte, ma abbiamo bisogno e voglia di imparare.

Riempire il ramo "domande dai neofiti" con esempi di codice più complicati e non comprensibili per i neofiti non è probabilmente utile.

Avendo letto due articoli "The Basics of Object Oriented Programming eOOP in MQL5: Error and Warning Code Handling" di esempi

Ho scritto un codice di esempio e voglio studiarlo in dettaglio. Vi suggerisco anche di pubblicare i vostri codici e discuterli insieme.

Sono interessato a quanto segue:

  • Questo codice è corretto?
  • Come migliorare il codice?
  • Come accelerare il codice?
Il mio codice per aprire gli ordini:

#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;
  }
//+------------------------------------------------------------------+
 
Quindi OOP è solo una funzione da stipare in una classe? Produttivo, presto ci sarà da divertirsi sul forum.
 
VOLDEMAR:


  • Il codice è corretto?
  • Come migliorare il codice?
  • Come accelerare il codice?


Cosa intende per giusto o sbagliato? Se funziona correttamente, è giusto. Se non funziona, è sbagliato.

Migliorare. Migliorare quando qualcosa non soddisfa un bisogno. Quali bisogni non soddisfa, allora dovreste migliorarlo in questa direzione.

Perché accelerare? Gli ordini non si aprono così spesso, anche raramente rispetto al numero totale di tick nel tester.

Ma quella era filosofia.

Pratica. Perché abbiamo bisogno di questa classe se c'è una grande classe standard? È vero, è per MT5 e non so se è disponibile per MT4. Non ne hai uno?

C'è uno svantaggio nel tuo codice: l'assenza di Stop Loss e Take Profit.

 
TheXpert:
Quindi OOP è solo una funzione da stipare in una classe? Produttivo, presto ci sarà da divertirsi sul forum.

Se sei così intelligente, allora scrivi nel modo giusto, il topic non è stato creato per il sarcasmo ....
 
VOLDEMAR:

Se sei così intelligente, allora scrivi nel modo giusto, l'argomento non è per il sarcasmo ....


Dipende da ciò che vuoi, da ciò di cui hai bisogno e dal tuo stile di programmazione.

Potete fare una classe come un insieme di funzioni con parametri, come nel vostro caso.

Potete fare dei metodi per impostare dei parametri, e aprire direttamente l'ordine chiamando il metodo senza parametri.

Sarebbe meglio quando è più semplice - in questo caso, sarà più applicabile in diversi casi. Cercare di fare qualcosa di super-perfettamente universale è il sogno di un idiota, una perdita di tempo e di sforzo mentale.

Di più. Finché non avete dovuto risolvere lo stesso problema 20 volte, è meglio non cercare di creare un approccio universale.

 
Integer:


Cosa significa giusto o sbagliato? Se funziona correttamente, è giusto. Se non funziona, è sbagliato.

Migliorare. Si dovrebbe migliorare quando qualcosa non soddisfa un bisogno. Quali esigenze non sono soddisfatte, in quella direzione per migliorare.

Perché accelerare? Gli ordini non si aprono così spesso, anche raramente rispetto al numero totale di tick nel tester.

Ma quella era filosofia.

Pratica. Perché abbiamo bisogno di questa classe se c'è una grande classe standard? È vero, è per MT5 e non so se è disponibile per MT4. Non ne hai uno?

C'è uno svantaggio nel tuo codice: l'assenza di Stop Loss e Take Profit.


Stop loss e takeaway per gli ordini sono impostati separatamente, dato che potremmo non sapere su quale tipo di account lavoreremo ....
 
Integer:

Potete creare dei metodi per impostare dei parametri, e aprire direttamente un ordine chiamando un metodo senza parametri.

Puoi dimostrarlo con il mio esempio?

 

Non ho voglia di codificare. Comunque... Nella sezione privata dichiarare le variabili per i valori di Stop Loss, Take Profit e lotto. Queste variabili sono utilizzate nei metodi di apertura degli ordini, naturalmente, il lotto è come è e i livelli di prezzo sono calcolati utilizzando queste variabili. Ma dovremmo impostare dei valori per queste variabili. Questo significa che abbiamo bisogno di metodi come: SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value).

Nella maggior parte degli EA, i metodi SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value) dovranno essere chiamati solo una volta nell'inite. Chiamare i metodi per aprire gli ordini senza parametri accelera notevolmente il tempo di esecuzione.

 
VOLDEMAR:
Se sei così intelligente, scrivilo correttamente, il topic non è stato creato per il sarcasmo ....
Non trascinare l'OOP in posti dove non è necessario. La semplice presenza di oggetti non rende il codice più veloce, più efficiente, ecc.
 

Come sempre, volevo imparare, ma ci sono sempre quelli che non hanno altro da dire se non essere intelligenti...

Ho scritto un semplice esempio per smontarlo, non so come scrivere in modo più competente con OOP ... È solo un esempio, se sai come scrivere un codice simile correttamente e OOP allora per favore scrivi, così che io e altri possano imparare...

 
VOLDEMAR:

Come sempre, volevo imparare, ma ci sono sempre quelli che non hanno più niente da dire se non essere intelligenti...

Ho scritto un semplice esempio per smontarlo, non so come scrivere in modo più competente con OOP ... È solo un esempio, se sai come scrivere un codice del genere correttamente e OOP allora per favore scrivi, così che io e altri possano imparare...


Non importa.

* * *

Dovreste cercare di assicurarvi che i metodi principali e più frequentemente usati siano chiamati senza passare alcun parametro. Questo aumenterebbe le prestazioni. Ma ridurrà l'usabilità.

Motivazione: