Besoin d'aide ! Je ne peux pas résoudre le problème, je me heurte à des limitations matérielles. - page 16

 
komposter: Comment calculer le critère pour les X dernières donnes de la séquence, en ayant un tel fichier ?


Nous disposons d'un fragment du fichier dans notre mémoire, nous le parcourons et formons un échantillon de la longueur nécessaire pour calculer le critère, en ne sélectionnant que les accords qui appartiennent à la même séquence. Ensuite, nous calculons le critère sur cet échantillon. À propos, il est possible d'utiliser la récursion lors de la sélection, par idée.

Ou n'ai-je pas compris la question ?

P.S. Bien sûr, nous devons revenir en arrière sur le dossier lors de la formation de l'échantillon.

 
Candid:

Nous disposons d'un fragment du fichier dans notre mémoire, nous le parcourons et formons un échantillon de la longueur nécessaire pour calculer le critère, en ne sélectionnant que les affaires, appartenant à la même séquence. Ensuite, nous calculons le critère sur cet échantillon. À propos, il est possible d'utiliser la récursion lors de la sélection, par idée.

Ou ai-je mal compris la question ?

P.S. Bien sûr, nous devons revenir en arrière sur le dossier lors de la formation de l'échantillon.

le problème de l'insertion de nouvelles données - résolvez-le d'une manière ou d'une autre.

Pourquoi passer par là et sélectionner les chaussettes blanches plusieurs fois, s'il est plus facile d'aller jeter les blanches dans un panier et les noires dans un autre, puis de demander qui est là et combien.

 
komposter:

Un morceau est lu. La taille du morceau est déterminée par le nombre de transactions jusqu'à la date de recherche qui étaient dans une séquence particulière.

D'ailleurs, si le point de départ de chaque séquence est connu, les dates souhaitées peuvent être recherchées par recherche binaire, puisque les transactions sont ordonnées par temps.
 
ALXIMIKS:

le problème de l'insertion de nouvelles données - résolvez-le d'une manière ou d'une autre.

pourquoi passer par plusieurs fois et choisir des chaussettes blanches alors qu'il est plus facile d'aller jeter du blanc dans un panier du noir dans un autre et de demander ensuite qui est là et en quelle quantité.

Trop de données, c'est aussi mauvais :)

Le problème est que ce ne sont pas les Blancs et les Noirs qui sont sélectionnés ici, mais ceux qui sont localement plus blancs. Donc, calculer le degré global de noirceur ne sauve rien. D'ailleurs, j'ai commencé dans ce fil de discussion juste avec une suggestion de calcul continu du critère.

P.S. Au fait, personne n'empêche de traiter certains fichiers ensemble - un simple cache pour chacun d'eux devra faire moins. Mais il semble avoir une réserve sur la taille du cache.

C'est-à-dire que les nouvelles données peuvent simplement être accumulées dans un autre fichier.

P.P.S. À propos, le fait de découper le fichier en plusieurs fichiers plus petits facilitera le problème du tri.

 
komposter:

1. Si le Criterion était statique... Et si ses paramètres changent ?

2. Oui, alors il y aura un échange. Mais le recalcul ne sera nécessaire que pour les données les plus récentes, il n'y a pas besoin de secouer tout l'historique.

3. C'est un outil...

4. Exactement.

1. à partir de ce que j'ai dit plus haut"Soit le critère est le profit moyen des 20 dernières transactions de la séquence."Il faut comprendre cela comme un seul critère, l'attente mobile de bénéfices. Quels sont les autres ?

Dans la base de données, générez une table avec l'identifiant de la séquence et les moyennes mobiles correspondantes. Les séquences qui ne répondent pas aux conditions doivent être supprimées immédiatement. Cette opération doit être effectuée par une procédure en mode simultané au niveau du SGBD, à la demande du robot, l'état du processus étant affiché dans le robot.

Disons, FilterAvgProfit (pProfitValue, pTrades, pDeviation),

où pProfitValue est le bénéfice cible, pTrades est le nombre de transactions pour le bénéfice de la moyenne mobile, pDeviation est l'écart autorisé par rapport à pProfitValue.

Le résultat - un tableau rempli avec les ID des séquences et les valeurs moyennes du bénéfice.

De même, vous pouvez écrire des procédures stockées pour chacun des critères.

2. Si une partie des données est éliminée (utilisez "fresh data" plutôt que 1million), cela donnera un gain de performance.

3. Ce n'était pas très clair dans la déclaration. Maintenant ok.

4. Je comprends que si nous examinons une sélection de stratégies, cette opération ne devrait pas être effectuée trop souvent (disons, sur chaque barre ou immédiatement avant d'ouvrir un ordre). Cette approche est raisonnable si la stratégie actuelle présente N trades perdants d'affilée - alors nous pouvons en choisir une autre et il faudra du temps pour "prendre une décision", il n'y a rien à éviter. Vous pouvez également effectuer cette sélection une fois par semaine (le week-end, lorsque le marché est fermé), et confirmer la stratégie actuellement sélectionnée ou passer à une autre. Il est possible de dresser une liste des stratégies optimales recommandées pour un trader, dans des conditions données. Ensuite, à l'ouverture du marché et à tête reposée (le lundi), le trader confirmera son choix (ou plus tôt, avant l'ouverture du marché... l'alerte e-mail, etc.).

Quelque chose comme ça.

 

Память выделяется однократно для массива структур последовательностей.

La structure de la séquence comprend : le numéro, le tableau des structures de tous les accords de la séquence [X], la valeur du critère, la position du pointeur de fichier.

L'étape suivante consiste uniquement à remplir les éléments de la structure (y compris les tableaux d'affaires). Les transactions du tableau sont décalées, de sorte qu'il n'y a toujours que X transactions de chaque séquence en mémoire.

Vous allouez de la mémoire pour un tableau de structures et obtenez :

le réseaunon,

tableau de tableaux de structures de tous les accords de la séquence [X],

un tableau de valeurs de critères,

un tableau de positions de pointeurs de fichiers.

Pourquoi avez-vous besoin d'untableau de valeurs de critère et d'untableau de positions d'index de fichier? (Avez-vous pensé à stocker un Criterion et le dernier commerce ?)

Est-ce que j'ai bien compris ?

Premier passage - recherche sur l'intervalle de 0 à SeekDate

puis trouver le meilleur critère etFindDate = heure de clôture de la transaction + 1

rechercher maintenant l'intervalle entre"l'heure de clôture du marché" et laSeekingDate ?

et vous devez avoir X transactions dans cet intervalle pour calculer le critère pour chaque séquence ?

 
komposter:

Partager les résultats de mes recherches.

Le fichier cache binaire de 7529 MB se lit :

  • Depuis le disque dur : en 212,3 sec (35,46 Mo/sec)
  • Depuis le disque RAM : en 88,1 sec (85,46 MB/sec)
Il est difficile de qualifier la différence de cosmique, bien que j'aie le disque dur le plus courant (bien que la mémoire ne soit pas rapide non plus).

Conclusion : la vitesse de lecture d'un gros fichier avec RAMdisk est d'environ 2.5x.

Résultats étranges.

Voici une image de notre système de serveur en fonctionnement sous charge :

  • avec SSD : 200 Mb par seconde, NTFS
  • avec RAM : 2000-2500 Mb par sec, FAT32, Softperfect RAM Disk 3.4.5

Sans disques RAM, il faut plusieurs fois plus de temps pour construire des projets.

 
Renat:

Résultats étranges.

Voici une image de notre système de serveur de production sous charge :

  • avec SSD : 200 Mb par seconde, NTFS
  • avec RAM : 2000-2500 Mb par seconde, FAT32, Softperfect RAM Disk 3.4.5

Sans disques RAM, il faut plusieurs fois plus de temps pour construire des projets.

C'est ce que je disais - les gros fichiers doivent être lus par gros morceaux, sinon les petits fichiers peuvent prendre jusqu'à 10 fois ou plus de temps.
 
papaklass:

À mon avis, la solution au problème réside dans le codage des données brutes.

Si vous ne pouvez pas vous permettre de lire les données brutes plusieurs fois, vous devez les convertir dans un format acceptable pour les lectures multiples.

Une option possible consiste à convertir chaque enregistrement en un nombre de 16 bits. Chaque champ de l'enregistrement original doit se voir attribuer un nombre spécifique de bits dans le numéro. Par exemple :

Le chiffre le plus significatif du nombre :

- "0" signifie un résultat négatif de la transaction;

- "1" indique un résultat positif d'une transaction.

le chiffre inférieur du numéro :

- "0" indique une transaction d'ACHAT ;

- "1" signifie une opération de VENTE.

et ainsi de suite.

Ainsi, au lieu de lire de manière répétée le fichier source avec de nombreux champs, le travail est réduit à la lecture répétée d'un seul champ numérique, ce qui devrait donner un gain de vitesse significatif.

Dans l'ensemble, le fichier source peut être immédiatement généré dans un format codé, même si les informations qu'il contient apparaissent sous une forme non visuelle.

Mais pas en "16 bits" mais en 64 bits, Andrew a un processeur x64, donc l'unité minimale de volume lors de l'accès à la mémoire est de 64 bits. Même si vous lisez un octet de la mémoire, le processeur lira toujours 8 octets (deux mots doubles).

 
komposter:

Oui, sous cette forme, la tâche est parallèle - chaque fois quele SeekDate change,vous pouvez exécuter une recherche simultanée du meilleur critère sur différentes parties de l'ensemble de séquences. Par exemple, nous les divisons en 20 parties et confions la tâche à 20 conseillers experts. Et ils doivent lire le dossier, trouver l'accord, et ne renvoyer que la meilleure séquence (№№, Critère et position du dossier).

Merci beaucoup !

Et voilà, une autre chose))

Raison: