Progetto del consigliere - pagina 6

 
Alexey Navoykov:

Nel mondo civile, le liste sono attuate attraverso...

Perché non scrivi una libreria civile in MQL, e poi ne parliamo. Sono anni che sentiamo queste grida, e quando si arriva al dunque, si inizia a fare del vero e proprio bodlocoding.

MQ ha fatto davvero un errore con i riferimenti in CObject. Non dovrebbero essere lì. E questi riferimenti sono usati in contenitori molto specifici come CList. Ma dove non ci sono errori? Lingue civilizzate, dice? Leggete la critica di Richter su cosa pensa dell'Object C# e quali metodi non dovrebbe contenere. Quindi, poiché Richter ha ragione, dovremmo rifiutarci di usare C#? Sciocchezze. Quindi smettetela di ammassarvi qui e andate finalmente nella vostra giungla procedurale.

 
George Merts:

Beh, sì, non si possono mettere oggetti costanti in una lista.

Tuttavia, io uso costantemente le funzionalità di CObject, e nessuno dei critici non ha offerto nulla di simile agli oggetti della Libreria Standard array e liste.

"Il modo in cui le cose dovrebbero essere fatte" è il grido di tutti. Ma per suggerire qualcosa, all'improvviso, non c'è niente.

Anche i partecipanti che offrono effettivamente diverse soluzioni software - non offrono un sostituto per il CObject - più spesso non lo usano affatto, meno spesso usano le sue funzionalità, non prestando attenzione alla "implementazione attraverso un posto". E questo significa che l'implementazione è abbastanza buona.

Se fosse stato cattivo, una sostituzione sarebbe stata suggerita molto tempo fa.

Di solito si usa il CObject nativo quando tutto il resto è basato sulla libreria standard. In particolare quelli che condividono attivamente i loro sorgenti, tendono a unificare, ridurre il codice auto-scritto e ridurre il numero delle proprie librerie per rendere la vita più facile agli utenti esterni. Ma ognuno decide da solo, se codificare per se stesso o per la convenienza degli altri.

Tuttavia, suppongo che molte persone usino le proprie soluzioni (come me), semplicemente non vedono la necessità di offrirle agli altri. Ma in generale penso che sarebbe meglio se ci fosse qualche standard basato su alcune librerie ben note, come MFC. Ecco perché non capisco davvero MQ, perché hanno dovuto reinventare la loro ruota (oltre che molto controverso), invece di portare una soluzione già pronta. Tuttavia lo stesso si può dire del linguaggio MQL stesso )))

Ma in linea di principio, non sono obbligato a rifiutare da CObject, ho solo fatto la mia osservazione critica in risposta alla frase, che qualcuno dovrebbe usare CMyCobject quando c'è un CObject molto cool da MQ :)

 
Vasiliy Sokolov:

Scrivi una libreria civile in MQL e poi ne parliamo. Hai urlato per anni, ma quando si arriva al dunque, cominci a fare un vero e proprio bodlocoding.

Beh, ho le mie biblioteche. Allora, di cosa volevi parlare?

Ho fatto un gran casino con i riferimenti in CObject MQ. Non devono essere lì. E questi riferimenti sono usati in contenitori molto specifici come CList. Ma dove non ci sono errori? Lingue civilizzate, dice? Leggete la critica di Richter su cosa pensa dell'Object C# e quali metodi non dovrebbe contenere. Quindi, poiché Richter ha ragione, dovremmo rifiutarci di usare C#? Sciocchezze. Quindi smettetela di ammassarvi qui e andate finalmente nella vostra giungla procedurale.

Non essere arrogante e scortese, non sto parlando con te personalmente.

A proposito di "incasinato con i link" - beh, sì, divertente, dopo che ho già dipinto tutto su di esso. Anche se prima hai letteralmente dribblato CObject, che è così grande, e che anche i puntatori non sono inizializzati lì per default (almeno avresti dovuto studiare prima il codice sorgente del tuo linguaggio). Ad ogni modo, non vedo più il senso di gettare aspirazioni su di te qui.

 
George Merts:
Ma sono d'accordo, non è sempre necessario usare OOP.

Diciamo che ho la classe CDataProvider:pulic CDataProviderI - fornitore di dati, che fornisce a Expert Advisor le serie temporali, gli indicatori, il terminale e i dati ambientali. In un Expert Advisor, ci possono essere molti TS - ognuno di loro riceverebbe i puntatori alle serie temporali e agli indicatori dal fornitore di dati (ogni TS non avrebbe bisogno di creare serie temporali - il fornitore di dati fornirebbe i puntatori alle serie temporali necessarie se esistono già, e creerebbe solo le serie temporali che non sono ancora state create).

