Ho bisogno di aiuto! Non riesco a risolvere il problema, sto incontrando delle limitazioni hardware - pagina 11

 
elugovoy:

Yurichik, intendevo dire che non c'è bisogno di armeggiare con l'elaborazione dei file, la compressione, ecc. Puramente lavorando con SQL e la logica dei robot/indicatori. Ha lavorato con molti database, l'unico problema è stato quello di far funzionare insieme MQL e SQL)). Ho creato una soluzione dall'aspetto gradevole senza array e strutture.

In generale, preferisco non reinventare la ruota e risolvere i problemi con i mezzi migliori.

Zhenya sì, ti ho preso ...

Questo è esattamente ciò che preferisco

... specialmente se è disponibile uno strumento professionale... meglio integrare bene...

 

Che discussione! Grazie a tutti per la vostra partecipazione!

Risponderò a tutti insieme, cercando di non perdere niente (e nessuno).

1. Перейти на x64

Mi ci è voluto un po' per capire che non avevo specificato la versione del terminale. Sto lavorando con la 4 e non ho ancora intenzione di migrare questo EA alla 5. MT4, purtroppo, è solo a 32 bit.

Rimuovere la limitazione di 4 GB di memoria su Windows 8 / 8.1 a 32 bit non aiuterà, il mio sistema è già x64.

2. Tagliare a pezzi / leggere in parti / caricare piccoli blocchi

Non funzionerà per le condizioni del compito.

Cercherò di dare più dettagli qui sotto, forse darà una migliore comprensione del problema.

3. Comprare più memoria / affittare un server potente o un cloud / spostare tutto su SSD

Naturalmente metterò altri 16GB di memoria negli slot disponibili, ma questa non è la risposta.

Quel volume non è il limite, e l'espansione della capacità risolverà solo un caso speciale del problema.

Penso che si dovrebbe ricorrere a questo solo quando si è certi che è al 100% spremuto algoritmicamente.

4. Comprimere i dati

È quello che sto facendo ora.

La cache del testo (che è di 20GB) è stata compressa di un fattore 2, e probabilmente sarà compressa ancora di più.
Non risolve il problema della dimensione della memoria, ma si avvicina ad altre soluzioni (disco RAM).

Lo convertirò anche in binario, accelererà la lettura e ridurrà il volume.


Non è chiarocome i wizard dihttp://www.nanex.net/historical.htmlcomprimano i dati. Le loro strutture di dati sono abbastanza ridondanti.

5. Comprimere/codificare i dati e decomprimere/scomprimere il chunk desiderato prima dell'uso

Accettato come opzione.

Ma qualcosa mi dice che ci vorrà anche molto tempo (qui ci impantaniamo con il processore).

6. Trasferire il calcolo a un programma esterno(Matlab/R/etc).

Non voglio, ci sono molte ragioni.

A meno che non sia in un ambiente ben integrato con MT. Ma questo richiederebbe ancora tempo per imparare il software/ambiente e/o ordinare la soluzione da uno sviluppatore terzo. È scomodo e costoso nella fase di sviluppo (che sono io).

Comunque, cercando di rimanere nella sandbox per ora, con tutti i suoi pro e contro.


7. Creare file di indice e lavorare con gli indici

Non vedo come questo possa aiutare.

Bisogna ancora recuperare ripetutamente i dati dal file principale (rileggendolo costantemente).


8. Utilizzare un database

Un'opzione molto allettante, dato:

  • scalabilità e portabilità (si può affittare un server o semplicemente collegare un PC vicino);
  • l'automazione e il buon flusso di lavoro di molti processi che altrimenti devono essere fatti manualmente su una piega;
  • e altri benefici.

Ma ci sono alcuni svantaggi:

  • Ambiente relativamente nuovo per me (non ho lavorato strettamente, solo query di base);
  • La complessità dell'installazione su una singola macchina client (versione standalone);
  • Probabilmente qualcos'altro.
Comunque, se le altre opzioni non funzionano, probabilmente tornerò a questa.


9. Comprendere e testare termini nuovi e oscuri

Questa è solo una nota a me stesso per il futuro e/o una richiesta di maggiori informazioni agli autori ;)

Lasciato scoperto: File mapping,soluzioni basate su hash, B-trees.


10. Spostare il terminale con tutte le cache su un disco di RAM virtuale

Finora questa è l'opzione più promettente (in termini di rapporto costi/benefici).

RAM Disk di SoftPerfect installato, finirò la compressione della cache, riscriverò la calcolatrice per la lettura permanente dei file e controllerò le prestazioni.

11. Prendi il compito giusto =)

Ottimo consiglio, soprattutto considerando la scarsità di informazioni in entrata.

Come promesso, cercherò di dare più dettagli.

Ci sono molte sequenze simili di scambi, ogni sequenza è ordinata per tempo.

Gli affari nelle diverse sequenze sono diversi e distribuiti in modo non uniforme nel tempo (e in modo diverso in ogni sequenza). Il numero di accordi è diverso. Ma tutti sono nell'intervallo da Data1 a Data2.

Il compito è quello di passare da D1 a D2 con passo M minuti (o meglio - esattamente per punti di fare scambi di tutte le sequenze), trovare una sequenza che sia migliore delle altre per criterio K (un compito separato - non solo trovare la migliore sequenza, ma ordinare l'intero set per criterio e produrre i primi 10 - ma è un optional, non ancora richiesto).

Il criterio K è calcolato sulla base di X scambi precedenti della sequenza corrispondente, quasi tutte le informazioni su ciascuno degli X scambi sono utilizzate nei calcoli (il solo profitto, per esempio, non è sufficiente).


Il criterio (K), il numero di accordi (X) e altri parametri che influenzano i risultati sono cambiati da un utente. Cioè, non possono essere "scritti" nell'algoritmo.

Qualcosa del genere.

In idea, possiamo ristrutturare il file per renderlo lineare per tutti gli scambi di tutte le sequenze.

Ma come si può fare questo senza mettere tutte le informazioni in memoria? E poi come posso ricalcolare il Criterio, se gli accordi di una sequenza saranno "spalmati" su tutto il file?

Ora, si spera, il compito è chiaro.

Ancora una volta, grazie mille per la vostra partecipazione, discussioni, domande, link e risposte concrete:

TheXpert,Urain,sergeev,elugovoy,anonymous,meat,ALXIMIKS,IvanIvanov,Integer,C-4,marketeer,barabashkakvn,Silent,GT788,papaklass,grizzly_v,artemiusgreat,YuraZ,Candid,Contender eserver

Grazie!

 
komposter:

Che discussione! Grazie a tutti per la vostra partecipazione!

....

Un'opzione molto allettante, tutto sommato:

  • Scalabilità e portabilità (si può affittare un server o semplicemente collegare un PC vicino);
  • automazione e buon flusso di lavoro di molti processi, che altrimenti devono essere fatti manualmente in ginocchio;
  • e altri benefici.

Ma ci sono alcuni svantaggi:

  • Ambiente relativamente nuovo per me (non ho lavorato strettamente, solo query di base);
  • La complessità dell'installazione su una singola macchina client (versione standalone);
  • Probabilmente qualcos'altro.
In generale, se altre opzioni non funzionano, probabilmente tornerò a questa.


Se andiamo nella direzione di SQL


  • Ambiente relativamente nuovo per me (non ho lavorato da vicino, solo query di base);

Può essere un bel peso sulla curva di apprendimento.

Se si sceglie questa variante, è meglio costruire tutta la logica di business con stored procedure

lasciando all'Expert Advisor solo due funzioni: inviare una richiesta al server e ottenere un risultato completamente finito

tutti i calcoli sul server

  • La complessità dell'installazione su una singola macchina client (versione stand-alone);

In effetti, la rete può trovare molte descrizioni di come mettere il server SQL

(ORACL, SYBASE + CENTOS per esempio) ORACL, SYBASE, MS SQL+WINDOWS macchina separata

ORACL è un po' più difficile da imparare - meno esperti, meno letteratura.

MS SQL - forse la più grande quantità di informazioni e più letteratura sul web.

non ci saranno difficoltà - ci sono molte descrizioni sul web e più libri nel negozio.

MSSQL 2012 dai suoi parametri è molto vicino a ORACL - già nel 2014.

SQL + LINUX è di solito scelto per operare in un ambiente di produzione - se non sapete nulla di LINUX è meglio usare WINDOWS

 

komposter:

Ci sono molte sequenze di accordi simili, ogni sequenza è ordinata per tempo.

Le transazioni in diverse sequenze sono diverse, distribuite in modo non uniforme nel tempo (e in modo diverso in ogni sequenza). Il numero di accordi è diverso. Ma tutti sono nell'intervallo da Data1 a Data2.

Il compito è quello di passare da D1 a D2 con passo M minuti (o meglio - esattamente per punti di fare accordi di tutte le sequenze), trovare una sequenza che sia migliore delle altre per criterio K (un compito separato - non solo trovare la migliore sequenza, ma ordinare l'intero set per criterio e produrre i primi 10 - ma è un optional, non ancora necessario).

Il criterio K è calcolato sulla base di X scambi precedenti della sequenza corrispondente, quasi tutte le informazioni su ciascuno degli X scambi sono utilizzate nei calcoli (il solo profitto, per esempio, non è sufficiente).


Il criterio (K), il numero di accordi (X) e altri parametri che influenzano i risultati sono cambiati da un utente. Cioè, non possono essere "scritti" nell'algoritmo.

Qualcosa del genere.

In idea, possiamo ristrutturare il file per renderlo lineare per tutti gli scambi di tutte le sequenze.

Ma come si può fare questo senza mettere tutte le informazioni in memoria? E poi come posso ricalcolare il Criterio, se gli accordi di una sequenza saranno "spalmati" su tutto il file?

Ora, spero, il compito è chiaro.

Tradizionalmente rallento la mattina :).

Una sequenza entrerà nella memoria o c'è già un problema?

Se il primo, quando avviene la lettura multipla dal disco, quando l'utente cambia criteri e parametri?

Se sì, il cambiamento è fatto da qualche algoritmo o manualmente su qualche base soggettiva?

 
Candid:

Tradizionalmente rallento la mattina :).

Una sequenza ci starà nella memoria o c'è già un problema?

Se è il primo, quando avviene la lettura multipla dal disco, quando l'utente cambia criteri e parametri?

Se sì, il cambiamento è fatto da qualche algoritmo o manualmente su qualche base soggettiva?

Un milione di sequenze.

E poi in ognuno di essi si trova un punto con la data giusta e si analizza la storia precedente.

E viene scelta la migliore delle sequenze.

E passa al punto successivo della "storia".

 
Penso che se non si vuole disturbare gli utenti finali con l'installazione di DBMS, allora c'è un'opzione per sintetizzare diversi (una dozzina) criteri K tipici (per esempio, chiamarli trading conservativo, trading aggressivo, ecc.) e metterli effettivamente nell'algoritmo, calcolare una volta per tutte le sequenze il cambiamento dell'indicatore selezionato nel tempo e quindi lavorare con vettori unidimensionali.
 
marketeer:
Penso che se non vuoi disturbare gli utenti finali con l'installazione di DBMS, puoi sintetizzare diversi (una dozzina) criteri K tipici (per esempio, chiamali trading conservativo, trading aggressivo, ecc.) e salvarli effettivamente nell'algoritmo, calcolare una volta per tutte le sequenze il cambiamento dell'indicatore selezionato nel tempo e poi lavorare con vettori unidimensionali.

Diciamo che ci sono solo 2 criteri.

Ma ci sono diversi parametri che impostano il criterio, e ognuno può assumere un valore diverso.

Anche se prendiamo molto approssimativamente diversi valori di ogni parametro, otterremo non un vettore unidimensionale, ma un array a 3 o 4 dimensioni.

Allora non c'è abbastanza memoria di sicuro =)

 
komposter:

Un milione di sequenze.

E poi in ognuno di essi si trova un punto con la data giusta e si analizza la storia precedente.

E viene scelta la migliore delle sequenze.

E passa al punto successivo della "storia".

L'intera sequenza viene caricata in memoria. Poi "trova il punto con la data desiderata e analizza la storia precedente". Il valore del criterio viene confrontato con il migliore ottenuto. Se meglio, si ricorda il criterio e cosa sapere della migliore sequenza. Poi la sequenza successiva viene caricata al posto di quella elaborata. E così via un milione di volte.

Il file viene letto in modo sequenziale e solo una volta.

Cosa c'è che non va?

 
Candid:

L'intera sequenza viene caricata in memoria. Poi "trova il punto con la data giusta e analizza la storia precedente". Il valore del criterio viene confrontato con il migliore ottenuto. Se meglio, si ricorda il criterio e cosa sapere della migliore sequenza. Poi la sequenza successiva viene caricata al posto di quella elaborata. E così via un milione di volte.

Il file viene letto in modo sequenziale e solo una volta.

Cosa c'è che non va?

Proprio così.

E poi la "data giusta" viene spostata del punto di chiusura dell'affare della sequenza selezionata e l'algoritmo si ripete.

E così via un altro milione di volte =)

 
komposter:

Funziona così.

E poi la "data giusta" viene spostata del punto di chiusura del trade dalla sequenza scelta e l'algoritmo viene ripetuto.

E così via un altro milione di volte =)

Ma le sequenze sono indipendenti l'una dall'altra, giusto? Allora perché non possiamo fare un ciclo di date su una sequenza caricata alla volta? Qui, tra l'altro, potrebbe essere solo un'opportunità per andare a qualche algoritmo di ricorrenza efficiente, ma questo è come la fortuna vuole. La dimensione di un milione su un milione rimarrà, e il file sarà letto una volta sola.

Naturalmente, un problema in cui il numero di passi rimane lo stesso all'iterazione successiva (cioè l'area di ricerca non si restringe mentre il calcolo procede) non sembra molto robusto. Ma questo è soggettivo, ovviamente.