Pull to refresh

Как рождается велосипед или зачем я написал клиент для биржи

Reading time 4 min
Views 13K
Думаю многие из вас могут сказать про себя «Два года назад я не верил в Bitcoin, поэтому не купил. Год назад я думал — ну теперь точно обвал и не купил...». Вы не одиноки.

Месяц назад я все таки решился и купил монет на одной из бирж. Какое было мое удивление, когда купленные по 4$ монеты, стали стоять 40$.

Но этот пост не об этом.

Предисловие

Я начал с небольшого анализа рынка, которые привел меня к умозаключению — «У LTC есть потенциал, как минимум он привлекателен для спекулянтов. Мало стоит — высокий доход при низких затратах. Для игры с BTC сейчас нужно куда больше вложений. Зря конечно в прошлом декабре я не начал майнить LTC, ну или хотя бы не купил.»

И вот я решился, купил немного монет, следил за колебаниями курсов, за спекулятивной игрой, тактикой и стратегией больших игроков. Начал постепенно втягиваться в кухню криптовалют. Тут сложно дать какой то определенный совет, но:
— Никогда нельзя спешить.
— Нельзя поддаваться панике.
— Чтобы не сжигать свои нервы, нужно заранее определиться что вы будете делать с той или иной частью активов.

Ближе к делу

После двух недель прошли эпилептические припадки при обвалах на бирже, я выбрал свою тактику поведения. Часть активов долгосрочных, а другая часть для игры на рынке. Я нашел как мне показалось достаточно удобную в плане использования биржу. Сайт позволял контролировать ситуацию по разным валютным парам, быстро делать ставки и получать прибыль. Игра на бирже за такой короткий промежуток времени стала чем то вроде зайти в свободную минутку на Хабрахабр и почитать новости. Это было легко сделать когда рядом ПК, но курсы могли значительно колебаться в любое время суток, мне нужен был контроль над активами и информация по состоянию рынка. Я начал искать клиент под Android, но тот что я нашел был очень не удобный, выглядел достаточно аляповато. Поэтому было принято решение, в свободное от работы время сделать свой клиент. Да, я люблю велосипеды, это мое хобби.

Работа с API и вклад в Open Source

У выбранного для торгов рынка есть свое API, оно достаточно простое в использовании. Есть публичное и приватное API. Первое для получения показателей рынка, второе для торгов и запроса информации о пользователе. Данные предоставляются в формате JSON. Я написал несколько Java классов в качестве прослойки, для удобной работы с API, все они будут опубликованы в моем профиле на github.

Пример из кода, для получения информации по валютной паре, достаточно выполнить:
BTCeTicker.getTicker(pair);

Это вернет вам объект JSON, такого вида:
{
   "ticker":{
      "high":1021,
      "low":928.09998,
      "avg":974.54999,
      "vol":15334566.88449,
      "vol_cur":15600.23488,
      "last":996.001,
      "buy":999.995,
      "sell":996.093,
      "updated":1386107758,
      "server_time":1386107759
   }
}

Далее отправив этот объект другому методу того же класса, можно получить любое нужное значение.
Например, получим цену последней сделки:
BTCeTicker.getLast(Ticker);

По-моему вышло достаточно неплохо и прозрачно. Вопросы разве что к именованию классов у меня в проекте, но пусть это останется на моей совести. Напомню, классы для работы с API биржи я выложу чуть позже на github.

После того как все классы по работе с API были написаны, осталось дело за малым, оформить внешний вид приложения, надеть скелет на ранее написанный код, как следует все оттестировать, и выложить для всеобщего обозрения в сеть. Собственно вот что получилось:

Скриншоты

Главная страница приложения, курсы:
image

Страница валютной пары:


Immersive mode для Android 4.4 + action bar снизу:
image image

История сделок:


Мотивирующая на покупку бесплатная версия

Доступна платная и бесплатная версии приложения. Отличия бесплатной версии:
— Нет ограничений, она полнофункциональная.
— Нет рекламы.
— Начиная с 14 дня использования, бесплатная версия при запуске будет говорить что она бесплатная. Это единственное отличие от платной.

Выглядит это так:


Поясню, таймер отсчитывает 15 секунд, оставшееся количество секунд видно на кнопке закрытия, после чего кнопка закрытия окна станет активной и можно работать с приложением в обычном режиме. Если ваши нервы не выдержат, возможно вы купите платную версию, ну или просто удалите бесплатную.

Для такого поведения, был написан небольшой метод который вызывается при запуске. Он ставит метку типа long и пишет ее в SharedPreferences, затем при каждом запуске сверяет, если разница более 14 суток, то выводит AlertDialog.
public static void checkTrial(){
        FIRST_RUN = prefs.getLong("FIRST_RUN",0);
        if(FIRST_RUN==0){
            prefs.edit().putLong("FIRST_RUN", System.currentTimeMillis()).commit();
            FIRST_RUN = prefs.getLong("FIRST_RUN",0);
        }
        CURRENT_TIME = System.currentTimeMillis();

        if(CURRENT_TIME/1000 - FIRST_RUN/1000 > 1209600){
            AlertDialog.Builder action_dialog = new AlertDialog.Builder(bm_MainContext);
            action_dialog.setTitle(R.string.about));
            LayoutInflater inflater = bm_MainState.getLayoutInflater();
            View layer = inflater.inflate(R.layout.trial,null);

            final Button btnCancel = (Button) layer.findViewById(R.id.btnCancelTrial);
            Button btnBuyApp = (Button) layer.findViewById(R.id.btnAppBuy);

            btnCancel.setEnabled(false);
            btnBuyApp.setText(R.string.close + " (15)");

            action_dialog.setCancelable(false);
            action_dialog.setView(layer);

            final AlertDialog AboutDialog = action_dialog.create();

            btnCancel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    AboutDialog.dismiss();
                }
            });
            btnBuyApp.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Uri uri = Uri.parse("https://play.google.com/store/apps/details?id=com.zlab.btcmonitor");
                    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                    bm_MainState.startActivity(intent);
                }
            });
            AboutDialog.show();

            Thread thread = new Thread()
            {
                @Override
                public void run() {
                    int i=14;
                    while(i>0){
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        final int c=i;
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                            btnCancel.setText(R.string.close) + " ("+c+")"); }});
                        i--;
                    }
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            btnCancel.setText(R.string.close);
                            btnCancel.setEnabled(true);}});}
            };
            thread.start();
        }
    }

Исходный код этого участка немного модифицирован, чтобы не казаться слишком раздутым. В IDE он выглядит симпатичней чем тут.
Если вы еще более несведущий в Java и Android чем я, то возможно вам пригодится этот кусок кода.

Ссылки

Платная версия:
image

Бесплатная версия:
image

p.s.: вот так и родился очередной мой велосипед.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+57
Comments 88
Comments Comments 88

Articles