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



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

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

Всем приветы.
Пока наша биржа в отпуске, решил сделать модуль на Python для робота с главной страницы сайта, чтобы читал файл TRI и отправлял заявки на BINANCE по маркету, чтобы без головняка. Думаю что вполне реально, пару дней развлекался с Питоном, что-то вырисовывается. Тестирую пока в тестовой сети BINANCE.

# Краткая инструкция
# 1. Поменять сокет с тестового на реальный и нужный таймфрейм
# 2. Поменять API ключи
# 3. Создать пустой файл test.tri (в него бот Амиброкера сохраняет нужную нам строку)
# 4. Создать пустой файл test_orders.tri (в него будет записываться текущая информация о позиции, на случай отключения python бота Smile)
# 5. В питоне нужно установить все библиотеки ниже, если не установлены. Если что скрипт сам покажет что надо установить.
# Также смотрите подсказки по коду, нужно заменить инструмент и количество.

---ОБНОВЛЕНО - 15.03.2022

------------------------------------------------------------------------------
# Краткая инструкция
# 1. Поменять сокет с тестового на реальный и нужный таймфрейм
# 2. Поменять API ключи
# 3. Создать пустой файл test.tri (в него бот Амиброкера сохраняет нужную нам строку)
# 4. Создать пустой файл test_orders.tri (в него будет записываться текущая информация о позиции, на случай отключения python бота Smile)
# 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

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

А может на писать из 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

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

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

СообщениеДобавлено: Чт Мар 10, 2022 9:39 am Ответить с цитатой Вернуться к началу

Ну да. Я не знаю как и 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

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

000 писал(а):

А вот что возможно наверняка, так это использовать в AFL код JS...
Зафигачить все в одном коде... Будет круто!


код JS это Java Script?
Чет это уже за гранью моего понимания Smile)
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пт Мар 11, 2022 9:10 am Ответить с цитатой Вернуться к началу

Да, Java Script.
С питоном разобрался, а JS на мой взгляд проще. Очень похож на AFL

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



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

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

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

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

Смотри функцию
Код:
EnableScript()

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



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

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

000 писал(а):
Смотри функцию
Код:
EnableScript()


Понял, нашел уже несколько примеров, но в другой плоскости.

Вот есть вопрос, если у меня в скрипте будет подключение и получение данных, каким образом это будет работать? Как чтение данных с внешнего источника? И должна ли быть подключена какая то база данных в этот момент или нет.
Или Амиброкер может без базы данных работать? А-ля брать данные из внешнего источника и их визуализировать на графике?
Посмотреть профиль Отправить личное сообщение
DennyV8



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

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

При попытке вставить скрипт в Амиброкер и запуске кода выдает ошибку компиляции и все тут ((

Хотя нарыл еще один код подключения - тянет текущую цену, меняет разными цветами если падает и растет.
Установил на ПК VSCode, скрипт работает, в браузере вижу цену Smile)
Кстати лайфхак как вывести цену крипты с 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

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

Если этот скрипт сохранить в файл 12345.JS , то он тоже не работает. Ошибка компиляции. Вероятнее всего проблема в модуле JSON. Через браузер он подтягивается автоматом, а локально работать не будет. Соответственно и в AFL тоже не заработает.

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



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

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

Да, кажись в нем нету такой функции сейчас, но нашел статью от 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

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

Наткнулся на гитхабе, человек пишет что вроде как это модуль для рилтайм поставки данных криптовалют в Амиюрокер, но я чет не пойму как оно работает))) Может надо скомпилировать ? Не шарю в этом ((

https://github.com/mrwoodo/BTCMarketsForAmibroker
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

DennyV8 писал(а):
Наткнулся на гитхабе, человек пишет что вроде как это модуль для рилтайм поставки данных криптовалют в Амиюрокер, но я чет не пойму как оно работает))) Может надо скомпилировать ? Не шарю в этом ((

https://github.com/mrwoodo/BTCMarketsForAmibroker

Да, это исходники. Их надо компилировать.
Можно попытаться в коде исходников найти откуда и как он получает RT.
Если знать эту инфу, то можно соорудить свой плагин.
Это плагин написано на .NET
Я его не люблю и поэтому не знаю.

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


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

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

Может этот плагин использует платный датафид?

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen