Domande su OOP in MQL5 - pagina 21

 
Alexey Navoykov:
È una classe puramente di prova o la userete davvero?
Se è la seconda, non dovresti farlo. Le variabili statiche non vengono reinizializzate quando un personaggio cambia, per quanto mi ricordi.
E in generale, non è una buona idea inizializzare la statica costante con valori esterni, che non sono necessariamente disponibili al momento dell'inizializzazione.

Ilsecondo, sto scrivendo comunque sotto MT4, anche per me stesso - non funziona nel tester per alcuni simboli, se vedo qualcosa di utile in MT4, passerò a MT5 usando MT4Orders - ho controllato il mio "lavoro creativo" senza problemi con questa libreria

In primo luogo, voglio vedere l'idea di una vera e propria OOP - è per questo che la sto testando, per vedere cosa verrà fuori, finora sta andando abbastanza male.... Vedremo, ho tempo, ecco il caricatore che ho deciso di farmi ))))


so che non è il modo migliore per inizializzare prima dell'inizio del codice principale, o meglio pensavo così, ma non l'ho mai controllato, non importa quante nuove build ho avuto - in MQL tutto è sempre disponibile, anche a livello di visibilità globale, ho visto le persone fonti andare direttamente in cima e scrivere in quel modo:

#property strict
int    dig = _Digits;
double point = _Point;
double startbalance = AccountBalance();

e queste inizializzazioni non valide hanno funzionato per anni di build in build. Quindi, gli sviluppatori hanno viziato le persone fino all'osso ))))




SZZY: qui in generale, come sempre quando si usa OOP - la cosa principale è dividere correttamente il problema in elementi complessi e non ereditare da tutto a portata di mano. Non so dove "mettere" l'output testuale degli errori - ha bisogno ovunque, in qualsiasi classe e in qualsiasi luogo del programma, molto probabilmente si dovrà creare una classe base come@Vladimir Simakov ha mostrato sopra il suo codice

 
Igor Makanu:

pp 1-3 tutti risolvibili, MA... OK, qui con statica aiutato, lasciate che sia così perché c'è un aiuto, almeno qualcosa per giustificare la sua decisione, ora il codice è il seguente:

ha creato 3 istanze di Cdeal e le ha messe nel registro:

...

finora tutto funziona come previsto!

Anche se funziona, non è affidabile. Poiché la funzione è implementata al di fuori della classe, è difficile controllare l'ordine dei campi nella classe stessa. Dovresti almeno scrivere un commento in grassetto nella classe dicendo che tali e tali campi non devono essere riordinati). Ma la tua variante iniziale era comunque migliore. Non si dovrebbe sacrificare la sicurezza per salvare una riga di codice )
 
Alexey Navoykov:
Ma comunque, la tua versione originale era migliore. Non sacrificare l'affidabilità per salvare una riga di codice )

quale? - Ho metà dell'argomento nelle mie variazioni ))))

ma sì, hai ragione al cento per cento!

SZY:

il modo più semplice e affidabile - creare un'istanza della classe tramite new in OnInit() - e copiare immediatamente tutte le variabili d'ambiente del terminale, ma non è il modo migliore - se ho intenzione di aprire un ordine immediatamente all'avvio del costruttore in questo esempio, allora questa istanza della classe sarà probabilmente cancellata e poi eventualmente ricreata - questo porta già alcuni problemi a causa delle chiamate ripetute - inizio a caricare di nuovo il terminale, sprecando ancora memoria.... in generale, non è risolvibile in questo modo


ZZZY: forse un altro giorno di esperimenti, e alla fine prendere esempio da@Vladimir Simakov- tutto è molto chiaro lì

 
Igor Makanu:

Ho abbozzato la mia classe, che dovrebbe inizializzare i campi una volta con valori costanti, e sembra funzionare come previsto:

Non mi piacciono 2 cose:

1. Ripeto chiamando SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) - perché l'ordine di inizializzazione non è definito, cioè non è sicuro che VolumeSTEP sarà inizializzato prima e solo allora GetDigitsInVolumeStep() sarà chiamato

2. Voglio sbarazzarmi del metodo statico static int GetDigitsInVolumeStep() - ho visto un video su youtube che dice che in OOP puro non si dovrebbero usare metodi statici, e ora sto combattendo contro i mulini a vento

il link al video, è essenzialmente lo stessohttps://youtu.be/lfdAwl3-X_c ehttps://youtu.be/zME4SOCHT0I


come posso riscrivere questi 2 punti che non mi piacciono?

1. Non c'è niente di male nel chiamare questa funzione due volte.

2. Non vi confonde il fatto che coloro che sono contro l'uso delle funzioni statiche non danno il minimo argomento?

È meglio non guardare video di chiunque, ma leggere libri.

 
Koldun Zloy:

2. non siete confusi dal fatto che coloro che sono contro l'uso delle funzioni statiche non danno il minimo argomento?

E tu sei il primo a sostenermi che il video non corrisponde a nulla della pratica, ho scritto in un altro thread la mia opinione sul video - l'oratore non poteva nemmeno rispondere alle domande degli studenti

 
Igor Makanu:

e tu sei il primo a sostenermi che il video non corrisponde a niente della pratica, ho scritto in un altro thread la mia opinione sul video - il giornalista non poteva nemmeno rispondere alle domande degli studenti

Non credo che OOP significhi tagliare le proprie capacità per seguire ciecamente i postulati infondati di alcuni portavoce di Internet, dove ognuno spazza a modo suo.

 
Artyom Trishkin:

Non credo che l'OOP sia la riduzione delle proprie capacità per seguire ciecamente i postulati infondati di alcuni portavoce di Internet, dove ognuno spazza a modo suo.

se avete visto il video, dovreste capire che l'obiettivo è .... beh, in generale, anche tu non capisci niente e non sei ancora abbastanza maturo - almeno così mi ha spiegato A100

SZZ: sperimenterò un po' più tardi con le interfacce, forse qualche "entità-bellezza" apparirà ))))

 

Ho guardato il suo video sulla statica, tutto per scrivere così:

new Type0(new Type1(new Type2(...))); 

Beh, scrivere un wrapper su una statica è un problema, no?

class Stateless_with_state {
        Stateless q;
        Data d;
        call() {q::call(d);}
};

E attraverso i modelli sono chiaramente più efficienti. Mi è piaciuta la domanda del pubblico https://www.youtube.com/watch?v=75U9eefFYoU#t=33m25s

 
Igor Makanu:

ZS: sperimenterò le interfacce un po' più tardi, forse qualche "entità-bellezza" apparirà ))))

Controllato se "OOP pattern - Behavioural patterns - Strategy" funzionerà

interface IStrategy
  {
   void Algorithm();
  };
//+------------------------------------------------------------------+
class Strategy_1 : public IStrategy
  {
public:
                     Strategy_1()   {Print(__FUNCTION__);}
   void              Algorithm()    {Print(__FUNCTION__);}
  };
//+------------------------------------------------------------------+
class Strategy_2 : public IStrategy
  {
public:
                     Strategy_2()   {Print(__FUNCTION__);}
   void              Algorithm()    {Print(__FUNCTION__);}
  };
//+------------------------------------------------------------------+
class Context
  {
private:
   IStrategy         *s;
public:
                     Context(IStrategy &_strategy) {Print(__FUNCTION__); s = GetPointer(_strategy); s.Algorithm();}
                    ~Context() {delete s;}
  };
//+------------------------------------------------------------------+
void OnStart()
  {
   Context c1(new Strategy_1);
   Context c2(new Strategy_2);
  }
//+------------------------------------------------------------------+

2019.08.31 21:04:40.441 tst (EURUSD,H1) Strategy_1::Strategy_1

2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_1::Algorithm

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Strategy_2

2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Algorithm


Funziona senza problemi secondo me

 
Igor Makanu:

controllato se "OOP Pattern - Behavioural Patterns - Strategy (Strategy)" funzionerà

2019.08.31 21:04:40.441 tst (EURUSD,H1) Strategy_1::Strategy_1

2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_1::Algorithm

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Strategy_2

2019.08.31 21:04:40.442 tst (EURUSD,H1) Context::Context

2019.08.31 21:04:40.442 tst (EURUSD,H1) Strategy_2::Algorithm


funziona senza problemi per me

Context(IStrategy* _strategy):s(_strategy){Print(__FUNCTION__); s.Algorithm();}

L'operatore new restituisce un puntatore. Naturalmente, gli sviluppatori hanno fatto un casino con la dereferenziazione implicita ed è per questo che la tua versione funziona, ma preferisco non fissarmi su cose non documentate.

2. Non è certamente C++, ma è molto simile, quindi le liste di inizializzazione (non so per l'efficienza) sono kosher.

Motivazione: