Перейти к публикации
Форум ботоводов
admin

Бот для trailing stop на Binance

Рекомендованные сообщения

Добрый день. Очень интересно. Огромнейшее спасибо за труды!
Но есть предложение по всем ботам: делать в виде функций или модулей. Вот сейчас, например, с удовольствием  прикрутил бы эту стратегию и погонял на других биржах, где без дела лежит некоторое количество крипты. 
Пример такой унификации - библиотека ccxt ( https://github.com/ccxt/ccxt )  хотя там свои недочёты..

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • Timestamp for this request was 1000ms ahead of the server's time.

Добрый день! Как с этим бороться?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
04.01.2019 в 23:03, Korzhik сказал:
  • Timestamp for this request was 1000ms ahead of the server's time.

Добрый день! Как с этим бороться?

Поставил синхронизацию времени с windows.com - бот стал исполнять ордера.

Спасибо огромное за Ваши труды!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Привет всем!!! можно ли этот параметр сделать в процентах? , amount = 0.0015             # Кол-во монет, которое планируем продать (в случае Long) или купить (в случае Short)
                                # Если указываем Long, то альты для продажи (Например, продать 0.1 ETH в паре ETHBTC)
                                # Если Short, то кол-во, на которое покупать, например купить на 0.1 BTC по паре ETHBTC

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
08.01.2019 в 12:20, валерий сказал:

Привет всем!!! можно ли этот параметр сделать в процентах? , amount = 0.0015             # Кол-во монет, которое планируем продать (в случае Long) или купить (в случае Short)
                                # Если указываем Long, то альты для продажи (Например, продать 0.1 ETH в паре ETHBTC)
                                # Если Short, то кол-во, на которое покупать, например купить на 0.1 BTC по паре ETHBTC

 

Можно, конечно, но надо ли? Бот то разовый, либо продает либо покупает и потом выходит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть мысль убрать из кода "while True" ,заменив функцией класса, создать отдельный основной модуль, в котором в цикле будет вызываться этот скрипт, и его клоны, на каждую пару.Таким образом реализуется бот на несколько пар. Также можно при срабатывании стопа не прекращать работу бота, а менять значение лонг шорт. Попробую реализовать (если терпения хватит). Уже около часа тестирую- полет нормальный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
20.01.2019 в 22:17, admin сказал:

Можно, конечно, но надо ли? Бот то разовый, либо продает либо покупает и потом выходит.

Если можно, то очень надо)

И если не затруднит, то хотелось бы попросить сделать такую последовательность действий в скрипте, буду крайне признателен!

  • Получаем сигнал на покупку (я его получаю с виджетов tradingview, когда по трём таймфреймам 5M/15M/1H в Summary стоит значение BUY или STRONG BUY)
  • Покупаем
  • Работаем по вашей статье "Trailing stop своими руками"
  • После продажи ждём следующего сигнала BUY

Заранее спасибо)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
21.01.2019 в 05:32, pazurs сказал:

Есть мысль убрать из кода "while True" ,заменив функцией класса, создать отдельный основной модуль, в котором в цикле будет вызываться этот скрипт, и его клоны, на каждую пару.Таким образом реализуется бот на несколько пар. Также можно при срабатывании стопа не прекращать работу бота, а менять значение лонг шорт. Попробую реализовать (если терпения хватит). Уже около часа тестирую- полет нормальный.

Тоже думал так сделать, но что мне кажется что если будет больше 10 пар, то "решение" будет опаздывать

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
30.01.2019 в 12:36, watson сказал:

Если можно, то очень надо)

И если не затруднит, то хотелось бы попросить сделать такую последовательность действий в скрипте, буду крайне признателен!

  • Получаем сигнал на покупку (я его получаю с виджетов tradingview, когда по трём таймфреймам 5M/15M/1H в Summary стоит значение BUY или STRONG BUY)
  • Покупаем
  • Работаем по вашей статье "Trailing stop своими руками"
  • После продажи ждём следующего сигнала BUY

Заранее спасибо)

А как вы сигналы получаете с виджетов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 часов назад, Andrei22 сказал:

Тоже думал так сделать, но что мне кажется что если будет больше 10 пар, то "решение" будет опаздывать

Можно каждую пару в отдельном потоке пускать, но все равно будет запаздывать.

Поэтому нужно получать курсы по сокетам, в отдельном потоке, а в других потоках переставлять 🙂

Но проще запустить несколько скриптов одновременно и не париться

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
10 минут назад, admin сказал:

А как вы сигналы получаете с виджетов?

С помощью selenium. Прикрепил файл

test.zip

Изменено пользователем watson

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
31.01.2019 в 15:05, watson сказал:

С помощью selenium. Прикрепил файл

test.zip

У вас всё есть уже, вам надо просто совместить два скрипта, вот как то так, приложил это еще и в файлах

import sqlite3
import logging
import time
import os
import math

from datetime import datetime

from binance_api import Binance

bot = Binance(
    API_KEY='',
    API_SECRET=''
)

def process_trailing(settings):
    multiplier = -1 if settings['strategy'] == "Long" else 1

    print("Получаем настройки пар с биржи")
    symbols = bot.exchangeInfo()['symbols']
    step_sizes = {symbol['symbol']:symbol for symbol in symbols}
    for symbol in symbols:
        for f in symbol['filters']:
            if f['filterType'] == 'LOT_SIZE':
                step_sizes[symbol['symbol']] = float(f['stepSize'])

    while True:
        try:
            print('Проверяю пару {pair}, стратегия {strategy}'.format(pair=settings['symbol'], strategy=settings['strategy']))
            # Получаем текущие курсы по паре
            current_rates = bot.depth(symbol=settings['symbol'], limit=5)

            bid=float(current_rates['bids'][0][0])
            ask=float(current_rates['asks'][0][0])

            # Если играем на повышение, то ориентируемся на цены, по которым продают, иначе на цены, по которым покупают
            curr_rate = bid if settings['strategy'] == "Long" else ask
            
            if settings['stop_loss_fixed'] == 0:
               settings['stop_loss_fixed'] = (curr_rate/100) * (settings['stop_loss_perc']*multiplier+100)
     
            print("Текущие курсы bid {bid:0.8f}, ask {ask:0.8f}, выбрана {cr:0.8f} stop_loss {sl:0.8f}".format(
                bid=bid, ask=ask, cr=curr_rate, sl=settings['stop_loss_fixed']
            ))

            # Считаем, каким был бы stop-loss, если применить к нему %
            curr_rate_applied = (curr_rate/100) * (settings['stop_loss_perc']*multiplier+100)

            if settings['strategy'] == "Long":
                # Выбрана стратегия Long, пытаемся продать монеты как можно выгоднее
                if curr_rate > settings['stop_loss_fixed']:
                    print("Текущая цена выше цены Stop-Loss")
                    if curr_rate_applied > settings['stop_loss_fixed']:
                        print("Пора изменять stop-loss, новое значение {sl:0.8f}".format(sl=curr_rate_applied))                    
                        settings['stop_loss_fixed'] = curr_rate_applied
                else:
                    # Текущая цена ниже или равна stop loss, продажа по рынку
                    res = bot.createOrder(
                        symbol=settings['symbol'],
                        recvWindow=15000,
                        side='SELL',
                        type='MARKET',
                        quantity=settings['amount']
                    )
                    print('Результат создания ордера', res)
                    if 'orderId' in res:
                        # Создание ордера прошло успешно, выход
                        break
            else:
                # Выбрана стратегия Short, пытаемся купить монеты как можно выгоднее
                if curr_rate < settings['stop_loss_fixed']:
                    print("Текущая цена ниже stop-loss")
                    if curr_rate_applied < settings['stop_loss_fixed']:
                        print("Пора изменять stop-loss, новое значение {sl:0.8f}".format(sl=curr_rate_applied))                    
                        settings['stop_loss_fixed'] = curr_rate_applied
                else:
                    # Цена поднялась выше Stop-Loss, Покупка по рынку
                    quantity = math.floor((settings['amount']/curr_rate)*(1/step_sizes[settings['symbol']]))/(1/step_sizes[settings['symbol']])
                    print("Цена поднялась выше Stop-Loss, Покупка по рынку, кол-во монет {quantity:0.8f}".format(quantity=quantity))
                    # math.Floor(coins*(1/stepSize)) / (1 / stepSize)
                    res = bot.createOrder(
                        symbol=settings['symbol'],
                        recvWindow=15000,
                        side='BUY',
                        type='MARKET',
                        quantity=quantity
                    )
                    print('Результат создания ордера', res)
                    if 'orderId' in res:
                        # Создание ордера прошло успешно, выход
                        break

        except Exception as e:
            print(e)
        time.sleep(1)

# Ваш код тут
# ....
# ....

if smth: # какое то там условие из индикаторов
    
    # тут на основе своих данных выбираете пару, тип ордера, курс, объем и т.п.
    curr_pair = 'EOSBTC'

    curr_amount = 0.0015
    curr_rate = 0.1

    # создаете ордер, покупаете монеты
    new_order = bot.createOrder(
        symbol=curr_pair,
        recvWindow=5000,
        side='BUY',
        type='LIMIT', 
        timeInForce='GTC',  # Good Till Cancel
        quantity=curr_amount,
        price=curr_rate,
        newOrderRespType='FULL'
    )
    # Если ордер создался без ошибок, начинаем трейлинг продажи купленных монет
    if 'orderId' in new_order:
    
        settings = dict(
            symbol=curr_pair,            # Пара для отслеживания
            strategy="Long",           # Стратегия - Long (повышение), Short (понижение)           
            stop_loss_perc = 0.5,       # % оставания от цены
            stop_loss_fixed = 0,        # Изначальный stop-loss, можно установить руками нужную сумму, потом бот подтянет.
                                    # Можно указать 0, тогда бот высчитает, возьмет текущую цену и применит к ней процент
            amount =  curr_amount            # Кол-во монет, которое планируем продать (в случае Long) или купить (в случае Short)
                                    # Если указываем Long, то альты для продажи (Например, продать 0.1 ETH в паре ETHBTC)
                                    # Если Short, то кол-во, на которое покупать, например купить на 0.1 BTC по паре ETHBTC
        )
        # запускается функция и перехватыет управление на себя, когда она отработает процесс пойдет дальше
        process_trailing(settings)

        

 

binance_api.py

tv.py

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте! Могли бы Вы адаптировать код трейлинг-стопа для Yobit?

Спасибо за Ваши статьи, очень интересная тема.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Он не сработает на yobit, там нет продажи по рынку.

1. Цена поднимется до пика, опустится до stop_loss_fiexed, создаст лимитный ордер на продажу и все ! Цена будет падать, ордер будет висеть.

2. Если только все верхние ордера выгрызать по очереди, но там куча ботов вверху по 10 копеек ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.


×
×
  • Создать...