Domande su OOP in MQL5 - pagina 40

 
Dmitry Fedoseev:

const - se è necessario proibire l'assegnazione di variabili (tranne una volta durante l'inizializzazione). Se una variabile è dichiarata come consts, allora quando la si passa a una funzione per riferimento, l'argomento della funzione deve anche essere const, ma il compilatore lo forzerà, non dovete pensarci. Se una variabile non viene assegnata, può anche essere marcata come const - funzionerà più velocemente, questo vale per gli argomenti delle funzioni. Tuttavia, in qualsiasi momento, potrebbe essere necessario modificarlo...

static - se è una variabile in una classe, è un caso raro, anche il più raro. Se si tratta di un metodo di classe, allora se il metodo gestisce solo argomenti di questo metodo e variabili statiche della classe, è anche un caso raro (tuttavia, non così raro, se si raccolgono solo funzioni in una classe per comodità).

Non ho ancora avuto modo di provare la DLL C# per MQL5. Ero solito usare wrapper C++ e creare un'istanza di classe in C#. Ho il sospetto che questa DLL userà ora una classe statica, il che limita fortemente le opzioni. Qualcuno sa se ora viene creata una classe statica o dinamica?

 
Alexey Volchanskiy:

Non ho ancora avuto modo di provare la DLL C# per MQL5. Lo facevo con i wrapper C++, il lato positivo è che un'istanza della classe veniva creata in C#. Ho il sospetto che ora la DLL userà una classe statica, il che limita fortemente le sue possibilità. Qualcuno sa se ora sta creando una classe statica o dinamica?

Ho usato solo quelli statici per MQL5 - se il modificatore statico è usato, la firma sarà visibile direttamente da MU, molto comodo

riguardo alla restrizione, si potrebbe lanciare il compito in un thread separato e poi inchiodarlo, è fatto molto velocemente in C#

o scrivere chiamate all'interno della dll

non è un problema


UPD:

Non sono sicuro di poter spiegare la mia recente ricerca sulla logica dell'uso di OOP nei compiti MQL, ma vi dirò cosa vedo

In generale, se usiamo lo stile OOP, rispettando pienamente il controllo degli accessi e assicurandoci di impostare tutti i modificatori privati/protetti/pubblici e di usare obbligatoriamente const per ogni definizione di metodo e firma (può essere rimosso in seguito se usato per modificare i dati) e scrivendo tutti gli accessi ai dati protetti con get/set, il risultato di usare OOP correttamente, è il rilevamento di grandi bug sullamodifica non intenzionale dei dati durante lo sviluppo.

Ho riscritto una classe in quel modo da zero - immediatamente il compilatore ha trovato incompatibilità con il mio problema, è entrato nella classe base dal discendente quando ha controllato (test) l'idea, e come al solito si è distratto e ha dimenticato di rimuovere - non il fatto che avrei trovato questo bug nel test, potrei pensare che era inteso in quel modo )) .

Un altro vantaggio notevole per me è l'assenza di tutte le variabili descritte globalmente - cerco di non usarle, non sono usate affatto qui (beh, tranne la bandiera di ottimizzazione globale - per soddisfare le mie esigenze e la bandiera di errore critico durante il trading)

Un'osservazione interessante è che quando si riscrivono tutte le chiamate via get / set, la classe sorgente prima è aumentata di dimensioni e poi ha iniziato a ridursi significativamente, quando ho iniziato a sostituire le chiamate di get / set - non dico che gonfia notevolmente il codice in dimensioni, ma ancora una volta - questo fornirà il controllo sull'integrità dei dati!


SZY: beh, se sei un perfezionista nel cuore e credi che una chiamata extra via get / set è un clock extra sulla CPU, allora quando il compito è fatto al 100%, non è difficile contare le chiamate ad ogni get / set via ricerca nel sorgente e applicare una vecchia regola - se si chiama una sezione di codice più di una volta, allora si deve fare questa sezione di codice come una subroutine.... nessuno vieta di fare il contrario ---> solo una chiamata a get / set per assegnare / leggere il campo.... ma questo è per così dire "trucchi sporchi" con benefici discutibili

 
Igor Makanu:

Ho usato solo quelli statici per MQL5 - se avete il modificatore statico, la firma sarà visibile direttamente da MU, molto comodo

riguardo alla restrizione, si potrebbe lanciare il compito in un thread separato e poi ucciderlo.

o scrivere chiamate all'interno della dll

Non credo che sia un problema.

Non intendo membri statici per Sharp, intendo questo

public static class ClassName {}

Non si può creare un'istanza di classe statica tramite new e distruggerla tramite delete, non ha costruttori e distruttori, tutti i membri e i metodi sono statici. Comunque, è passato molto tempo da quando ho lavorato lì, ma ricordo quanto fosse scomodo, come un letto procusteano.

Di solito sono usati come contenitore di funzioni di libreria, come le funzioni matematiche.

 
Alexey Volchanskiy:

Non intendevo membri statici per Sharp, ma questo

Penso che sia una classe che non vedrà MQL senza il modificatore statico, ma lo farà se i metodi all'interno della classe hanno un modificatore statico.

è possibile utilizzare qualsiasi classe all'interno di dll localmente, ho WinForm in una classe dll senza statica. tutto funziona bene, ma chiamo funzioni dichiarate con statica, e dove queste funzioni sono dichiarate all'interno della classe - non importa per la chiamata dll da MQL, anche se l'intera classe è statica o no.

Non sarò in grado di controllarlo ancora, non ho installato lo studio sul mio portatile dopo averlo sostituito con un SSD, non ne ho ancora bisogno

 
Alexey Volchanskiy:

Non ho ancora avuto modo di provare la DLL C# per MQL5. Lo facevo con i wrapper C++, il lato positivo è che un'istanza della classe veniva creata in C#. Ho il sospetto che ora la DLL userà una classe statica, il che limita fortemente le sue possibilità. Qualcuno sa se ora viene creata una classe statica o dinamica?

La classe è regolare, i metodi sono statici. Non ho provato altre opzioni.

 
Igor, Dmitry, insomma, dovete provarlo voi stessi. Da quanto ho capito, in ogni caso, è necessario fare riferimento al nome della classe, non al nome dell'oggetto classe. Lo proverò, grazie.
 
Ciao, se ho una domanda sui segnali, dove devo scrivere? Vorrei sapere se è ragionevole abbonarsi ai segnali, se il deposito = 312 dollari? E come evitare la dipendenza dal broker e lavorare efficacemente, se ho iniziato a fare trading un mese e mezzo fa? Ho iniziato a commerciare un mese e mezzo fa, grazie.
 
Alexey Volchanskiy:
Igor, Dmitry, insomma, dovete provarlo voi stessi. Per quanto ho capito, in ogni caso, è necessario fare riferimento al nome della classe e non al nome dell'oggetto classe. Lo proverò, grazie.

Indirizzatevi con il nome della classe.

 
Alexey Volchanskiy: Igor, Dmitry, insomma dovete provarlo voi stessi. Capisco che in ogni caso si dovrebbe fare riferimento al nome della classe, non al nome dell'oggetto classe. Lo proverò, grazie.

Non posso affermare che questo sia l'unico modo per chiamare C# da MQL5, ho usato un esempio dahttps://www.mql5.com/ru/forum/285631 developers

#import "TestLib.dll"

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int x=41;
   TestClass::Inc(x);
   Print(x);
  }

public class TestClass
{
   public static void Inc(ref int x)
   {
    x++;
   }
}

Ho usato l'esempio degli sviluppatori per ottenere il punto di ingresso in C#, non ho usato altri modi, con qualche ritocco lo stesso codice .dll può essere compilato per MT4

articolo e la mia ricerca sul perché il codice dell'articolo non funziona come previsto https://www.mql5.com/ru/forum/3153/page4#comment_10366498 - tutto funziona finora

 

guardato i risultati della mia battaglia con il codice in stile OOP - hmmm... eccellente! ))))


Ho una domanda, ma nel mio codice, beh, tre volte esattamente, uso una costruzione come:

private:
   COrder            *m_order;
.......

// использую так
return(CheckPointer(m_order)==POINTER_INVALID ? true : m_order.Orderclose());

//или так

if(CheckPointer(m_order)==POINTER_INVALID)

chiama tutti in metodi privati, ma c'è un "metodo Jedi ?" per allontanarsi nel codice sorgente daCheckPointer(m_order)==POINTER_INVALID

Sto chiedendo un po' di get / set

nessun problema particolare, ma per così dire un capriccio, o mentre la sete di conoscenza dei metodi OOP in C++ non si è ancora placata

Motivazione: