Избранное трейдера redtiger8
# В КВИКе запускаем луа-скрипт QuikLuaPython.lua import socket import threading from datetime import datetime, timezone import pandas as pd import finplot as fplt fplt.display_timezone = timezone.utc class DeltaBar(): def __init__(self): self.df = pd.DataFrame(columns='date_time open high low close delta delta_time_sec'.split(' ')) self.df.loc[len(self.df)] = [0, 0, 0, 0, 0, 0, 0] def parser(self, parse): if parse[0] == '1' and parse[1] == 'RIH1': if abs(self.df.iloc[len(self.df) - 1]['delta']) >= 500: self.df.loc[len(self.df)] = [0, 0, 0, 0, 0, 0, 0] # Добавляем строку в DF self.df.iloc[len(self.df) - 1]['close'] = float(parse[4]) # Записываем последнюю цену как цену close бара if self.df.iloc[len(self.df) - 1]['date_time'] == 0: self.df.iloc[len(self.df) - 1]['date_time'] = \ datetime.strptime(f'{parse[7]} {parse[8][0:-1]}', "%d.%m.%Y %H:%M:%S.%f").replace(microsecond=0) if self.df.iloc[len(self.df) - 1]['open'] == 0: self.df.iloc[len(self.df) - 1]['open'] = float(parse[4]) if float(parse[4]) > self.df.iloc[len(self.df) - 1]['high']: self.df.iloc[len(self.df) - 1]['high'] = float(parse[4]) if (float(parse[4]) < self.df.iloc[len(self.df) - 1]['low']) or \ (self.df.iloc[len(self.df) - 1]['low'] == 0): self.df.iloc[len(self.df) - 1]['low'] = float(parse[4]) if parse[5] == '1026': self.df.iloc[len(self.df) - 1]['delta'] += float(parse[6]) if parse[5] == '1025': self.df.iloc[len(self.df) - 1]['delta'] -= float(parse[6]) self.df.iloc[len(self.df) - 1]['delta_time_sec'] = \ datetime.strptime(f'{parse[7]} {parse[8][0:-1]}', "%d.%m.%Y %H:%M:%S.%f") - \ self.df.iloc[len(self.df) - 1]['date_time'] self.df.iloc[len(self.df) - 1]['delta_time_sec'] = self.df.iloc[len(self.df) - 1]['delta_time_sec'].seconds def service(): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(('127.0.0.1', 3587)) # Хост-этот компьютер, порт - 3587 while True: res = sock.recv(2048).decode('utf-8') if res == '<qstp>\n': # строка приходит от клиента при остановке луа-скрипта в КВИКе break else: delta_bar.parser(res.split(' ')) # Здесь вызываете свой парсер. Для примера функция: parser (parse) sock.close() def update(): df = delta_bar.df # Меняем индекс и делаем его типом datetime df = df.set_index(pd.to_datetime(df['date_time'], format='%Y-%m-%d %H:%M:%S')) # print(delta_bar.df) # pick columns for our three data sources: candlesticks and TD candlesticks = df['open close high low'.split()] volumes = df['open close delta_time_sec'.split()] if not plots: # first time we create the plots global ax plots.append(fplt.candlestick_ochl(candlesticks)) plots.append(fplt.volume_ocv(volumes, ax=ax.overlay())) else: # every time after we just update the data sources on each plot plots[0].update_data(candlesticks) plots[1].update_data(volumes) if __name__ == '__main__': delta_bar = DeltaBar() # Запускаем сервер в своем потоке t = threading.Thread(name='service', target=service) t.start() plots = [] ax = fplt.create_plot('RIH1', init_zoom_periods=100, maximize=False) update() fplt.timer_callback(update, 2.0) # update (using synchronous rest call) every N seconds fplt.show()
Напомню перечень возможных вариантов получения статуса:
1. Владеть имуществом на сумму от 6 млн ₽. Учитываются деньги на счетах и ценные бумаги.
Правило, по которому я получил, но здесь не всё так просто, и об этом пост
2. Иметь опыт работы в профессиональном участнике рынка от 2 лет.
Вряд ли ради бумажки стоит идти работать туда, где тебя не ждут
3. Иметь оборот по сделкам с ценными бумагами и др. инструментами за последние 4 квартала — от 6 млн ₽. Частота сделок — не реже 10 в квартал, одной в месяц.
Самое простое и часто применяемое правило, но нельзя пропускать ни месяца
4. Иметь аттестат ФСФР / CFA, профильное образование в специальном вузе.
Многие думают, что это легко, но это не так
В июне сумма по двум брокерским счетам вкупе с суммой на накопительном счёте, где хранится подушка безопасности, насчитывали уже 6 млн ₽. В тот момент активно обсуждались изменения в законодательстве, связанными с возможностью покупать иностранные акции неквалифицированным инвесторам. Ничего не было ясно, и я решил, что надо обезопасить себя от возможных последствий, получив этот статус сейчас, по старым правилам.
import requests import datetime import pathlib SECIDs = ["GAZP", "BANEP", "LKOH"] DISK = "E" for SECID in SECIDs: from_date = "2020-05-04" to_date = "2005-01-03" while str(to_date) != from_date: to_date = str(to_date) to_date = to_date.split('-') a = datetime.date(int(to_date[0]), int(to_date[1]), int(to_date[2])) b = datetime.timedelta(days=140) to_date = a + b pathlib.Path("{}:/{}/{}".format(DISK, "Database_MOEX", SECID)).mkdir(parents=True, exist_ok=True) filename = SECID + "_" + str(to_date) + ".csv" with requests.get("http://iss.moex.com/iss/history/engines/stock/markets/shares/boards/tqbr/securities/{}.csv?date={}".format(SECID, to_date)) as response: with open("{}:/Database_MOEX/{}/{}".format(DISK, SECID, filename), 'wb') as f: for chunk in response.iter_content(): f.write(chunk)Для начала пройдемся по его плюсам и минусам. Самый главный минус, что этот парсер качает только определенный период, который уникален для каждой акции, судя по всему для увеличения этого периода надо кинуть бирже на лапу:), и то что информация предоставляется за день, теперь перейдем к плюсам: можно выкачивать историю за определенный период для нескольких инструментов сразу (их количество ограничивается лишь количеством инструментов на мосбиржи), есть возможность назначать диск для сохранения информации, быстрота выгрузки данных.
Если ты не знаешь, чего хочешь, ты в итоге останешься с тем, чего точно не хочешь.
Чак Паланик
Чтобы дойти до цели, надо идти.
Оноре де Бальзак
Это своего рода забава, делать невозможное.
Уолт Дисней
Если люди не смеются над вашими целями, значит ваши цели слишком мелкие.
Азим Премжи
Пробуйте и терпите неудачу, но не прерывайте ваших стараний.
Стивен Каггва
К черту все! Берись и делай!
Ричард Брэнсон
Мы сами должны стать теми переменами, которые хотим видеть в мире.
Махатма Ганди
Препятствия – это те страшные вещи, которые вы видите, когда отводите глаза от цели.
Генри Форд
Постановка целей является первым шагом на пути превращения мечты в реальность.
Тони Роббинс
Быть самым богатым человеком на кладбище для меня не важно… Ложиться спать и говорить себе, что сделал действительно нечто прекрасное, — вот что важно!
Стив Джобс
После всех вычислений, приведенных в этой и этой публикациях, можно углубиться в статистический анализ и рассмотреть метод наименьших квадратов. Для этой цели используется библиотека statsmodels, которая позволяет пользователям исследовать данные, оценивать статистические модели и выполнять статистические тесты. За основу были взяты эта статья и эта статья. Само описание используемой функции на английском доступно по следующей ссылке.
Сначала немного теории:
О линейной регрессии
Линейная регрессия используется в качестве прогнозирующей модели, когда предполагается линейная зависимость между зависимой переменной (переменная, которую мы пытаемся предсказать) и независимой переменной (переменная и/или переменные, используемые для предсказания).
OpenBoApi - это C++ header-only библиотека для работы с API брокеров бинарных опционов. С помощью этой библиотеки выполняется правило трех сигм, тфу, то есть, трех