вторник, 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. И пусть эти страшные аббревиатуры вас не пугают. Всю грязную работу за вас сделает среда разработки.

среда, 19 сентября 2012 г.

Лига Европы. 20 сентября

Хапоэль (Тель-Авив) - Атлетико (Мадрид) 5.5 - 3.75 - 1.77

Поездка в Израиль для Атлетико не обещает быть легкой если принимать во внимание тот факт, что Атлетико решил часть игроков оставить дома. На игру не приедут легендарный Фалькао и 5 игроков основного состава - Годин, Луиз, Габи, Тьяго, Туран.
Против Атлетико за 1.77 в выездном матче? Считаю очень валуйно.

Леванте - Хельсингборг  1.42 - 5.1 - 10.0

Еще одного фаворита плять нарисовали. Суперклуб из Валенсии - Леванте. Схуяли здесь дают 1.4 при боевых 1.8 мне не понять. Ставлю против Леванте за 1.42 или Хельсинборг +0.5 за 3.2 в Пинке и Bet365.

Наполи - АИК 1.34 - 5.4 - 10.0

Как известно, итальянские команды обычно кладут болт на Лигу Европы, уделяя основное внимание родному чемпионату Серии А. Составов на матч я не видел, однако, я практически не сомневаюсь, что ни Кавани, ни Пандев, ни Гамшик играть с первой минуты не будут, а может и вообще на поле не выйдут. А шведский АИК не такой уж и слабый как о нем думают. В надежде на повторение московского чуда ставлю ПРОТИВ Наполи за 1.34.