Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Модуль на Python выставляющий заявки из TRI файла на BINANCE Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
DennyV8



Зарегистрирован: 11.01.2022
Сообщения: 100

СообщениеДобавлено: Вт Мар 22, 2022 12:12 pm Ответить с цитатой Вернуться к началу

000 писал(а):
А с закачкой истории не попадались примеры?
В описании API очень много про аккаунт. Там можно по API выставлять заявки, получать историю своих сделок, портфель и т.п.


Да по API там полно всего, можно мозги вскипятить.

Поясни что именно нужно в плане загрузки истории, много чего встречал в сети.
Поищу если что надо.


Нашел робота, на питоне где подгружается история перед стартом робота - работает вроде.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Мар 22, 2022 1:14 pm Ответить с цитатой Вернуться к началу

Вот. Нужны примеры. Давай сюда этого бота.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
DennyV8



Зарегистрирован: 11.01.2022
Сообщения: 100

СообщениеДобавлено: Вт Мар 22, 2022 2:47 pm Ответить с цитатой Вернуться к началу

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

СообщениеДобавлено: Ср Мар 23, 2022 4:51 pm Ответить с цитатой Вернуться к началу

Еще инфа по API, свечам и прочему.

https://github.com/binance/binance-spot-api-docs/blob/master/rest-api.md
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Чт Мар 24, 2022 5:42 pm Ответить с цитатой Вернуться к началу

Все, что найдешь вали сюда. Надо больше примеров.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
DennyV8



Зарегистрирован: 11.01.2022
Сообщения: 100

СообщениеДобавлено: Чт Мар 24, 2022 6:11 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Все, что найдешь вали сюда. Надо больше примеров.


Огласите весь список пжлст...примеров ))
Посмотреть профиль Отправить личное сообщение
DennyV8



Зарегистрирован: 11.01.2022
Сообщения: 100

СообщениеДобавлено: Пн Мар 28, 2022 3:16 pm Ответить с цитатой Вернуться к началу

Набрел на УМНЫЙ скрипт, на питоне, по закачке ЛЮБЫХ исторических данных с 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

СообщениеДобавлено: Ср Мар 30, 2022 3:19 pm Ответить с цитатой Вернуться к началу

Еще исходники по плагину передачи данных.
Вроде на C++ сделан. Нужен видимо экспорт в DLL, описание не нашел ))

https://github.com/cupid-gracer/Amibroker-Plugin
Посмотреть профиль Отправить личное сообщение
DennyV8



Зарегистрирован: 11.01.2022
Сообщения: 100

СообщениеДобавлено: Вт Апр 05, 2022 9:25 pm Ответить с цитатой Вернуться к началу

DennyV8 писал(а):
Ураааа заработала..

Организовал поставку тиковых данных через такой маршрут Python -> Excel -> DDE -> Amibroker.

Свечи рисует. Круть

только вот бывает такая ошибка и питон выключает скрипт :

URLError: <urlopen error [WinError 10060] Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера>

Пока не понял с чем это связано.

Вобщем осталось подключить программеров и наладить бесперебойную работу.


Решил проблему с остановкой скрипта, вобщем Питон такая интересная штука, не только я один такое решение искал. Надо было прописать в скрипте строку, что когда он останавливается (не важно по какой причине), то чтобы сам перезапускался...В итоге наладил бесперебойную поставку данных через DDE, с утра сегодня Амик шурует тиковые данные c BINANCE через Python в EXCEL...Осталось как то подгружать исторические данные в эту базу, когда комп выключен был )). Может быть можно задействовать тот плагин от демки как-то, пока не допер как 2 базы совмещать, и тупо менять плагины местами.
Посмотреть профиль Отправить личное сообщение
genom



Зарегистрирован: 09.11.2010
Сообщения: 53

СообщениеДобавлено: Ср Апр 06, 2022 7:46 pm Ответить с цитатой Вернуться к началу

Всем привет! Интересная тема у вас тут. Решил приложить с гитхаба вариант скачки исторических данных с 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

СообщениеДобавлено: Ср Апр 06, 2022 10:37 pm Ответить с цитатой Вернуться к началу

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 только осилил, но работает железно, правда есть потеря секунд несколько на перезапуск скрипта, когда его забанят, но по графику вроде и не заметно Smile)
Как выставляешь заявки на Binance?
Или только для бэктеста?

Тут на форуме я выкладывал плагин ДЕМО (разница в 3 часа и только USDT пары), но через него закачиваются любые исторические данные по желанию, все в одну базу, но только 1 тикер за раз. На полную версию тратиться пока не готов, может что тут получится сваять )) Хочу сначала проверить на коленке , а надо ли мне оно ....
Посмотреть профиль Отправить личное сообщение
genom



Зарегистрирован: 09.11.2010
Сообщения: 53

СообщениеДобавлено: Ср Апр 06, 2022 10:52 pm Ответить с цитатой Вернуться к началу

DennyV8 писал(а):


Приветы...
Отлично, у нас прибыло ))

А как качаешь данные в реальном времени? Я пока DDE - Excel только осилил, но работает железно, правда есть потеря секунд несколько на перезапуск скрипта, когда его забанят, но по графику вроде и не заметно Smile)
Как выставляешь заявки на Binance?
Или только для бэктеста?

Тут на форуме я выкладывал плагин ДЕМО (разница в 3 часа и только USDT пары), но через него закачиваются любые исторические данные по желанию, все в одну базу, но только 1 тикер за раз. На полную версию тратиться пока не готов, может что тут получится сваять )) Хочу сначала проверить на коленке , а надо ли мне оно ....


Привет! Пока сил и времени хватает только на бэктест, но тема
интересная. Будет время, обязательно подключусь как смогу, хотя мои навыки в этих делах совсем не блещут.


Последний раз редактировалось: genom (Ср Апр 06, 2022 10:55 pm), всего редактировалось 1 раз
Посмотреть профиль Отправить личное сообщение
DennyV8



Зарегистрирован: 11.01.2022
Сообщения: 100

СообщениеДобавлено: Ср Апр 06, 2022 10:53 pm Ответить с цитатой Вернуться к началу

genom писал(а):
DennyV8 писал(а):


Приветы...
Отлично, у нас прибыло ))

А как качаешь данные в реальном времени? Я пока DDE - Excel только осилил, но работает железно, правда есть потеря секунд несколько на перезапуск скрипта, когда его забанят, но по графику вроде и не заметно Smile)
Как выставляешь заявки на Binance?
Или только для бэктеста?

Тут на форуме я выкладывал плагин ДЕМО (разница в 3 часа и только USDT пары), но через него закачиваются любые исторические данные по желанию, все в одну базу, но только 1 тикер за раз. На полную версию тратиться пока не готов, может что тут получится сваять )) Хочу сначала проверить на коленке , а надо ли мне оно ....


Привет! Пока сил и времени хватает только на бэктест, но тема
интересная. Будет время обязательно подключусь как смогу.


Чет у меня ошибки сыпет (Anaconda + Spyder Python 3_8 правда), там папки надо какие создавать дополнительные?
Посмотреть профиль Отправить личное сообщение
genom



Зарегистрирован: 09.11.2010
Сообщения: 53

СообщениеДобавлено: Ср Апр 06, 2022 10:58 pm Ответить с цитатой Вернуться к началу

Я использовал обычный питон, т.е. нет анаконды, а библиотеки, те, что там импортированы. Вроде на какой то 3.8 версии, тоже запускалось, но не точно. Сейчас проверил на 3.10, тоже тянет. п.с. попробуй вариант подправленный, папка любая, файлы положи в одну папку.
Обрати внимание на import h5py - он ниже там вставлен

asyncio
ccxt.async_support
pandas
tables
datetime
h5py

этого достаточно для запуска
Посмотреть профиль Отправить личное сообщение
DennyV8



Зарегистрирован: 11.01.2022
Сообщения: 100

СообщениеДобавлено: Ср Апр 06, 2022 11:32 pm Ответить с цитатой Вернуться к началу

genom писал(а):
Я использовал обычный питон, т.е. нет анаконды, а библиотеки, те, что там импортированы. Вроде на какой то 3.8 версии, тоже запускалось, но не точно. Сейчас проверил на 3.10, тоже тянет. п.с. попробуй вариант подправленный, папка любая, файлы положи в одну папку.
Обрати внимание на import h5py - он ниже там вставлен

asyncio
ccxt.async_support
pandas
tables
datetime
h5py

этого достаточно для запуска


Под Анакондой так и не пошло...

Зато пошло на обычном 3,8, только вопрос, скрипт качает все данные что есть по инcтрументам?
И как долго он их будет качать например в 1м ?
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen