вторник, 25 сентября 2012 г.

Betfair Free API. Ч.3 Пишем бот на Java.

Продолжу тему, посвященную Betfair Free API, которую я начал в Ч.1 и Ч.2.

Все на этих ботах помешались. Только и слышно - Куплю бота! Продам бота! Напишу бота! Украду бота! Обману бота!
Почему же эти боты (программы автоматической торговли на бирже) такие популярные? А потому, что на бирже им позволено делать все, что позволено делать людям - следить за рынками и делать ставки. Только вот боты могут делать эту работу в тысячи раз быстрее чем человек.

Попробую в этом посте раскрыть тайну написания ботов. Для начала реализуем функцию автоматического логина к бирже с помощью бота. Использовать я буду, специально предназначенное для этого Betfair API. На самом деле, ничего страшно сложного в нем нет. При современном развитии инструментариев для разработчиков ПО, написать (вернее создать) программу можно даже не обладая знаниями программирования. Хотя, для нашей конкретной области, ботописательства, отсутствие знаний элементарных вещей может обернуться большими убытками. Поэтому, хотя бы начальные знания программирования лишними не окажутся.

Итак, вперед! Написание ботов для домохозяеек!

Для написания ботов я выбрал язык программирования Java, поскольку этот язык очень простой и понятный даже такому тупому валенку как я. И поскольку писать бот мы будем на языке Java, то для начала следует установить эту самую Яву. Я думаю, что Java Runtime у вас на машине уже, скорее всего, установлен. Но нам для разработки требуется Java SDK, качаем последний релиз здесь Java SE Development Kit 6 Update 35. Установка не должна вызвать проблем

Далее, требуется установить среду разработки. Мне нравится Netbeans. Качаем версию Netbeans 7.2 здесь. Выбирать для загрузки следует сборку Java SE. Во время установки среды разработки Netbeans можно отказаться от установки серверов приложений GlassFish и TomCat, сняв соответствующие галочки. Они нам для разработки не понадобятся, а места занимают много.

 Все готово. Через 10 минут у вас будет готов первый бот который уже умеет логиниться к Betfair с помошью Betfair Free API!

Запускаем Netbeans. В меню "Файл" выбираем "Создать новый проект". В открывшемся окне щелкаем на категорию Java, а в проектах выбираем Java Application и клацаем Next. В следующем окне можно изменить название проекта, но лучше не надо, )) (по умолчанию это JavaApplication1) и поставить галочку на опции "Create main class" (Создать класс Main). Все, Finish.


Теперь самое главное. Надо указать Нетбинсу, что мы будем работать с биржей с помощью протокола SOAP. Для этого кладем пальчик на правую кнопку мыши и клацаем на наш проект. В выпадающем меню выбираем "New", а затем "Web Service Client". Если такого пункта меню сразу не видно, то его надо разыскать в подменю "Other" -> "WebService" -> "Web Service Client".


 В открывшемся окне "New Web Service Client" выбираем WSDL URL и в соответствующем ему текстовом поле вставляем следующий урл - https://api.betfair.com/global/v3/BFGlobalService.wsdl. Клацаем Финиш и ждем пока Netbeans загрузит файл по этому урлу, а затем создаст все необходимые классы для работы с Betfair с помощью Betfair Free API.


Теперь повторяем все то же самое (создаем еще один Web Service Client), но указываем уже другой урл - https://api.betfair.com/exchange/v5/BFExchangeService.wsdl.
Если кому интересно, то эти урлы я взял из документации на Betfair API, страница 10. Документация доступна здесь в HTML и здесь в PDF форматах. Без знакомства с этим документом что-либо создавать будет очень сложно. Справка по АПИ, разумеется, на английском языке. Но это мне кажется даже лучше, поскольку в наше интересное время английским не владеют только гопота и эскимосы, а подобные документы следует читать в оригинале.

Итак полдела сделано. Остались сущие пустяки. В только что созданном проекте ищем файл JavaApplication1.java. Это и есть исходный код нашей программы. Изменяем его до следующего вида.
package javaapplication1;

import com.betfair.publicapi.types.global.v3.LoginReq;
import com.betfair.publicapi.types.global.v3.LoginResp;
import com.betfair.publicapi.v3.bfglobalservice.BFGlobalService;
import com.betfair.publicapi.v3.bfglobalservice.BFGlobalService_Service;
import com.betfair.publicapi.v5.bfexchangeservice.BFExchangeService;
import com.betfair.publicapi.v5.bfexchangeservice.BFExchangeService_Service;

public class JavaApplication1 {

    public static void main(String[] args) {
            String sessionToken = "";
            
            BFGlobalService_Service WSDLService_Global = new BFGlobalService_Service();
            BFGlobalService WSDLPort_Global = WSDLService_Global.getBFGlobalService();

            BFExchangeService_Service WSDLService_Exchange = new BFExchangeService_Service();
            BFExchangeService WSDLPort_Exchange = WSDLService_Exchange.getBFExchangeService();
            
            LoginReq request = new LoginReq();
            request.setUsername("login");
            request.setPassword("password");
            request.setProductId(82);
            request.setVendorSoftwareId(0);
            request.setIpAddress("0");
            request.setLocationId(0);
            
            LoginResp result = WSDLPort_Global.login(request);
            
            System.out.println("Логин на Betfair - " + result.getErrorCode().toString());
            if (result.getErrorCode().toString().equals("OK")) {
                sessionToken = result.getHeader().getSessionToken();
                System.out.println("Текущий session Token - " + result.getHeader().getSessionToken());
            }
    }
}

Вот и все. Жмакнув F5 или запустив программу из меню "Run", можно увидеть результат запуска программы в окошечке Output внизу экрана - строку содержащую тип ошибки (например, Betfair API можно пользоваться только если на твоем счету есть отличная от нуля сумма) или ОК если логин прошел успешно. Естественно, запустить программу можно и без Нетбинса. Для этого кликаем на корень проекта правой кнопкой мышки и в выпадающем меню выбираем Build или Clean and Build. После этого в иерархии папок появится папка dist, а в ней и будет находится исполняемый файл программы - JavaApplication1.jar. Запустить его из консоли просто. Надо набрать следующую команду java -jar JavaApplication1.jar

Теперь быстренько пробежимся по коду.
Строка 13. В переменной sessionToken будет храниться идентификатор сессии (что такое идентификатор сессии читай в документации на странице 16 главы 2). Этот идентификатор надо будет передавать всем следующим запросам к бирже.
Строки 15-19. В этих переменных хранится нечто, что должно использоваться для вызова любого запроса к бирже. Деталей я не знаю и знать не хочу. Знаю только, что эти переменные проинициализировать надо один раз и затем использовать для каждого вызова. Поскольку при каждой инициализации эта штука будет скачивать с сайта Betfair файл BFGlobalService.wsdl, а он по размеру не маленький. Около 1.5Мб.
И еще, важно понимать, что все вызовы API делятся на две части Global и Exchange. В документации возле описания каждой функции большими буквами, черным по белому написано, к какой категории данный вызов относится. Если это Global функция (какой, например, является функция Login), то дергать ее следует из переменной WSDLPort_Global. Если же это Exchange функция, то дергать ее уже следут из переменной WSDLPort_Exchange.
Строки 21-27. Создание и инициализация логина к бирже. В строке 24 значением 82 инициализируется поле запроса productID. Это как раз и есть указание на то, что мы будем пользоваться именно Free API. Если я был счастливым обладателем платного доступа к бирже, то в это поле необходимо было бы поставить, число которое мне выдал бы менеджер биржи. Детали здесь. В отличие от платного доступа, бесплатный доступ с помощью Free API имеет кое-какие ограничения. Сравнение различных способов доступа смотрим здесь.
Строка 29. Собственно запрос логина к бирже.
Строка 31. Печать результата на экран (в консоль)
Строка 33. В случае успешного логина сохранение идентификатора сессии для передачи всем последующим вызовам.

Ну вот и все, начало положено. В следующем посте расскажу как запросить текущие рынки с биржи. Хотя те кому надо и сами дальше смогут разобраться. Дополнительные материалы по разработке на Java ищите в известном месте. Также есть русскоязычный форум для Betfair и Betdaq разработчиков (Да, биржа Betdaq тоже предоставляет бесплатный API для доступа к своей бирже для разработчиков, которые хотят автоматизировать свои алгоритмы и на этой бирже). Форум правда не очень посещаемый, но кто-то там тусуется.

P. S. В виду последних событий, этот пост немного запоздал. Поскольку Betfair API, в скором времени, перейдет с технологии SOAP на JSON. Но все таки, я надеюсь, что может быть кому-то эта тема будет еще интересна. Тем более, что еще как минимум 1.5 года Betfair API будет работать используя протокол SOAP. И пусть эти страшные аббревиатуры вас не пугают. Всю грязную работу за вас сделает среда разработки.

22 комментария:

  1. Огромное спасибо за проделанную работу!Когда ждать продолжения?Интервал между ч.2 и ч.3 немаленький...

    ОтветитьУдалить
  2. На днях закончу написанием бота для автоматической расстановки вожделенной ставки LAY 1.01 на любые, заранее определенные, рынки.

    ОтветитьУдалить
    Ответы
    1. Привет!
      А помочь написанием проги можешь? Причем прога не для ставок.
      Ответь плиз на maximum2001@yandex.ru

      Удалить
  3. Хотя, с другой стороны, мне не совсем ясна аудитория, которой может быть интересна данная тема. Люди которые шарят в программировании могут и сами разобраться в вопросе. А НЕпрограммисты вряд ли решатся браться за такое дело как ботописательство...

    ОтветитьУдалить
  4. Ну почему же?! Мне, например, интересно прочитать было эту заметку. Я не программер, и вот хоть убей не понимаю, с какой стороны подступиться к ботописательству. Есть стратегии, а как реализовать их в машинке - проблема. Вот и понимаю, что потихоньку придется разбираться с этим делом. Так что спасибо тебе большое за науку! Как минимум один читатель, который считает этот цикл статей полезным, уже есть.

    ОтветитьУдалить
  5. Ну и как успехи? Удалось запустить мой пример логина?

    ОтветитьУдалить
  6. Полностью поддерживаю предыдущего анонимуса. Учусь писать бот на твоих примерах. Некоторый опыт программирования имеется, но твои разжеванные примеры существенно экономят время.

    ОтветитьУдалить
  7. FB
    Есть ли такой софт, или можно написать:
    для автоматического хеджированию ставок ЗА . То есть, интересует следующие: чтобы на выбранном рынке до-инплей, не подбирать самому суммы, а вбить в прогу кэфы ЗА, и она показала суммы, которые уже нужно выставить для грин ап.

    ОтветитьУдалить
  8. Используй любую торговую программу для Betfair. В них это легко делается.
    Если хочешь это делать вручную, то в интернетах есть миллион онлайн калькуляторов. Тебя в Гугле забанили чтоле? :-))

    ОтветитьУдалить
  9. "Для написания ботов я выбрал язык программирования Java"

    Дядя Билли(Гейтс) и дядя Стиви (Балмер) с досады горько плачут...

    ОтветитьУдалить
  10. Чёт я не понял смысла этого дурацкого комментария...

    Какое отношение имеет Microsoft к Betfair в общем, и к программированию в частности?

    ОтветитьУдалить
  11. Гм... Я ведь точно знаю, что на Фаеровских хостах крутятся сановские сервера приложений (сам проверял). Причем тут Microsoft?... Сразу видно, что аноним нихуя не шарит в программной разработке.

    Оставлю его комментарий как памятник человеческой глупости и невежеству.

    ОтветитьУдалить
  12. Привет.
    Вам можно заказать написать бот?
    Суть бота - в указанном матче на заданной минуте делать ставку на рынке текущих тоталов.

    ОтветитьУдалить
  13. С помощью Betfair API невозможно точно узнать минуту матча. В первом тайме еще приблизительно можно. Во втором - совсем приблизительно

    ОтветитьУдалить
  14. С помощью Betfair API невозможно, но вполне реально сделать, чтобы бот брал время матча с futbol24 или xscores. Там всё очень приближено к действительности.

    ОтветитьУдалить
  15. Прекрасно. Свяжись с заказчиком и начните сотдрудничество ))

    ОтветитьУдалить
  16. Огромное спасибо за данный цикл статей.

    ОтветитьУдалить
    Ответы
    1. You are welcome :-)
      Только не подумай, что это просто. Ошибка в программировании здесь может очень дорого стоить

      Удалить
  17. Забавно, либо у Анонимнуса такая же стратегия либо это был я :)
    Я сам написал бота, который на заданной минуте (минуту с BF берёт) совершает ставку на тотал.
    Писал на питоне. :)

    ОтветитьУдалить
  18. Здравейте ! Я из Болгарии. Мне очень интересно Ваша схема для бот. Но теперь Betfair имеет другую структуру и связь /линк/ https://api.betfair.com/global/v3/BFGlobalService.wsdl не работает.
    Пожалуйста, помогите, как создать бота в новых условиях.
    С уважением, Влад

    ОтветитьУдалить
    Ответы
    1. С ноября 2014 Betfair полностью изменил API доступа к своему серверу. SOAP протокол был заменен на обмен JSON соорбщениями посредством RESTful доступа. Подробности на сайте Betfair https://developer.betfair.com/exchange-api/

      Удалить