Jump to content
FORUM · BOTBEETLE

Admin

Administrators
  • Content Count

    488
  • Joined

  • Last visited

  • Days Won

    39

Posts posted by Admin


  1. 1. Чтобы показать тоталы, их нужно открыть. Для открытия можно использовать функцию  

    • Api.Expand(Event) - откроет все тоталы.
    • или более экономно, только те что нужно, например:
      Api.Expand(liveEvent, new List<MarketTypeEnum>
      {
      	MarketTypeEnum.OVER_UNDER_05,MarketTypeEnum.OVER_UNDER_15,MarketTypeEnum.OVER_UNDER_25,
      });

       

    2. Есть ли ордера на открытом, можно определить по переменной IsOrders 

    3. Если ордеров нет и событие не нужно его можно закрыть  Api.Collapse(Event) для экономии времени обновления (Чем меньше открыто рынков в окне - тем быстрее каждый из них получает информацию)

    4. Api.Green(RunnerCatalog) - команда выравнивания - закрывает только принятый объем (даже если это несколько принятых частично) по текущей цене, не принятые ставки в расчете не участвуют. 

     

     

    • Thanks 1

  2. Без проблем, в следующем обновлении добавлю в класс MarketCatalouge переменную MarketBook - это и будет последние полученные данные MarketBook.

     

     


  3. Как только появится время, сделаю описание. И самая большая проблема в том что нет обратной связи по скриптам. Я не знаю что кому нужно (какие функции какие переменные). Все что сейчас сделано, сделано для самого себя ?.

    После создания активных графиков, есть много идей по сохранению истории и тестированию скриптов по истории, поиску стратегий и параметров к ним. 

    • Thanks 1

  4. Если кратко:

    Главные базовые классы - это классы бетфайр, и в них есть все переменные описанные в API документации бетфайр. Для удобства в них добавлен ряд переменных.

    1Event он содержит MarketCatalogue   (MatchOdds), а также список  MarketCatalogues в котором будут рынки если список будет раскрыт в ручную или командой  Api.Expand(Event) . 

    2. MarketCatalogue содержит список RunnerCatalogу этих классов можно использовать такие переменные как:

    • IsLive - рынок перешел в игру
    • IsGreen - рынок не выровнен
    • IsOrders - есть ордера
    • IsMatched - есть принятые ордера
    • IsUnMatched - есть не принятые ордера
    • IsExluded - сейчас не используется
    • IsChanged - эта переменная отвечает за перерисовку в окне при изменениях данных

    3RunnerCatalog переменные:

    • List<Order> Orders - список всех ордеров
    • List<Order> UnmatchedOrders - список не принятых ордеров
    • List<Match> Matches - список принятых ставок
    • Back - последняя цена back
    • Lay - последняя цена lay
    • CurrentResult - возможный результат
    • MatchedResult - принятый результат

    3. Api.Green(RunnerCatalog) - выравнивает линию, по текущим ценам

     

    • Thanks 1

  5. Отображение ставок поправил, все типы ставок текущие (1), не принятые (2) и принятые (3) отображаются с прокруткой 

    image.png.530d8425124e720614ee20741886d070.png

    • Thanks 1

  6. 1 hour ago, Kravcov said:

    Установил 5.39 версию. Есть пару вопросов.

    2. В окне "Не принятые ставки" видно только 3 ставки (4-той ставки не видно), полоса прокрутки появляется только после 5 ставки, но и она не отображает всех ставок. (см. на рис.)

    3. В этих же окнах нет возможности включить скрипт, потому что в версии 5.39 скрипта класс MarketScript не наследуется (в Botbeetle.Types нет класса MarketSkript). По этому остается и предыдущий вопрос в первом сообщении темы.

     

    Пункт 2 проверю, ошибка критическая, обновление в ближайшие дни, спасибо за сообщение.

    По 3  - MarketScript больше не будет эти классы предусматривал для работы в окне, но это, как потом стало понятно, бессмысленно для автоматизации круглосуточной работы, пользователь должен открывать окно сам. 

    Рекомендация унаследовать текший скрипт  от EventScript и подключать его к окну расписания. 

     


  7. 3. Полный код скрипта

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using Botbeetle.Types.BettingEnums;
    using Botbeetle.Types.BettingTypes;
    using Botbeetle.Types.Scripts;
    
    namespace Soccer.Scripts
    {
        [Serializable]
        public class SoccerCardsScript : EventScript
        {
            protected override Script CreateInstanceForClone()
            {
                return new SoccerCardsScript();
            }
    
            //----------------------------------------------------------------------------------
    
            [Category("1. Script")]
            [DisplayName("Name")]
            public override string Name { get; set; } = "Cards";
    
            [Category("1. Script")]
            [DisplayName("Description")]
            public override string Description { get; set; } = "Bet if count of card more then ...";
    
            [Browsable(false)]
            public override EventTypeEnum EventType { get; set; } = EventTypeEnum.Soccer;
    
            //----------------------------------------------------------------------------------
    
            [Category("2. Order")]
            [DisplayName("Price Back")]
            public decimal OrderSize { get; set; } = 5M;
    
            //----------------------------------------------------------------------------------
    
            [Category("3. Conditions of Selection")]
            [DisplayName("Total Matched, more")]
            public decimal TotalMatched { get; set; } = 5000;
    
            //----------------------------------------------------------------------------------
    
            [Category("4. Conditions of Enter")]
            [DisplayName("Time of Event, more")]
            public int TimeStart { get; set; } = 50;
    
            [Category("4. Conditions of Enter")]
            [DisplayName("Time of Event, less")]
            public int TimeStop { get; set; } = 80;
    
            [Category("4. Conditions of Enter")]
            [DisplayName("Count of Card, more or equal")]
            public int CardCount { get; set; } = 2;
    
            //=============================================================================================================
    
            /// <summary>
            /// It is called many times when the data is updated. Contains score, prices. 
            /// </summary>
            public override void UpdateEvents(List<Event> events)
            {
                // Choose Live the event that is in Live Matched > TotalMatched
                var liveEvents = events.Where(x => x.MarketCatalogue.IsLive && x.MarketCatalogue.TotalMatched >= TotalMatched).ToList();
                foreach (var liveEvent in liveEvents)
                {
                    // MarketCatalogue in Event is MatchOdds 
                    var market = liveEvent.MarketCatalogue;
                    // Check that the status of the event == OPEN, otherwise skip (SUSPENDED or CLOSED)
                    if (market.Status == MarketStatus.OPEN)
                    {
                        // Check that this Event has Live Score, if there is a missing - skip
                        if (Api.Soccer.IsScoreInfo(liveEvent))
                        {
                            // Count card Number and check with CardCount var
                            var cards = market.EventState.Score.Home.NumberOfCards + market.EventState.Score.Away.NumberOfCards;
                            if (cards >= CardCount)
                            {
                                // Match Time, Check that the event time is in the specified time range, otherwise we skip
                                var time = market.EventState.TimeElapsed;
                                if (time > TimeStart && time < TimeStop)
                                {
                                    ExpandAndSelect(liveEvent, cards.Value, time);
                                }
                            }
                        }
                    }
                }
            }
    
            private void ExpandAndSelect(Event liveEvent, int cards, int time)
            {
                if (liveEvent.IsExpanded == false)
                {
                    //Expand selected Evet and Open markets: OVER_UNDER_05 OVER_UNDER_15 OVER_UNDER_25
                    Api.Expand(liveEvent, new List<MarketTypeEnum>
                    {
                        MarketTypeEnum.OVER_UNDER_05,MarketTypeEnum.OVER_UNDER_15,MarketTypeEnum.OVER_UNDER_25,
                    });
                }
                else
                {
                    //From Expanded markets select first opened OVER_UNDER_05 market
                    var market05 = liveEvent.MarketCatalogues.FirstOrDefault(x => x.Status == MarketStatus.OPEN);
                    if (market05 != null)
                    {
                        //if market selected, get runner OVER
                        var runner = Api.Soccer.SelectRunner(market05, RunnerTypeEnum.OVER);
                        if (runner != null)
                        {
                            // Check that we not placed bet in this runner, otherwise we skip
                            if (Api.IsProtected(runner)) return;
                            // Check runner has Back Price
                            if (runner.Back.HasValue)
                            {
                                // Check runner has not bets 
                                if (runner.Matches.Any()) return;
                                // 13. We put the protection so as not to put twice on one runner.
                                Api.SetProtection(runner);
                                // log action:
                                Api.Log($"Runner:{runner}; Cards:{cards}; Time:{time}; Back:{runner.Back}");
                                // Place bet
                                Api.PlaceLimitOrder(runner, Side.BACK, runner.Back.Value, OrderSize);
                            }
                        }
                    }
                }
            }
        }
    }

     


  8. 2.2 Делаем ставку

    Чтобы не загромождать код, вынес выполнение ставки в отдельную фунцию

    (1) Проверяем открыто ли событие в окне расписания

    (2) Если нет даем команду на открытие, при этом запрашиваем только 3 рынка (OVER_UNDER_05  OVER_UNDER_15  OVER_UNDER_25)

    (3) Если событие раскрыто, в списке рынков события берем первый открытый рынок

    (4) Если рынок доступен, отбираем линию OVER

    image.png.fef61b586b019645a79b089701b02a6b.png

    (5) Проверяем стоит на линии защита от повторной ставки или нет

    (6) Проверяем есть ли Back цена 

    (7) На случай если программа было полностью перегружена и защита от повторной ставки не сработает, проверяем что у рынка нет принятых ставок

    (8) Устанавливаем защиту от повторной ставки для данной линии

    (9) Пишем в лог что делам ставку и при каких условиях она произошла

    (10) Делаем ставку.

     

     


  9. 2. Работа скрипта

    2.1 Отбираем подходящие рынки

    (1) Среди входящих событий отбираем те которые перешли в игру (MarketCatalogue.IsLive == true) и у которых денег больше чем задано переменной (MarketCatalogue.TotalMatched >= TotalMatched) 

    (2) Проверяем что рынок открыт

    (3) Проверяем что у события доступна информация о точном счете. Не все события ее имеют.

    (4) Считаем сумму карт у каждой команды, проверяем значение с задаваемой переменной (cards >= CardCount)

    (5) Проверяем что событие попадает в интервал

    (6) Выбранное событие передаем следующий функции.

    image.png.95c1eb14935fb06f1e7ab1d2d6e157d7.png


  10. Full script

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using Botbeetle.Types.BettingEnums;
    using Botbeetle.Types.BettingTypes;
    using Botbeetle.Types.Scripts;
    
    
    namespace Botbeetle.Scripts
    {
        [Serializable]
        public class SoccerCloseBeforeStartEventScript : EventScript
        {
            protected override Script CreateInstanceForClone()
            {
                return new SoccerCloseBeforeStartEventScript();
            }
    
            [Browsable(false)]
            public override EventTypeEnum EventType { get; set; } = EventTypeEnum.Soccer;
    
            //=============================================================================================================
    
            [Category("1. Script")]
            [DisplayName("Name")]
            public override string Name { get; set; } = "Close Before Start";
    
            [Category("1. Script")]
            [DisplayName("Description")]
            public override string Description { get; set; } = "At a given time, close all bets on the market";
    
            //---------------------------------------------------
    
            [Category("2. Conditions of Enter")]
            [DisplayName("Time before Event, less (min)")]
            public int TimeEnter { get; set; } = 1;
    
            //=============================================================================================================
            
            /// <summary>
            /// It is called many times when the data is updated. Contains score, prices. 
            /// </summary>
            public override void UpdateEvents(List<Event> events)
            {
                // 1. Choose from all Events the Markets that have bets and it not "Green"
                List<MarketCatalogue> markets = events.Select(x=>x.MarketCatalogue).Where(x => x.IsGreen).ToList();
    
                foreach (var market in markets)
                {
                    // 2. Check that the status of the market == OPEN, otherwise skip (SUSPENDED or CLOSED)
                    if (market.Status != MarketStatus.OPEN) continue;
    
                    // 3. Сalculate the time before the match
                    var time = (market.MarketStartTime.ToLocalTime() - DateTime.Now).TotalMinutes;
    
                    // 4. Checking "Time before Event" parameter, otherwise skip 
                    if (time > TimeEnter) continue;
    
                    foreach (var runner in market.Runners)
                    {                
                        // 5. Choose Runner that have bets and it not "Green"
                        if (runner.IsGreen)
                        {
                            Api.Green(runner);
                        }
                    }
                }
            }
        }
    }

     


  11. image.png.db1a26dcd4ac58f838230074bfb53d34.png

     

    1. Among all incoming events, we select only those markets where the variable IsGreen = true, so the market has not closed bets
    2. We check that the market is open
    3. Determine how many minutes are left before the event
    4. Compare with the given parameter TimeEnter
    5. for all lines (Runner) in the market (5),
    6. if runner has IsGreen = true, so the runner has not closed bets
    7. We give the Green() command 
×
×
  • Create New...