Автор |
Сообщение |
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
Всем приветы.
Пока наша биржа в отпуске, решил сделать модуль на Python для робота с главной страницы сайта, чтобы читал файл TRI и отправлял заявки на BINANCE по маркету, чтобы без головняка. Думаю что вполне реально, пару дней развлекался с Питоном, что-то вырисовывается. Тестирую пока в тестовой сети BINANCE.
# Краткая инструкция
# 1. Поменять сокет с тестового на реальный и нужный таймфрейм
# 2. Поменять API ключи
# 3. Создать пустой файл test.tri (в него бот Амиброкера сохраняет нужную нам строку)
# 4. Создать пустой файл test_orders.tri (в него будет записываться текущая информация о позиции, на случай отключения python бота )
# 5. В питоне нужно установить все библиотеки ниже, если не установлены. Если что скрипт сам покажет что надо установить.
# Также смотрите подсказки по коду, нужно заменить инструмент и количество.
---ОБНОВЛЕНО - 15.03.2022
------------------------------------------------------------------------------
# Краткая инструкция
# 1. Поменять сокет с тестового на реальный и нужный таймфрейм
# 2. Поменять API ключи
# 3. Создать пустой файл test.tri (в него бот Амиброкера сохраняет нужную нам строку)
# 4. Создать пустой файл test_orders.tri (в него будет записываться текущая информация о позиции, на случай отключения python бота )
# 5. В питоне нужно установить все библиотеки ниже, если не установлены. Если что скрипт сам покажет что надо установить.
# Также смотрите подсказки по коду, нужно заменить инструмент и количество.
import websocket
import json
import pandas as pd
import pickle
import talib
import re
import time
from datetime import datetime
from binance.client import Client
from binance.enums import *
#Binance Web Socket
SOCKET = 'wss://testnet.binance.vision/ws/bnbusdt@kline_1m' # Заменить на реальный сокет и нужный таймфрейм
#Symbol
TRADE_SYMBOL = "BNBUSDT" #Заменить на нужный инструмент
#Quantity of ETH for a trade
TRADE_QUANTITY = 0.5 #Заменить на свое количество
in_position = False
working = True
Position_Long = False
Sell_No_Position = False
count2 = 0
df = pd.DataFrame()
API_KEY = 'T9kDFoeeX9jnlCBxxxxxxxxxxxxxxxxxxxxxxxxxxxxdJdDKu11roM1hqWL8SfEs' # Заменить на свои
API_SECRET = 'G4AiLbwls1yKxxxxxxxxxxxxxxxxxxxxxxxxx6oLWqBV0XHUTSMrPna6QZr2u' # Заменить на свои
client = Client(API_KEY, API_SECRET)
client.API_URL = 'https://testnet.binance.vision/api' # Заменить нареальный сокет
print(client.get_asset_balance(asset='BNB'))
print(client.get_asset_balance(asset='USDT'))
#fonction to create an order
def order(symbol, qty, side, order_type=ORDER_TYPE_MARKET):
try:
order = client.create_order(symbol=symbol,
side=side,
type = order_type,
quantity = qty)
return True
except Exception as e:
return False
def on_open(ws):
global in_position
#Reading the data from a pickle file
print("-----Open Connection-----")
def on_close(ws):
#Saving the data into a pickle file
print("-----Close Connection-----")
while working:
f = open('test.tri', 'r')
# 2. Цикл чтения строк файла
count = 0 # количество строк в файле
s = f.readline()
while s != '': # цикл чтения строк до пустой строки
s = f.readline()
count = count+1
f.close()
# print('count = ', count) # вывести результат
if count == 0 :
print('Waiting Transaction from Amibroker')
time.sleep(2)
# -------Reading Order Position from TRI file----------------
with open("test_orders.tri") as openfile1:
for Position_Long in openfile1:
if "Position_Long" in Position_Long:
print('Already in Long Position')
time.sleep(2)
with open("test_orders.tri") as openfile:
for Sell_No_Position in openfile:
if "Sell_No_Position" in Sell_No_Position:
print('Not Position Hold')
time.sleep(2)
#-------------------------------------------------------------
f2 = open('test_orders.tri', 'r')
count2 = 0 # количество строк в файле
s2 = f2.readline()
while s2 != '': # цикл чтения строк до пустой строки
s2 = f2.readline()
count2 = count2+1
f2.close()
if count == 0:
str4 = 'A'
else:
with open("test.tri", "r") as file:
lines = file.readlines()
str1 = lines[-1]
str2 = re.split ('; ', str1)
str3 = str2[3]
str4 = (str3.partition('=')[2])
print(str4)
if (str4 == 'S' and Position_Long == 'Position_Long') :
#if in position
# if in_position:
print("Sell")
#Binance Sell Order
order_success = order(TRADE_SYMBOL, TRADE_QUANTITY, SIDE_SELL, ORDER_TYPE_MARKET)
#not anymore in position
#in_position = False
f = open('test.tri', 'w')
f.close()
# -------Записьв файл произведенной операции сделки ПОКУПКИ---------
lines = ["Sell_No_Position"]
with open("test_orders.tri", "w") as file:
for line in lines:
file.write('\n' + line)
#-------------------------------------------------------------------
else:
if (str4 == 'S' and Sell_No_Position == 'Sell_No_Position') or (str4 == 'S' and count2 == 0 ):
f = open('test.tri', 'w')
f.close()
print("Not Position Hold")
time.sleep(2)
if (str4 == 'B' and count2 == 0 ) or (str4 == 'B' and Sell_No_Position == 'Sell_No_Position') :
print("Buy")
#Binance Buy Order
order_success = order(TRADE_SYMBOL, TRADE_QUANTITY, SIDE_BUY, ORDER_TYPE_MARKET)
#In position
# in_position = True
f = open('test.tri', 'w')
f.close()
# -------Записьв файл произведенной операции сделки ПОКУПКИ---------
lines = ["Position_Long"]
with open("test_orders.tri", "w") as file:
for line in lines:
file.write('\n' + line)
#-------------------------------------------------------------------
else:
if str4 == 'B' and Position_Long == 'Position_Long':
f = open('test.tri', 'w')
f.close()
print("Already in Long Position - Not need it more")
time.sleep(2)
ws = websocket.WebSocketApp(SOCKET, on_open=on_open, on_close=on_close)
ws.run_forever() |
Последний раз редактировалось: DennyV8 (Вт Мар 15, 2022 2:25 pm), всего редактировалось 1 раз |
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
А может на писать из AFL в .tri а сразу пихать ордер в BINANCE ?
Зачем лишняя прокладка из питона?
Код: |
order = client.create_order(symbol=symbol,
side=side,
type = order_type,
quantity = qty) |
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
000 писал(а): |
А может на писать из AFL в .tri а сразу пихать ордер в BINANCE ?
Зачем лишняя прокладка из питона?
Код: |
order = client.create_order(symbol=symbol,
side=side,
type = order_type,
quantity = qty) |
|
А как быть с подключением с BINANCE? Или будет использоваться подключение через плагин и открытый график инструмента?
Я чет в AFL не сильно шарю, а питон заодно попрактиковаться ))
Но если напрямую можно кидать, так это другое дело, осталось реализовать эту тему.
И главный вопрос - можно ли обойтись без плагина, а подключаться из самого скрипта сразу? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ну да. Я не знаю как и AFL подключиться к вебсокету
Код: |
SOCKET = 'wss://testnet.binance.vision/ws/bnbusdt@kline_1m' |
Хотя может InternetOpenURL() прокатит. Не знаю.
и
Код: |
API_KEY = 'xxxxxxxxxxxxxxxx'
API_SECRET = 'xxxxxxxxxxxxxxx'
client = Client(API_KEY, API_SECRET) |
возможно можно использовать createobject()...
А вот что возможно наверняка, так это использовать в AFL код JS...
Зафигачить все в одном коде... Будет круто! |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
000 писал(а): |
А вот что возможно наверняка, так это использовать в AFL код JS...
Зафигачить все в одном коде... Будет круто! |
код JS это Java Script?
Чет это уже за гранью моего понимания ) |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Да, Java Script.
С питоном разобрался, а JS на мой взгляд проще. Очень похож на AFL |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
000 писал(а): |
Да, Java Script.
С питоном разобрался, а JS на мой взгляд проще. Очень похож на AFL |
Случаем нет примеров как интегрируется JS в Амиброкер?
А то я похоже что-то нарыл, надо проверить ))
<html>
<body>
</body>
<script>
var burl = "https://api.binance.com";
var query = '/api/v1/ticker/24hr';
query += '?symbol=BTCUSDT';
var url = burl + query;
var ourRequest = new XMLHttpRequest();
ourRequest.open('GET',url,true);
ourRequest.onload = function(){
console.log(ourRequest.responseText);
}
ourRequest.send();
</script>
</html> |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Смотри функцию |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
000 писал(а): |
Смотри функцию |
Понял, нашел уже несколько примеров, но в другой плоскости.
Вот есть вопрос, если у меня в скрипте будет подключение и получение данных, каким образом это будет работать? Как чтение данных с внешнего источника? И должна ли быть подключена какая то база данных в этот момент или нет.
Или Амиброкер может без базы данных работать? А-ля брать данные из внешнего источника и их визуализировать на графике? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
При попытке вставить скрипт в Амиброкер и запуске кода выдает ошибку компиляции и все тут ((
Хотя нарыл еще один код подключения - тянет текущую цену, меняет разными цветами если падает и растет.
Установил на ПК VSCode, скрипт работает, в браузере вижу цену )
Кстати лайфхак как вывести цену крипты с Binance на сайт.
Но в Амиброкере все равно не пашет, пишет ошибка компиляции.
Пока доведу до ума модуль через TRI файл, потом еще поищу инфу про скрещивание JS и Амиброкера.
Сам код :
let ws = new WebSocket('wss://stream.binance.com:9443/ws/btcusdt@trade');
let stockPriceElement = document.getElementById('stock-price');
let lastPrice = null;
ws.onmessage = (event) => {
let stockObject = JSON.parse(event.data);
let price = parseFloat(stockObject.p).toFixed(2);
stockPriceElement.innerText = price;
stockPriceElement.style.color = !lastPrice || lastPrice === price ? 'black' : price > lastPrice ? 'green' : 'red';
lastPrice = price;
}; |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Если этот скрипт сохранить в файл 12345.JS , то он тоже не работает. Ошибка компиляции. Вероятнее всего проблема в модуле JSON. Через браузер он подтягивается автоматом, а локально работать не будет. Соответственно и в AFL тоже не заработает. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
Да, кажись в нем нету такой функции сейчас, но нашел статью от 2021 года где они рекламируют эту функцию в версии 6.40
https://www.marketcalls.in/algomojo/how-to-fetch-trading-account-balance-using-amibroker.html
но ждать долго)))
В итоге я доделал прокладку, пока режим LONG-SELL, позже шорты добавлю. Обновил первый пост.
Теперь найти поставщика данных в реальном времени от BINANCE в AmiBroker. Я ранее кидал ссылку на рабочий вариант, но он стоит денег, годовое обслуживание. Хочется что-то бесплатное. Сам врядли напишу DLL- шку )). |
|
|
Посмотреть профиль Отправить личное сообщение |
|
DennyV8
Зарегистрирован: 11.01.2022
Сообщения: 100
|
Наткнулся на гитхабе, человек пишет что вроде как это модуль для рилтайм поставки данных криптовалют в Амиюрокер, но я чет не пойму как оно работает))) Может надо скомпилировать ? Не шарю в этом ((
https://github.com/mrwoodo/BTCMarketsForAmibroker |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
DennyV8 писал(а): |
Наткнулся на гитхабе, человек пишет что вроде как это модуль для рилтайм поставки данных криптовалют в Амиюрокер, но я чет не пойму как оно работает))) Может надо скомпилировать ? Не шарю в этом ((
https://github.com/mrwoodo/BTCMarketsForAmibroker |
Да, это исходники. Их надо компилировать.
Можно попытаться в коде исходников найти откуда и как он получает RT.
Если знать эту инфу, то можно соорудить свой плагин.
Это плагин написано на .NET
Я его не люблю и поэтому не знаю. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Может этот плагин использует платный датафид? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|