Libreria di classi generiche - bug, descrizione, domande, caratteristiche d'uso e suggerimenti - pagina 14
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Per quanto mi riguarda, se un oggetto non implementa qualche interfaccia o metodo, è meglio generare un'eccezione che tacere e poi cercare la fonte del problema.
E alla fine, si ottiene un nobile auto-risarcimento e un evidente occultamento del problema con il codice.
Per la stessa ragione, il confronto non è corretto. Come si può confrontare la CHashMap personalizzata e lavorare con le funzioni del sistema per ottenere un ambiente di trading?
Continuate a scrivere codice sub-ottimale poiché non accettate argomenti di ferro.
Forum sul trading, sistemi di trading automatico e test di strategia
Libreria di classi generiche - bug, descrizione, problemi, casi d'uso e suggerimenti
fxsaber, 2017.12.08 22:46
Per un caso di tester più realistico (2000 transazioni e 1.000.000 di accessi alla storia singola) il risultato appare così
Quasi 100ms di risparmio per ogni passaggio! Se, diciamo, facciamo l'ottimizzazione per 10.000 passaggi completi, la variante Hash finirebbe per essere 15 minuti più veloce.
Tutto sommato, sì, è una nobile autocombustione e un apparente occultamento del problema con il codice.
Continuate a scrivere codice sub-ottimale se non accettate argomenti di ferro.
Alcune sciocchezze che entrambi avete scritto, non capendo minimamente che HashMap nella sua forma attuale non funziona per struct e union.Caro, se fumi qualcosa e non sei in grado di leggere attentamente il post dell'interlocutore - allora è un tuo problema e non sono tutti gli altri che hanno bisogno di cure, ma solo il malato.
Ripeto: nessuno ha sollevato la questione della struttura e dell'unione, nessuno ha contestato le tue idee sull'argomento....
Si trattava specificamente di quei termini del codice.
Dalla libreria standard:
E quelli aggiunti:
Forum sul trading, sistemi di trading automatico e test di strategia
Libreria di classi generiche - bug, descrizione, problemi, casi d'uso e suggerimenti
fxsaber, 2017.12.08 21:17
Aggiunto un altro sovraccarico
Quello che volevi trasmettere:
L'hash è usato per accelerare la ricerca di elementi in un contenitore. La velocità è O(1) - non dipende da quanti elementi vengono aggiunti al contenitore.
Situazione - l'utente usa la propria classe come chiave.
1) A causa dell'assenza di ereditarietà multipla delle interfacce(non ci sono interfacce in MQL5), l'utente non può ereditare da IEqualityComparable;
2) L'utente dimentica anche di specificare una specifica esplicita per la funzione template GetHashCode.
Le conseguenze - l'utente non viene informato che ha omesso qualcosa e il codice viene eseguito con successo senza generare eccezioni(non ci sono eccezioni in MQL5).
La velocità scende da O(1) con una costante media di calcolo dell'hash a O(n) con una costante piuttosto grande al confronto.
Solo con un gran numero di elementi in un contenitore e perdendo molto tempo a cercare un collo di bottiglia nell'implementazione, l'utente potrebbe essere in grado di trovare la causa dei problemi - la mancanza di una specifica esplicita di GetHashCode per la sua classe.
Senza offesa, grazie.
Caro signore, se lei fuma qualcosa e non riesce a leggere attentamente il post dell'interlocutore, è un suo problema e non sono tutti gli altri che devono essere curati, ma solo il malato.
A quanto pare non c'è modo per gli astemi di chiudere il guanto
Anche se non era originariamente destinato ad essere una raccolta di esempi, sento ancora il bisogno di aggiungere alcuni esempi in modo che coloro che non hanno ancora utilizzato gli algoritmi nella loro pratica, possano capire perché è conveniente e, soprattutto, semplice.
Esempio 1: associare un errore di runtime con la sua stringa di descrizione
Molto spesso è necessario tradurre le costanti numeriche in letterali di stringa. Per esempio, è meglio duplicare i codici di errore con una didascalia chiara che descriva l'errore. Questo non è un compito molto difficile e di solito è risolto da una funzione speciale o da un caso di switch o da molti if:
Qualsiasi soluzione del genere ha diritto alla vita. Ma qui descriveremo una soluzione basata su CHashMap e vi mostreremo i suoi vantaggi.
L'algoritmo può assomigliare a questo:
- Creiamo un array associativo del tipo <codice del bug - descrizione del bug>;
- Aggiungete i possibili codici di errore e la loro descrizione in questo dizionario;
- Ci rivolgiamo al dizionario direttamente e senza intermediari per ottenere la descrizione dell'errore tramite il suo codice
Questo codice appare come segue:Una volta compilati i codici di errore, si accede ad essi con una sola riga, senza utilizzare diverse funzioni. Inoltre, vi ricordo che in alcuni casi questo codice funzionerà anche più velocemente di diverse decine di if, poiché l'indirizzamento all'errore necessario avviene direttamente, con una velocità media di O(1).
Una volta che i codici di errore sono popolati, si può accedere ad essi con una sola stringa, senza usare diverse funzioni.
ErrorToString dovrà essere scritto comunque. Quindi l'argomento, come plus, è debole.
Inoltre, vi ricordo che in alcuni casi questo codice funzionerà anche più velocemente di diverse decine di if, perché l'indirizzamento all'errore necessario avviene direttamente, con velocità media O(1).
Ma questo è un vantaggio evidente.
Ci sono diversi vantaggi nella soluzione proposta per il dizionario, il più importante dei quali non è del tutto ovvio a prima vista. Quando scriviamo codice come questo
Noi siamo cablati nel codice stesso dell'Expert Advisor. Quando riempiamo il dizionario, lo facciamo dinamicamente, cioè al momento dell'esecuzione del programma. L'approccio dinamico ci dà più flessibilità. Per esempio, i codici di errore possono essere contenuti in un file speciale, per esempio ErrorsCode.txt:
Al momento del lancio il programma può leggere questo file e riempire il dizionario con i codici richiesti e poi restituire la variante richiesta della stringa all'utente. Ci possono essere diversi file di questo tipo: un file per lingua. In questo modo, si può eseguire la localizzazione, dove vengono visualizzati i codici di errore nella lingua dell'utente, a seconda della lingua dell'utente. Inoltre, l'utente stesso può tradurre questi codici di errore nella sua lingua una volta, e il programma stesso "impara" a produrre il messaggio desiderato nella sua lingua. Questo è il modo in cui la maggior parte dei programmi sono localizzati, quando la traduzione di un menu è contenuta in un file di testo e il programma la carica, a seconda delle impostazioni. Cioè, senza alcuna ricompilazione del programma e senza cambiare il suo algoritmo, possiamo influenzare significativamente la presentazione dei suoi risultati.