Récupération de cours avec Java ?

Zone d'échange de sources C, C++, Java, VB, VBA et autres...

Modérateur : webmaster

gigi
Messages : 1000
Enregistré le : 09/01/2005 20:30
Localisation : Paris
Contact :

Récupération de cours avec Java ?

Message par gigi » 07/05/2006 19:04

Je souhairerai récupérer les cours via une application écrite en Java. Comment faire ? Est-ce quelqu'un a déjà fait cela et pourrait poster un exemple ?
Merci d'avcance.

Sandy Zordan
Messages : 91
Enregistré le : 06/03/2006 10:47

Message par Sandy Zordan » 08/05/2006 08:24

Bonjour, :D
J'ai le même problème technique. Lorsque je copie dans Excel des données, le programme Excel ne reconnait pas les nombres. Je dois les enregister manuellement.
SMZ

Avatar du membre
webmaster
Messages : 769
Enregistré le : 14/06/2003 15:21
Contact :

Message par webmaster » 08/05/2006 12:38

Bonjour,
Sandy Zordan a écrit :Lorsque je copie dans Excel des données, le programme Excel ne reconnait pas les nombres. Je dois les enregister manuellement.
Vous pouver utiliser les macros fournies dans le fil Téléchargement des cours / des codes reuters-sico-isin... pour récupérer les cours sous Excel sans problème.
gigi a écrit :Je souhairerai récupérer les cours via une application écrite en Java.
Si je peux me permettre : pourquoi en java ? Et pour les mettre où ensuite ? Dans une base mySQL ? Vous souhaitez récupérer les cours de clôture quotidiens ?

Webmaster

Renard du Désert
Messages : 55
Enregistré le : 21/02/2006 22:37
Contact :

Message par Renard du Désert » 08/05/2006 13:10

Le formalisme d'Euronext a changé par rapport à la dernière fonction Excel pour rappatrier les cours.

Si j'ai bien compris le fonctionnement de la fonction, elle rappatrie les pages html, puis elle recherche le début du tableau, pour ensuite reprendre les données du tableau. Je n'ai pas eu le temps de la réadapter avant hier soir (désolé, je suis loin d'etre un expert du code HTML)

voici la macro
'******************************************************************************
'* Module Cours *
'******************************************************************************
'* *
'* DESCRIPTION. : Ensemble de macros et fonctions permettant de recuperer des *
'* cours de valeurs mobilieres sur Internet. *
'* *
'* AUTEUR...... : webmaster 'La Bourse pour les nains' *
'* http://www.bnains.org/ *
'* *
'* VERSION..... : 0.1 *
'* *
'* ENVIRONNEMENT: Win32. Necessite Wininet. Compatible Excel et OpenOffice (a *
'* verifier). *
'* *
'* MACROS EXPORTEES : *
'* telechargeCours = provoque la creation d'une feuille 'valeurs' a la fin *
'* du classeur courant et y colle les cours des valeurs *
'* de cinq marches, telecharges depuis le site d'Euronext *
'* *
'* FONCTIONS EXPORTEES : *
'* getCoursValeur ( szCodeISIN ) = renvoie le cours de cloture de la valeur *
'* dont le code ISIN est passe en parametre.*
'* *
'******************************************************************************
'* MODIFIE LE : 13/06/2004 PAR Webmaster http://www.bnains.org/ *
'* DESCRIPTION DE LA MODIFICATION : *
'* Adaptation des fonctions telechargeCours() et recupereCours() suite à *
'* modification du site Euronext (fermeture site SBF remplacé par site *
'* Euronext). *
'* *
'* MODIFIE LE : ../../.... PAR ............... *
'* DESCRIPTION DE LA MODIFICATION : *
'* *
'******************************************************************************

Option Explicit
'==============================================================================
' Import
'==============================================================================
Public Declare Function InternetOpenA Lib "wininet" _
(ByVal sAgent As String, ByVal lAccessType As Long, _
ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long

Public Declare Function InternetCloseHandle Lib "wininet" _
(ByVal hInet As Long) As Integer

Public Declare Function InternetOpenUrlA Lib "wininet" _
(ByVal hInternetSession As Long, ByVal lpszUrl As String, _
ByVal lpszHeaders As String, ByVal dwHeadersLength As Long, ByVal dwFlags As Long, _
ByVal dwContext As Long) As Long

Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Public Declare Function InternetReadFile Lib "wininet" _
(ByVal hFile As Long, ByVal sBuffer As String, _
ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer

'==============================================================================
' Déclarations de constantes
'==============================================================================
Public Const INTERNET_OPEN_TYPE_DIRECT = 1
Public Const INTERNET_FLAG_RELOAD = &H80000000

Public Const COLONNE_COURS_CLOTURE = 3
Public Const COLONNE_CODE_ISIN = 1


'******************************************************************************
'* Macro telechargerCours *
'******************************************************************************
'* *
'* Description : cette macro cree une feuille 'Valeurs' a la fin du classeur *
'* courant, puis recupere les cours de differents marches. *
'* *
'******************************************************************************
Sub telechargeCours()
' ----- On efface le contenu de la feuille des valeurs -----
Dim bValeurs As Boolean
Dim i As Integer
Dim s As Worksheet

bValeurs = False
For i = 1 To Sheets.Count
If (Sheets(i).Name = "Valeurs") Then
bValeurs = True
End If
Next i

Application.DisplayAlerts = False
If (bValeurs = True) Then
Worksheets("Valeurs").Delete
End If
Set s = Sheets.Add(After:=Worksheets(Worksheets.Count))
s.Name = "Valeurs"
Application.DisplayAlerts = True

Dim iPage As Integer
' Premier marché
iPage = 1
While (iPage <> -1)
iPage = recupereCours("http://www.euronext.com/trader/pricesli ... pageIndex=" + Format(iPage), iPage)
Wend
' Second marché
iPage = 1
While (iPage <> -1)
iPage = recupereCours("http://www.euronext.com/trader/pricesli ... pageIndex=" + Format(iPage), iPage)
Wend
' Nouveau marché
iPage = 1
While (iPage <> -1)
iPage = recupereCours("http://www.euronext.com/trader/pricesli ... pageIndex=" + Format(iPage), iPage)
Wend
' Marché libre
iPage = 1
While (iPage <> -1)
iPage = recupereCours("http://www.euronext.com/trader/pricesli ... pageIndex=" + Format(iPage), iPage)
Wend
' Trackers
iPage = recupereCours("http://www.euronext.com/pricesearch/0,4 ... y=&sector=", 1)
End Sub


'******************************************************************************
'* Fonction recupereCours *
'******************************************************************************
'* *
'* Description : cette fonction recupere une page sur le site Euronext, en *
'* extrait les intitulés, codes et cours des valeurs et renvoie *
'* eventuellement la page suivante si il y en a une. *
'* Les intitulés, codes et cours des valeurs sont ajoutées dans *
'* la feuille 'valeurs' du classeur courant. *
'* *
'* Entree : URL des donnees a recuperer. *
'* *
'* Sortie : ajout de lignes dans la feuille 'Valeurs' du classeur. *
'* *
'* Retour : numero de la page suivante (parametre 'pageIndex' Euronext). *
'* *
'******************************************************************************
Function recupereCours(szUrl As String, iPage As Integer) As Integer
Dim hInternetSession As Long ' handle de la session internet
Dim hPage As Long ' handle de la page
Dim iPageSuivante As Integer

'------ On ouvre une connexion -----
hInternetSession = InternetOpenA("Wininet", 1, vbNullString, vbNullString, 0)
If (hInternetSession <> 0) Then
' ----- On ouvre la page demandee -----
hPage = InternetOpenUrlA(hInternetSession, szUrl, vbNullString, 0, _
INTERNET_FLAG_RELOAD, 0)
If (hPage <> 0) Then
Dim szBuffer As String * 32000 ' Buffer pour lecture de la page
Dim lNbOctLus As Long ' Pour recevoir le nombre d'octets lus
Dim bRet As Boolean ' Pour le code de retour de la lecture
Dim iLigne As Integer
Dim iColonne As Integer
Dim szPage As String

' ----- On cherche la premiere ligne vide -----
iLigne = 1
iColonne = 1
While (Worksheets("Valeurs").Cells(iLigne, iColonne).Value <> "")
iLigne = iLigne + 1
Wend

' ----- On lit le contenu de la page -----
szPage = vbNullString
Do
szBuffer = vbNullString
bRet = InternetReadFile(hPage, szBuffer, Len(szBuffer), lNbOctLus)
If (bRet = True) Then
szPage = szPage & Mid$(szBuffer, 1, lNbOctLus)
End If
Loop While (bRet = True And lNbOctLus <> 0)

' ----- On ferme le handle de la page -----
CloseHandle (hPage)

Dim iDeb As Long ' pointeur dans la page
iDeb = 1

' ----- On cherche le debut des donnees qui nous interessent -----
While (InStr(iDeb, szPage, "<td class=" + Chr(34) + "tableBgColor2" + Chr(34) + "><span class=" + _
Chr(34) + "tableValueName" + Chr(34) + ">") _
And _
InStr(iDeb, szPage, "?isinCode="))
Dim deb As Long
Dim fin As Long
Dim szCodeISIN As String
Dim szNom As String
Dim szCours As String

deb = InStr(iDeb, szPage, "?isinCode=")
If (deb <> 0) Then
' Code ISIN
deb = deb + Len("?isinCode=")
fin = InStr(deb, szPage, "&")
szCodeISIN = Mid$(szPage, deb, fin - deb)
Worksheets("Valeurs").Cells(iLigne, iColonne).Value = szCodeISIN
iColonne = iColonne + 1
iDeb = fin
' Nom
deb = InStr(iDeb, szPage, ">")
deb = deb + 1
fin = InStr(deb, szPage, "</a>")
szNom = Mid$(szPage, deb, fin - deb)
Worksheets("Valeurs").Cells(iLigne, iColonne).Value = szNom
iColonne = iColonne + 1
iDeb = fin
' Cours
deb = InStr(iDeb, szPage, "tableValueNumCentered" + Chr(34) + ">")
deb = deb + Len("tableValueNumCentered" + Chr(34) + ">")
szCours = vbNullString
While ((Mid$(szPage, deb, 1) >= "0" And Mid$(szPage, deb, 1) <= "9") Or Mid$(szPage, deb, 1) = ".")
szCours = szCours & Mid$(szPage, deb, 1)
deb = deb + 1
Wend
Worksheets("Valeurs").Cells(iLigne, iColonne).Value = szCours
iDeb = fin
' Ligne suivante
iColonne = 1
iLigne = iLigne + 1
End If
Wend

End If

' ----- Et on regarde si il y a une page suivante -----
Dim SZ_PAGE_INDEX As String
SZ_PAGE_INDEX = "?pageIndex="

iPageSuivante = -1
If (InStr(iDeb, szPage, SZ_PAGE_INDEX)) Then
While (InStr(iDeb, szPage, SZ_PAGE_INDEX) And iPageSuivante <= iPage)
iPageSuivante = Mid$(szPage, InStr(iDeb, szPage, SZ_PAGE_INDEX) + Len(SZ_PAGE_INDEX), InStr(InStr(iDeb, szPage, SZ_PAGE_INDEX), szPage, "&") - (InStr(iDeb, szPage, SZ_PAGE_INDEX) + Len(SZ_PAGE_INDEX)))
iDeb = InStr(InStr(iDeb, szPage, SZ_PAGE_INDEX), szPage, "&") + 1
Wend
If iPageSuivante <= iPage Then iPageSuivante = -1 ' Au cas où...
End If


' ----- On ferme la connexion -----
InternetCloseHandle (hInternetSession)
End If

' On fixe le code retour
recupereCours = iPageSuivante

End Function


'******************************************************************************
'* Fonction getCoursValeur *
'******************************************************************************
'* *
'* Description : cette fonction renvoie le cours de cloture d'une valeur en *
'* fonction de son code ISIN. Pour ce faire, elle cherche la *
'* valeur dans la feuille 'Valeurs' du classeur courant. *
'* *
'* Entree : szCodeISIN = code ISIN de la valeur dont on souhaite connaitre le *
'* cours de cloture. *
'* *
'* Sortie : Neant. *
'* *
'* Retour : cours de cloture ou '?' si valeur non trouvee. *
'* *
'******************************************************************************
Function getCoursValeur(szCodeISIN As String) As Double
' On cherche le code dans la feuille 'Valeurs'
Dim iLigne As Integer

iLigne = 1
While (Worksheets("Valeurs").Cells(iLigne, COLONNE_CODE_ISIN).Value <> "" And _
Worksheets("Valeurs").Cells(iLigne, COLONNE_CODE_ISIN).Value <> szCodeISIN)
iLigne = iLigne + 1
Wend

If Worksheets("Valeurs").Cells(iLigne, COLONNE_CODE_ISIN).Value = "" Then
getCoursValeur = "?"
Exit Function
End If

getCoursValeur = Worksheets("Valeurs").Cells(iLigne, COLONNE_COURS_CLOTURE).Value

End Function

Renard du Désert
Messages : 55
Enregistré le : 21/02/2006 22:37
Contact :

Message par Renard du Désert » 08/05/2006 14:45

Cher Webmaster,

Le sujet revenant régulièrement, ne croyez vous pas qu'un nouveau forum "développement Excel" serait intéressant.

PS : bientôt une nouvelle page ?

20StylZ
Messages : 28
Enregistré le : 11/04/2006 19:17

Message par 20StylZ » 08/05/2006 18:52

Voila j'ai fait un petit exemple très simple d'une classe qui récupère les cours de Yahoo.

La fonction possède 7 paramètres : le ticker et les dates de début et de fin de l'historique que l'on veut récupérer.
Elle renvoie un Vector qui contient chaque cotation journalière.

J'ai mis un petit exemple qui récupère quelques cours pour Alcatel.

Code : Tout sélectionner

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.StringTokenizer;
import java.util.Vector;

public class YahooHistory 
&#123;
	public static void main&#40;String&#91;&#93; args&#41; 
	&#123;
		Vector v = getQuotes&#40;"CGE.PA","2006","4","28","2006","5","8"&#41;;
		
		for&#40;int i = 0; i < v.size&#40;&#41;; i++&#41;
			System.out.println&#40;v.get&#40;i&#41;.toString&#40;&#41;&#41;;
	&#125;
	
	public static Vector getQuotes&#40;String ticker, 
							String startYear, 
							String startMonth, 
							String startDay, 
							String endYear, 
							String endMonth, 
							String endDay&#41;
	&#123;
		Vector v = new Vector&#40;&#41;;
		String line = "";
		try &#123;
				startMonth = String.valueOf&#40;Integer.parseInt&#40;startMonth&#41; - 1&#41;;
				endMonth = String.valueOf&#40;Integer.parseInt&#40;endMonth&#41; - 1&#41;;
				URL url = new URL&#40;"http&#58;//ichart.finance.yahoo.com/table.csv?s=" + ticker + "&a=" + startMonth + "&b=" + startDay + "&c=" + startYear + "&d=" + endMonth + "&e=" + endDay + "&f=" + endYear + "&g=d&y=0&z=" + ticker + "&ignore=.csv"&#41;;			
				BufferedReader buffer = new BufferedReader&#40;new InputStreamReader&#40;url.openStream&#40;&#41;&#41;&#41;;
				for&#40;int count = 0; &#40;line = buffer.readLine&#40;&#41;&#41; != null; count++&#41;
	            &#123;
					if&#40;count > 0&#41;
						v.add&#40;quoteParser&#40;ticker, line&#41;&#41;;	                
	            &#125;
				buffer.close&#40;&#41;;
		&#125; 
		catch &#40;MalformedURLException e&#41; &#123;&#125;
		catch &#40;IOException e&#41; &#123; System.out.println&#40;"Mauvais ticker"&#41;;	&#125;
		
		return v;
	&#125;
	
	private static String quoteParser&#40;String ticker, String line&#41;
    &#123;
        StringTokenizer sToken = new StringTokenizer&#40;line, ","&#41;;
        int count = 0;
        String quote = "";
        try
        &#123;
            while&#40;sToken.hasMoreTokens&#40;&#41;&#41; 
                try
                &#123;
                    String token = sToken.nextToken&#40;&#41;;
                    if&#40;++count == 1&#41;
                    &#123;
                        StringTokenizer sToken2 = new StringTokenizer&#40;token, "-"&#41;;
                        String day = sToken2.nextToken&#40;&#41;;
                        if&#40;day.length&#40;&#41; == 1&#41;
                            day = "0" + day;
                        String month = monthNumber&#40;sToken2.nextToken&#40;&#41;&#41;;
                        String year = sToken2.nextToken&#40;&#41;;
                        int y = &#40;new Integer&#40;year&#41;&#41;.intValue&#40;&#41;;
                        if&#40;y < 10&#41;
                            year = "20" + year;
                        else
                            year = "19" + year;
                        String date = year + "/" + month + "/" + day;
                        quote = ticker + "," + date;
                    &#125;
                    else quote += "," + token;
                    
                &#125;
                catch&#40;Exception exception&#41; &#123; &#125;
        &#125;
        catch&#40;Exception exception1&#41; &#123; &#125;
        return quote;
    &#125;
	
	private static String monthNumber&#40;String s&#41;
    &#123;
        HashMap h = new HashMap&#40;&#41;;
        h.put&#40;"Jan", "01"&#41;;
        h.put&#40;"Feb", "02"&#41;;
        h.put&#40;"Mar", "03"&#41;;
        h.put&#40;"Apr", "04"&#41;;
        h.put&#40;"May", "05"&#41;;
        h.put&#40;"Jun", "06"&#41;;
        h.put&#40;"Jul", "07"&#41;;
        h.put&#40;"Aug", "08"&#41;;
        h.put&#40;"Sep", "09"&#41;;
        h.put&#40;"Oct", "10"&#41;;
        h.put&#40;"Nov", "11"&#41;;
        h.put&#40;"Dec", "12"&#41;;
        return &#40;String&#41;h.get&#40;s&#41;;
    &#125;
&#125;

Renard du Désert
Messages : 55
Enregistré le : 21/02/2006 22:37
Contact :

Message par Renard du Désert » 09/05/2006 21:13

Voici les macros modifiées pour importer les cours du CAC40.

Code : Tout sélectionner

[color=green]'******************************************************************************
'*                                 Module Cours                               *
'******************************************************************************
'*                                                                            *
'* DESCRIPTION. : Ensemble de macros et fonctions permettant de recuperer des *
'*               cours de valeurs mobilieres sur Internet.                    *
'*                                                                            *
'* AUTEUR...... : webmaster 'La Bourse pour les nains'                        *
'*                http://www.bnains.org/                                      *
'*                                                                            *
'* VERSION..... : 0.1                                                         *
'*                                                                            *
'* ENVIRONNEMENT: Win32. Necessite Wininet. Compatible Excel et OpenOffice (a *
'*                verifier).                                                  *
'*                                                                            *
'* MACROS EXPORTEES :                                                         *
'*   telechargeCours = provoque la creation d'une feuille 'valeurs' a la fin  *
'*                     du classeur courant et y colle les cours des valeurs   *
'*                     de cinq marches, telecharges depuis le site d'Euronext *
'*                                                                            *
'* FONCTIONS EXPORTEES :                                                      *
'*   getCoursValeur ( szCodeISIN ) = renvoie le cours de cloture de la valeur *
'*                                   dont le code ISIN est passe en parametre.*
'*                                                                            *
'******************************************************************************
'* MODIFIE LE : 13/06/2004 PAR Webmaster http://www.bnains.org/               *
'* DESCRIPTION DE LA MODIFICATION :                                           *
'* Adaptation des fonctions telechargeCours() et recupereCours() suite à      *
'* modification du site Euronext (fermeture site SBF remplacé par site        *
'* Euronext).                                                                 *
'*                                                                            *
'* MODIFIE LE : 10/05/2006 PAR Renard du Désert                               *
'* DESCRIPTION DE LA MODIFICATION :                                           *
'* Modification telechargeCours()                                             *
'* Si la feuille 'valeur' existe, elle est simplement nettoyée de ses données *
'* sinon elle est crée                                                        *
'* Suite à la modification du site Euronext, l'URL a changé. Cette évolution  *
'* gère uniquement les valeurs du CAC40.                                      *
'******************************************************************************

Option Explicit
'==============================================================================
' Import
'==============================================================================
Public Declare Function InternetOpenA Lib "wininet" _
    (ByVal sAgent As String, ByVal lAccessType As Long, _
    ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
   
Public Declare Function InternetCloseHandle Lib "wininet" _
    (ByVal hInet As Long) As Integer
   
Public Declare Function InternetOpenUrlA Lib "wininet" _
    (ByVal hInternetSession As Long, ByVal lpszUrl As String, _
    ByVal lpszHeaders As String, ByVal dwHeadersLength As Long, ByVal dwFlags As Long, _
    ByVal dwContext As Long) As Long
   
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Public Declare Function InternetReadFile Lib "wininet" _
    (ByVal hFile As Long, ByVal sBuffer As String, _
    ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer

'==============================================================================
' Déclarations de constantes
'==============================================================================
Public Const INTERNET_OPEN_TYPE_DIRECT = 1
Public Const INTERNET_FLAG_RELOAD = &H80000000

Public Const COLONNE_COURS_CLOTURE = 3
Public Const COLONNE_CODE_ISIN = 1


'******************************************************************************
'*                         Macro telechargerCours                             *
'******************************************************************************
'*                                                                            *
'* Description : cette macro cree une feuille 'Valeurs' a la fin du classeur  *
'*               courant, puis recupere les cours de differents marches.      *
'*                                                                            *
'******************************************************************************
Sub telechargeCours()
' ----- On efface le contenu de la feuille des valeurs -----
Dim bValeurs As Boolean
Dim i As Integer
Dim s As Worksheet

bValeurs = False
For i = 1 To Sheets.Count
  If (Sheets(i).Name = "Valeurs") Then
    bValeurs = True
  End If
Next i

If (bValeurs = True) Then
  Worksheets("Valeurs").Columns("A:D").Delete
Else
   Set s = Sheets.Add(After:=Worksheets(Worksheets.Count))
   s.Name = "Valeurs"
End If

Dim iPage As Integer
' CAC40
iPage = 1
While (iPage <> -1)
  iPage = recupereCours("http://www.euronext.com/trader/priceslists/1/wide/0,4614,1679_338638,00.html?mep=89291&belongsToList=index_FR0003500008", iPage)
Wend
End Sub


'******************************************************************************
'*                         Fonction recupereCours                             *
'******************************************************************************
'*                                                                            *
'* Description : cette fonction recupere une page sur le site Euronext, en    *
'*               extrait les intitulés, codes et cours des valeurs et renvoie *
'*               eventuellement la page suivante si il y en a une.            *
'*               Les intitulés, codes et cours des valeurs sont ajoutées dans *
'*               la feuille 'valeurs' du classeur courant.                    *
'*                                                                            *
'* Entree : URL des donnees a recuperer.                                      *
'*                                                                            *
'* Sortie : ajout de lignes dans la feuille 'Valeurs' du classeur.            *
'*                                                                            *
'* Retour : numero de la page suivante (parametre 'pageIndex' Euronext).      *
'*                                                                            *
'******************************************************************************
Function recupereCours(szUrl As String, iPage As Integer) As Integer
  Dim hInternetSession As Long     ' handle de la session internet
  Dim hPage As Long                ' handle de la page
  Dim iPageSuivante As Integer

  '------ On ouvre une connexion -----
  hInternetSession = InternetOpenA("Wininet", 1, vbNullString, vbNullString, 0)
  If (hInternetSession <> 0) Then
    ' ----- On ouvre la page demandee -----
    hPage = InternetOpenUrlA(hInternetSession, szUrl, vbNullString, 0, _
                             INTERNET_FLAG_RELOAD, 0)
    If (hPage <> 0) Then
      Dim szBuffer As String * 32000   ' Buffer pour lecture de la page
      Dim lNbOctLus As Long            ' Pour recevoir le nombre d'octets lus
      Dim bRet As Boolean              ' Pour le code de retour de la lecture
      Dim iLigne As Integer
      Dim iColonne As Integer
      Dim szPage As String
     
      ' ----- On cherche la premiere ligne vide -----
      iLigne = 1
      iColonne = 1
      While (Worksheets("Valeurs").Cells(iLigne, iColonne).Value <> "")
        iLigne = iLigne + 1
      Wend
     
      ' ----- On lit le contenu de la page -----
      szPage = vbNullString
      Do
        szBuffer = vbNullString
        bRet = InternetReadFile(hPage, szBuffer, Len(szBuffer), lNbOctLus)
         If (bRet = True) Then
          szPage = szPage & Mid$(szBuffer, 1, lNbOctLus)
        End If
      Loop While (bRet = True And lNbOctLus <> 0)
         
      ' ----- On ferme le handle de la page -----
      CloseHandle (hPage)
   
      Dim iDeb As Long    ' pointeur dans la page
      iDeb = 1
           
      ' ----- On cherche le debut des donnees qui nous interessent -----
      Dim szChaine As String
      ' <td class="tableValueName" nowrap><a href="/trader/summarizedmarketRoot/0,4082,1679_338638,00.html?isinCode=FR0004152593&selectedMep=1&idInstrument=16908">A NOVO</a></td>
      ' <td nowrap>FR0004152593</td>
      ' <td nowrap align="center">PAR</td>
      ' <td nowrap class="tableValueNumRight">0.87&nbsp;</td>
      ' <td nowrap class="tableValueNumRight">286,622</td>
      ' <td nowrap class="tableValuePositive">2.35</td>
      ' <td nowrap align="center" class="tableDateStamp">08/05/06 17:30</td><td align="center">
                    
      szChaine = "<td class=" + Chr(34) + "tableValueName" + Chr(34) + " nowrap>"
    
      While (InStr(iDeb, szPage, szChaine) _
             And _
             InStr(iDeb, szPage, "?isinCode="))
        Dim deb As Long
        Dim fin As Long
        Dim szCodeISIN As String
        Dim szNom As String
        Dim szCours As String
             
        deb = InStr(iDeb, szPage, "?isinCode=")
        If (deb <> 0) Then
          ' Code ISIN
          deb = deb + Len("?isinCode=")
          fin = InStr(deb, szPage, "&")
          szCodeISIN = Mid$(szPage, deb, fin - deb)
          Worksheets("Valeurs").Cells(iLigne, iColonne).Value = szCodeISIN
          iColonne = iColonne + 1
          iDeb = fin
          ' Nom
          deb = InStr(iDeb, szPage, ">")
          deb = deb + 1
          fin = InStr(deb, szPage, "</a>")
          szNom = Mid$(szPage, deb, fin - deb)
          Worksheets("Valeurs").Cells(iLigne, iColonne).Value = szNom
          iColonne = iColonne + 1
          iDeb = fin
          ' Cours
          deb = InStr(iDeb, szPage, "tableValueNumRight" + Chr(34) + ">")
          deb = deb + Len("tableValueNumRight" + Chr(34) + ">")
          szCours = vbNullString
          While ((Mid$(szPage, deb, 1) >= "0" And Mid$(szPage, deb, 1) <= "9") Or Mid$(szPage, deb, 1) = ".")
            szCours = szCours & Mid$(szPage, deb, 1)
            deb = deb + 1
          Wend
          Worksheets("Valeurs").Cells(iLigne, iColonne).Value = szCours
          iDeb = fin
          ' Ligne suivante
          iColonne = 1
          iLigne = iLigne + 1
        End If
      Wend
           
    End If
     
    ' ----- Et on regarde si il y a une page suivante -----
    Dim SZ_PAGE_INDEX As String
    SZ_PAGE_INDEX = "?pageIndex="

    iPageSuivante = -1
    If (InStr(iDeb, szPage, SZ_PAGE_INDEX)) Then
      While (InStr(iDeb, szPage, SZ_PAGE_INDEX) And iPageSuivante <= iPage)
        iPageSuivante = Mid$(szPage, InStr(iDeb, szPage, SZ_PAGE_INDEX) + Len(SZ_PAGE_INDEX), InStr(InStr(iDeb, szPage, SZ_PAGE_INDEX), szPage, "&") - (InStr(iDeb, szPage, SZ_PAGE_INDEX) + Len(SZ_PAGE_INDEX)))
        iDeb = InStr(InStr(iDeb, szPage, SZ_PAGE_INDEX), szPage, "&") + 1
      Wend
      If iPageSuivante <= iPage Then iPageSuivante = -1          ' Au cas où...
    End If
     
     
    ' ----- On ferme la connexion -----
    InternetCloseHandle (hInternetSession)
  End If
 
  ' On fixe le code retour
  recupereCours = iPageSuivante

End Function


'******************************************************************************
'*                         Fonction getCoursValeur                            *
'******************************************************************************
'*                                                                            *
'* Description : cette fonction renvoie le cours de cloture d'une valeur en   *
'*               fonction de son code ISIN. Pour ce faire, elle cherche la    *
'*               valeur dans la feuille 'Valeurs' du classeur courant.        *
'*                                                                            *
'* Entree : szCodeISIN = code ISIN de la valeur dont on souhaite connaitre le *
'*                       cours de cloture.                                    *
'*                                                                            *
'* Sortie : Neant.                                                            *
'*                                                                            *
'* Retour : cours de cloture ou '?' si valeur non trouvee.                    *
'*                                                                            *
'******************************************************************************
Function getCoursValeur(szCodeISIN As String) As Double
' On cherche le code dans la feuille 'Valeurs'
Dim iLigne As Integer

iLigne = 1
While (Worksheets("Valeurs").Cells(iLigne, COLONNE_CODE_ISIN).Value <> "" And _
        Worksheets("Valeurs").Cells(iLigne, COLONNE_CODE_ISIN).Value <> szCodeISIN)
  iLigne = iLigne + 1
Wend

If Worksheets("Valeurs").Cells(iLigne, COLONNE_CODE_ISIN).Value = "" Then
  getCoursValeur = 0
  Exit Function
End If

getCoursValeur = Worksheets("Valeurs").Cells(iLigne, COLONNE_COURS_CLOTURE).Value

End Function[/color]&#91;code&#93;
&#91;/code&#93;

nab
Messages : 6
Enregistré le : 10/05/2006 16:26

Message par nab » 10/05/2006 16:35

Salu tout le monde,

Suis 1 nouveau de la bourse.
Merci pour tous les conseils sur le site et un GRAND MERCI au webmaster pour son site et son forum !

J'ai essayé la macro de Webmaster revue et corrigée par Renard, elle fonctionne plutot bien mais pour avoir l'historique des valeurs comment faire ?
J'ai cru comprendre que la macro de 20StylZ était faite pour ça mais comment la faire tourner ?

Merci d'aider un super débutant :lol:

Nab

20StylZ
Messages : 28
Enregistré le : 11/04/2006 19:17

Message par 20StylZ » 10/05/2006 16:54

Non attention le code que j'ai mis n'est pas une macro. C'est une classe JAVA.

Donc pour la faire tourner il te faut un IDE (Integrated Development Environment) pour java tel que Eclispe.
Mais il vaut mieu avoir des bases de programmation java !

nab
Messages : 6
Enregistré le : 10/05/2006 16:26

Message par nab » 11/05/2006 15:48

Salut,

Merci pour ta réponse 20StylZ.
Seulement connait pas du tout java :oops:
Y aurait pas une macro sous excel pour ça ?

merci.

gigi
Messages : 1000
Enregistré le : 09/01/2005 20:30
Localisation : Paris
Contact :

Macro JAVA.

Message par gigi » 13/05/2006 07:17

Mreci pour vos morceaux de code XLS et JAVA. Comme le dit 20StylZ, le bout de code JAVA est destinée aux programmeurs.
Si vous voulez le tester, il faut:
1) Avoir JAVA (que l'on trouve sur le site SUN par exemple)
2) recopier le bout de code de 20StylZ dans un fichier texte de nom YahooHistory.java
3) compiler par la commande dans une fenêtre texte

Code : Tout sélectionner

javac YahooHistory.java
Un fichier YahooHistory.class est généré.
4) Exécuter, toujours dans la fenêtre texte, le programme par

Code : Tout sélectionner

java YahooHistory 
qui vous affichera dans l'exemple donné les cours d'Alcatel entre le 28/4 et le 8 mai. Votre fenêtre de commande devrait ressembler à ceci:

Code : Tout sélectionner

C&#58;\Java_trainning>C&#58;\j2sdk1.4.2_11\bin\javac.exe YahooHistory.java

C&#58;\Java_trainning>C&#58;\j2sdk1.4.2_11\bin\java YahooHistory
CGE.PA,2006/05/08,11.52,11.58,11.31,11.31,8090997,11.31
CGE.PA,2006/05/05,11.32,11.53,11.29,11.46,9460595,11.46
CGE.PA,2006/05/04,11.32,11.41,11.10,11.38,11327769,11.38
CGE.PA,2006/05/03,11.55,11.59,11.21,11.23,19676754,11.23
CGE.PA,2006/05/02,11.45,11.66,11.45,11.54,11241050,11.54
CGE.PA,2006/04/28,11.62,11.62,11.23,11.43,20635484,11.43

C&#58;\Java_trainning>

20StylZ
Messages : 28
Enregistré le : 11/04/2006 19:17

Message par 20StylZ » 13/05/2006 13:25

Merci pour la précision gigi.

Toutefois je recommande quand même l'utilisation d'un IDE comme Eclispe ou JBuilder. C'est gratuit et vraiment puissant !

Si vous voulez d'autres exemples comme comment écrire les résultats de la récupération des cours dans un fichier ou n'importe quoi d'autre y'a pas de problème :)

gigi
Messages : 1000
Enregistré le : 09/01/2005 20:30
Localisation : Paris
Contact :

Java.

Message par gigi » 17/05/2006 21:23

Merci à toi. Je vais voir pour récupérer Eclipse ou JBuilder sur le net un jour.
Si tu veux faire d'autres Travaux Pratique, je veux bien l'écriture dans un fichier des résultats, et aussi un exemple d'affichage graphique. :D
Ainsi, avec un exemple de récup de données (ci dessus), une écriture de datas sur disque, et un affichage, il y aura tout pour donner ensuite libre cours à sa création sans e^tre bloqué par des aspects de syntaxe du language !
PS: Ouh là là... Tu as vu la chute de la Bourse ce soir ? ça fait mal là, quand la volatilité s'envole en plus... (je sais, c'est hors sujet...)

20StylZ
Messages : 28
Enregistré le : 11/04/2006 19:17

Message par 20StylZ » 19/05/2006 21:08

Voici une petite fonction à rajouter dans la classe YahooHistory.
Elle possède 3 arguments :
- le chemin du fichier (si le fichier n'existe pas il sera crée mais pas un répertoire !)
- le Vector qui contient les cours
- un booléen qui autorise l'écrasement du fichier si il existe dejà. Si il est mis à faux, les données seront écrites à la suite des données éxistantes dans le fichier.

Code : Tout sélectionner

public static void fileSave&#40;String chemin, Vector quotes, boolean ecraserFichier&#41;
	&#123;
		try &#123;
				BufferedWriter buffer = new BufferedWriter&#40;new FileWriter&#40;chemin, !ecraserFichier&#41;&#41;;				
				for&#40;int i = 0; i < quotes.size&#40;&#41;; i++&#41;
				&#123;
					buffer.write&#40;quotes.get&#40;i&#41;.toString&#40;&#41;&#41;;
					buffer.newLine&#40;&#41;;
				&#125;				
				buffer.close&#40;&#41;;
		&#125;
		catch &#40;IOException e&#41; &#123; System.out.println&#40;"Problème d'écriture dans le fichier"&#41;;	&#125;
	&#125;
Pour l'appeller, il suffit simplement d'une ligne dans le genre

Code : Tout sélectionner

fileSave&#40;"C&#58;/CGE.PA.txt",getQuotes&#40;"CGE.PA","2006","4","28","2006","5","8"&#41;,false&#41;;
qui enregistrera le fichier dans C:

Pour l'exemple d'affichage, je verrai quand j'aurai un moment parcque sa se complique un peu... on est pas en Delphi :wink:

PS: Oui j'ai vu ça c'est bien cassé la gueule et je suis déçu on fesais un petit jeu en cours de bourse à la fac et là j'ai pris un max !!
-10% en quelques jours, ouf heuresement c'est que de la simulation mais ceux qui étaient vraiment en position... peut être toi d'ailleur...

gigi
Messages : 1000
Enregistré le : 09/01/2005 20:30
Localisation : Paris
Contact :

Java

Message par gigi » 19/05/2006 22:25

Salut !
Et merci pour ton code de sauvegarde fichier. J'attends plus que l'exemple pour l'aspect graphique maintenant. :D
C'est pour me tester que tu as oublié de me dire de rajouter les import suivants ?

Code : Tout sélectionner

import java.io.BufferedWriter; 
import java.io.FileWriter; 
Bon, c'est justze pour te charier un peu.... et pour te prouver aussi que je regarde avec attention ton code, et que je le teste pour me former et l'utiliser ensuite. C'est sympa de ta part en tous cas de m'aider. :D

Pour la Bourse, oui je suis en position, et plus que jamais! Avec cette chute, la volatilité augmente, et c'est très favorable pour mon style de gestion, qui joue sur le temps et non sur le cours.... enfin disons que je suis relativement décorrélé des marchés, mais pas totalement quand même! Si la bourse continue à chuter, ça va finir par m'affecter, mais j'ai une marge confortable. Nous étions aujourd'hui le 3ième vendredi du mois de mai, et c'est donc le moment de rouler ses positions (c'est à dire porter les positions de mai vers l'échéance de juin ou juillet)... Ce que j'ai fait donc. C'est mon courtier qui va être content, car peu de produits sont arrivés avec une valeur nulle à cette échéance de mai, et j'ai donc dû racheter les positions dans la monnaie pour revendre (plus cher bien sûr !) le mois suivant. Donc il facture 2 opérations à 15€ chaque...

Répondre

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités