VBA - Exploitation base de données financières

Bonjour à tous,

J'aurais s'il vous plaît besoin d'un petit coup de main concernant un retraitement d'une base de données que je souhaite réaliser avec VBA.

J'ai une liste de données de 3 types : Bid (Offre de vente), Ask (Offre d'achat) et Trade (Transaction) avec, à chaque fois, la date et l'heure, le prix et le volume.

Pour chaque trade que j'ai isolé dans un nouvel onglet en utilisant le code ci-dessous;

Sub FiltreTrade()
Dim Lig As Long
Dim Col As String
Dim NbrLig As Long
Dim NumLig As Long

Sheets("Output").Activate

Col = "B"
NumLig = 0
With Sheets("BaseExemple")
NbrLig = 1029708
For Lig = 1 To NbrLig
    If .Cells(Lig, Col) = "TRADE" Then
    .Cells(Lig, Col).EntireRow.Copy
    NumLig = NumLig + 1
    Cells(NumLig, 1).Select
    ActiveSheet.Paste
    End If
Next
End With

End Sub

je souhaiterais reporter à côté le plus petit bid publié avant ce trade et le plus grand ask publié avant ce trade (Mais après le trade précédent).

Dans le cas où il n y a pas eu de nouveau bid et/ou de ask postés entre ce trade et le précédent, je souhaite reprendre le plus petit bid et/ou le plus grand ask du trade précédent.

Je ne sais pas quelle fonction utiliser ni comment aller rechercher des données dans le précédent si il n y a pas eu de nouveaux bid/ask postés.

J'ai réalisé un document "exemple" en notant à la main ce que je souhaiterais automatiser sur un million de lignes environ. Je suis débutante en VBA.

N'hésitez pas à me signaler si mon post n'est pas assez précis

Je vous remercie par avance pour vos idées/votre aide.

28classeur.xlsx (9.23 Ko)

bonjour,

Je ne comprend pas la notion de "best" : S'agit-il en fait du "last" ?

Documenter avec des exemples suffisamment variés pour faire ressortir le "best"

A+

Bonjour et merci de prendre le temps de me répondre

Non, le best n'est pas toujours le last.

Si on prend uniquement le cas du Best Bid, c'est le plus petit prix posté entre ce trade (At Time T=0) et le trade précédent (At Time T= -1). Si aucun bid n'a été posté entre le trade T=0 et le trade T= -1, on reprend le Best Bid du Trade T= -1.

Par exemple, si j'ai 3 bid postés à 6, 7 et 8€ juste avant le trade n°1, le meilleur bid est 6€. Si j'ai ensuite le trade n°2 sans autres bids dans l'intervalle, le meilleur bid est toujours 6€. Si j'ai ensuite 2 autres bid postés à 5,5 et 6€ puis le trade n°3, le meilleur bid est désormais 5,5€.

Pour le best ask, c'est le même raisonnement sauf que c'est cette fois le plus grand ask (dont le prix est le plus grand) posté entre le trade at Time T=0 et le trade précédent at Time T=-1.

Est-ce que c'est un peu plus clair ?

Merci beaucoup

Ok

Hum... J'ai cru déceler comme une erreur en F6

Bon. Je t'ai fait ça en mode bourrin : Pour un million de ligne ça te laissera le temps d'aller fumer quelques cigarettes... Mais si ton PC à suffisamment de RAM ça devrait le faire : (sinon tu me diras...)

Sub galopin()
Dim a, c(1, 6), i%, x&, y&
a = Worksheets("Base Exemple").[A1].CurrentRegion.Value
'On stocke la base dans un Array : C'est plus rapide que de parcourir une feuille de calcul
On Error GoTo GESTERRFIRSTLINE 'gère la première ligne de titre
Do 'Et on parcoure cet Array de la première à la dernière ligne
x = x + 1
   Select Case a(x, 2)  'Selon ce qu'on trouve dans la colonne 2
   Case "BID"           'on charge la valeur dans une autre variable Array c()
      If c(1, 5) = "" Then c(1, 5) = a(x, 3) Else c(1, 5) = IIf(a(x, 3) < c(1, 5), a(x, 3), c(1, 5))
   Case "ASK"
      If c(1, 6) = "" Then c(1, 6) = a(x, 3) Else c(1, 6) = IIf(a(x, 3) > c(1, 6), a(x, 3), c(1, 6))
   Case Else            'C'est un TRADE : on termeine le chargement de c
      For i = 1 To 4
         c(1, i) = a(x, i)
      Next
      With Worksheets("Output") 'et on vide c dans la ligne y
         y = y + 1
         For i = 1 To 4
            .Cells(y, i) = c(1, i)
         Next
            'C'est ici qu'intervient la gestion d'erreur
            If c(1, 5) <> "" Then .Cells(y, 5) = c(1, 5) Else .Cells(y, 5) = .Cells(y - 1, 5)
            If c(1, 6) <> "" Then .Cells(y, 6) = c(1, 6) Else .Cells(y, 6) = .Cells(y - 1, 6)
         c(1, 5) = ""      'et on réinitialise les BID et les ASK
         c(1, 6) = ""
      End With
   End Select
Loop Until x = UBound(a)
Exit Sub
GESTERRFIRSTLINE:
If y = 1 Then
   Worksheets("Output").Cells(y, 5) = "Best Bid before trade (Plus petit)"
   Worksheets("Output").Cells(y, 6) = "Best Ask before trade (Plus grand)"
   Resume Next
Else
   MsgBox "Erreur imprévue !"
End If
End Sub

A+

Merci beaucoup, je devrais m'en sortir !!

Bonjour Manon,

Comment fais-tu pour obtenir une valeur actualisée de la valeur et le volume à l'instant T ?

Merci beaucoup !

Rechercher des sujets similaires à "vba exploitation base donnees financieres"