I created a function in F # to restore historical data from Yahoo (classic asynchronous example for F #):
let getCSV ticker dStart dEnd =
async {
let query = getFileUrl ticker dStart dEnd
let req = WebRequest.Create(query)
use! resp = req.AsyncGetResponse()
use stream= resp.GetResponseStream()
use reader = new StreamReader(stream)
let content = reader.ReadToEnd()
let ts = parseData content
return ts
}
Now I can run this function asynchronously by doing the following:
let test=
["MSFT";"YHOO"]
|>List.map (fun x -> getCSV x (DateTime.Parse("01.01.2000")) (DateTime.Parse("01.01.2010")))
|> Async.Parallel
|> Async.RunSynchronously
Well that's cool.
Now I would like to know how to apply some function to it, which is a price history:
For instance:
let getReturns (prices:(DateTime *float)list) =
[for i in 1..(prices.Length-1) -> i]
|> List.map (fun i ->(fst (List.nth prices i), (snd (List.nth prices i))/(snd (List.nth prices (i-1) )) - 1.0))
So the trivial way to do this is:
let test2=
["MSFT";"YHOO"]
|>List.map (fun x -> getCSV x (DateTime.Parse("01.01.2000")) (DateTime.Parse("01.01.2010")))
|> Async.Parallel
|> Async.RunSynchronously
|> Array.map getReturns;;
However, the function getReturnsis executed after downloading and analysis of each file.
What I would like to know is if you can start the execution of the second function while the downloads are still happening: as soon as the MSFT is complete, you do not need to wait until YHOO is executed to calculate its return ...
, getCSV, , "" getReturn ...