Stock History Example
Posted: Wed Jun 25, 2003 4:14 am
Here is a Stock History example based on pulling free data from Yahoo Finance (based on stock ticker symbol), parsing CSV data into arrays and displaying results in a ListIconGadget. Not really an advanced example, but might be helpful for anyone looking to write their own investment program.
Mark
Mark
Code: Select all
; StockHistory
; Mark1Up - 6/24/03
; HTTP Network code thanks to Ricardo!
; www.purebasic.com
; Open Window
#MyWindow = 0
#MyGadget = 1
Global Ticker$
If OpenWindow(#MyWindow,100,100,420,600,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Stock History") And CreateGadgetList(WindowID(0))
StringGadget(2, 5, 5, 70, 20, "IBM")
ButtonGadget(3, 80, 5, 70, 20, "Get History")
If CreateGadgetList(WindowID())
ListIconGadget(#MyGadget,5,30,410,590,"Date",70,#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#MyGadget,1,"Open",60)
AddGadgetColumn(#MyGadget,2,"High",60)
AddGadgetColumn(#MyGadget,3,"Low",60)
AddGadgetColumn(#MyGadget,4,"Close",60)
AddGadgetColumn(#MyGadget,5,"Volume",90)
EndIf
EndIf
Procedure GetStockHistory()
InitNetwork()
; Get stock data
ConnectionID = OpenNetworkConnection("table.finance.yahoo.com", 80)
If ConnectionID
com$="GET http://table.finance.yahoo.com/table.csv?s="+Ticker$+"&g=d HTTP/1.1"+Chr(13)+Chr(10)
com$=com$+"Accept: */*"+Chr(13)+Chr(10)
com$=com$+"Accept: text/html"+Chr(13)+Chr(10)
com$=com$+"Host: "+host$+Chr(13)+Chr(10)
com$=com$+"User-Agent: Yahoo CVS Parser"+Chr(13)+Chr(10)
com$=com$+Chr(13)+Chr(10)
Res = SendNetworkData(ConnectionID,@com$,Len(com$))
Repeat
Delay(10)
Result = NetworkClientEvent(ConnectionID)
Select Result
Case 2
Content$ = Space(14500)
ReceiveNetworkData(ConnectionID,@Content$,14500)
Ok = 1
CloseNetworkConnection(ConnectionID)
EndSelect
Until Ok = 1
EndIf
; Parse data
; Get past header data
ptr=1
For i = 1 To 4
eptr = FindString(Content$, Chr(10),ptr+1)
ptr = eptr+1
Next
Dim Stock$(65)
Dim StockDate$(65)
Dim StockOpen.f(65)
Dim StockHigh.f(65)
Dim StockLow.f(65)
Dim StockClose.f(65)
Dim StockVolume.l(65)
For i = 1 To 65
eptr = FindString(Content$, Chr(10),ptr+1)
Stock$(i)=Mid(Content$,ptr,eptr-ptr)
StkPtr=1
; Parse Date
StkEptr = FindString(stock$(i),",",StkPtr)
StockDate$(i)=Mid(Stock$(i),StkPtr,StkEptr-StkPtr)
StkPtr=StkEptr+1
; Parse Open
StkEptr = FindString(stock$(i),",",StkPtr)
StockOpen(i)=ValF(Mid(Stock$(i),StkPtr,StkEptr-StkPtr))
StkPtr=StkEptr+1
; Parse High
StkEptr = FindString(stock$(i),",",StkPtr)
StockHigh(i)=ValF(Mid(Stock$(i),StkPtr,StkEptr-StkPtr))
StkPtr=StkEptr+1
; Parse Low
StkEptr = FindString(stock$(i),",",StkPtr)
StockLow(i)=ValF(Mid(Stock$(i),StkPtr,StkEptr-StkPtr))
StkPtr=StkEptr+1
; Parse Close
StkEptr = FindString(stock$(i),",",StkPtr)
StockClose(i)=ValF(Mid(Stock$(i),StkPtr,StkEptr-StkPtr))
StkPtr=StkEptr+1
; Parse Volume
StkEptr = Len(stock$(i))+1
StockVolume(i)=Val(Mid(Stock$(i),StkPtr,StkEptr-StkPtr))
StkPtr=StkEptr+1
ptr = eptr+1
Next i
; Show parsed results in List Gadget
ClearGadgetItemList(#MyGadget)
For i=1 To 64
AddGadgetItem(#MyGadget,-1,StockDate$(i)+Chr(10)+StrF(StockOpen(i),2)+Chr(10)+StrF(StockHigh(i),2)+Chr(10)+StrF(StockLow(i),2)+Chr(10)+StrF(StockClose(i),2)+Chr(10)+StrU(StockVolume(i),#Long))
Next i
EndProcedure
; Main Loop
Repeat
EventID = WindowEvent()
If EventID = #PB_EventGadget
Select EventGadgetID()
Case 3 ; Assign ticker and get history
Ticker$ = GetGadgetText(2)
GetStockHistory()
EndSelect
EndIf
Until EventID = #PB_EventCloseWindow
End