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

 
elugovoy:

Yurichik, je voulais dire sans avoir à manipuler le traitement des fichiers, la compression, etc. Je travaille uniquement avec SQL et la logique des robots/indicateurs. J'ai travaillé avec de nombreuses bases de données, le seul problème étant de faire fonctionner ensemble MQL et SQL)). J'ai créé une solution agréable à regarder sans tableaux ni structures.

En général, je préfère ne pas réinventer la roue et résoudre les problèmes par les meilleurs moyens.

Zhenya oui, je t'ai eu...

C'est exactement ce que je préfère

... surtout si un outil professionnel est disponible... il est préférable d'intégrer joliment...

 

Quelle discussion ! Merci à tous pour votre participation !

Je vais répondre à tout le monde en même temps, en essayant de ne rien oublier (ni personne).

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

Il m'a fallu un certain temps pour réaliser que je n'avais pas spécifié la version du terminal. Je travaille avec 4, et je ne vais pas encore migrer cette EA vers 5. MT4, malheureusement, est uniquement en 32 bits.

Lasuppression de la limitation de la mémoire à 4 Go sur Windows 8/8.1 32 bits ne sera d'aucune utilité, mon système étant déjà en x64.

2. Couper en morceaux / lire en pièces détachées / charger de petits blocs

Cela ne fonctionnera pas pour les conditions de la tâche.

Je vais essayer de donner plus de détails ci-dessous, peut-être cela permettra-t-il de mieux comprendre le problème.

3. Acheter plus de mémoire / louer un serveur puissant ou un cloud / tout transférer sur SSD

Je vais bien sûr mettre 16 Go de mémoire supplémentaire dans les emplacements disponibles, mais ce n'est pas la solution.

Ce volume n'est pas la limite, et l'augmentation de la capacité ne résoudra qu'un cas particulier du problème.

Je pense qu'on ne devrait y avoir recours que lorsqu'on est certain qu'il s'agit d'une pression algorithmique à 100%.

4. Compresser les données

C'est ce que je fais maintenant.

Le cache du texte (qui représente 20 Go) a été compressé par un facteur de 2, et le sera probablement encore.
Il ne résout pas le problème de la taille de la mémoire, mais il se rapproche de certaines autres solutions (disque RAM).

Je vais aussi le convertir en binaire, cela accélérera la lecture et réduira le volume.


Lamanière dont les assistants dehttp://www.nanex.net/historical.htmlcompriment les données n'est pas claire. Leurs structures de données sont assez redondantes.

5. Compresser/encoder les données et décompresser/décompresser le morceau souhaité avant de l'utiliser.

Accepté comme une option.

Mais quelque chose me dit que cela prendra aussi beaucoup de temps (ici, nous allons nous laisser submerger par le processeur).

6. Transfert du calcul vers un programme externe(Matlab/R/etc).

Je ne veux pas, il y a de nombreuses raisons.

A moins qu'il ne soit dans un environnement bien intégré avec MT. Mais cela prendrait quand même du temps pour apprendre le logiciel/environnement et/ou commander la solution à un développeur tiers. C'est peu pratique et coûteux au stade du développement (ce que je suis).

Bref, j'essaie de rester dans le bac à sable pour l'instant, avec tous ses avantages et ses inconvénients.


7. Créer un fichier d'index et travailler avec des index

Je ne vois pas comment cela peut aider.

Il faut toujours récupérer les données du fichier principal de manière répétée (en le relisant constamment).


8. Utiliser une base de données

Une option très tentante, étant donné :

  • évolutivité et portabilité (vous pouvez louer un serveur ou simplement connecter un PC voisin) ;
  • l'automatisation et le bon déroulement de nombreux processus qui, autrement, doivent être effectués manuellement sur un chiffon ;
  • et d'autres avantages.

Mais il y a quelques inconvénients :

  • Un environnement relativement nouveau pour moi (je n'ai pas travaillé en profondeur, seulement des requêtes de base) ;
  • La complexité de l'installation sur une seule machine cliente (version autonome) ;
  • Probablement quelque chose d'autre.
Quoi qu'il en soit, si les autres options ne fonctionnent pas, je reviendrai probablement à celle-ci.


9. Comprendre et tester les termes nouveaux et obscurs

C'est juste une note à moi-même pour l'avenir et / ou une demande de plus d'informations aux auteurs ;)

Reste à découvrir : le mappage de fichiers, lessolutions basées sur le hachage, les arbres B.


10. Déplacer le terminal avec tous les caches vers un disque RAM virtuel

Jusqu'à présent, c'est l'option la plus prometteuse (en termes de rapport coût/bénéfice).

RAM Disk de SoftPerfect installé, je vais terminer la compression du cache, réécrire le calculateur pour une lecture permanente des fichiers et vérifier les performances.

11. Faites bien votre travail =)

Très bon conseil, surtout si l'on considère le manque d'informations sur les entrées.

Comme promis, je vais essayer de donner plus de détails.

Il existe de nombreuses séquences de transactions similaires, chaque séquence étant classée par ordre chronologique.

Les transactions dans les différentes séquences sont différentes et distribuées de manière inégale dans le temps (et d'une manière différente dans chaque séquence). Le nombre de transactions est différent. Mais ils sont tous dans l'intervalle de Date1 à Date2.

La tâche est de passer de D1 à D2 avec un pas de M minutes (ou mieux - exactement par points de faire des trades de toutes les séquences), trouver une séquence qui est meilleure que les autres par le critère K (une tâche séparée - non seulement pour trouver la meilleure séquence, mais pour trier l'ensemble par critère et sortir le top 10 - mais c'est une option, pas encore requis).

Le critère K est calculé sur la base de X transactions précédentes de la séquence correspondante, presque toutes les informations sur chacune des X transactions sont utilisées dans les calculs (le profit seul, par exemple, n'est pas suffisant).


Le critère (K), le nombre d'affaires (X) et d'autres paramètres influençant les résultats sont modifiés par un utilisateur. C'est-à-dire qu'ils ne peuvent pas être "écrits" dans l'algorithme.

Quelque chose comme ça.

En idée, nous pouvons restructurer le fichier pour le rendre linéaire pour tous les métiers de toutes les séquences.

Mais comment le faire sans mettre toutes les informations en mémoire ? Et ensuite, comment puis-je recalculer le Criterion, si les transactions d'une séquence sont "étalées" sur tout le fichier ?

Maintenant, espérons-le, la tâche est claire.

Encore une fois, merci beaucoup pour votre participation, vos discussions, vos questions, vos liens et vos réponses concrètes :

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

Merci !

 
komposter:

Quelle discussion ! Merci à tous pour votre participation !

....

Une option très tentante, compte tenu de la situation :

  • Évolutivité et portabilité (vous pouvez louer un serveur ou simplement connecter un PC voisin) ;
  • l'automatisation et le bon déroulement de nombreux processus qui, sinon, doivent être effectués manuellement sur les genoux ;
  • et d'autres avantages.

Mais il y a quelques inconvénients :

  • Un environnement relativement nouveau pour moi (je n'ai pas travaillé en profondeur, seulement des requêtes de base) ;
  • La complexité de l'installation sur une seule machine cliente (version autonome) ;
  • Probablement quelque chose d'autre.
En général, si les autres options ne fonctionnent pas, je reviendrai probablement à celle-ci.


Si nous allons dans la direction de SQL


  • Environnement relativement nouveau pour moi (je n'ai pas travaillé de près, seulement des requêtes de base) ;

Cela peut être un frein à l'apprentissage.

Si vous choisissez cette variante, il est préférable de construire toute la logique d'entreprise avec des procédures stockées.

ne laissant au conseiller expert que deux fonctions - envoyer une requête au serveur et obtenir un résultat complètement terminé.

tous les calculs sur le serveur

  • La complexité de l'installation sur une seule machine cliente (version autonome) ;

En fait, le réseau peut trouver de nombreuses descriptions de la façon de mettre le serveur SQL

( ORACL, SYBASE + CENTOS par exemple ) ORACL, SYBASE, MS SQL+WINDOWS machine séparée

ORACL est un peu plus difficile à apprendre - moins d'experts, moins de littérature.

MS SQL - peut-être la plus grande quantité d'informations et plus de littérature sur le web.

il n'y aura pas de difficultés - il y a de nombreuses descriptions sur le web et plus de livres dans la boutique.

MSSQL 2012 par ses paramètres est très proche d'ORACL - déjà en 2014.

SQL + LINUX est généralement choisi pour fonctionner dans un environnement de production - si vous ne connaissez pas LINUX, il est préférable d'utiliser WINDOWS.

 

komposter:

Il existe de nombreuses séquences de transactions similaires, chaque séquence étant classée par ordre chronologique.

Les transactions dans les différentes séquences sont différentes, distribuées de manière inégale dans le temps (et d'une manière différente dans chaque séquence). Le nombre de transactions est différent. Mais ils sont tous dans l'intervalle de Date1 à Date2.

La tâche est de passer de D1 à D2 avec un pas de M minutes (ou mieux - exactement par points de faire des trades de toutes les séquences), trouver une séquence qui est meilleure que les autres par le critère K (une tâche séparée - non seulement pour trouver la meilleure séquence, mais pour trier l'ensemble par critère et sortir les 10 meilleurs - mais c'est une option, pas encore nécessaire).

Le critère K est calculé sur la base de X transactions précédentes de la séquence correspondante, presque toutes les informations sur chacune des X transactions sont utilisées dans les calculs (le profit seul, par exemple, n'est pas suffisant).


Le critère (K), le nombre d'affaires (X) et d'autres paramètres influençant les résultats sont modifiés par un utilisateur. C'est-à-dire qu'ils ne peuvent pas être "écrits" dans l'algorithme.

Quelque chose comme ça.

En idée, nous pouvons restructurer le fichier pour le rendre linéaire pour tous les métiers de toutes les séquences.

Mais comment le faire sans mettre toutes les informations en mémoire ? Et ensuite, comment puis-je recalculer le Criterion, si les transactions d'une séquence sont "étalées" sur tout le fichier ?

Maintenant, j'espère, la tâche est claire.

Traditionnellement, je suis en train de ralentir le matin :).

Une séquence tiendra-t-elle dans la mémoire ou y a-t-il déjà un problème avec celle-ci ?

Dans le premier cas, quand les lectures multiples du disque se produisent-elles, lorsque l'utilisateur modifie les critères et les paramètres ?

Si oui, le changement est-il effectué par un algorithme ou manuellement sur des bases subjectives ?

 
Candid:

Traditionnellement, je suis en train de ralentir le matin :).

Une seule séquence tiendra-t-elle dans la mémoire ou cela pose-t-il déjà un problème ?

Dans le premier cas, quand les lectures multiples du disque se produisent-elles, lorsque l'utilisateur modifie les critères et les paramètres ?

Si oui, le changement est-il effectué par un algorithme ou manuellement sur des bases subjectives ?

Un million de séquences.

Puis, dans chacun d'eux, un point avec la bonne date est trouvé et l'historique précédent est analysé.

Et la meilleure des séquences est choisie.

Et il passe au point suivant de l'"histoire".

 
Je pense que si vous ne voulez pas embêter les utilisateurs finaux avec l'installation d'un SGBD, alors il y a une option pour synthétiser plusieurs (une douzaine) critères K typiques (par exemple, les appeler trading conservateur, trading agressif, etc.) et les mettre réellement dans l'algorithme, calculer une fois pour toutes les séquences le changement de l'indicateur sélectionné dans le temps et ensuite travailler avec des vecteurs unidimensionnels.
 
marketeer:
Je pense que si vous ne voulez pas embêter les utilisateurs finaux avec l'installation d'un SGBD, vous pouvez synthétiser plusieurs (une douzaine) critères K typiques (par exemple, les appeler trading conservateur, trading agressif, etc.) et les enregistrer réellement dans l'algorithme, calculer une fois pour toutes les séquences le changement de l'indicateur sélectionné dans le temps et ensuite travailler avec des vecteurs unidimensionnels.

Disons qu'il n'y a que 2 critères.

Mais il y a plusieurs paramètres qui définissent le critère, et chacun peut prendre une valeur différente.

Même si nous prenons très approximativement plusieurs valeurs de chaque paramètre, nous n'obtiendrons pas un vecteur unidimensionnel, mais un tableau à 3 ou 4 dimensions.

Alors il n'y a pas assez de mémoire, c'est sûr =)

 
komposter:

Un million de séquences.

Puis, dans chacun d'eux, un point avec la bonne date est trouvé et l'historique précédent est analysé.

Et la meilleure des séquences est choisie.

Et il passe au point suivant de l'"histoire".

La séquence entière est chargée en mémoire. Ensuite, il "trouve le point avec la date souhaitée et analyse l'historique précédent". La valeur du critère est comparée au meilleur résultat obtenu. Si c'est mieux, on se souvient du critère et de ce qu'il faut savoir sur la meilleure séquence. Ensuite, la séquence suivante est chargée à la place de la séquence traitée. Et ainsi de suite un million de fois.

Le fichier est lu séquentiellement et une seule fois.

Qu'est-ce qui ne va pas ?

 
Candid:

La séquence entière est chargée en mémoire. Ensuite, il "trouve le point avec la bonne date et analyse l'historique précédent". La valeur du critère est comparée au meilleur résultat obtenu. Si c'est mieux, on se souvient du critère et de ce qu'il faut savoir sur la meilleure séquence. Ensuite, la séquence suivante est chargée à la place de la séquence traitée. Et ainsi de suite un million de fois.

Le fichier est lu séquentiellement et une seule fois.

Qu'est-ce qu'il y a ?

C'est vrai.

Ensuite, la "bonne date" est décalée du point de clôture de la transaction de la séquence sélectionnée et l'algorithme se répète.

Et ainsi de suite un million de fois de plus =)

 
komposter:

C'est comme ça.

Ensuite, la "bonne date" est décalée du point de clôture de la transaction de la séquence sélectionnée et l'algorithme est répété.

Et ainsi de suite un million de fois de plus =)

Mais les séquences sont indépendantes les unes des autres, non ? Alors pourquoi ne pouvons-nous pas faire un cycle de dates sur une seule séquence chargée à la fois ? D'ailleurs, c'est peut-être l'occasion de passer à un algorithme de récurrence efficace, mais c'est le hasard qui veut ça. La taille d'un million sur un million sera conservée, et le fichier sera lu une fois.

Bien sûr, un problème où le nombre d'étapes reste le même à l'itération suivante (c'est-à-dire que la zone de recherche ne se rétrécit pas au fur et à mesure du calcul) ne semble pas très robuste. Mais ceci est subjectif, bien sûr.

Raison: