Bug di ridimensionamento degli array nella build beta 530 - pagina 6

 
ubzen:
***Ps: (Non voglio dimenticare questo). Certo a molti di noi non piace non sapere cosa c'è nei codici che stiamo usando. O ci consumiamo nel cercare di capire i codici di qualcun altro, altrimenti probabilmente non li useremmo. Tuttavia, la maggior parte delle funzioni native (esempio OrderSend()) in mql4 sono oggetti dal nostro punto di vista. Noi non vediamo i loro codici ma li accettiamo. Credo che questa accettazione delle librerie di altri sia qualcosa che un programmatore professionale che lavora su grandi progetti deve accettare e su cui deve costruire. Altrimenti sei bloccato a ricreare la ruota.
Sì, se la metti in questo modo, tutti noi reinventiamo la ruota tutto il tempo in mql4.
 
ubzen:

Credo che tu stia descrivendo un flusso di programma. Non credo che questa sia la big_idea dietro l'OOP. (imo) OOP cerca di affrontare i seguenti problemi. Sono un noob OOP, ma sto formando la mia visione del mondo su di esso.

1) Le vostre funzioni sono indipendenti dalle variabili globali? In altre parole, le vostre funzioni sono oggetti indipendenti? Incapsulamento

2) La tua funzione nasconde i dettagli come i nomi delle variabili locali? Semplifica il volume dei codici sullo schermo? Astrazione

3) Ha la capacità di creare copie duplicate di se stessa per le modifiche? Come la capacità di creare i propri tipi di dati? Ereditarietà.

4) Ha la capacità di cambiare al volo? Esempio: la funzione può gestire sia integer_array che double_array? Polimorfismo.

I modi in cui l'OOP può aiutare a costruire l'ea è simile a come un ea_builder aiuta un non_programmatore a costruire un expert_advisor. Basta prendere la vostra Order_Accounting_Function -> Data_Function -> Event Tracking Function -> Volume Defining Function -> Trading Criteria Defining Function -> Trade Functions -> Error Processing Function. E boom, avete un Expert_Advisor. Tutte le funzioni di definizione dei criteri di trading che avete sviluppato nel corso degli anni possono essere facilmente sostituite.

Per esempio, se tu volessi modificare il mio expert advisor, dovresti studiare dove sono applicate le mie variabili globali e quali altre funzioni dipendono da esse (come i tuoi array di stato o di stato). L'OOP lo rende as_simple_as Accounting(Option_3); Display(Option_1); Caption(Option_5); TradingSys(Option_7); VolumeSize(Option2); OrderType(Option_2) e questo è l'intero esperto.

Questo rende più facile per qualcun altro usare il tuo set di librerie, e di solito ciò che funziona per qualcun altro funziona anche per te in futuro. Se non altro, pensate agli oggetti stand_alone in una catena di montaggio :)

Grazie per aver descritto questo in modo così conciso ubzen, ho cercato questo prima e di solito vanno in un romanzo così lungo su tutto questo, non ho mai veramente capito il punto.
 
SDC: Grazie per aver descritto questo in modo così conciso ubzen, ho cercato questo prima e di solito vanno in un romanzo così lungo su tutto questo, non ho mai veramente capito il punto.
Non c'è di che.
 
RaptorUK: C'è una differenza . . . Non ho altra scelta che usare OrderSend() se voglio piazzare un ordine . . . Ho la scelta di usare o meno la libreria di qualcun altro ... anche quando la fonte è rispettata cerco comunque di capirla prima di provare ad usarla, è così che alcuni errori vengono trovati e corretti: https://www.mql5.com/en/forum/133792/page3 "E la mia correzione per il commentodi RaptorUK :"
Nessuna discussione qui. L'OOP non risolve il problema dei bug nei codici né ti costringe a usare la libreria di qualcun altro.
 
RaptorUK:
Mi sono dilettato un po' con MQL5 e non ho avuto bisogno di usare alcuna OOP nel codice che ho scritto

Le classi e l'OOP sono un'aggiunta opzionale in MQL5. Il framework della piattaforma non le usa direttamente. Per esempio, ci si potrebbe aspettare che la piattaforma abbia qualcosa come una collezione Orders che contenga una lista di oggetti Order, permettendo di scrivere codice come il seguente:

for (int i = 0; i < Orders.length; i++) {
  Order O = Orders.getByIndex(i);
  if (O.symbol == "EURUSD" && O.magicNumber = 12345) {
  }
}

Ma questo non è il caso. Invece, il modo in cui si fa questo è fondamentalmente identico tra MQL4 e MQL5:

for (int i = 0; i < OrdersTotal(); i++) {
  if (OrderGetTicket(i)) {
    if (OrderGetString(ORDER_SYMBOL) == "EURUSD" && OrderGetInteger(ORDER_MAGIC) == 12345) {
    }
  }
}

(Ci si potrebbe anche aspettare che ogni EA che si scrive sia una classe derivata da una classe ExpertAdvisor che ha cose come le funzioni virtuali OnTick e OnInit nella sua dichiarazione. Ma non è nemmeno questo il caso. Il framework MQL5 rimane fondamentalmente non-OOP, ma con la possibilità di usare OOP per qualsiasi compito in cui sia utile).

Di conseguenza, si può continuare ad usare il codice MQL4 su MQL5 attraverso una serie di funzioni di aiuto come string OrderSymbol() {return OrderGetString(ORDER_SYMBOL);}. L'unica area in cui questo si rompe è l'accesso alle serie temporali, perché è organizzato in modo molto diverso in MQL5. Una funzione come iOpenMQL4() in https://www.mql5.com/en/articles/81 funziona, ma è terribilmente lenta e inefficiente per un uso ripetuto.

 

(Se a qualcuno interessa ancora, la segnalazione del bug che ha dato il via a questo thread è ancora valida nella build 535. Lo stesso vale per https://forum.mql4.com/56885/page20#861740, anche se sembra che MetaQuotes abbia avuto un tentativo fallito di risolverlo).

 
Scusa per la risposta tardiva, ma a volte devo dormire e lavorare

Sono d'accordo con RaptorUK, la documentazione su mql5.com su OOP è almeno imperfetta. Ma purtroppo non conosco un buon riferimento su oop. Tutto quello che ho letto è o troppo astratto o troppo basilare, prendendo pera e mela come esempio di oggetti e frutta come classe.

La programmazione OOP è utile solo se hai un grande progetto. Un grande progetto non è necessariamente 1 EA, il tuo progetto può essere quello di costruire una serie di EA con indicatori, ecc...Allora è bene riutilizzare il codice, e OOP riguarda principalmente il riutilizzo del codice, ti aiuta a costruire una struttura che può essere facilmente riutilizzata in altri programmi. Sfortunatamente ora non ho il tempo di andare in profondità con questo. Ma è nei miei piani scrivere alcuni articoli su questo.

Un esempio di un grande progetto è il Wizard MQL5 creato da Metaquotes. Ti permette di creare un EA in 5 minuti con alcuni input dell'utente. Si basa sulla Libreria Standard mql5 che fornisce tutti gli elementi necessari per costruire un EA. La stessa procedura guidata può probabilmente essere fatta in modo procedurale, ma sarebbe molto più difficile a mio parere. E poi bisogna mantenere questo codice. Ma questi Standard libray sono difficili da capire perché non sono ben documentati e descritti. Ho creato un topic per centralizzare tutto ciò che esiste sull'argomento (mql5 wizard non oop).

 
ubzen:

Credo che tu stia descrivendo un flusso di programma. Non credo che questa sia la big_idea dietro l'OOP. (imo) OOP cerca di affrontare i seguenti problemi. Sono un noob OOP, ma sto formando la mia visione del mondo su di esso.

1) Le vostre funzioni sono indipendenti dalle variabili globali? In altre parole, le vostre funzioni sono oggetti indipendenti? Incapsulamento

2) La tua funzione nasconde i dettagli come i nomi delle variabili locali? Semplifica il volume dei codici sullo schermo? Astrazione

3) Ha la capacità di creare copie duplicate di se stessa per le modifiche? Come la capacità di creare i propri tipi di dati? Ereditarietà.

4) Ha la capacità di cambiare al volo? Esempio: la funzione può gestire sia integer_array che double_array? Polimorfismo.

I modi in cui l'OOP può aiutare a costruire l'ea è simile a come un ea_builder aiuta un non_programmatore a costruire un expert_advisor. Basta prendere la vostra Order_Accounting_Function -> Data_Function -> Event Tracking Function -> Volume Defining Function -> Trading Criteria Defining Function -> Trade Functions -> Error Processing Function. E boom, avete un Expert_Advisor. Tutte le funzioni di definizione dei criteri di trading che avete sviluppato nel corso degli anni possono essere facilmente sostituite.

Per esempio, se tu volessi modificare il mio expert advisor, dovresti studiare dove sono applicate le mie variabili globali e quali altre funzioni dipendono da esse (come i tuoi array di stato o di stato). L'OOP lo rende as_simple_as Accounting(Option_3); Display(Option_1); Caption(Option_5); TradingSys(Option_7); VolumeSize(Option2); OrderType(Option_2) e questo è l'intero esperto.

Questo rende più facile per qualcun altro usare il tuo set di librerie, e di solito ciò che funziona per qualcun altro funziona anche per te in futuro. Se non altro, pensate agli oggetti stand_alone in una catena di montaggio :)

È una buona panoramica, tranne che per il polimorfismo. Quando hai detto "La funzione può gestire sia integer_array che double_arrays" non si tratta di polimorfismo, ma di sovraccarico di funzioni. Si può avere anche l'overloading dell'operatore in mql5 (erroneamente tradotto in sovraccarico di operazioni). OOP e polimorfismo sono più di questo. Non ho tempo per elaborare (specialmente in inglese), quindi vi suggerisco di leggere l 'introduzione al polimorfismo in mql5.
 
cyclops993:

Le classi e l'OOP sono un'aggiunta opzionale in MQL5. Il framework della piattaforma non le usa direttamente. Per esempio, ci si potrebbe aspettare che la piattaforma abbia qualcosa come una collezione Orders che contenga una lista di oggetti Order, permettendo di scrivere codice come il seguente:

Ma non è questo il caso. Invece, il modo in cui si fa questo è fondamentalmente identico tra MQL4 e MQL5:

(Ci si potrebbe anche aspettare che ogni EA che si scrive sia una classe derivata da una classe ExpertAdvisor che ha cose come le funzioni virtuali OnTick e OnInit nella sua dichiarazione. Ma non è nemmeno questo il caso. Il framework MQL5 rimane fondamentalmente non-OOP, ma con la possibilità di usare l'OOP per qualsiasi compito in cui sia utile).

Di conseguenza, si può continuare ad usare il codice MQL4 su MQL5 attraverso una serie di funzioni di aiuto come string OrderSymbol() {return OrderGetString(ORDER_SYMBOL);}. L'unica area in cui questo si rompe è l'accesso alle serie temporali, perché è organizzato in modo molto diverso in MQL5. Una funzione come iOpenMQL4() in https://www.mql5.com/en/articles/81 funziona, ma è terribilmente lenta e inefficiente per un uso ripetuto.

Sono d'accordo. Aggiungerei che mql5 fornisce più funzioni di "basso" livello rispetto a mql4. Per esempio molte persone si lamentano che iBarShift() non esiste in mql5. Ma mql5 fornisce funzioni più dettagliate, in modo da poter costruire il proprio iBarShift() e fornisce anche oop in modo da poterlo riutilizzare facilmente in qualsiasi progetto (naturalmente oop non è obbligatorio per riutilizzarlo). Non sono sicuro che la mia spiegazione sia chiara, poiché il mio inglese è ancora un po'rudimentale.
 
Ovo:

L'OOP è abbastanza comune attualmente e attirerà più codificatori veri al MQL. Ma l'editor simile al blocco note respingerà la maggior parte di loro, ne sono sicuro.

Hai provato il metaeditor mql5 (o il nuovo editor mql4 che è lo stesso)? Ci sono molti miglioramenti.