Избранное трейдера Роман Давыдов
Бывает, что частные инвесторы не доверяют сервисам для ведения портфеля ценных бумаг и ведут учет своих инвестиций в «Экселе» или «Гугл Таблицах».
Если количество ценных бумаг не так велико, то подобное использование таблиц оправдано:
Но у такого метода учета есть и свои минусы, главным образом связанные с необходимостью ручного обновления котировок. Если раз в квартал сделать это несложно и вручную, но чтобы поддерживать актуальность чаще, потребуется много времени: нужно зайти на сайт, где опубликованы текущие котировки, найти нужную цену, скопировать ее и вставить в ячейку таблицу. И так для каждой ценной бумаги в портфеле. Печально и долго.
Зачем вообще нужны актуальные цены в таблицах:
Четыре года назад я написал систему поиска поиска недооцененных американских акций, используя данные Яху Финанс, ведь на американском рынке торгуется больше 10 тысяч бумаг, из которых около 4 тысяч бумаг имеют рекомендации аналитиков о прогнозируемой цене. Это большие цифры, с которыми сложно работать. Но что по России?
Я вялотекуще пытался найти систему которая бы также отдавала рекомендации аналитиков по российским компаниям, пока недавно не нашёл такой API. Вот например какие рекомендации для оператора аренды электросамокатов WUSH:
{ "targets": [ { "uid": "b993e814-9986-4434-ae88-b086066714a0", "ticker": "WUSH", "company": "SberCIB Investment Research", "recommendation": "RECOMMENDATION_HOLD", "recommendationDate": "2024-10-02T00:00:00Z", "currency": "rub", "currentPrice": { "units": "192", "nano": 0 }, "targetPrice": { "units": "250", "nano": 0 }, "priceChange": { "u
local Titles, Entries, Desk = {}, {}, {} local Wn1_Hndl local Wn1_Field1, Wn1_Field2, Wn1_Field3, Wn1_Field4, Wn1_Field5 = "Код CALL", "Страйк", "Дельта CALL", "Дельта расч", "Теор. расч" function OnInit (scriptPath) qu = require ("QuikUtil(qu)") -- qc, lu, tu blk = require ("BlackScholes(blk)") glb_ScriptDir, glb_ScriptName = lu.SplitPath (scriptPath) message (glb_ScriptName .." started") server = require ("OptionDesk") end -- OnInit() function OnStop (signal) if Wn1_Hndl then DestroyTable (Wn1_Hndl) end StopFlag = true return 1000 -- 1 sec end local function ShowWin (cols) for k = 1, #Desk do local calCode = Desk[k][Entries[Wn1_Field1]] if calCode:sub (3,3) == "0" then calCode = calCode:sub (1,2) .
Итак, это было обычное скучное утро, когда я решил: «А почему бы не попробовать этот Алгопак от Московской биржи?» Я давно слышал про него, а тут как раз была пара свободных часов и чашка горячего кофе. Что может пойти не так, верно?
Регистрироваться было просто. Почта, пароль, подтверждение — стандартный набор. И вот я уже на главной странице Алгопака, который выглядит достаточно дружелюбно. Однако, первый звоночек прозвенел, когда я начал искать справочную информацию. Документация оказалась несколько запутанной, а некоторые разделы вовсе не обновлялись годами.
Для начала я решил не мудрить и создать что-то простое. Пусть это будет стратегия на основе скользящих средних (SMA). Вот мой пример кода на Python, который я решил использовать:
import pandas as pd import numpy as np # Загружаем данные data = pd.read_csv('historical_data.csv') # Параметры стратегии short_window = 40 long_window = 100 # Создаем сигналы signals = pd.
Функция OnTrade
Сохранение параметров сделки в файл.
Работа с таблицей сделок.
Сохранение всех сделок дня.
Скрипт автосохранения всех заявок и сделок под завершение торгового дня.
Для отслеживания прошедших сделок мы можем задействовать функцию обратного вызова OnTrade. Она во многом похожа по логике на OnOrder, только возвращает коллбэки уже по исполненным сделкам. В случае, если заявка разбивается на несколько сделок, мы получим информацию по каждой.
В файле QLUA.chm в директории терминала находим через поиск описание самой функции:
qp_provider = QuikPy()<br /><br />теперь пишу<br /><br />
qp_provider = QuikPy(host='127.0.0.1', requests_port=50827, callbacks_port=50828)<br /><br />получаю<br /><br />
C:\Users\vadim\PycharmProjects\pythonProject\.venv\Scripts\python.exe C:\Users\vadim\PycharmProjects\pythonProject\MyFolder\TestSupport.py
Traceback (most recent call last):
File «C:\Users\vadim\PycharmProjects\pythonProject\MyFolder\TestSupport.py», line 25, in <module>
qp_provider = QuikPy(host='127.0.0.1', requests_port=50827, callbacks_port=50828)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File «C:\Users\vadim\PycharmProjects\pythonProject\QuikPy\QuikPy.py», line 168, in __init__
self.socket_requests.connect((self.Host, self.RequestsPort)) # Открываем соединение для запросов
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ConnectionRefusedError: [WinError 10061] Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение