Ako zistit pocet dostihov (greyhounds) pre rovnaky track v TOLS?

Potrebujem poradit .. Nacitam si do TOLS  Greyhounds Today's card. Pomocou funkcie v LookupBot-e potrebujem zistit  pocet dostihov pre rovnaky track (oxford..sheffield apod).  Ako na to?

Comments (9)

  1. StefanBelo Says:
    Wednesday, March 25, 2009

    Na podobnú otázku som už odpovedal Jose-mu:

    Event Id & Market type

    Tvoj LookUpBot vie len o MonitoredMarket v momente keď sú dáta monitorovaného trhu vyhodnocované tvojím LookUpBot robotom.

    Trade Opportunity Lookup Service najprv načíta všetky trhy podľa tvojho výberu (zrejme si použil: Browse selected events) a potom začne monitorovanie jednotlivých trhov podľa času ktorý si nastavil parametrom: Start monitoring, tento čas hovorí len o tom kedy začne TOLS trh monitorovať, ak je to kladná hodnota, je to čas v sekundách pred oficiálnym začiatok udalosti, inak po oficiálnom začiatku.

    TOLS spúšťa robota vždy keď sú načítané dáta pre monitorovaný trh, to znamená aj pri prvom načítaní dát kedy TOLS načítava všetky trhy ktoré chceš monitorovať, preto je dobré aby súčasťou kódu tvojho robota bola aj kontrola času, samozrejme ak to tvoja stratégia vyžaduje.

    Keďže robot má šancu vyhodnotiť akékoľvek dáta už pri prvom načítaní dát, môžeš si pri tomto prvom načítaní dát inicializovať čo len chceš, môžeš si teda vytvoriť zoznam všetkých dostihov podľa dostihovej dráhy na ktorom sa daný dostih koná, čiže robot bude napríklad vedieť koľko dostihov je v daný deň na dostihovej dráhe v Oxforde.

  2. sunnymarkus Says:
    Wednesday, March 25, 2009

    Ci zistit Event Id a potom pomocou  EventmarketTree  ziskat uvedeny zoznam a vyfiltrovat podla Market.Name dostihy s rovnakym Name. Inak na co sluzi monitoretMarket.ContextData ?

  3. StefanBelo Says:
    Wednesday, March 25, 2009

    Ale kdeže, José chcel predsa čosi iné.

    Čo je vo vašich riešeniach spoločné je, že máte jednu inštanciu LookUpBot-a, a keďže LookUpBot má prístup ku všetkým trhom ktoré budeš monitorovať práve len počas ich načítavania do TOLS, môžeš si vytvoriť zoznam dostihových dráh a zistiť počet dostihov na každej dráhe.

    ContextData data nie je špecifikované, môžeš si tam uložiť čo len chceš, napríklad nejaké dáta ktoré tvoj robot potrebuje, takže pri opätovnom vyhodnocovaní dát máš (tvoj robot) prístup k dátam ktoré si tam predtým uložil, napríklad zoznam výberov na trhu ktoré majú najväčší pokles kurzu za sledované obdobie.

  4. sunnymarkus Says:
    Wednesday, March 25, 2009

    no u mna je poziadavka mat ten zoznam dostihov na danej drahe pri kazdom spusteni bota..nie len pri nacitani do TOLS..vtedy ho nepotrebujem.. ja potrebujem zistit kolko dostihov v drahe este ostava do konca..pri kazdom spusteni bota. preto som myslel ze by to islo cez EventmarketTree.. teraz neviem..potom uz jedine urobit to ako vlastne riesenie ..plug-in .

  5. StefanBelo Says:
    Wednesday, March 25, 2009

    My sa stále nerozumieme, prosím ťa teraz nachvíľu zabudni, že si programátor a zrekapituluj si čo chceš urobiť a čo máš k dispozícii.

    Chceš zistiť koľko dostihov sa v daný deň beží na konkrétnej dostihovej dráhe, a koľko ich ešte zostáva odbehnúť.

    Keď spustíš TOLS po prvýkrát so svojím LookUpBot robotom, TOLS vytvorí jednu inštanciu tvojho robota, a načíta všetky trhy ktoré si mu určil načítať. Toto je jediný moment kedy môžeš mať k dispozícii všetky trhy, pretože TOLS ich postupne začne otvárať o volať DoYourJob metódu tvojho robota.

    V tejto chvíli si vytvoríš zoznam jednotlivých dostihových dráh s počtom dostihov na jednotlivých dráhach. To že trh bol pridaný do zoznamu si môžeš poznačiť do už spomínanej premennej ContextData, takže funkciu ktorá bude počítať počet dostihov na dostihovej dráhe zavoláš iba vtedy keď ešte nebola pre konkrétny monitoretMarket.ContextData volaná.

    Keď tvoj robot urobí to čo má na konkrétnom trhu, čiže v momente keď spustíš akčného robota na trh, alebo trh vyradíš z TOLS bez toho aby si čokoľvek robil na trhu (podal stávku alebo obchodoval) jednoducho znížiť o 1 počet dostihov ktoré sa majú na konkrétnej dostihovej dráhe bežať, takže vždy budeš vedieť koľko dostihov ešte ostáva.

    Keďže máš k dispozícii Bfexplorer BOT SDK, vieš aké rozhranie je implementované pre LookUpBot a Bot triedu (class) a čo má takýto robot k dispozícii, čiže prístup k aktuálne monitorovanému trhu ktorý robot vyhodnocuje: MonitoredMarket monitoredMarket, a interface IBetfairService betfairService pomocou ktorého môžeš na trh umiestniť, zmeniť alebo zrušiť stávku/stávky. Vypýtať si konkrétny trh (podľa MarketId), odštartovať alebo stopnúť monitorovanie trhu, prípadne odštartovať iného akčného robota, alebo robotov na jednotlivých výberoch.

    Bohužiaľ nemáš možnosť otvoriť nový trh na monitorovanie, prípadne nemáš možnosť prístupu ku všetkým už otvoreným trhom. To čo chceš urobiť je jednoduchá vec s pár riadkami kódu.

  6. StefanBelo Says:
    Wednesday, March 25, 2009

    Idem teraz na hokej, takže ak stále nechápeš čo a ako môžeš urobiť, zajtra tých pár riadkov napíšem. Daj mi vedieť či sa s tým potrápiš sám, alebo to mám urobiť.

  7. sunnymarkus Says:
    Thursday, March 26, 2009

    No ja som sa s tym uz trapil ..aj s contextdata..a bez vysledku. Ak by bolo mozne tak napis tych par riadkov ako priklad. diky

  8. StefanBelo Says:
    Thursday, March 26, 2009

    Nemal som pravdu ak som tvrdil, že robot je spustený hneď pri prvom načítaní dát, je to až v čase ktorý nastavíš, a tak som musel preto čo chceš urobiť pridať "Initialize the context data".

    Nainštaluj si najnovšiu verziu Bfexplorer PRO, a tu je kód pre LookUpBot-a:

    using System;
    using System.Collections.Generic;
    using BeloSoft.Betfair.Data;
    using BeloSoft.Betfair.Trading;
    
    namespace Bfexplorer.Scripting
    {
      public class CountNumberOfRacesForCourseLookUpBot : LookUpBot
      {
        // Const
        private const int StartActionBeforeInMinutes = 2;
    
        // Data
        private Dictionary< int, int > numberRacesByEvent = 
                        new Dictionary < int, int >();
    
        public CountNumberOfRacesForCourseLookUpBot(IBetfairService betfairService)
          : base(betfairService)
        {
        }
    
        public override bool DoYourJob(MonitoredMarket monitoredMarket)
        {
          if (monitoredMarket.ContextData == null)
          {
            AddTheRace(monitoredMarket);
    
            // Just for testing
            ShowEventsAndRaces();
          }
    
          if (GetIsTheRaceXMinutesBeforeStart(monitoredMarket))
          {
            RemoveTheRace(monitoredMarket);
    
            AddMessage(string.Format("For the racecourt: {0} remains {1} race/s.", 
              monitoredMarket.MarketInfo.Event.Name, 
              GetNumberOfRaces(monitoredMarket))
            );
    
            return false;
          }
    
          return true;
        }
    
        private bool GetIsTheRaceXMinutesBeforeStart(MonitoredMarket monitoredMarket)
        {
          return DateTime.Now >= monitoredMarket.MarketDetails.MarketTime.AddMinutes(
              -StartActionBeforeInMinutes
          );
        }
    
        private void AddTheRace(MonitoredMarket monitoredMarket)
        {
          MarketInfo marketInfo = monitoredMarket.MarketInfo;
          int eventId = marketInfo.Event.Id;
    
          if (numberRacesByEvent.ContainsKey(eventId))
          {
            numberRacesByEvent[eventId] += 1;
          }
          else
          {
            numberRacesByEvent[eventId] = 1;
          }
    
          monitoredMarket.ContextData = true;
        }
    
        private void RemoveTheRace(MonitoredMarket monitoredMarket)
        {
          MarketInfo marketInfo = monitoredMarket.MarketInfo;
          int eventId = marketInfo.Event.Id;
    
          if (numberRacesByEvent.ContainsKey(eventId))
          {
            numberRacesByEvent[eventId] -= 1;
          }
        }
    
        private int GetNumberOfRaces(MonitoredMarket monitoredMarket)
        {
          MarketInfo marketInfo = monitoredMarket.MarketInfo;
          int eventId = marketInfo.Event.Id;
    
          return numberRacesByEvent.ContainsKey(eventId) ? 
                        numberRacesByEvent[eventId] : 0;
        }
    
        private void ShowEventsAndRaces()
        {
          // Just for testing to show data
          Dictionary.Enumerator enumerator = numberRacesByEvent.GetEnumerator();
    
          while (enumerator.MoveNext())
          {
            KeyValuePair current = enumerator.Current;
    
            AddMessage(string.Format("The racecourt: {0}, number of races: {1}", 
                                           current.Key, current.Value));
          }
        }
      }
    }
    
  9. sunnymarkus Says:
    Friday, March 27, 2009

    Diky za priklad. Uvedeny kod spocita pocet vsetkych dostihov pre UK Today's Card pretoze Today's Card je Event. Jednotlive RaceCourt su uz len ako markety nie ako Eventy. Preto som priklad upravil a teraz to uz chodi presne ako som chcel.  Btw: konecne som pochopil jak funguje contextData.. Este raz diky za priklad

    using System;
    using System.Collections.Generic;
    using BeloSoft.Betfair.Data;
    using BeloSoft.Betfair.Trading;
    
    namespace Bfexplorer.Scripting
    {
      public class CountNumberOfRacesForCourseLookUpBot : LookUpBot
      {
        // Const
        private const int StartActionBeforeInMinutes = 2;
    
        // Data
        private Dictionary numberRacesByRacecourt =
                        new Dictionary();
    
        public CountNumberOfRacesForCourseLookUpBot(IBetfairService betfairService)
          : base(betfairService)
        {
        }
    
        public override bool DoYourJob(MonitoredMarket monitoredMarket)
        {
          if (monitoredMarket.ContextData == null)
          {
            AddTheRace(monitoredMarket);
    
            // Just for testing
            ShowEventsAndRaces();
          }
    
          if (GetIsTheRaceXMinutesBeforeStart(monitoredMarket))
          {
            RemoveTheRace(monitoredMarket);
    
            AddMessage(string.Format("For the racecourt: {0} remains {1} race/s.",
              monitoredMarket.MarketInfo.Market.Name,
              GetNumberOfRaces(monitoredMarket))
            );
    
            return false;
          }
    
          return true;
        }
    
        private bool GetIsTheRaceXMinutesBeforeStart(MonitoredMarket monitoredMarket)
        {
          return DateTime.Now <= monitoredMarket.MarketDetails.MarketTime.AddMinutes(
              -StartActionBeforeInMinutes
          );
        }
    
        private void AddTheRace(MonitoredMarket monitoredMarket)
        {
          MarketInfo marketInfo = monitoredMarket.MarketInfo;
          //cutt-off market start time from marketName
          string marketName = marketInfo.Market.Name.Substring(5);
    
          if (numberRacesByRacecourt.ContainsKey(marketName))
          {
            numberRacesByRacecourt[marketName] += 1;
          }
          else
          {
            numberRacesByRacecourt[marketName] = 1;
          }
    
          monitoredMarket.ContextData = true;
        }
    
        private void RemoveTheRace(MonitoredMarket monitoredMarket)
        {
          MarketInfo marketInfo = monitoredMarket.MarketInfo;
          //cutt-off market start time from marketName
          string marketName = marketInfo.Market.Name.Substring(5);
    
          if (numberRacesByRacecourt.ContainsKey(marketName))
          {
            numberRacesByRacecourt[marketName] -= 1;
          }
        }
    
        private int GetNumberOfRaces(MonitoredMarket monitoredMarket)
        {
          MarketInfo marketInfo = monitoredMarket.MarketInfo;
          //cutt-off market start time from marketName
          string marketName = marketInfo.Market.Name.Substring(5);
    
          return numberRacesByRacecourt.ContainsKey(marketName) ?
                        numberRacesByRacecourt[marketName] : 0;
        }
    
        private void ShowEventsAndRaces()
        {
          // Just for testing to show data
          Dictionary.Enumerator enumerator = numberRacesByRacecourt.GetEnumerator();
    
          while (enumerator.MoveNext())
          {
            KeyValuePair current = enumerator.Current;
    
            AddMessage(string.Format("The racecourt: {0}, number of races: {1}",
                                           current.Key, current.Value));
          }
        }
      }
    }
    

Do you want to comment this article? Sign up here or login.