Jump to content
FORUM · BOTBEETLE

Admin

Administrators
  • Content Count

    488
  • Joined

  • Last visited

  • Days Won

    39

Everything posted by Admin

  1. Admin

    Last Size Traded

    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) - команда выравнивания - закрывает только принятый объем (даже если это несколько принятых частично) по текущей цене, не принятые ставки в расчете не участвуют.
  2. If you don’t change your mind, let's make such a script ... Clarification. We have to make two bets 1. at 75 minutes in the market over 1.5 size $ 2 on Back 2. at 65 minutes on the market 2.5 size $ 5 on Back So? Will we leave the market or not? Or leave bets to the end?
  3. Admin

    Last Size Traded

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

    Last Size Traded

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

    Last Size Traded

    Если кратко: Главные базовые классы - это классы бетфайр, и в них есть все переменные описанные в API документации бетфайр. Для удобства в них добавлен ряд переменных. 1. Event он содержит MarketCatalogue (MatchOdds), а также список MarketCatalogues в котором будут рынки если список будет раскрыт в ручную или командой Api.Expand(Event) . 2. MarketCatalogue содержит список RunnerCatalog, у этих классов можно использовать такие переменные как: IsLive - рынок перешел в игру IsGreen - рынок не выровнен IsOrders - есть ордера IsMatched - есть принятые ордера IsUnMatched - есть не принятые ордера IsExluded - сейчас не используется IsChanged - эта переменная отвечает за перерисовку в окне при изменениях данных 3. RunnerCatalog переменные: List<Order> Orders - список всех ордеров List<Order> UnmatchedOrders - список не принятых ордеров List<Match> Matches - список принятых ставок Back - последняя цена back Lay - последняя цена lay CurrentResult - возможный результат MatchedResult - принятый результат 3. Api.Green(RunnerCatalog) - выравнивает линию, по текущим ценам
  6. Admin

    Last Size Traded

    Удалите текущую версию и скачайте снова версию 5.39
  7. Admin

    Last Size Traded

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

    Last Size Traded

    Пункт 2 проверю, ошибка критическая, обновление в ближайшие дни, спасибо за сообщение. По 3 - MarketScript больше не будет эти классы предусматривал для работы в окне, но это, как потом стало понятно, бессмысленно для автоматизации круглосуточной работы, пользователь должен открывать окно сам. Рекомендация унаследовать текший скрипт от EventScript и подключать его к окну расписания.
  9. 6. Рекомендация Включить в окне фильтр денег, тогда событий будет меньше и каждое событие будет быстрее обновляться.
  10. 5. Промежуточные результаты Небольшой плюс (1). Результаты в низу не считаем, так как они при тестировании скрипта по моей ошибке стали на рынки UNDER.
  11. 4. Пример работы Рынок (1) был открыт ставка, сделана и прошла успешна, Рынки (2-3) в процессе
  12. 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); } } } } } } }
  13. 2.2 Делаем ставку Чтобы не загромождать код, вынес выполнение ставки в отдельную фунцию (1) Проверяем открыто ли событие в окне расписания (2) Если нет даем команду на открытие, при этом запрашиваем только 3 рынка (OVER_UNDER_05 OVER_UNDER_15 OVER_UNDER_25) (3) Если событие раскрыто, в списке рынков события берем первый открытый рынок (4) Если рынок доступен, отбираем линию OVER (5) Проверяем стоит на линии защита от повторной ставки или нет (6) Проверяем есть ли Back цена (7) На случай если программа было полностью перегружена и защита от повторной ставки не сработает, проверяем что у рынка нет принятых ставок (8) Устанавливаем защиту от повторной ставки для данной линии (9) Пишем в лог что делам ставку и при каких условиях она произошла (10) Делаем ставку.
  14. 2. Работа скрипта 2.1 Отбираем подходящие рынки (1) Среди входящих событий отбираем те которые перешли в игру (MarketCatalogue.IsLive == true) и у которых денег больше чем задано переменной (MarketCatalogue.TotalMatched >= TotalMatched) (2) Проверяем что рынок открыт (3) Проверяем что у события доступна информация о точном счете. Не все события ее имеют. (4) Считаем сумму карт у каждой команды, проверяем значение с задаваемой переменной (cards >= CardCount) (5) Проверяем что событие попадает в интервал (6) Выбранное событие передаем следующий функции.
  15. 1.3 Задаем временной интервал (1-2), когда ставка может быть сделана и количество желтых и красных карт (3)
  16. 1.2 Задаем размер ставки (1), и ограничиваем рынки по сумме денег (2). Нам не нужны пустые рынки.
  17. Пояснения по скрипту 1. Переменные 1.1 Определяем тип скрипта - футбол (1), задаем имя (2), описание (3) (чтоб не забыть про что он ?)
  18. 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); } } } } } }
  19. Among all incoming events, we select only those markets where the variable IsGreen = true, so the market has not closed bets We check that the market is open Determine how many minutes are left before the event Compare with the given parameter TimeEnter for all lines (Runner) in the market (5), if runner has IsGreen = true, so the runner has not closed bets We give the Green() command
  20. Task - Close the event before the start As a parameter, I set only one variable: Time before the event when the closure should occur.
  21. In order for the program to see (2) your library (1), copy the file (Botbeetle.Types.dll) to the executable file folder (3).
  22. Botbeetle.Script.5.39.zip Botbeetle.Types.dll
  23. 3. Reopen the market in any type of window
  24. 1 . Trading Chart This window combines a Chart and a Ladder displays a graph of price changes, allows you to place bets and to change them using the graphical interface More about him here: http://wiki.botbeetle.com/chart-interface/
×
×
  • Create New...