有没有人有c#代码来使用betfair api?

时间:2012-07-24 06:51:52

标签: c# betfair

我正在创建一个c#windows应用程序,使用betfair exchange webservice显示当前的体育市场费率,我使用

  

getmarketpricescompressed()

返回如下所示的价格字符串的方法:

106093239~GBP~ACTIVE~0~1~~true~5.0~1343114432333~~N:7337~1~6992.56~2.16~~~false~~~~|2.16~1036.19~L~1~2.14~97.18~L~2~2.12~5.0~L~3~|2.18~467.36~B~1~2.2~34.12~B~2~2.22~162.03~B~3~:414464~2~102181.96~1.86~~~false~~~~|1.85~2900.33~L~1~1.84~1831.59~L~2~1.83~1593.73~L~3~|1.86~58.83~B~1~1.87~1171.77~B~2~1.88~169.15~B~3~

我不知道如何正确解压缩此字符串,现在我正在使用此代码:

GetMarketPricesCompressedReq price_req1 = new GetMarketPricesCompressedReq();
            price_req1.header = header2;
            price_req1.marketId = marketid_temp;
            price_req1.currencyCode = "GBP";
            GetMarketPricesCompressedResp price_resp = new GetMarketPricesCompressedResp();
            price_resp = bfg2.getMarketPricesCompressed(price_req1);
            //MessageBox.Show(price_resp.errorCode.ToString());
            //richTextBox1.Text = "";
            //richTextBox1.Text = price_resp.marketPrices;
            string prices = price_resp.marketPrices;
            richTextBox1.Text = price_resp.marketPrices;
            string[] ab1 = prices.Split('|');
            string[] temp = ab1[1].Split('~');
            textBox3.Text = temp[0];
            textBox4.Text = temp[4];
            textBox5.Text = temp[8];
            temp = ab1[2].Split('~');
            textBox6.Text = temp[0];
            textBox7.Text = temp[4];
            textBox8.Text = temp[8];
            temp = ab1[3].Split('~');
            textBox9.Text = temp[0];
            textBox10.Text = temp[4];
            textBox11.Text = temp[8];
            temp = ab1[4].Split('~');
            textBox12.Text = temp[0];
            textBox13.Text = temp[4];
            textBox14.Text = temp[8];
            if (ab1.Length >5)
            {
                temp = ab1[5].Split('~');
                textBox15.Text = temp[0];
                textBox16.Text = temp[4];
                textBox17.Text = temp[8];
                temp = ab1[6].Split('~');
                textBox18.Text = temp[0];
                textBox19.Text = temp[4];
                textBox20.Text = temp[8];
            }

它适用于一些匹配,但我观察到一些其他匹配的字符串更改,因此它生成异常, any1可以帮我用正确的代码解压缩这个字符串,我用Google搜索并发现了一个vb代码,这个代码不是很有用,

和顺便说一句,我想安排这样的数据:

enter image description here

3 个答案:

答案 0 :(得分:3)

请考虑以下事项:

a|b|c|d

在这里,你有四个块。但它不一定只有四个。它可以是两个,也可以是六个。

尝试通过迭代由

得到的字符串数组来实现它
string[] ab1 = prices.Split('|');

这样的东西
foreach(var stringChunk in ab1)
{
    string[] temp = stringChunk.Split('~');
    // use the strings here as you please
}

考虑使用更动态的方法来呈现数据,使用基于行的重复控件而不是静态文本框。 =)

压缩数据的完整文档可在此处获取:https://docs.developer.betfair.com/betfair/#!page=00008360-MC.00008307-MC

答案 1 :(得分:2)

猜测,我认为数据的组织方式如此

首先由:分隔,然后|分隔

  

106093239〜GBP〜ACTIVE〜0〜1 ~~真〜5.0〜1343114432333 ~~Ñ

     

7337〜1〜6992.56〜2.16 ~~~假~~~~
  2.16〜1036.19〜L〜1〜2.14〜97.18〜L〜2〜2.12〜5.0〜1〜3〜   2.18〜467.36〜B〜1〜2.2〜34.12〜B〜2〜2.22〜162.03〜B〜3〜

     

414464〜2〜102181.96〜1.86 ~~~假~~~~   1.85〜2900.33〜L〜1〜1.84〜1831.59〜L〜2〜1.83〜1593.73〜1〜3〜   1.86〜58.83〜B〜1〜1.87〜1171.77〜B〜2〜1.88〜169.15〜B〜3〜

我认为第一行显然是标题,第一个数字可能是市场ID。 同样,每个后续部分的第一部分是行标识符。由~界定的

  

(SelectionId)7337(Order)1(TotalMatched?)6992.56(EvenPoint)2.16(???)false

我认为价格行在元组4中由~分隔,就像这样

  

(价格)2.16(MatchAvailable)1036.19(类型)L(订单)1
  (价格)2.14(MatchAvailable)0097.18(类型)L(订单)2
  (价格)2.12(MatchAvailable)0005.00(Type)L(订购)3

例如。

为了测试我的猜测,我必须与他们网站上的BetFair渲染进行比较。

答案 2 :(得分:2)

我将vb代码转换为c#我自己,如果有人发现它有用,我会在这里发布:

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;

namespace stock
{
    class UnpackMarketPricesCompressed : stock.BFExchangeService.MarketPrices
{
        //The substitute code for "\:"
    private const string ColonCode = "&%^@";

    //Unpack the string
    public UnpackMarketPricesCompressed(string MarketPrices)
    {
        string[] Mprices = null;
        string[] Part = null;
        string[] Field = null;
        int n = 0;

        Mprices = MarketPrices.Replace("\\:", ColonCode).Split(':');
        //Split header and runner data
        Field = Mprices[0].Replace("\\~", "-").Split('~');
        //Split market data fields
        marketId = Convert.ToInt32(Field[0]);
        //Assign the market data
        currencyCode = Field[1];
        marketStatus = (stock.BFExchangeService.MarketStatusEnum)Enum.Parse(typeof(stock.BFExchangeService.MarketStatusEnum), Field[2], true);
        delay = Convert.ToInt32(Field[3]);
        numberOfWinners = Convert.ToInt32(Field[4]);
        marketInfo = Field[5].Replace(ColonCode, ":");
        discountAllowed = (Field[6].ToLower() == "true");
        marketBaseRate = float.Parse(Field[7]);
        lastRefresh = long.Parse(Field[8]);
        removedRunners = Field[9].Replace(ColonCode, ":");
        bspMarket = (Field[10] == "Y");

        n = Mprices.Length - 1;
         // ERROR: Not supported in C#: ReDimStatement

        //For each runner
        for (int i = 0; i <= n; i++) 
        {
            Part = Mprices[i + 1].Split('|');
            //Split runner string into 3 parts
            Field = Part[0].Split('~');
            //Split runner data fields
             runnerPrices[i] = new stock.BFExchangeService.RunnerPrices();
            var _with1 = runnerPrices[i];
            //Assign the runner data
            _with1.selectionId = Convert.ToInt32(Field[0]);
            _with1.sortOrder = Convert.ToInt32(Field[1]);
            _with1.totalAmountMatched = Convert.ToDouble(Field[2]);
            _with1.lastPriceMatched = Convert.ToDouble(Field[3]);
            _with1.handicap = Convert.ToDouble(Field[4]);
            _with1.reductionFactor = Convert.ToDouble(Field[5]);
            _with1.vacant = (Field[6].ToLower() == "true");
            _with1.farBSP = Convert.ToDouble(Field[7]);
            _with1.nearBSP = Convert.ToDouble(Field[8]);
            _with1.actualBSP = Convert.ToDouble(Field[9]);
            _with1.bestPricesToBack = Prices(Part[1]);
            _with1.bestPricesToLay = Prices(Part[2]);
        }
    }

    private stock.BFExchangeService.Price[] Prices(string PriceString)
    {
        string[] Field = null;
        stock.BFExchangeService.Price[] Price = null;
        int k = 0;
        int m = 0;

        Field = PriceString.Split('~');
        //Split price fields
        m = (Field.Length / 4) - 1;
        //m = number of prices - 1 
         // ERROR: Not supported in C#: ReDimStatement

        for (int i = 0; i <= m; i++) 
        {
            Price[i] = new stock.BFExchangeService.Price();
            var _with2 = Price[i];
            _with2.price = Convert.ToInt32(Field[k + 0]);
            //Assign price data
            _with2.amountAvailable = Convert.ToInt32(Field[k + 1]);
            _with2.betType = (stock.BFExchangeService.BetTypeEnum)Enum.Parse(typeof(stock.BFExchangeService.BetTypeEnum), Field[k + 2], true);
            _with2.depth = Convert.ToInt32(Field[k + 3]);
            k += 4;
        }
        return Price;
        //Return the array of prices
    }

    }
}