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

 
komposter:

...

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

Una sequenza ci starà nella memoria?

Puoi scrivere un Expert Advisor. All'inizio, l'Expert Advisor carica la sequenza # (parametro nella finestra delle proprietà) e fa trading su questa sequenza. Ottimizzare №.

Il compito non è molto chiaro, mentre molte cose diverse possono essere implementate.

 
Integer:

Una sequenza ci starà nella memoria?

Potete scrivere un Expert Advisor. L'Expert Advisor carica la sequenza n. all'avvio (parametro nella finestra delle proprietà) e fa trading su questa sequenza. Ottimizzare №.

Il compito non è del tutto chiaro, mentre molte cose diverse possono essere fanatizzate.

Se abbiamo 20Gb (21 474 836 480 byte), con 1 milione di sequenze, otteniamo circa 21 475 byte in media per sequenza (~21Kb). Penso che dovrebbe entrare nella memoria, anche nel telefono ))

О. A proposito, che dire del calcolo distribuito? Dovremmo pensare anche in quella direzione...

 
Credo che abbia i file della storia dei segnali).
 

Scusate ancora per la pausa, ho fatto esperimenti con l'unità RAM (non molto successo finora). Rispondere a tutti in ordine.

Candid:

Ma le sequenze sono indipendenti l'una dall'altra, giusto? Allora perché non posso fare un loop delle date su una sequenza caricata in una volta sola? 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 all'iterazione successiva rimane lo stesso (cioè l'area di ricerca calcolata non si restringe) non sembra robusto. Ma naturalmente questo è soggettivo.

Indipendente. E come entrare in un ciclo su tutte le sequenze contemporaneamente, senza caricarle in memoria?

Il numero di passi può essere ridotto, se si capisce come leggere le sequenze dal posto giusto (gli ultimi X scambi dalla data attuale analizzata).

Urain:
L'intera base si adatta a linee di 10 anni o no? tutti i file cumulativamente

Un file per milione di sequenze (scrivo ciascuno in 9 righe per comodità).

Beh, o un milione di file, non importa.

ALXIMIKS:

Ho capito bene quanto segue:

1) Un file di 20gb consiste in circa un milione di sequenze ordinate per tempo

2) La dimensione di ogni sequenza può variare e dipende dal numero di trade che la sequenza contiene

3) La dimensione media di una sequenza è 20/10^6 = 20 Mb, quindi cosa possiamo garantire per scaricare completamente una sequenza?

4) Il coefficiente K dipende solo dagli scambi all'interno della sequenza data

5) Per ogni sequenza, dobbiamo trovare K (un totale di 10^6 pezzi) e selezionare i primi 10

  1. 20K, possiamo garantire
  2. Sì, una corsa usa un Criterion con impostazioni fisse. Ma in futuro vorrei che anche le prossime corse (con un Criterio cambiato o altre impostazioni) fossero contate rapidamente.
    Fino a quando non ho avuto questi volumi, ho semplicemente scaricato tutto in memoria e l'ho eseguito in un ciclo, contando tutto ciò di cui avevo bisogno.
  3. Il valore del criterio è calcolato per ogni affare della sequenza, a partire dall'affare #X (questo è l'importo necessario per il calcolo).
    La migliore sequenza dovrebbe essere selezionata in ogni punto della storia (la migliore - sequenza con il miglior criterio al momento attuale, il criterio è calcolato utilizzando l'ultima transazione chiusa.

ALXIMIKS:

A se creiamo un altro file con i valori delle distanze tra le sequenze.

Non ho capito questo e quello successivo.

Candido:
A proposito, sì, si possono caricare lotti di sequenze in una volta sola.

Non si salverà, hai bisogno di tutti loro.

Silenzioso:

Non lo capisco da qualche parte.

Ecco il criterio - tutti - nell'intervallo da Data1 a Data2.

Cioè, si legge come segue.

Perché non spezzare il file in tanti intervalli da Data1 a Data2? Ci saranno sequenze lavorate che possono essere chiuse, giusto?

L'intervallo "Data1 - Data2" copre attualmente tutte le transazioni di tutte le sequenze.

E l'idea di dividerlo in diversi altri più piccoli è abbastanza sensata. Vero, allora dovresti leggere le informazioni dal disco ogni volta che i parametri vengono cambiati... Ma è già qualcosa.

Candido:
A quanto pare uno dei risultati del passaggio di una data singola è una nuova data.

Sì, ma penso che si possa trovare un punto in cui non ci sono accordi per nessuna delle sequenze e fare una pausa.

Poi ci sarà una transizione all'intervallo successivo. Farò un tentativo.

 
ALXIMIKS:

se il problema è questo:

data una riga 1 2 3 4 5 6 7 8 9

La larghezza è data, per esempio 4, bisogna muoversi con questa larghezza lungo tutta la fila per trovare qualche valore all'interno della larghezza (per esempio il minimo):

prima devi trovare in 1 2 3 4 poi 2 3 4 5 poi 3 4 5 6 poi 4 5 6 7 poi .... ecc.

Se X (numero di scambi) fosse fisso (4 nel tuo esempio) e non ci fossero altri parametri - sì. E così - no.

Vinin:
Pondererei questo compito

Le condizioni sono indicate sopra, benvenuto tra le nostre fila ;)

commerciante:
Dato che il problema è piuttosto accademico (come una domanda per assumere un programmatore) e molte persone hanno mostrato interesse in esso, perché non formularlo più strettamente in termini di formato di descrizione dei dati di input, e tutti potrebbero generare 20 Giga di dati di prova e presentare la loro soluzione pratica?

Nessun problema.

Genera sequenze di trade casuali (in ordine cronologico, anche di 1 anno) con tutti i loro attributi: data e ora di apertura, prezzo di apertura, SL, TP, data e ora di chiusura, prezzo di chiusura. Numera le sequenze da 1 a un milione.

Il compito è quello di creare una nuova serie di trade consecutivi tra tutti i trade di tutte le sequenze (non sovrapposti nel tempo), e selezionati da un certo criterio.

Lasciamo che il criterio sia il profitto medio degli ultimi 20 trade della sequenza.

Esempio di risultato:

  1. Sequenza #250, trade #53, criterio = 51: 2013.01.31 00:00 - 2013.02.12 12:30 (il criterio è stato calcolato per i trade #32-52, cioè il 53° non è stato usato)
  2. sequenza #1222, affare #28, criterio = 75: 2013.02.13 10:00 - 2013.02.13 02:21
  3. E così via fino alla fine dell'anno.

joo:
Quindi immagino che stiamo parlando di un tester/ottimizzatore fatto in casa?

Sì, qualcosa del genere.

sergeev:

nah, c'è qualcosa di diverso.

Immagino che qualche broker/provider abbia il database dell'affare. :)

Se solo =)

sergeev:

Ripeterò il compito in termini più semplici.

No, non lo è. Ho dato un esempio concreto, può essere considerato il più vicino possibile al problema reale.

 
elugovoy:

Tipico del database. Ma non c'è modo di farlo senza l'aggregazione dei dati. Potete scrivere in una tabella separata gli attributi unici di una sequenza (c-date), il valore medio del profitto K e la varianza D, e poi cercare le prime 10 sequenze che sono vicine ai criteri di cui avete bisogno. Con gli indici su questi campi, la ricerca non richiederà molto tempo (anche in un milione di record). Poi, quando si ottengono le 10 sequenze giuste, si può curiosare nei dati grezzi, ma non sarà più un milione di ricerche, perché abbiamo un limite di date.

Se il Criterion fosse statico...

E se i suoi parametri cambiano?

elugovoy:

È ancora un mistero - cosa dovremmo cercare? Quale dovrebbe essere il risultato di tutte le operazioni? Se stiamo parlando di prendere una decisione in termini di apertura/chiusura di un ordine, qualsiasi elaborazione di un tale volume richiederà una quantità di tempo abbastanza grande.

Sì, allora ci sarà uno scambio. Ma il ricalcolo sarà necessario solo per i dati più recenti, non abbiamo bisogno di ricalcolare l'intera storia.

elugovoy:

C'è un altro punto. Visto che stiamo parlando di accordi, forse ha senso separare gli accordi per ogni simbolo? E per scrivere robot di trading simili progettati per EURUSD, USDJPY, ecc.

È uno strumento...

elugovoy:

Mi sembra che in questo modo si possa solo identificare la strategia che è stata usata per fare trading (o l'insieme dei parametri del robot) di una certa sequenza e passare ad essa in una certa situazione di mercato.

Esattamente.

 
Integer:

Una sequenza ci starà nella memoria?

Puoi scrivere un Expert Advisor. All'inizio, l'Expert Advisor carica la sequenza n. (parametro nella finestra delle proprietà) e fa trading su questa sequenza. Ottimizzare il numero.

Lo farà.

Ma non abbiamo bisogno di un unico risultato (finale), ma di ogni punto nel tempo.

Fondamentalmente, potremmo usare la nuvola dando come parametro il numero di sequenza e la data fino alla quale leggere. Ma è difficilmente più veloce del ricalcolo di un file)

elugovoy:

О. A proposito, che dire del calcolo distribuito? Dovremmo pensare anche in questa direzione...

Cosa dobbiamo calcolare in parallelo? Valore del criterio per diverse sequenze?

Ma per questo abbiamo bisogno di caricarli in memoria. E non importa se sono caricati da un processo (Expert Advisor, terminale) o da diversi processi. Forse, potremmo avere 8 (o 12, 16, 20) invece di 4 Gb. Ma bisogna "incollare" il risultato dopo.

 
komposter:

Che cosa contiamo come parallelo? Qual è il significato del criterio per le diverse sequenze?

L'idea è di dividere tutte le storie in, diciamo, 100 gruppi e per ogni gruppo calcolare il set ottimale separatamente.

Poi, per ogni gruppo, lasceremmo solo le storie che sono nell'insieme ottimale del gruppo e procediamo al passo successivo con un numero minore di storie. Poi, teoricamente, è parallelo 100 volte.

E dalla memoria tutto va bene, la dimensione del gruppo può essere regolata

 
TheXpert:

L'idea è di dividere tutte le storie in, diciamo, 100 gruppi e per ogni gruppo calcolare il set ottimale separatamente.

Poi, per ogni gruppo, lasciate solo le storie nel gruppo ottimale impostato e procedete al passo successivo, con meno storie. Poi, teoricamente, è parallelo 100 volte.

E dalla memoria tutto va bene, la dimensione del gruppo può essere regolata

Se carichi 100 di 100 pezzi in parallelo, non c'è abbastanza memoria =)

E se si carica in modo sequenziale (ogni volta memorizzando una variante migliore), allora dov'è il parallelismo? E il file sarà ancora letto ogni volta che si va alla macchina.

Penso che sia possibile inventare un meccanismo intelligente di caricamento parziale, ma bisogna inventarlo.

Per esempio, alla prima lettura, trova per ogni passaggio l'ultimo trade chiuso prima della Start Date, torna indietro e leggi X trade precedenti, ricorda il punto del file dove finisce quel trade.

Dopo di che, trovate il primo affare nei risultati, e poi lavorate solo con dati freschi: leggete il file dal punto desiderato alla nuova data attuale, e ogni volta spostate gli affari nell'array (ottenete un array di dimensioni fisse - X elementi).

Questo risolverà il problema della lettura multipla (semplicemente non è necessario), e della memoria (solo se possiamo ospitare X milioni di transazioni).

Mi muoverò in questa direzione.

 

Passare ai file binari, tra l'altro, non ha dato quasi nessun guadagno in termini di dimensioni.

Il formato di testo che ho ottimizzato era molto compatto: la data era memorizzata un passaggio (apertura del primo trade), e tutti gli altri (sia apertura che chiusura) erano memorizzati come un offset dalla data precedente; SL, TP e PriceClose erano anche salvati come un offset dal prezzo di apertura.

Quando sono passato al formato binario non aveva senso questa ottimizzazione - lo spostamento in secondi (uint) prende tanto spazio quanto la data completa (ho rifiutato long-a, 2030 anni mi bastano), ma ushort non è sufficiente (solo 18 ore spostamento massimo). Lo stesso con i prezzi - potrei spostare l'offset a ushort, ma poi dovrei aggiungere controlli per l'overflow (se, per esempio, SL = 0), e il guadagno sarebbe solo 6 byte su tutti e 3 i prezzi. Ha deciso di non farlo.

Ma ho rimosso un po' di informazioni inutili, quindi ne ho il 20%. Dimensione prevista del file originale (che era 20Gb) - 7-8Gb, un paio d'ore per la conversione.

Beh, ho anche vinto il tempo della CPU, che è stato utilizzato per convertire le linee.