Quando hai bisogno di ottenere un indicatore dal fornitore di dati - riempi la struttura di descrizione dell'indicatore, e poi richiedi un indicatore dal fornitore, puntando a questa struttura.

Di conseguenza, ogni indicatore all'interno del fornitore di dati dovrebbe essere in grado di identificare la sua struttura (il fornitore di dati "conosce" solo la classe base astratta della struttura) e in base ad essa creare l'oggetto indicatore pronto, che sarà creato dal fornitore di dati.

Ma sarebbe irragionevole iniziare un tale progetto solo per verificare una nuova idea di un indicatore. Di conseguenza, per questi nuovi indicatori tutto è "a mano", senza alcuna OOP. Tuttavia, se vedo che un indicatore è utile per Expert Advisors - è scritto "correttamente" - con pieno supporto OOP, e la creazione all'interno di un fornitore di dati.

È una grande soluzione per molti TS che usano gli stessi indicatori nel loro lavoro.

Quando ho testato tutti gli indicatori in MT4 circa 15 anni fa per l'idoneità al commercio in modalità ordine inverso, ho trovato solo 1 che permette di fare profitto sul quotidiano. la maggior parte degli indicatori sono basati su indicatori costruiti, ecco perché i risultati di trading sono bassi quasi per tutti loro. penso che il primo compito di ogni trader è quello di studiare il mercato per la precisione di previsione o redditività di un modello.

con rispetto.

La cosa principale è che non possono confondervi con la direzione in cui andate e vedere la realizzazione delle loro idee. Lo scopo di tutto questo circo, confondere e dirigere nella direzione sbagliata, lontano dal profitto.
 
Alexey Navoykov:

  1. Beh, di solito si usa il CObject normale quando tutto il resto è anche basato su una libreria standard.
  2. In particolare, coloro che condividono attivamente il loro codice sorgente di solito cercano l'unificazione,
  3. ridurre il codice scritto in proprio e
  4. ridurre il numero delle proprie biblioteche,
  5. per rendere la vita più facile agli utenti esterni. Ma ognuno decide per se stesso, se sta codificando per se stesso o per convenienza degli altri.

Beh, tu stesso hai risposto alla domanda perché dovresti usare CObject, piuttosto che la bicicletta auto-scritta. Questo è necessario per rendere la vita più facile non solo per gli altri, ma soprattutto per voi stessi, perché le parole "unificazione", "ridurre il codice auto-scritto", "ridurre il numero delle proprie librerie" - questo è ciò a cui ogni sviluppatore dovrebbe tendere. Questo è il Santo Graal del programmatore.

Naturalmente, la libreria standard è obsoleta. Il linguaggio ora permette di fare i generici, e le interfacce stanno arrivando. Ma la vecchia biblioteca funziona ed è una buona unificazione, e come si dice il meglio è nemico del bene. Dato che non esiste il perfetto e il migliore, bisogna usare il buono.

Riguardo al "casino con i link" - beh, sì, è divertente, dopo che ho già scritto tutto su questo. Anche se prima hai letteralmente "cagato" su CObject affermando che è così grande, e che anche i puntatori non sono inizializzati lì per default (dovresti almeno studiare il linguaggio sorgente per cominciare). In generale, non vedo l'utilità di gettarvi addosso delle ombre.

Qui nessuno si umilia davanti a voi. Credetemi, la conoscenza "nascosta" che avete "rivelato" a tutti noi qui è da tempo nota a molti. Non voglio nemmeno discutere dell'inizializzazione dei link. Sapete che avete formalmente ragione, quindi cercate di rinfacciarmi la stessa cosa: leggete la matematica, imparate cosa NULL, ecc. ecc. Ma non devi insegnarmi. Sei forte. Hai tutto. Allora perché ci lanci le perline? Andate nella vostra biblioteca. Vedi se diventa lo 0,5% più veloce.

 
Andrey Kisselyov:
Anche gli indicatori frattali e pinbars sono spesso utilizzati. è una soluzione meravigliosa per molti sistemi di trading che utilizzano gli stessi indicatori nel loro trading. ma non sono adatti per i test, ecco perché lo fanno per necessità.

15 anni fa stavo testando tutti gli indicatori in MT4 per l'idoneità al commercio in modalità posizione inversa e ho trovato solo uno che si è rivelato essere redditizio su base giornaliera.

No, devi solo ottenere la giusta essenza dell'indicatore. Un indicatore non è un Graal già pronto, ma solo una comoda espressione di alcune peculiarità del movimento dei prezzi. Pertanto, non dovremmo trattarli come "la fonte finale del segnale", ma solo come una "caratteristica del segnale" e usarli come un complesso. E in questo caso - molti indicatori iniziano ad essere necessari nella maggior parte dei test. In particolare, ATR, per esempio, sto già pensando di standardizzarlo nel template di un Expert Advisor perché lo uso praticamente ovunque. I MA MA sono anche molto spesso indicatori richiesti. Frattali, indicatori pinbar...

 
George Merts:

...

Ma, sono d'accordo, non è affatto necessario usare sempre OOP.

Diciamo che ho una classe CDataProvider:pulic CDataProviderI - un fornitore di dati, che fornisce all'esperto le serie temporali, gli indicatori, i dati del terminale e dell'ambiente. In un Expert Advisor, ci possono essere molti TS - ognuno di loro riceverebbe i puntatori alle serie temporali e agli indicatori dal fornitore di dati (ogni TS non avrebbe bisogno di creare serie temporali - il fornitore di dati fornirebbe i puntatori alle serie temporali necessarie se esistono già, e creerebbe solo le serie temporali che non sono ancora state create).

Quando hai bisogno di ottenere un indicatore dal fornitore di dati - riempi la struttura di descrizione dell'indicatore, e poi richiedi un indicatore dal fornitore, puntando a questa struttura.

Di conseguenza, ogni indicatore all'interno del fornitore di dati dovrebbe essere in grado di identificare la sua struttura (il fornitore di dati "conosce" solo la classe base astratta della struttura) e in base ad essa creare l'oggetto indicatore pronto, che sarà creato dal fornitore di dati.

Ma sarebbe irragionevole iniziare un tale progetto solo per verificare una nuova idea di un indicatore. Di conseguenza, per questi nuovi indicatori tutto è "a mano", senza alcuna OOP. Tuttavia, se vedo che un indicatore è utile per Expert Advisors, è scritto "correttamente" - con pieno supporto OOP e creazione all'interno di un dataprovider.

P.S.

A proposito, nel caso degli indicatori e del fornitore di dati vediamo il vantaggio dell'ereditarietà della virtualizzazione. Abbiamo l'interfaccia di base dei parametri dell'indicatore CIndicatorParametersI; il discendente di questa interfaccia sono i parametri reali dell'indicatore necessario. Quando richiediamo l'indicatore, dichiariamo questi parametri e passiamo al fornitore di dati un puntatore all'interfaccia astratta. Così lo stesso fornitore di dati non sa nemmeno quale indicatore è richiesto - è definito in una funzione, in cui l'indicatore è creato secondo il nuovo tipo. E quali parametri esattamente sono stati passati - solo questo indicatore creato lo sa, estrae i parametri richiesti dall'oggetto passato.

Il trucco è che quasi ovunque all'interno del dataprovider c'è una semplice classe base di parametri (o indicatori) - solo le funzioni più semplici e comuni delle interfacce di base sono disponibili al dataprovider. Questo semplifica la modifica del codice (quando è necessario), e non crea la tentazione di "manomettere" il codice degli indicatori del fornitore di dati. Se volete cambiare un indicatore, si fa solo all'interno dell'indicatore, il fornitore di dati è solo un magazzino di indicatori, il massimo che può fare è creare un nuovo indicatore.

Penso che la stiate rendendo troppo complicata. Il fornitore di date è MetaTrader stesso. Cioè il date-provider non è veramente necessario, ha solo bisogno di una comoda interfaccia per lavorare con i dati. Per esempio, nella mia Libera, basta scrivere il prezzo di apertura dell'ultima barra:

double open_price = WS.Open[0];

L'oggetto WS è sempre lì ed è sempre a portata di mano e funzionante. Come lo fa è nascosto dietro le quinte. Questo è tutto l'accesso ai dati:)

s.o.p. OOP dovrebbe ridurre la complessità d'uso del sistema, non aumentarla. Se ammettete di dover costruire un giardino per un semplice controllo, significa che avete qualcosa di sbagliato nella vostra architettura con provider. Cioè, avete programmato qualcosa che non volete usare sempre.
 
George Merts:

No, devi solo ottenere la giusta essenza dell'indicatore. Un indicatore non è un Graal già pronto, ma solo una comoda espressione di alcune peculiarità del movimento dei prezzi. Pertanto, non dovremmo trattarli come "la fonte finale del segnale", ma solo come una "caratteristica del segnale" e usarli come un complesso. E in questo caso - molti indicatori iniziano ad essere necessari nella maggior parte dei test. In particolare, ATR, per esempio, sto già pensando di standardizzarlo nel template di un Expert Advisor perché lo uso praticamente ovunque. I MA MA sono anche molto spesso indicatori richiesti. Frattali, indicatori pinbar...

Non considero l'ATP come un indicatore, mostra la volatilità media del mercato in un certo periodo di tempo, non è adatto come segnale di entrata (può essere applicato come filtro, niente di più).

Intendevo lavorare nella modalità "sempre a mercato" in base al segnale dell'indicatore di inversione. ancora una volta, ribadisco 15 anni fa, ora la mia visione del mercato è leggermente cambiata.

con rispetto.
 
Vasiliy Sokolov:

Credo che la stiate rendendo più complicata di quanto sia necessario. Il fornitore di dati è MetaTrader stesso. Cioè, non avete davvero bisogno di un fornitore di date, avete solo bisogno di un'interfaccia user-friendly per lavorare con i dati. Per esempio, nella mia Libera, basta scrivere il prezzo di apertura dell'ultima barra:

L'oggetto WS è sempre lì ed è sempre a portata di mano e funzionante. Come lo fa è nascosto dietro le quinte. Questo è tutto l'accesso ai dati:)

s.w. OOP dovrebbe ridurre la complessità dell'uso del sistema, non aumentarla. E se tu stesso ammetti che hai bisogno di costruire un orto per un semplice controllo, significa che c'è qualcosa di sbagliato nella tua architettura ISP. Cioè, avete programmato qualcosa che non volete usare sempre.

La tua (siamo "tu") voce "WS.Open[0];" differisce molto poco dalla mia voce "m_tcMainContainer.Open(0)".

Sospetto che ci debba essere qualche azione preliminare nell'inizializzazione dell'oggetto WS.

Nel mio caso dovremmo chiamare la funzione bool _LoadMainTimeseriesToLocalContainer(uint uiNeedBuffer).

In ogni parte di un Expert Advisor (nel generatore di ingressi, nei controllori di trailing e di uscita, cioè negli oggetti che possono eseguire azioni di trading) ho l'oggetto "Timeseries Container" - in effetti, è un puntatore a OHLCSTVtVr timeseries con opzioni di servizio aggiuntive.

In un Expert Advisor ci possono essere diversi contenitori di diversi simboli e diversi timeframe. L'ideologia del fornitore di dati permette di non duplicarli. Poiché in realtà - tutte le serie temporali sono memorizzate in esso, e i contenitori - basta puntare a quelli necessari.

Non vedo molta differenza - per come la vedo io, WS (WareStore, probabilmente ?) è ancora il mio dataprovider. È solo che il mio dataprovider concentra anche il resto dei dati - indicatori, simboli (oggetti CSymbolInfo), terminale (oggetto CTerminalInfo), che ha anche una collezione di grafici. In ogni refresh, la serie temporale viene aggiornata (come necessario) - qui l'ideologia è vicina a quella della Libreria Standard.

Se consideriamo MT4-5 stesso come fornitore di dati, e la nostra classe è usata solo per fornire l'accesso - allora risulta che secondo il tuo riferimento al prezzo Open dobbiamo chiamare la funzione CopyOpen() per un valore - questo mi sembra irragionevole.


Dare un accesso globale completo a tutte le variabili in qualsiasi punto del programma penso anche che sia estremamente irragionevole, al contrario, cerco di avere accesso solo a quelle strutture e dati, che sono necessari per questa azione in ogni punto del programma. Tutto il resto deve essere inaccessibile. L'ideologia del fornitore di dati mi permette di controllare questo accesso.

 
Andrey Kisselyov:
Non lo considero un indicatore, mostra la volatilità media del mercato in un certo periodo di tempo, non è adatto come un segnale di entrata (può essere applicato come un filtro, niente di più).

Intendevo lavorare nella modalità "sempre a mercato" in base al segnale dell'indicatore di inversione. ancora una volta, ribadisco 15 anni fa, ora la mia visione del mercato è leggermente cambiata.

Con rispetto.

Cosa intende per "l'ATR non conta come indicatore"?

E in che modo "non è adatto come segnale d'entrata"? E io sono un pazzo, uso la voce "volatility breakdown" usando solo questo indicatore...?

Ho il sospetto che lei abbia una sua particolare comprensione dell'essenza degli indicatori... Per me, un indicatore è un oggetto che può produrre un valore variabile in funzione del tempo. Infatti, anche un normale grafico a candele del prezzo è un indicatore. Ma per te è un'altra cosa... Di conseguenza, la nostra comprensione è diversa.