Domande su OOP in MQL5 - pagina 29

 
Dmitry Fedoseev:

Sì, ecco un'altra domanda che continua a sorgere e che non ha una risposta chiara. Quando hai bisogno di ereditare la tua classe - cosa è meglio fare, ereditarla o scrivere una nuova versione estesa della tua classe.

Tutto dipende dall'idea generale di ciò che si vuole alla fine, imho

se pensate di usare la classe da qualche altra parte, dovete renderla completa senza ereditarietà

nel mio esempio, la classe CError può ottenere GetLastError(), disinserire con una descrizione e restituire il valore (int) dell'errore. ho intenzione di usarlo ovunque, comunque, ha solo un costruttore che definisce la lingua in una variabile statica e il caso che restituisce il testo dell'errore

Ma c'è un altro metodo utile - bool ServerDisable(); - definisce la disponibilità del server (codice multipiattaforma MT4/МТ5), una funzione molto buona, sembra essere necessaria da qualche altra parte nel codice, ma ho pensato che la userò comunque per le operazioni commerciali - l'ho messa nella classe COrder

.....

e se voglio usarlo per il trailing? .... - molto spazio per l'immaginazione, ma alla fine sarà usato come un oggetto in COrder - dove altro potrebbe essere usato?


imho, tutto sembra ingombrante, è più facile includere la libreria di funzioni di servizio con il linker, e il compilatore non includerà le parti inutilizzate nell'eseguibile da solo

L'intera classe sarebbe abbastanza compatta in stile procedurale, ho mostrato un esempio per una funzione per aprire un ordine che può memorizzare in costanti statiche il volume dell'ordinehttps://www.mql5.com/ru/forum/85652/page17#comment_12805083

 
Dmitry Fedoseev:

È davvero importante rimanere nei limiti? Se è importante rimanere nei limiti, si possono scrivere anche delle funzioni.

Stavo rispondendo nel contesto del tuo messaggio che se non usi le classi, dovrai preoccuparti di scomode firme di chiamata. Ho dimostrato che non devi preoccuparti.

 
Alexey Navoykov:
Cosa mi impedisce di inviare il nome del simbolo al costruttore, rendendo la classe flessibile e versatile? Non consideri la possibilità del trading di portafoglio come una questione di principio?

considerando tutto,

Ma finora ho continuato con la ricerca - ora sono quasi pronto a ricercare 1000 e 1 modi di MM e tutti i tipi di trucchi con i sistemi di ordine )))

Ma penso ancora che non sarebbe troppo flessibile alla fine, ho già scritto 2 volte sopra che uno stile procedurale + piccole classi con funzioni ben tarate di gestione degli ordini sarebbe meglio.

Passerò a testare le mie idee per ora e poi vedrò cosa modifico spesso nel codice e cosa lascio intatto

 
Igor Makanu:

.....

E se volessi usarlo per il trailing? .... C'è più spazio per l'immaginazione, ma alla fine sarà ancora usato come un oggetto nel COrder - dove altro potrebbe essere usato?


Le barre di coda sono separate perché non hanno nulla a che fare con la logica principale. Possono esistere o non esistere affatto.

***

Le barre di trascinamento e altre funzioni di supporto simili dovrebbero essere fatte come discendenti di una classe, e le loro istanze dovrebbero essere create in un array. Se una funzione è abilitata, un'istanza viene aggiunta all'array ed eseguita. Se tutte le funzioni sono disabilitate, l'array è vuoto e gli if non necessari non vengono eseguiti. Puoi inserire almeno 100 trailing bar nell'EA, e questo non influenzerà la velocità della sua esecuzione.

 
Alexey Navoykov:
Non è questo il modo di farlo. Devi almeno chiamare sia Bid() che Ask(). Il tuo codice sembra solo una variabile, facendo sembrare che il suo valore rimanga invariato, quando in realtà non è così.

ahimè, è sempre stato fatto in questo modo, in MT4 è ancora Bid e Ask e nessun capriccio del creatore per rovinare questo semplice uso e ottenere prezzi attuali ;)

fxsaber:

Ho il seguente schema in cui non ho riscontrato alcun problema.

  1. Scrivo TC solo per Tester. Nessun registro, gestori di errori e altre cose. Il codice è molto conciso, comprensibile e suscettibile di modifiche, se fatto tramite OOP (ma non cruciale). Ho già postato l'esempio in KB. Il bonus è l'ottimizzazione veloce.
  2. La cosa principale è che dovrebbe essere disponibile per il tester e in blocchi indipendenti. La generazione di segnali di trading - un blocco. Trading di segnali - un altro blocco.
  3. Il trasferimento al conto reale è sempre fatto in diverse mosse una e una sola. Il TS è inserito in un ambiente virtuale senza alcuna modifica del codice. Diversi TS possono essere messi in un ambiente o ogni TS nel proprio ambiente, allora l'OOP diventa particolarmente conveniente. Poi prendiamo una fotocopiatrice (il mercato ne è pieno, quindi la gente è brava nella logica delle fotocopiatrici), che semplicemente copia le offerte/ordini dall'ambiente virtuale a quello reale.
  4. Con questo schema, scrivere TS è facile e veloce. Il trasferimento al reale (cosa rara in realtà) è sempre fatto in modo uniforme, rapido e chiaro.

stiamo parlando di questo codice?https://www.mql5.com/ru/code/22770

Mi piace molto l'implementazione. davvero buono per il tester e l'ottimizzatore, probabilmente lo userò come base, il codice è breve e leggibile, ad essere onesti sono sorpreso di leggere il tuo codice, hai uno stile di scrittura molto più sofisticato, io di solito plug and play, so che non posso capire la logica

 
Igor Makanu:

ahimè, è sempre stato così, in MT4 rimane Bid e Ask e nessun capriccio del creatore distrugge questo semplice uso e ottenere prezzi attuali ;)

Ma i loro valori sono invariabili all'interno dell'elaborazione corrente dell'evento (a meno che tu non chiami forzatamente RefreshRates, ovviamente). Quindi sono variabili, non funzioni. E le tue funzioni sembrano variabili

 

Date ai FP un compito reale di gestione ed elaborazione di array di centinaia di megabyte o gigabyte di dati e tutto il loro modello fiabesco di messaggi (i dati sono immutabili) andrà in malora.

Questi sono teorici, appena in tempo per uscire dai compiti del mondo reale e trasmettere nel loro universo fittizio :) le storie di telecomunicazione sono passaggi di dati stupidi.

In effetti, l'unica possibilità di combattere la complessità è quella di impacchettarla negli oggetti.
 
Alexey Navoykov:

Ma i loro valori rimangono invariati all'interno dell'elaborazione corrente dell'evento (a meno che tu non chiami forzatamente RefreshRates). Quindi, sono variabili, non funzioni. E le tue funzioni sembrano variabili

Non so nemmeno come spiegare il problema discusso nel tuo esempio, cercherò di spiegarlo umanamente - per me, come persona che ha avuto il primo PC Pentium-90, è doloroso vedere che per ottenere un uso conveniente, una chiamata di funzione extra, che implica mettere i valori dei registri sullo stack, sarà aggiunta... e ...ecco.

So che ora tutto è memorizzato ripetutamente nella cache a livello di processore, e sospetto che gli sviluppatori di compilatori renderanno più efficiente la "chiamata di funzione da chiamata di funzione".

allora il vostro esempio dovrebbe apparire così:

#define  Ask(dummy) SymbolInfoDouble(_Symbol,SYMBOL_ASK)
#define  Bid(dummy) SymbolInfoDouble(_Symbol,SYMBOL_BID)

void OnStart()
  {
   Print("Ask = ",Ask());
   Print("Bid = ",Bid());
  }

O come questo:

#define  Ask(symbol_) SymbolInfoDouble(symbol_,SYMBOL_ASK)
#define  Bid(symbol_) SymbolInfoDouble(symbol_,SYMBOL_BID)

void OnStart()
  {
   Print("Ask = ",Ask(_Symbol));
   Print("Bid = ",Bid(_Symbol));
  }
 
Dmitry Fedoseev:

Vasiliy, questo articolo sarebbe molto utile per te - per non torturarti spremendo l'OOP per amore dell'OOP.

Ho un'idea di quadro funzionale per MT. Non ci sarà quasi nessun OOP lì. Solo funzioni, "monadi" e altre funzionalità pseudo FP. Sto scrivendo tutto tra virgolette, dato che è impossibile fare un FP completo in MQL.

 
Dmitry Fedoseev:

I commenti non sono necessari.

non vi piacete così tanto, o forse è il contrario di 2 gay che cercano una via d'uscita per se stessi)

A proposito, mi sono piaciuti i suoi articoli, quelli dell'esperto sono zoppi, deboli, ma mi piace altrettanto,

e non sono gay.

Motivazione: