Если покупать на 10 баксов каждый день.

Не знаю как вы, а я частенько натыкаюсь на рекламу – «каждый день новичок вкладывает 10 долларов в покупку Ripple… Узнай, зачем»

Ну, конечно, Ripple вырастет, каждый купит по острову и т.п., но давайте, на самом деле рассмотрим такую стратегию, где бот каждый день в течении года покупает одну и ту же монету на 10 долларов по текущей цене, а в конце года продаёт всё, что купил.

Что бы было интереснее, давайте заглянем в прошлое и виртуально всё это провернем и посмотрим, что получится?

Для упрощения эксперимента, будем считать годом 365 дней, последний день - сегодня. Каждый день где-то просыпается бот, тратит 10 долларов на покупку монеты и засыпает. На 365й день бот всё продает. Назовем такого бота Санта-Клаусом.

Для чистоты эксперимента мы возьмем два отрезка времени – 2016-2017гг, и 2017-2018 гг. Текущей ценой будем считать время открытия каждого дня.

10 долларами будем считать 10 USDT – это, конечно, не доллары, но очень близко. Свечи возьмем с полоникса – т.к. там очень удобно и быстро их брать.

В эксперименте будут участвовать только те пары, которые торгуются больше двух лет – различного рода форки и токены сюда не попадают, но вы сможете изменить для себя код, указать нужную пару и период поменьше, если захотите, конечно.

Итак, погнали.


Реклама


Получение данных

Нам потребуются свечи за 365 дней назад и еще 365 дней – итого 730 свечей. Для полоникса нужно указать временной разрыв в формате unix, поэтому нам потребуется перевести это в секунды.

Текущее время в формате unix:

import time
dateend = int(time.time())

в переменной dateend сейчас хранится кол-во целых секунд, прошедших с запуска первого экземпляра Unix. Мы назвали её dateend, т.к. текущее время – это крайняя (правая) граница нужного нам диапазона дат.

Теперь нам нужно получить время, которое было 730 дней назад от текущего. Давайте посчитаем, сколько это примерно секунд.

Нам нужно 730 дней по 24 часа, в каждом часе 60 минут, в каждой минуте 60 секунд. Можно посчитать в калькуляторе, а можно сразу на лету считать в коде, так приятнее.

import time

dateend = int(time.time())
datestart = int(dateend - 60*60*24*365*2)

print(dateend, datestart)

Давайте проверим наши выкладки – в интернете множество сайтов, где можно перевести время из unix-формата в обычный и наоборот, я выбрал первый попавшийся. Вбиваем первое число (красный квадрат), и убеждаемся, что время соответствует текущему международному.

 Текущее международное – для упрощения можно сказать времени по Гринвичу. Для Москвы это -3 часа, для Калининграда -2 и т.п.

Теперь вобьем вторую дату и убедимся, что она похожа на первую, но отличается на два года.

В общем, мы получили два момента времени – текущее и древнее, теперь нужно получить свечи за этот период.

Для получения свечей полоникс предоставляет удобный интерфейс, ссылка выглядит примерно так: https://poloniex.com/public?command=returnChartData¤cyPair=USDT_BTC&start=1458835653&end=1521907653&period=86400

USDT_BTC  - это нужная мне пара, я подставил её сам.

start – это время Unix, начиная с которого нужно возвращать данные (datestart в нашем коде)

end – это время, до которого возвращать (dateend в нашем коде)

86400 – это тип свечи. В данном случае – сутки. Считается просто – 24 часа на 60 минут на 60 секунд. Другие допустимые значения – 300 (5 минут), 900 (15 минут), 1800 (30 минут), 7200 (2 часа), 14400 (4 часа).

Если перейдете по ссылке, увидите примерно такую картину:

Каждая структура внутри фигурных скобок олицетворяет свечу – date это время в формате unix, open – цена открытия и т.п.

Давайте используем это в коде и проверим, сколько свечей вернулось.

import time
import requests

dateend = int(time.time())
datestart = int(dateend - 60*60*24*365*2)

pair = 'USDT_BTC'
data = requests.get("https://poloniex.com/public?command=returnChartData&currencyPair={pair}&start={datestart}&end={dateend}&period=86400".format(
    pair=pair, datestart=datestart, dateend=dateend
)).json()

print("Итого записей:", len(data))

Вроде похоже:

 

Теперь давайте покупать по 10 долларов каждые 364 дня, и продавать на 365й?

import time
import requests

dateend = int(time.time())
datestart = int(dateend - 60*60*24*365*2)

spend_base = 10

pair = 'USDT_BTC'
data = requests.get("https://poloniex.com/public?command=returnChartData&currencyPair={pair}&start={datestart}&end={dateend}&period=86400".format(
    pair=pair, datestart=datestart, dateend=dateend
), verify=False).json()

spent_total = 0 # Сколько всего потратили долларов
got_total = 0 # Сколько всего получили монет

# Проходимся в цикле по каждой свече
for day, candle in enumerate(data):
    
    if day+1 in (365, 730): # Если прошел год, то продаем 
        print("Прошел ГОД, продаем всё, что купили!")
        open_rate = float(candle['open']) # Цена открытия
        income = (got_total * open_rate) * (1-0.025) # Продаем всё, что купили по текущей цене, вычитаем комиссию
        profit = income - spent_total # От полученных долларов отнимаем потраченные

        print("Итого потрачено долларов: {spent_total}, получено долларов {income}. Прибыль/убыток составляет {profit}".format(
            spent_total=spent_total, income=income, profit=profit
        ))
        # Обнуляем траты/профиты для следующего года
        spent_total = 0
        got_total = 0
    else:
        spent_total += spend_base # Каждый день прибавляем по 10 долларов к уже потраченной сумме
        open_rate = float(candle['open']) # Цена открытия
        got_today = (spend_base/open_rate) * (1-0.025) # Сколько получили монет сегодня после вычета комиссии
        got_total += got_today
        
        print("День {day}, цена открытия {open_rate:0.8f}, потрачено долларов {spent_total}, получено монет сегодня {got_today:0.8f}, всего {got_total:0.8f}".format(
            day=day+1, open_rate=open_rate, spent_total=spent_total, got_total=got_total, got_today=got_today
        ))
    

print("Итого записей:", len(data))

Вот такой вот простой код, и узнаем, что могли бы в марте 2017 получить 1800 долларов прибыли. А в марте 2018го 5500 долларов прибыли. Тут был мат.

Ну а теперь изменим код так, что бы проверять несколько пар и не выводить отладочных сообщений.

import time
import requests

from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

dateend = int(time.time())
datestart = int(dateend - 60*60*24*365*2)

spend_base = 10

pairs = ['USDT_BTC', 'USDT_ETH', 'USDT_LTC', 'USDT_DASH']

for pair in pairs:
    data = requests.get("https://poloniex.com/public?command=returnChartData&currencyPair={pair}&start={datestart}&end={dateend}&period=86400".format(
        pair=pair, datestart=datestart, dateend=dateend
    ), verify=False).json()

    spent_total = 0 # Сколько всего потратили долларов
    got_total = 0 # Сколько всего получили монет

    # Проходимся в цикле по каждой свече
    for day, candle in enumerate(data):
        
        if day+1 in (365, 730): # Если прошел год, то продаем 
            open_rate = float(candle['open']) # Цена открытия
            income = (got_total * open_rate) * (1-0.025) # Продаем всё, что купили по текущей цене, вычитаем комиссию
            profit = income - spent_total # От полученных долларов отнимаем потраченные

            print("{pair} потрачено долларов: {spent_total}, получено долларов {income}. Прибыль/убыток составляет {profit}".format(
                pair=pair, spent_total=spent_total, income=income, profit=profit
            ))
            # Обнуляем траты/профиты для следующего года
            spent_total = 0
            got_total = 0
        else:
            spent_total += spend_base # Каждый день прибавляем по 10 долларов к уже потраченной сумме
            open_rate = float(candle['open']) # Цена открытия
            got_today = (spend_base/open_rate) * (1-0.025) # Сколько получили монет сегодня после вычета комиссии
            got_total += got_today

Думайте сами, решайте сами… =) Я не буду комментировать результаты.


Реклама


Заключение

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

Написать бота, который будет просыпаться раз в сутки и делать покупку совсем не сложно, вы вполне можете сделать это сами, возможно мы разберем пример подобного поведения в другой статье.

В любом случае желаю вам хороших заработков и приглашаю к обсуждению в комментарии)


Это статья из цикла "Популярно о бирже"
Все статьи цикла:

Последнее изменение:

Не забудьте рассказать друзьям об этой статье.
Чтобы поддержать ресурс Bablofil достаточно просто поделиться с друзьями этой статьей в социальных сетях. Каждый репост - это самая высокая оценка качества материала. Спасибо, что читаете этот блог.



Комментарии
26.03.2018 18:37:32
немножко изменил код, что бы посчитать какой был бы профит если купить в первый же день на 3640 и продать через 365 дней (я не буду комментировать результаты =)))))):
______________________________
USDT_BTC потрачено долларов: 3640, получено долларов 5144.92297586313, если купить в первый день на 3640, получено через 365: 7929.774424906838
USDT_BTC потрачено долларов: 3640, получено долларов 8546.467634638762, если купить в первый день на 3640, получено через 365: 28073.07607299361
USDT_ETH потрачено долларов: 3640, получено долларов 15864.43814158324, если купить в первый день на 3640, получено через 365: 17139.812972905678
USDT_ETH потрачено долларов: 3640, получено долларов 8883.616179283505, если купить в первый день на 3640, получено через 365: 37154.130523039516
USDT_LTC потрачено долларов: 3640, получено долларов 3643.358688159822, если купить в первый день на 3640, получено через 365: 4189.3022022962805
USDT_LTC потрачено долларов: 3640, получено долларов 14235.69402208071, если купить в первый день на 3640, получено через 365: 136104.59215431445
USDT_DASH потрачено долларов: 3640, получено долларов 32188.82398285546, если купить в первый день на 3640, получено через 365: 45960.422150603314
USDT_DASH потрачено долларов: 3640, получено долларов 6662.548160880572, если купить в первый день на 3640, получено через 365: 16830.895978199886
Проголосовать Проголосовать
0 0
Пожалуйста, авторизуйтесь, что бы оставить свой комментарий
Крипто-кошельки для помощи и благодарности проекту:

Bitcoin адрес проекта: [[address]]

Перевод на сумму [[value]] BTC получен. Спасибо!.
[[error]]

Ethereum адрес проекта: [[address]]