Seems to work ok on empty markets - here it is - make of it what you will!
TraderMarketPrice price = new TraderMarketPrice(true);
switch (response.errorCode)
{
case GetCompleteMarketPricesErrorEnum.OK:
sLogger.DebugFormat("Processing Price for {0} {1}", market.MenuPath, market.Name);
mGlobalSession.SessionToken = response.header.sessionToken;
string token;
Tokenizer tokenizer = new Tokenizer(response.completeMarketPrices);
char[] delimiters = new char[] { ':', '~', '|' };
while (tokenizer.GetNextToken(delimiters, out token))
{
switch (tokenizer.TokenNo)
{
case 0:
{
price.MarketId = Int32.Parse(token);
break;
}
case 1:
{
price.BetDelay = Int32.Parse(token);
break;
}
case 2:
{
//Removed Runners
ProcessRemovedRunners(price, token);
//Runners and price
char[] runnersDelimiters = new char[] { ':' };
string runnersToken;
while (tokenizer.GetNextToken(runnersDelimiters, out runnersToken))
{
string[] runnerFields = runnersToken.Split('|');
string runnerInfo = runnerFields[0];
string completePrices = runnerFields[1];
TraderRunnerPrices runnerPrices = ProcessGCMPCRunnerInfo(runnerInfo, price.CurrencyCode);
// TODO not that we have this data from GCMPC...
runnerPrices.LastRefresh = price.LastRefresh;
ProcessCompletePrices(completePrices, runnerPrices.LayPrices, runnerPrices.BackPrices, price.CurrencyCode);
price.RunnerPrices.Add(runnerPrices);
}
break;
}
}
}
break;// TODO make sure I have got back and lay the right way round!!!
private void ProcessCompletePrices(string priceData, IList<TraderPrice> layPrices, IList<TraderPrice> backPrices, string currency)
{
string[] prices = priceData.Split('~');
for (int i = 0; i < prices.Length - 1; i += 5)
{
double odds = Double.Parse(prices[i]);
// TODO - need to sort out the currency...
double backAmountAvailable = mGlobalSession.ConvertToBase(Double.Parse(prices[i + 1]), currency);
double layAmountAvailable = mGlobalSession.ConvertToBase(Double.Parse(prices[i + 2]), currency);
// TODO get the BSP data too
if (backAmountAvailable > 0)
{
TraderPrice price = new TraderPrice();
price.Odds = odds;
price.AmountAvailable = backAmountAvailable;
// price.Depth = ???? TODO cunning handling here??
layPrices.Add(price);
}
if (layAmountAvailable > 0)
{
TraderPrice price = new TraderPrice();
price.Odds = odds;
price.AmountAvailable = layAmountAvailable;
// price.Depth = ???? TODO cunning handling here??
backPrices.Add(price);
}
}
}
[code}
private TraderRunnerPrices ProcessGCMPCRunnerInfo(string runnerInfo, string currency)
{
string token;
Tokenizer tokenizer = new Tokenizer(runnerInfo);
char[] delimiters = new char[] { '~' };
TraderRunnerPrices runnerPrices = new TraderRunnerPrices();
while (tokenizer.GetNextToken(delimiters, out token))
{
switch (tokenizer.TokenNo)
{
case 0:
{
runnerPrices.Id = Int32.Parse(token);
break;
}
case 1:
{
runnerPrices.Index = Int32.Parse(token);
break;
}
case 2:
{
runnerPrices.TotalAmountMatched = mGlobalSession.ConvertToBase(Double.Parse(token), currency);
break;
}
case 3:
{
if (token != string.Empty)
{
runnerPrices.LastPriceMatched = Double.Parse(token);
}
break;
}
case 4:
{
if (token != string.Empty)
{
runnerPrices.Handicap = Double.Parse(token);
}
break;
}
case 5:
{
if (token != string.Empty)
{
runnerPrices.ReductionFactor = Double.Parse(token);
}
break;
}
case 6:
{
if (token != string.Empty)
{
runnerPrices.Vacant = Boolean.Parse(token);
}
break;
}
case 7:
{
runnerPrices.AsianLineId = Int32.Parse(token);
break;
}
case 8:
{
if (token != string.Empty)
{
if (token.Equals("NaN") || token.Equals("Infinity"))
{
runnerPrices.FarSPPrice = 0;
}
else
{
runnerPrices.FarSPPrice = Double.Parse(token);
}
}
break;
}
case 9:
{
if (token != string.Empty)
{
if (token.Equals("NaN") || token.Equals("Infinity"))
{
runnerPrices.NearSPPrice = 0;
}
else
{
runnerPrices.NearSPPrice = Double.Parse(token);
}
}
break;
}
case 10:
{
if (token != string.Empty)
{
runnerPrices.ActualSPPrice = Double.Parse(token);
}
break;
}
}
}
return runnerPrices;
}
[/code]
private static void ProcessRemovedRunners(TraderMarketPrice price, string token)
{
if (token.Length > 0)
{
string[] removedRunners = token.Split(';');
foreach (string removedRunner in removedRunners)
{
if (removedRunner != string.Empty)
{
string[] rrFields = removedRunner.Split(',');
TraderRemovedRunner rr = new TraderRemovedRunner();
rr.Name = rrFields[0];
string[] dateFields = rrFields[1].Split('.');
int hours = Int32.Parse(dateFields[0]);
int mins = Int32.Parse(dateFields[1]);
rr.RemovedDate = new DateTime(1900, 01, 01, hours, mins, 0);
rr.AdjustmentFactor = Double.Parse(rrFields[2]);
price.RemovedRunners.Add(rr);
}
}
}
}