Избранное трейдера Petr S

по

Данные из QUIK в Python. Построение Дельта графика.

Данные из QUIK в Python. Построение Дельта графика.Построение нестандартных графиков в Python при помощи библиотеки finplot.
Можно строить почти любые нестандартные графики: Range, Renco, Delta.
В качестве примера скрипт для построения Дельта графика.
График строиться с момента запуска по поступающим данным из таблицы обезличенных сделок.
Для получения данных из КВИКа используется PythonServer Евгения Шибаева (огромное спасибо автору!!!)

Тапками не кидайтесь, программировать только учусь.

# В КВИКе запускаем луа-скрипт 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()
  • обсудить на форуме:
  • QUIK

Парный трейдинг не для всех

    • 10 февраля 2021, 12:55
    • |
    • ELab
  • Еще
Известный факт — парный трейдинг не приносит прибыли. Все модели сливают. Понятно, что или расходятся они недостаточно для того чтобы окупить спрэд (например, обычные против префок или GOOG против GOOGL) или просто не состоянии сохранить зависимость друг от друга после обнаружения таковой. Поэтому часть трейдеров ищет зависимости между ETF, а другая между ETF, фьючерсами и корзиной акций. Это так называемый классический стат. арбитраж.

Я предлагаю взглянуть на с другой стороны и торговать корзину из более чем 200 акций (да, извините, но это не для российского рынка — даже 20-30 акций недостаточно). Для начала нужно высчитать синтетик у которого будет минимальная дисперсия — всех интересующихся отсылаю к трудам hrenfx, который, впрочем, пошел путем непрозрачных и требовательных вычислений, которые требуют большое кол-во памяти и не в состоянии рассчитать синтетик для более чем 30 и более инструментов. Каждый желающий прочитав посты hrenfx может самостоятельно все вычислить используя несколько строк на Python. Чтобы не утомлять деталями в финале получим синтетик вида k1*msft + k1*aapl +… k_n*XLNX. Одна часть синтетика будет с положительными значениями, другая с отрицательными. Это и будет синтетик с минимальной дисперсией, который вы уже можете начать торговать. В реальности нужно будет нормировать коэффициенты и отсеять акции вес которых в портфеле, например, меньше 5-10% (все зависит от торгуемого капитала — ведь нужно будет на эти 5% купить минимальное кол-во акций). Так же можно убрать и дорогие акции AMZN, TESLA etc… Разумно выбрать одну часть синтетика с отрицательными или положительными коэффициентами и торговать «one leg» по оценке на основе полного синтетика. Это снизит издержки и повысит вашу прибыль.  

( Читать дальше )

Методичка ABC of stock trading от легенды Blastarr_no_1

12 лет назад в ЖЖ блистал такой человек Blastarr_no_1. Он красочно рассказывал, как зарабатывал деньги десятками миллионов рублей, и в итоге заработал на кризисе 2008-2009 более 1 млрд рублей. Потом он сообщил всем что ушёл в политику и удалил свой ЖЖ. Выдумка или правда — так и осталось тайной. Вот тут 10 лет назад я делился у себя в блоге мыслями после прочтения его блога. По ссылке внутри поста на бластара можно не переходить, после удаления этот логин зарегали какие-то лохотронщики.

Этот человек тогда накатал методичку торговли которую назвал ABC of stock trading. Сейчас ее сложно где-либо найти кроме смартлаба. Из тех, кто сейчас на рынке, мало кто помнит такие далекие времена, поэтому я решил на всякий случай напомнить, вдруг вас заинтересует.

Итак, Методичка ABC от blastarr_no_1 «Основные принципы спекуляции» в 5 частях:

smart-lab.ru/blog/250818.php
smart-lab.ru/blog/250820.php
smart-lab.ru/blog/250824.php
smart-lab.ru/blog/250827.php
smart-lab.ru/blog/250831.php

Чтобы не просрать этот пост, добавляйте его в избранное❤️

Использование Машинного Обучения в торговых системах. Простейшее применение.

    • 18 января 2021, 14:54
    • |
    • 3Qu
  • Еще
Допустим, делаете вы торговую аж на 5 или больше индикаторах. Их как-то надо обернуть логикой принятия решений, потом как-то настроить, подобрать параметры в логике — работа большая, требующая много времени. Но вы сами эту систему разработали, и уже в основном знаете, что конкретно должна искать ваша логика. А раз так, то вы уже примерно знаете, где конкретно ваша логика должна выдавать свои сигналы.
В подобных случаях мы можем существенно облегчить себе работу, поручив построение логики методам Машинного Обучения (МО).
Входы мы знаем, выходы нам тоже примерно известны — строим обучающую последовательность для выбранного метода МО. Затем нормируем нашу обучающую последовательность к входам/выходам метода МО. Обучаем. Проверяем. Получаем готовую логику для нашей торговой системы.
Отмечу, что в данном конкретном случае нас не должны особо заботить переобучение и прочие проблемы МО — мы делаем вполне однозначную систему.
В нашем случае мы всего-навсего используем МО как обучаемую логику.

( Читать дальше )

квик сменил кодировку роботов на луа языке

MARKET               = «SPBFUT»
TICKER               = «SiH7»
ACCOUNT              = "----"
CLIENT_CODE          = "----"

TRANS_ID             = 0
STOP_FACTOR          = 30
SPREAD_FACTOR        = 30
LAST_ORDER           = 0
TRANS_REPLY          = nil
BALANCE = 0

BEZUBYTOK=STOP_FACTOR*5--0.0014--малый шаг

TP=STOP_FACTOR*30--STOP_FACTOR*1--0.015--в % внутри дня (тейк-профит).большой шаг

SREDNSHAG=STOP_FACTOR*10---0.007--средн.шаг(0.08* STOP_FACTOR /1000)

n=3-- кол-во кругов малого BEZUBYTOK>STOP_FACTOR*(n+1)--минимально

k=4--кол-во кругов  безубытка --SREDNSHAG>STOP_FACTOR*(k+1)--минимально

run = true
function main()
   while run do
      if LAST_ORDER == 0 then     
      
         BALANCE = GetTotalnet()
         if BALANCE ~= 0 then
            LAST_ORDER = NewStopOrder(BALANCE)
         end        

( Читать дальше )
  • обсудить на форуме:
  • Quik Lua

Вот мы и добрались до Америки. Накладываем паттерны там.

Мой переход к программированию и машингленинг (случилось это где то год с небольшим), отчасти был связан с мыслями глянуть, а что там в забугорье творится. Проходить опять тот же путь ручного перелопачивания, что я прошел на отечественном рынке, понятно дело не хотелось. Но то котировок не было, то еще чего то, и вот наконец то дошли ручки до Америки, тем паче робот для автоматического скачивания котирок есть, модели для тестирования есть, осталось только пуско-наладочные работы.
К слову, по поводу выкачки американских внутридневных котирок через Питон не все так просто оказалось, как казалось раньше. Google Finance ограничивает скачивание часовиков 730 днями (а ниже — еще меньше), у Yfinance я вообще внутридневных не нашел. Была большая надежда на AlphaVantage, но и там ограничение на intraday в несколько дней. Еще и данные в каком то месте оказались кривыми, на что я даже написал кляузу им в поддержку, на что мне ответили что так и надо, это все «adjusted close» и закрыли тему. Так что у кого есть какие то секретные места, где все это можно быстро выкачать — делитесь.

( Читать дальше )

Как устанавливать стоп-слосс в торговой стратегии

Стратегия очень простая. Дневной таймфрейм. Акции сбербанка. Ждём 4 закрытия подряд вниз (когда закрытие ниже открытия). На следующий день на открытии дня покупаем, а на закрытии продаём. Повторяем тоже самое для продаж, только наоборот. Ждём 4 закрытия подряд вверх. На следующий день продаём на открытии и откупаем на закрытии. Всё это делаем с 5 плечом. Комиссию я считал 0,06% за сделку.

Так выглядит график:
Как устанавливать стоп-слосс в торговой стратегии
График возврата при 4 одинаковых закрытиях подряд и 5 плече

Как видно до 1 октября 2020 (пунктирная линия) график выглядел отлично. Сегодня посчитал до 1 декабря и всё уже не так радужно. Но тем интереснее будет понять, как на стратегию повлияет стоп-лосс. Нужно найти такой стоп, который будет уменьшать максимальные потери, но при этом и не уменьшать возможные выигрыши. Ведь по стопу может выбить раньше, чем будет закрытие.

Посмотрим на сделки при покупках. Пока будем смотреть на сделки без плеча. Добавим график на сколько цена движется вниз от открытия до лоу.

( Читать дальше )

Итоги года 2020. Программирование

   Год уже заканчивается и пора подводить некоторые итоги. Начну свою ежегодную серию итогов со своего хобби – программирование в области финансовых рынков. Увлёкся этим делом в конце 2005-го года. Тогда начал осваивать MQL4 в MetaTrader 4, но, через пару лет, поняв кухню ДЦ, перешёл в QUIK на реальную биржу. Тогда же, начал монетизировать своё хобби. Моя история прошлых лет, если кому интересно.

   В статье будет, возможно, много не интересного не посвящённым в программирование, поэтому можете смело прокрутить в «Выводы».

Итоги.

   В начале года не было желания что-то программировать. Часто собирался с друзьями. Мой робот в январе ушёл в минус 2% по всему счёту. Робот был настроен только в продажу рынка на деривативах, хеджируя основной портфель акций. В общем-то, это моя основная идея последних двух лет. Звёздный час робота настал в конце февраля. Как раз, когда я уехал из города, робот исправно накапливал продажи на летящем вниз рынке. Тогда я в очередной раз убедился в необходимости автоматизации. На мартовской экспирации часть средств удалось удачно перекинуть в подешевевшие акции.



( Читать дальше )

Визуализация рекомендаций Романа Андреева на Python. Часть 2. Компьютерное зрение.

Всем здоровья и бодрого расположения духа!
В статье «Визуализация рекомендаций Романа Андреева на Python» мы разобрали как можно с помощью нескольких строк кода на Питоне разобрать текст, который выкладывает каждое утро в своем блоге Роман Андреев (далее по тексту Роман) — известный трейдер и блогер (или наоборот), и отобразить эти рекомендации в виде уровней и зон на графиках. В этом топике я покажу способ для извлечения информации из графических изображений с помощью технологий компьютерного зрения (но без использования нейронных сетей) на примере таблиц-рекомендаций из блога Романа Андреева.
Визуализация рекомендаций Романа Андреева на Python. Часть 2. Компьютерное зрение.
Надеюсь, что я не напугал читателей термином «компьютер вижн», скоро вы поймете, что это просто. И что любой юный прогер может написать код для распознавания внешними камерами номеров автомобилей, который впоследствии возненавидят все автолюбители мегаполисов, а МАДИ и ГИБДД будут собирать со всех нас миллиардные штрафы



( Читать дальше )

Торгуем в боковике на примере RIZ0

        Данная статья не для ленивых, так как прежде чем посмотреть скрипт у себя в TSLab — нужно будет предварительно собрать индикатор волатильности.

    Так же нас просят писать не только о крипте, но и примеры на рф рынке  — потому рассмотрели именно riz0. Хотя тут стоит сказать — мы не пытаемся склонять к тому или иному рынку. Если вы увидите рекламу ложки, которой кушают мороженое, не значит что этой же ложечкой вы не можете воспользоваться для чая. Тут точно так же — берете скрипт, выбираете интересующую вас бумагу — и работаете с ней.))

Ниже тот самый индикатор, который вам предварительно нужно будет собрать. Блоков не много и собирается просто
Торгуем в боковике на примере RIZ0



Суть индикатора тоже простая — он покажет в какой стадии рынок. Штормит его, или же мы вяло торгуемся и можно пробовать торговать против рынка.
Далее сделки, для примера взяты по максимум/минимум за период, от верха шортим от низа в лонг, реверсно. Ничего не оптимизировали и не подгоняли — вообще! взяты стандартные периоды 20 так же не включена комиссия (в контрендовых алго, будет львинную часть прибыли снимать, мы это понимаем, но для многих бумаг комиссия разная и вы сами можете ее указать в скрипте так как он в открытом виде доступен).



( Читать дальше )
  • обсудить на форуме:
  • TSLab

....все тэги
UPDONW
Новый дизайн