GROS problème d'agregation, j'ai besoin d'AIDE, SVP !!!!

Résolu
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013 - 1 sept. 2006 à 16:13
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013 - 4 sept. 2006 à 10:46
Bonjour à tous, j’ai un gros problème avec un algo d’agregation àfaire en VBA sous Excel<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>






 






Dans une feuille excel j’ai une liste avec une colonne comprenant des heures, une colonne comprenant des données (cours d’action), et une troisième colonne comprenant d’autres données (les volumes traités) :





04:45:36.145    85.4   150





04:45:36.141    85.4   260





04:45:36.139    85.3   320





04:45:36.138    85.2   140





04:45:36.134    85.1   169






 






Le but est d’agréger les trades de la manière suivante :





Tous les trades distants de moins d’un dixième de seconde sont agrégés en un seul trade si le cours est identiques entre les trades ou si l’évolution du cours est monotone.





Le volume obtenu pour chaque agrégation se calcule en faisant la somme des volumes des trades agrégés.





Et le cours obtenu pour chaque agrégation se calcule en faisant une moyenne pondérée des cours par les volumes et en arrondissant au centième.






 






Voila un exemple de ce que je souhaiterai obtenir :






 







04:45:36.145    85.4   150







04:45:36.141    85.4   260







04:45:36.139    85.3   320







04:45:36.138    85.2   140







04:45:36.136    85.1   169







04:45:36.124    85.1   150







04:45:36.046    85.1   260






04:45:36.040    85.1   320





04:45:36.039    85.2   140





04:45:36.027    85.2   169





04:45:36.023    85.3   260






04:45:36.019    85.1   320







04:45:36.017    85.1   140







04:45:35.920    85.1   169







 






Ainsi on va agrègé les 7 premiers trades ensembles puisqu’ils sont dans le même dixième de seconde et que les cours évoluent dans le même sens





On agrège ensuite les 4 trades suivant pour les mêmes raisons.





Enfin on agrege ensemble les trois derniers trades puisque l’évolution du cours a changé de sens (on est passé à une baisse du cours) et que ces trades sont compris dans le même dixième de seconde.






 






On obtient alors :






 






04:45:36.145    85.24   1449





04:45:36.040    85.20   889





04:45:36.019    85.1    629






 







 






Donc le premier problème est que Excel ne gère pas les millisecondes, donc j’ai codé une petite macro qui transforme les heures en secondes et je travaille directement avec les secondes.





L’exemple sur lequel je travaille est le suivant :






 







 








09:31:13.142

,
34273.142

,
0.82

,
68

,

----

 09:31:13.141

,
34273.141

,
0.83

,
105

,

----

 09:31:13.140

,
34273.14

,
0.83

,
88

,

----

 09:31:10.139

,
34270.139

,
0.84

,
99

,

----

 09:31:09.138

,
34269.138

,
0.85

,
189

,

----

 09:31:09.137

,
34269.137

,
0.85

,
75

,

----

 09:31:08.136

,
34268.136

,
0.84

,
203

,

----

 09:31:03.135

,
34263.135

,
0.84

,
19

,

----

 09:31:02.134

,
34262.134

,
0.84

,
58

,

----

 09:31:01.133

,
34261.133

,
0.84

,
108

,

----

 09:30:56.132

,
34256.132

,
0.83

,
3

,

----

 09:30:56.131

,
34256.131

,
0.84

,
7

,

----

 09:30:55.130

,
34255.13

,
0.84

,
72

,

----

 09:30:55.129

,
34255.129

,
0.84

,
34

,

----

 09:30:54.128

,
34254.128

,
0.85

,
6

,

----

 09:30:52.127

,
34252.127

,
0.85

,
63

,

----

 09:30:52.126

,
34252.126

,
0.85

,
23

,

----

 09:30:49.125

,
34249.125

,
0.85

,
25

,

----

 09:30:48.124

,
34248.124

,
0.85

,
7

,

----

 09:30:46.123

,
34246.123

,
0.85

,
34

,

----

 09:30:46.122

,
34246.122

,
0.85

,
20

,

----

 09:30:46.121

,
34246.121

,
0.85

,
31

,

----

 09:30:46.120

,
34246.12

,
0.85

,
1

,

----

 09:30:45.119

,
34245.119

,
0.85

,
14

,

----

 09:30:45.118

,
34245.118

,
0.85

,
4

,

----

 09:30:44.117

,
34244.117

,
0.87

,
18

,

----

 09:30:43.116

,
34243.116

,
0.87

,
39

,

----

 09:30:43.115

,
34243.115

,
0.87

,
27

,

----

 09:30:42.114

,
34242.114

,
0.85

,
23

,

----

 09:30:42.113

,
34242.113

,
0.85

,
3

,

----

 09:30:42.112

,
34242.112

,
0.86

,
13




 







 






Bon voila le problème, je galere dessus depuis pas mal de temps, donc si quelqu’un peut m’aider ce serait super sympa.






 






Merci à tous !!!






 






Peupeu




 

4 réponses

cs_Dowin Messages postés 11 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 15 avril 2008
2 sept. 2006 à 17:51
Salut
J'ai essayé un truc a toi de voir si ca marche chez toi et surtout si c'est ce que tu cherches.

Sur la feuille 1 j'ai les trades et un CommandButton1 et la feuille 2 affiche l'agrégation.
Voila le code :

Dim IndexHeure As Integer
Dim Ligne As Integer
Dim LigneAffichage As Integer
Dim CoursMontant As Boolean
Dim CoursDescendant As Boolean
Dim CoursMonotone As Boolean


Private Sub AnalyseCours()


Do


If Worksheets(1).Cells(Ligne, 2) <> Worksheets(1).Cells(Ligne - 1, 2) Then
   
    If Worksheets(1).Cells(Ligne, 2) > Worksheets(1).Cells(Ligne - 1, 2) Then
        CoursMontant = True
        CoursMonotone = False
       
        If CoursMontant = CoursDescendant Then
            If CoursMonotone = False Then
                Agregation
                IndexHeure = Ligne
            End If
        End If
       
        CoursDescendant = False
    Else
        CoursDescendant = True
        CoursMonotone = False
       
        If CoursMontant = CoursDescendant Then
            If CoursMonotone = False Then
                Agregation
                IndexHeure = Ligne
            End If
        End If
       
        CoursMontant = False
    End If
   
Else
    CoursMonotone = True
End If


AnalyseHeure


Ligne = Ligne + 1


Loop Until Worksheets(1).Cells(Ligne, 1) = ""


Agregation


End Sub


Private Sub AnalyseHeure()


If (Worksheets(1).Cells(IndexHeure, 1) * 24 * 60 * 60) - (Worksheets(1).Cells(Ligne, 1) * 24 * 60 * 60) > 0.1 Then


    Agregation
    IndexHeure = Ligne
   
    CoursMontant = False
    CoursDescendant = False
    CoursMonotone = True
   
End If


End Sub


Private Sub CommandButton1_Click()


CoursMontant = False
CoursDescendant = False
CoursMonotone = True


IndexHeure = 1
Ligne = 2
LigneAffichage = 1


AnalyseCours


End Sub


Private Sub Agregation()


For i = IndexHeure To Ligne - 1
    Volume = Volume + Worksheets(1).Cells(i, 3)
    Cours = Cours + (Worksheets(1).Cells(i, 2) * Worksheets(1).Cells(i, 3))
Next i


Worksheets(2).Cells(LigneAffichage, 1) = Worksheets(1).Cells(IndexHeure, 1)
Worksheets(2).Cells(LigneAffichage, 2) = Format(Cours / Volume, "########0.00")
Worksheets(2).Cells(LigneAffichage, 3) = Volume


LigneAffichage = LigneAffichage + 1


End Sub

j'ai les fichiers excel que je peux t'envoyer par mail si tu veux.
Dorian
3
cs_Kobaya Messages postés 2 Date d'inscription vendredi 5 novembre 2004 Statut Membre Dernière intervention 3 septembre 2006
2 sept. 2006 à 16:16
bonjour Peupeu,

il faut d'abord qur tu définisses "monotone" : est-ce 1/10e du cours, plus, moins ?

pour la gestion des secondes, j'ai Excel 200 et windows 2000 SP4, et en utilisant le format "hh:mm:ss.00", on voit jusqu'au 1/100e, donc à priori c'est bon, non ?
prends comme référence Dep heure de départ + 1 seconde (ex. :A1+"00:00:01"). Parcours ensuite la liste, et tant que l'heure est inférieure à Dep, tu agrèges.
0
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013
4 sept. 2006 à 09:39
Merci les gars pour votre aide.
Dowin merci pour ton code, je vais le tester de suite, par contre si'il ya moyen de me filer ta feuille excel, ca le ferait grave ( je t'ai envoyé mon adresse par message privé)

Et pour Kobaya, je crains que ca le fasse pas avec les centièmes car je dois gérer des heures qui sont précises au millième.
Sinon monotone signifie que dans le même dixième de seconde si le cours évolue, il doit évoluer dans le même sens (augmenter ou baisser).
Par exemple si dans un même dixième le cours baisse, et qu'à l'instant suivant (toujours dans le même dixième) le cours se met à grimper, alors l'évolution n'est plus monotone, du coup on débute une nouvelle agrégation.

J'espère que j'ai été assez clair.
Sinon dans l'exemple que j'ai filé dans mon premier message, on peut voir que les 7 dernières lignes sont situées dans le même dixième, pourtant on va égréger les lignes en deux groupes. Un premier contiendra les quatres premières lignes (car le cours évolue de manière croissante) et le second contiendra les trois derniers (car le cours s'est mis à baisser).

Voila, merci et Dowin si tu peux m'envoyer ta feuille excel ce serait mortel.

++

Peupeu
0
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013
4 sept. 2006 à 10:46
Dowin, je viens de tester ton code, et je crois bien que c'est exactement ce que je cherchais, donc c'est nikel nikel.
Je vais vérifier tous les ptits détails, mais je crois avoir bien compris comment t'as fait, donc je devrais pouvoir m'en sortir.
Si je galere je re posterai un message.

Merci beaucoup !!!
0
Rejoignez-nous