Блог им. jatotrade_com
import numpy as np import pandas as pd from datetime import datetime import matplotlib.pyplot as plt %matplotlib inline #Исходными данными являются файлы в формате csv. #Файлы находятся в папке Jatotrader\DATASET\имятикера\. Каждый файл содержит в себе информацию по одной торговой сессии #одного тикера с заданным методом формирования баров. Дата сессии и метод формирования баров указаны в имени файла. #Например, в файле 2020-02-03_RIH0_TICKS_500.FRQ содержится информация за 3 февраля 2020 года по фьючерсному контракту RIH0, #сформированная из расчета 500 тиков на бар. Первая строка файла - это имена столбцов DATETIME,H,L,O,C,DH,DL,DO,DC,OTO, #BI,SI,BV,SV,BC,SC. Последующие строки - это бары, идущие в хронологическом порядке. DATETIME-строка в формате #"ГГГГ-ММ-ДД ЧЧ:ММ:СС", H,L,O,C - максимальная, минимальная цена и цена открытия и закрытия бара. DH и DL - максимальное # и минимальное значение накопленной маркет-дельты бара, DO и DC - значение маркет-дельты при открытии и закрытии бара. #OTO - значение объемно-тикового осциллятора на закрытии бара, BI-интенсивность покупок (тиков в секунду), #SI- интенсивность продаж, BV-объем покупок, SV-объем продаж, BC-количество покупок,SC-количество продаж #Читаем в датафрейм candles из файлов с частотными данными за соответствующую дату с соотв. частотными настройками candles=pd.read_csv('C:\\acl90-smp\\DATASET\\RIH0\\2020-02-04_RIH0_TICKS_500.frq', header=0, sep=',') MOEXCloseTime=pd.to_datetime(candles['DATETIME'][0][0:11]+'23:50:00') #Определяем ДатуВремя закрытия торгов candles['DATETIME']= pd.to_datetime(candles['DATETIME']) #Преобразуем весь столбец DATETIME в формат datetime clen=len(candles) #Общее количество частотных свечей в наборе данных #Эти два параметра можно менять для удобства просмотра. По умолчанию на графике умещается весь набор. istart=0 #Индекс первой свечи на графике xwidth= min(clen, clen) #Количество свечей, отображаемое на графике fig, [axPrice, axOTO, axIntence, axVol] = plt.subplots(4, 1, figsize=(16, 15)) #Четыре секции графика с соответствующими осями для индикаторов axPrice.set_ylabel('Price') axOTO.set_ylabel('OTO') axIntence.set_ylabel('Intence') axVol.set_ylabel('Buy&Sell Vol') axIntence.set_yscale('log') #Логарифмическая шкала интенсивностей покупок продаж axDELTA = axPrice.twinx() #Дополнительная шкала маркет-дельты на графике цены axDELTA.set_ylabel('Delta') for ax in [axPrice, axOTO, axIntence, axVol]: #цикл по секциям ax.grid(True) #Добавляем сетку в каждую секцию ax.set_xlim(xmin=istart, xmax=xwidth) #Задаем границы отображения по шкале X t = np.arange(istart, xwidth) #Шкала Х по количеству свечей axOTO.plot(t, candles['OTO'][istart:xwidth], linewidth=1) #Рисуем график ОТО axPrice.plot(t, candles['C'][istart:xwidth], color = 'black', linewidth=1) #Рисуем график цены axDELTA.plot(t, candles['DC'][istart:xwidth], linewidth=1) #График маркет-дельты axIntence.plot(t, candles['BI'][istart:xwidth], color = 'yellowgreen', linewidth=1) #График интенсивности покупок axIntence.plot(t, candles['SI'][istart:xwidth], color = 'darksalmon', linewidth=1) #График интенсивности продаж axIntence.fill_between(t, candles['BI'][istart:xwidth], 0, color='palegreen', alpha=0.5) #Заливка с прозрачным наложением axIntence.fill_between(t, candles['SI'][istart:xwidth], 0, color='lightsalmon', alpha=0.4) #Заливка с прозрачным наложением axVol.vlines(t-0.1, 0, candles['BV'][istart:xwidth], color='darkseagreen', linewidth=1, alpha=0.9) #Объем покупок axVol.vlines(t+0.1, 0, candles['SV'][istart:xwidth], color='lightsalmon', linewidth=1, alpha=0.9) #Объем продаж print(clen, "свечей прочитано") #Сколько всего свечей в наборе данных
Данные тестовых наборов можно найти в папке \JATOTRADER\DATASET\ИмяТикера. Если вы не устанавливали Jatotrader,
istart=200 #Индекс первой свечи на графике xwidth= min(270, clen) #Количество свечей, отображаемое на графикеЭтот код отобразит данные с 200-й по 270-ю свечу, таким образом увеличивая масштаб:
#Рассчитаем длительность каждой свечи (в секундах) и добавим в таблицу под именем 'DUR'(создадим новый столбец) #Эта строка кода означает, что мы берем разницу в секундах между временем текущей и последующей свечи, добавляем их в список #длительностью последней свечи в наборе будет разница между временем окончания торговой сессии и временем начала свечи candles['DUR']=[max(1,(candles['DATETIME'][i+1]-candles['DATETIME'][i]).seconds) for i in range (clen-1)]+[(MOEXCloseTime - candles.iloc[-1, 0]).seconds] #Длительность свечей очень важный параметр, если мы рассматривает данные не как фиксированный таймфрейм, например 5 мин. #Давайте посмотрим, есть ли корреляция этого параметра с ценой axDUR = axPrice.twinx() #Дополнительная шкала длительности свечи на графике цены axDUR.yaxis.set_ticklabels([]) #Не показывать шкалу длительности axDUR.plot(t, 1/(candles['DUR'][istart:xwidth]), linewidth=1, color='r') #График скоротечности баров (длительность в знаменателе)Добавьте эти четыре строчки кода в после основного кода и сделайте вычисление CTRL+ENTER. В результате на графике цены и маркет-дельты появится график скоротечности баров (т.к. длительность мы поставили в знаменатель).
Петр Ткаченко, в TSLab есть бесплатные боевые коннекторы для криптобирж.
Binance, Bitfinex, Deribit, и ещё какие-то, емнип.
а после 60 долларов вообще не понятно где цена?
Антон Б, 60 баксов — это 6 лотов фьючерса PERPETUAL на Deribit (если не больше). Должно быть вполне достаточно, чтобы определиться рабочая у Вас ТС или нет.
Для некоторых криптобирж (например, Binance и Binance Futures) — коннектор бесплатен БЕЗ ОГРАНИЧЕНИЙ на размер счета.
тойесть человек принимает решение что он входит.
а специальный бот на горячей клавише старается зайти так чтобы не заплатить спред.
или чтобы по максимуму получить ребейт.
но и на последние сопли успеть.
фактически выводишь на прогулку микроботов.
включая и выключая их.
они не понимают направления, но, зато, очень хорошо отрабатывают стакан.
рискменеджемент, автовыход по краю стакана, это уже давно боты.