Думаю многие из вас могут сказать про себя «Два года назад я не верил в 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.: вот так и родился очередной мой велосипед.