Автор |
Сообщение |
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
000 писал(а): |
А с закачкой истории не попадались примеры?
В описании API очень много про аккаунт. Там можно по API выставлять заявки, получать историю своих сделок, портфель и т.п. |
Да по API там полно всего, можно мозги вскипятить.
Поясни что именно нужно в плане загрузки истории, много чего встречал в сети.
Поищу если что надо.
Нашел робота, на питоне где подгружается история перед стартом робота - работает вроде. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вот. Нужны примеры. Давай сюда этого бота. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
000 писал(а): |
Вот. Нужны примеры. Давай сюда этого бота. |
Лови.....
import websocket
import json
import pandas as pd
import talib
import os
import re
from datetime import datetime
from binance.client import Client
from binance.enums import *
#Binance Web Socket
SOCKET = 'wss://testnet.binance.vision/ws/btcusdt@kline_1m'
TRADE_SYMBOL = 'BTCUSDT'
TRADE_QUANTITY = 0.01
API_KEY = ''
API_SECRET = ''
client = Client(API_KEY, API_SECRET)
fast_ema = 7
slow_ema = 21
slow_sma = 100
data = client.get_klines(symbol = TRADE_SYMBOL, interval = Client.KLINE_INTERVAL_1MINUTE, limit = 102)
df = pd.DataFrame(data)
df_edited = df.drop([0,5,6,7,8,9,10,11], axis=1)
df_final = df_edited.drop(df_edited.tail(1). index)
df_final.columns = ['o', 'h', 'l', 'c']
df_final['fast_ema'] = round(talib.EMA(df_final['c'], fast_ema), 4)
df_final['slow_ema'] = round(talib.EMA(df_final['c'], slow_ema), 4)
df_final['slow_sma'] = round(df_final['c'].rolling(window=slow_sma).mean(), 4)
print(df_final)
def on_open(ws):
print("-----Open Connection-----")
def on_close(ws):
print("-----Close Connection-----")
def on_message(ws, message):
global df_final
in_position = False
json_message = json.loads(message)
print(json_message)
#getting only the candle details from the websocket's message
candle = json_message['k']
#candle['x'] inform about the end of the candle
candle_closed = candle['x']
open_data = candle['o']
high_data = candle['h']
low_data = candle['l']
close_data = candle['c']
if candle_closed:
#if the message is a closed candle, add it to the DataFrame
df_final = df_final.append(candle, ignore_index=True)
df_final['fast_ema'] = round(talib.EMA(df_final['c'], fast_ema), 4)
df_final['slow_ema'] = round(talib.EMA(df_final['c'], slow_ema), 4)
df_final['slow_sma'] = round(df_final['c'].rolling(window=slow_sma).mean(), 4)
last_open = df_final['o'].tail(1)
last_high = df_final['h'].tail(1)
last_low = df_final['l'].tail(1)
last_close = df_final['c'].tail(1)
last_fast_EMA = df_final['fast_ema'].tail(1)
last_slow_EMA = df_final['slow_ema'].tail(1)
last_slow_SMA = df_final['slow_sma'].tail(1)
print("Open: {}" .format(open_data), " │ " "High: {}".format(high_data), " │ " "Low: {}" .format(low_data), " │ " "Close: {}" .format(close_data))
print('EMA 7: {}' .format(float(df_final['fast_ema'].tail(1))))
print('EMA 21: {}' .format(float(df_final['slow_ema'].tail(1))))
print('SMA 100: {}' .format(float(df_final['slow_sma'].tail(1))))
# trading strategy
if float(last_close) > float(last_fast_EMA) and float(last_fast_EMA) > float(last_slow_SMA) and float(last_slow_EMA) > float(last_slow_SMA) :
print('EMAs sross to the upside, execute buy order')
# your buying code here
if float(last_close) < float(last_fast_EMA) and float(last_fast_EMA) < float(last_slow_EMA) and float(last_slow_EMA) < float(last_slow_SMA) :
print('EMAs sross to the downside, execute sell order')
# your selling code here
ws = websocket.WebSocketApp(SOCKET, on_open=on_open, on_close=on_close, on_message=on_message)
ws.run_forever() |
|
|
Посмотреть профиль Отправить личное сообщение |
|
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Все, что найдешь вали сюда. Надо больше примеров. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
000 писал(а): |
Все, что найдешь вали сюда. Надо больше примеров. |
Огласите весь список пжлст...примеров )) |
|
|
Посмотреть профиль Отправить личное сообщение |
|
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
Набрел на УМНЫЙ скрипт, на питоне, по закачке ЛЮБЫХ исторических данных с BINANCE.
Скрипт обходит ограничение биржы при разовой закачке данных, он тупо делает паузу и потом продолжает, в итоге собирает весь указанный ему диапазон и выдает.
Добавил вывод в текстовый файл в формат Amibroker.
Внизу скрипта меняем инструмент, диапазон закачки, имя файла.
Вверху ищем переменную interval со значением '1m' - тоже меняем.
Все работает на отлично.
Возник вопрос по Амиброкеру, можно ли в нем провести бэктестинг сразу всех имеющихся стратегий на инструменте? Или это только WelsLab может?
from datetime import datetime
import pandas as pd
import requests
from typing import *
import time
import csv
import os
class BinanceClient:
def __init__(self, futures=False):
self.exchange = "BINANCE"
self.futures = futures
if self.futures:
self._base_url = "https://fapi.binance.com"
else:
self._base_url = "https://api.binance.com"
self.symbols = self._get_symbols()
def _make_request(self, endpoint: str, query_parameters: Dict):
try:
response = requests.get(self._base_url + endpoint, params=query_parameters)
except Exception as e:
print("Connection error while making request to %s: %s", endpoint, e)
return None
if response.status_code == 200:
return response.json()
else:
print("Error while making request to %s: %s (status code = %s)",
endpoint, response.json(), response.status_code)
return None
def _get_symbols(self) -> List[str]:
params = dict()
endpoint = "/fapi/v1/exchangeInfo" if self.futures else "/api/v3/exchangeInfo"
data = self._make_request(endpoint, params)
symbols = [x["symbol"] for x in data["symbols"]]
return symbols
def get_historical_data(self, symbol: str, interval: Optional[str] = "1m", start_time: Optional[int] = None, end_time: Optional[int] = None, limit: Optional[int] = 1500):
params = dict()
params["symbol"] = symbol
params["interval"] = interval
params["limit"] = limit
if start_time is not None:
params["startTime"] = start_time
if end_time is not None:
params["endTime"] = end_time
endpoint = "/fapi/v1/klines" if self.futures else "/api/v3/klines"
raw_candles = self._make_request(endpoint, params)
candles = []
if raw_candles is not None:
for c in raw_candles:
candles.append((float(c[0]), float(c[1]), float(c[2]), float(c[3]), float(c[4]), float(c[5]),))
return candles
else:
return None
def ms_to_dt_utc(ms: int) -> datetime:
return datetime.utcfromtimestamp(ms / 1000)
def ms_to_dt_local(ms: int) -> datetime:
return datetime.fromtimestamp(ms / 1000)
def GetDataFrame(data):
df = pd.DataFrame(data, columns=['Timestamp', "Open", "High", "Low", "Close", "Volume"])
df["Timestamp"] = df["Timestamp"].apply(lambda x: ms_to_dt_local(x)) # May be change to UTC time Binance
df['Date'] = df["Timestamp"].dt.strftime("%d/%m/%Y")
df['Time'] = df["Timestamp"].dt.strftime("%H:%M:%S")
column_names = ["Date", "Time", "Open", "High", "Low", "Close", "Volume"]
df = df.set_index('Timestamp')
df = df.reindex(columns=column_names)
return df
def GetHistoricalData(client, symbol, start_time, end_time, limit=1500):
collection = []
while start_time < end_time:
data = client.get_historical_data(symbol, start_time=start_time, end_time=end_time, limit=limit)
print(client.exchange + " " + symbol + " : Collected " + str(len(data)) + " initial data from "+ str(ms_to_dt_local(data[0][0])) +" to " + str(ms_to_dt_local(data[-1][0])))
print (data)
start_time = int(data[-1][0] + 1000)
collection +=data
time.sleep(1.1)
return collection
indate = '2021-03-27'
outdate = '2022-03-27'
client = BinanceClient(futures=False)
symbol = "BTCUSDT"
interval = "1m"
fromDate = int(datetime.strptime(indate, '%Y-%m-%d').timestamp() * 1000)
toDate = int(datetime.strptime(outdate, '%Y-%m-%d').timestamp() * 1000)
data = GetHistoricalData(client, symbol, fromDate, toDate)
df = GetDataFrame(data)
df
to_csv_timestamp = datetime.today().strftime('%Y%m%d_%H%M%S')
path = os.getcwd()
#filename = path + '/data/' + indate +'_' +outdate + '_' +symbol+'_History.csv'
filename = path + '/data/' + symbol+'.txt'
#df.to_csv(filename,mode = 'a', header = True, index=False)
df.to_csv(filename,mode = 'w', sep=',', header = True, index=False) |
|
|
Посмотреть профиль Отправить личное сообщение |
|
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
|
Посмотреть профиль Отправить личное сообщение |
|
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
DennyV8 писал(а): |
Ураааа заработала..
Организовал поставку тиковых данных через такой маршрут Python -> Excel -> DDE -> Amibroker.
Свечи рисует. Круть
только вот бывает такая ошибка и питон выключает скрипт :
URLError: <urlopen error [WinError 10060] Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера>
Пока не понял с чем это связано.
Вобщем осталось подключить программеров и наладить бесперебойную работу. |
Решил проблему с остановкой скрипта, вобщем Питон такая интересная штука, не только я один такое решение искал. Надо было прописать в скрипте строку, что когда он останавливается (не важно по какой причине), то чтобы сам перезапускался...В итоге наладил бесперебойную поставку данных через DDE, с утра сегодня Амик шурует тиковые данные c BINANCE через Python в EXCEL...Осталось как то подгружать исторические данные в эту базу, когда комп выключен был )). Может быть можно задействовать тот плагин от демки как-то, пока не допер как 2 базы совмещать, и тупо менять плагины местами. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
genom
Зарегистрирован: 09.11.2010
Сообщения: 53
|
Всем привет! Интересная тема у вас тут. Решил приложить с гитхаба вариант скачки исторических данных с binance на питоне в отдельную файловую базу, далее легко вставляются в ами . Использую его для закачки всей истории в */usdt, можно отдельные тикеры. Прикладываю исходник (fast_binance_ohlcv_history_downloader_asyncio-main.zip) и мой подправленный вариант USDT HISTORY.rar.
необходимые библиотеки для питона указаны в файле binance_asyncio_fetcher.py, а настройки в main.py. (п.с. безотказно работает на Python 3.9), запускать main.py |
|
|
Посмотреть профиль Отправить личное сообщение |
|
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
genom писал(а): |
Всем привет! Интересная тема у вас тут. Решил приложить с гитхаба вариант скачки исторических данных с binance на питоне в отдельную файловую базу, далее легко вставляются в ами . Использую его для закачки всей истории в */usdt, можно отдельные тикеры. Прикладываю исходник (fast_binance_ohlcv_history_downloader_asyncio-main.zip) и мой подправленный вариант USDT HISTORY.rar.
необходимые библиотеки для питона указаны в файле binance_asyncio_fetcher.py, а настройки в main.py. (п.с. безотказно работает на Python 3.9), запускать main.py |
Приветы...
Отлично, у нас прибыло ))
А как качаешь данные в реальном времени? Я пока DDE - Excel только осилил, но работает железно, правда есть потеря секунд несколько на перезапуск скрипта, когда его забанят, но по графику вроде и не заметно )
Как выставляешь заявки на Binance?
Или только для бэктеста?
Тут на форуме я выкладывал плагин ДЕМО (разница в 3 часа и только USDT пары), но через него закачиваются любые исторические данные по желанию, все в одну базу, но только 1 тикер за раз. На полную версию тратиться пока не готов, может что тут получится сваять )) Хочу сначала проверить на коленке , а надо ли мне оно .... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
genom
Зарегистрирован: 09.11.2010
Сообщения: 53
|
DennyV8 писал(а): |
Приветы...
Отлично, у нас прибыло ))
А как качаешь данные в реальном времени? Я пока DDE - Excel только осилил, но работает железно, правда есть потеря секунд несколько на перезапуск скрипта, когда его забанят, но по графику вроде и не заметно )
Как выставляешь заявки на Binance?
Или только для бэктеста?
Тут на форуме я выкладывал плагин ДЕМО (разница в 3 часа и только USDT пары), но через него закачиваются любые исторические данные по желанию, все в одну базу, но только 1 тикер за раз. На полную версию тратиться пока не готов, может что тут получится сваять )) Хочу сначала проверить на коленке , а надо ли мне оно .... |
Привет! Пока сил и времени хватает только на бэктест, но тема
интересная. Будет время, обязательно подключусь как смогу, хотя мои навыки в этих делах совсем не блещут. |
Последний раз редактировалось: genom (Ср Апр 06, 2022 10:55 pm), всего редактировалось 1 раз |
|
Посмотреть профиль Отправить личное сообщение |
|
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
genom писал(а): |
DennyV8 писал(а): |
Приветы...
Отлично, у нас прибыло ))
А как качаешь данные в реальном времени? Я пока DDE - Excel только осилил, но работает железно, правда есть потеря секунд несколько на перезапуск скрипта, когда его забанят, но по графику вроде и не заметно )
Как выставляешь заявки на Binance?
Или только для бэктеста?
Тут на форуме я выкладывал плагин ДЕМО (разница в 3 часа и только USDT пары), но через него закачиваются любые исторические данные по желанию, все в одну базу, но только 1 тикер за раз. На полную версию тратиться пока не готов, может что тут получится сваять )) Хочу сначала проверить на коленке , а надо ли мне оно .... |
Привет! Пока сил и времени хватает только на бэктест, но тема
интересная. Будет время обязательно подключусь как смогу. |
Чет у меня ошибки сыпет (Anaconda + Spyder Python 3_8 правда), там папки надо какие создавать дополнительные? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
genom
Зарегистрирован: 09.11.2010
Сообщения: 53
|
Я использовал обычный питон, т.е. нет анаконды, а библиотеки, те, что там импортированы. Вроде на какой то 3.8 версии, тоже запускалось, но не точно. Сейчас проверил на 3.10, тоже тянет. п.с. попробуй вариант подправленный, папка любая, файлы положи в одну папку.
Обрати внимание на import h5py - он ниже там вставлен
asyncio
ccxt.async_support
pandas
tables
datetime
h5py
этого достаточно для запуска |
|
|
Посмотреть профиль Отправить личное сообщение |
|
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
genom писал(а): |
Я использовал обычный питон, т.е. нет анаконды, а библиотеки, те, что там импортированы. Вроде на какой то 3.8 версии, тоже запускалось, но не точно. Сейчас проверил на 3.10, тоже тянет. п.с. попробуй вариант подправленный, папка любая, файлы положи в одну папку.
Обрати внимание на import h5py - он ниже там вставлен
asyncio
ccxt.async_support
pandas
tables
datetime
h5py
этого достаточно для запуска |
Под Анакондой так и не пошло...
Зато пошло на обычном 3,8, только вопрос, скрипт качает все данные что есть по инcтрументам?
И как долго он их будет качать например в 1м ? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|