Argomento interessante per molti: cosa c'è di nuovo in MetaTrader 4 e MQL4 - grandi cambiamenti in arrivo - pagina 10

 

Non dimenticate che abbiamo un ottimo inliner in funzione, che scarica un sacco di piccole funzioni, quindi non c'è perdita di velocità.

E nella maggior parte dei casi, le chiamate alle funzioni virtuali tramite vtable sono ottimizzate in chiamate dirette. Questo è uno dei metodi efficaci dell'ottimizzatore. Il che, insieme all'inlining multiplo, permette di sbarazzarsi quasi completamente delle chiamate complesse a più livelli e di far sembrare il codice piatto.

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Виртуальные функции - Документация по MQL5
 
Renat:

Non dimenticate che abbiamo un ottimo inliner in funzione, che scarica un sacco di piccole funzioni, quindi non c'è perdita di velocità.

E nella maggior parte dei casi, le chiamate alle funzioni virtuali tramite vtable sono ottimizzate in chiamate dirette. Questo è uno dei metodi efficaci dell'ottimizzatore. Questo, insieme all'inlining multiplo, permette di sbarazzarsi quasi completamente delle chiamate complesse a più livelli e di far sembrare il codice piatto.

:) divertente. E nessuno sostiene che il compilatore ottimizza perfettamente il codice, sto solo mostrando al mio amico perché non mi abbasso prima di SB.

Ok, usiamo degli esempi:

class CiCustom : public CIndicator : public CDoubleBuffer

                пользуется включением class CSeries : public CArrayObj который в свою очередь

                                                     пользуется включением class CArrayDouble : public CArray и

                                                                           class CArrayObj : public CArray ну и конечно куда как без

                                                                                  включения class CArray : public CObject который включает

                                                                                                           class CObject и #include "StdLibErr.mqh"

è sostituito in pratica da una semplice funzione standard

CopyBuffer(...);

Abbiamo l'arte per l'arte. E così su ogni elemento che fa qualcosa (il resto, come capite, è scritto perché gli elementi finali funzionino).

Sì, sono d'accordo sulla versatilità, sì, sono d'accordo sul codice ben strutturato (si può dire, è un campione da analizzare).

Ma qual è il succo del discorso? Il punto è che questa libreria è principalmente necessaria per il Wizard MQL5 e come tutorial su OOP.

 
Urain:

Sto semplicemente facendo capire al compagno perché non cado davanti al SB.

Sì, sì, lo sottolineo di nuovo - non ho nessuna seria obiezione a nessuno dei vostri argomenti. Una discussione su questo sarebbe più religiosa che oggettiva.

Beh, proprio sul tuo esempio, personalmente ME, e NEL MIO CASO, sembra più accettabile proprio la prima variante del codice, a causa di tutte quelle inclusioni multilivello che garantiscono la compatibilità dell'indicatore con tutte le interfacce, a partire da CObject e fino a CiCustom.

Ma, d'altra parte - tutte le serie temporali e gli indicatori sono creati su richiesta, impilati in una singola collezione, e quindi disponibili per tutti gli utenti. E quando abbiamo bisogno di copiare un buffer solo una volta, ci chiediamo perché prendersi tutto questo disturbo.

Quindi, in un caso semplice, ovviamente, sarebbe molto più facile usare CopyBuffer().

Ma cosa succede se abbiamo una dozzina di utenti di un dato buffer? Nel mio caso - tutti lo chiederanno, il buffer sarà creato e tutti gli altri avranno un riferimento ad esso. E se usiamo CopyBuffer() "direttamente" - avrò dieci copie invece di una. E quando si usa CopyBuffer() in modo più astuto, si ottengono cose con il tracciamento di chi e quale buffer è stato allocato, che è abbastanza equivalente in termini di costi all'incapsulamento che hai menzionato.

Personalmente sono per la ragionevolezza - non ha senso fare una trama così grande con OOP per un solo posto. Se abbiamo molti utenti, allora l'approccio OOP, secondo me, si giustifica.

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyBuffer - Документация по MQL5
 
Urain:

Poi è il momento di introdurre le eccezioni in modo che un codice possa essere compilato sia per mql4 che per mql5.

La questione dell'unificazione incombe.

D'accordo. Caratteristica molto utile.
C-4:
Stavo pensando che quando si fondono due linguaggi, le direttive di compilazione condizionale come #ifdef sono assolutamente necessarie - questo semplificherebbe l'unificazione dei codici tra le due piattaforme, e le API dipendenti dalla piattaforma sarebbero definite al momento della compilazione.
Siamo almeno in quattro adesso :)
 
Renat:
Purtroppo no. Il tester rimarrà a thread singolo e senza MQL5 Cloud Network.
E la multivaluta?
 
In Mt4 l'ideologia del tester rimarrà la stessa. Non faremo nessun cambiamento fondamentale, almeno non nel prossimo futuro.
 
Renat:

Non dimenticate che abbiamo un ottimo inliner in funzione, che scarica un sacco di piccole funzioni, quindi non c'è perdita di velocità.

E nella maggior parte dei casi, le chiamate alle funzioni virtuali tramite vtable sono ottimizzate in chiamate dirette. Questo è uno dei metodi efficaci dell'ottimizzatore. Il che, insieme all'inlining multiplo, permette di sbarazzarsi quasi completamente delle chiamate complesse a più livelli e di far sembrare il codice piatto.

Ahhhh... Ora capisco perché uno dei miei errori più frequenti quando scrivo un programma è "La funzione deve avere un corpo".

È l'inliner che richiede... Mi chiedevo perché pensavo che un'intestazione di funzione fosse sufficiente per compilare un modulo, ma no... Hai bisogno di un corpo...

Questo è un bene.

 
Laryx:

Ahhhh... Ora capisco perché uno dei miei errori più frequenti quando scrivo un programma è "La funzione deve avere un corpo".

È l'inliner che richiede... Mi chiedevo perché pensavo che un header di funzione fosse sufficiente per compilare un modulo, ma no... Hai bisogno di un corpo...

È corretto, ma non ha niente a che fare con l'ottimizzatore.

Se avete descritto il prototipo di una funzione di classe, il corpo deve esserci. Anche se è vuoto.

Документация по MQL5: Основы языка / Функции
Документация по MQL5: Основы языка / Функции
  • www.mql5.com
Основы языка / Функции - Документация по MQL5
 

Renat, suggerisco che in MT4 dovremmo rendere la visibilità delle posizioni sul controllo del grafico non nei parametri generali del terminale, ma separatamente per ogni grafico (come è stato fatto in MT5).

La mia domanda alla SR su questo argomento è rimasta in sospeso per due mesi.

 
Interesting:

Renat, suggerisco che in MT4 dovremmo rendere la visibilità delle posizioni sul controllo del grafico non nei parametri generali del terminale, ma separatamente per ogni grafico (come è stato fatto in MT5).

La mia domanda alla SR su questo argomento è rimasta in sospeso per due mesi.

Mentre si lavora sugli oggetti vedremo.