А.К.
А.К. личный блог
08 ноября 2021, 07:17

🇺🇸🇷🇺 Spb Exchange - биржа больших возможностей 😎 Как заработать во время обвала?! $$$ 🤖 Автоматизация (QLUA-робот) 🤖

Хорошей практикой диверсификации ваших инвестиций является покупка иностранных акций за валюту. Инвестировать в акции зарубежных компаний можно просто и выгодно через Санкт-Петербургскую биржу (https://spbexchange.ru/). Преимущества очевидны:

  1. Инвестиции производятся в долларах США и Евро
  2. Низкие комиссии за малые объемы инвестиций. Можно покупать акции хоть по одной штуке, тогда как на биржевых площадках в США минимальный торговый лот = 100 акций.

  3. Торговый терминал QUIK с возможностью создавать торговых роботов на языке lua. Пример скрипта в этом посте.

  4. Автоматизированные расчеты и удержание НДФЛ на сделки купли-продажи


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


  • Real estate investment trust (REIT) — уникальный сектор в США для возможности инвестировать в коммерческую недвижимость небольшие суммы денег частных инвесторов;

  • Kraft Heinz Co. — американский продовольственный концерн, одна из крупнейших инвестиций в портфеле Уоррена Баффетта;

  • Wells Fargo & Co. — банковская холдинговая компания, входит в “большую четверку” банков США;

  • Intel Corporation — крупнейший американский производитель процессоров и микрочипов;

  • Verizon Communications Inc. — американская телекоммуникационная компания, “дивидендный аристократ” в портфеле Баффетта с 2021 года;

  • Biogen Inc. — биотехнологическая компания с перспективными разработками лекарств от болезни Альцгеймера и рассеянного склероза;

  • Alibaba Holding Group Ltd — ADR — Китайская публичная компания, работающая в сфере e-коммерции на интернет-порталах Alibaba.com, AliExpress, Taobao.com, Tmall и ряда других.

🇺🇸🇷🇺 Spb Exchange - биржа больших возможностей 😎 Как заработать во время обвала?! $$$ 🤖 Автоматизация (QLUA-робот) 🤖
Итого, в моих постах на смарт-лабе раскрыто 39% инвестиционного портфеля иностранных акций. Заходите в блог и читайте мои аргументы.

Я сторонник широкой диверсификации портфеля акций. В портфеле уже более 30 эмитентов. Благо на СПБ-бирже богатый выбор компаний, работающих в разных отраслях экономики и разных странах. 🌏

🇺🇸🇷🇺 Spb Exchange - биржа больших возможностей 😎 Как заработать во время обвала?! $$$ 🤖 Автоматизация (QLUA-робот) 🤖

🇺🇸🇷🇺 Spb Exchange - биржа больших возможностей 😎 Как заработать во время обвала?! $$$ 🤖 Автоматизация (QLUA-робот) 🤖
Когда буду добавлять (покупать) новые акции в портфель? 

Я считаю, что лучшее время для больших инвестиций — это кризис ликвидности. Так вот: микро-кризисами ликвидности СпБ биржа и славится — бывает, что здесь проскальзывают цены, которые сильно отклоняются от котировок на Уолл-стрит. Это время возможностей. 

Обратимся к истории.

Самым ярким примером является мини-кризис 9 марта 2020 года, когда на графиках многих ликвидных акций возникли “спайки”, цены по которым можно было бы выгодно купить или продать акции, используя заранее выставленные лимитированные заявки. А те кто ставил стоп-приказы как раз “попали” в тот день на убытки.

Купить Apple, Facebook, Microsoft за три доллара как вам такая игра? 🙃

🇺🇸🇷🇺 Spb Exchange - биржа больших возможностей 😎 Как заработать во время обвала?! $$$ 🤖 Автоматизация (QLUA-робот) 🤖

В сети есть несколько статей про события того дня. Например, статья РБК от 11 марта 2020 г.: Клиенты «Тинькофф Инвестиций» пострадали из-за сбоя на СПб бирже. Подробнее : 
https://quote.rbc.ru/news/article/5e6908bb9a7947233678c676 

Люди бурно обсуждали этот кризис и подсчитывали свои потери в пульсе, собрали целое сообщество пострадавших численностью более 500 человек в телеграм-канале. Вроде как брокер признал ошибки и возместил потери, но это не точно.... 

Сама биржа получила тогда хороший урок и позднее изменила алгоритмы учета рыночной цены. Об этом читаем в пресс-релизе от 10 марта 2020 года.

Санкт-Петербургская биржа в ближайшее время планирует внести изменения в алгоритм расчета показателя «Текущая цена рынка»

Однако, 19 апреля 2021 года история почти повторилась — о чём можно прочитать в блоге Дмитрия Семенова :

У меня стояла стоп-лимитная заявка на продажу $MSFT, что при достижении определенной цены при падении, будет автоматически выставлена лимитная заявка на продажу не ниже указанной. В заявке стояла сумма 247.07.

В 7:03 я получаю уведомление, что все тейк-профиты отменены.

В 7:22 что моя лимитная заявка на продажу выставлена.

Заявка была исполнена в 1 минуту открытия биржи.

Потери составили 198 долларов, где 260 долларов, цена закрытия предыдущего рабочего дня, а 238 долларов это цена продажи.

Всего было продано 9 акций.

🇺🇸🇷🇺 Spb Exchange - биржа больших возможностей 😎 Как заработать во время обвала?! $$$ 🤖 Автоматизация (QLUA-робот) 🤖

Много случаев “спайков” есть и позднее марта 2020 в разных акциях. Хорошо летают котировки биотехнологических компаний в час публикации важных корпоративных сообщений (в основном это пресс-релизы связанные с FDA) перед стартом основных торгов в Америке. Для иллюстрации открываем график Biogen (BIIB_SPB) и видим:

🇺🇸🇷🇺 Spb Exchange - биржа больших возможностей 😎 Как заработать во время обвала?! $$$ 🤖 Автоматизация (QLUA-робот) 🤖

а также Moderna (MRNA_SPB):

🇺🇸🇷🇺 Spb Exchange - биржа больших возможностей 😎 Как заработать во время обвала?! $$$ 🤖 Автоматизация (QLUA-робот) 🤖
Бывали казусы после сплита акций — например случай произошедший 02 июня 2020 года, в первый день торгов Edwards Lifesciences (EW_SPB) после сплита 3 of 1.

🇺🇸🇷🇺 Spb Exchange - биржа больших возможностей 😎 Как заработать во время обвала?! $$$ 🤖 Автоматизация (QLUA-робот) 🤖

Это самые яркие ценовые аномалии, но вы легко сможете найти отклонения на графиках других акций на разные величины. Если встречали — пишите в комментариях.

 

Почему кризисы ликвидности возможны ? 

Дело в локальном спросе и предложении, которые формируются на СпБ бирже в конкретную минуту торгов. Действующие силы, которые могут сильно влиять на цену:

  1. Масса частных физ лиц, принимающих эмоциональные решения о купле или продаже

  2. Брокеры с техническими сбоями программного обеспечения

  3. Стоп-лосс и тейк-профит заявки трейдеров

  4. Риск-менеджеры брокеров, которые “режут” кредитные позиции клиентов

  5. Маркет-мейкеры, осуществляющие арбитраж между площадками NYSE и SPB-EXCHANGE.


На нормальном спокойном рынке, который мы видим большую часть времени, все силы сбалансированы. Именно маркет-мейкеры дают основную ликвидность и держат спреды между площадками NYSE и SPB-Exchange на минимальных значениях 0,1-0,2%. 

Но, предположим, что пушной зверёк таки снова пробрался на мировые рынки (как это было в марте 2020) и ночью (у нас) произошел обвал в Америке. Утром следующего дня фьючерсы в минусе. 😱😵🤯

🇺🇸🇷🇺 Spb Exchange - биржа больших возможностей 😎 Как заработать во время обвала?! $$$ 🤖 Автоматизация (QLUA-робот) 🤖

И как тогда открывать котировки в утреннюю торговую сессию на СПБ-бирже когда основная площадка NYSE закрыта с большими неопределенностями ?! 🥴

Предполагаю, что в это утро Маркет-Мейкер просто не выйдет рисковать своими деньгами или встанет в покупках в лучшем случае на несколько процентных пунктов (или десятки процентов), ниже закрытий предыдущего дня. Спреды в утреннюю торговую сессию СПБ-биржи будут колоссальными, если торги вообще начнутся. А сверху возникнет навес предложения в виде массы паникеров, стоп-лоссов и рисковиков с маржин-коллами. Это и есть мини-кризис ликвидности, открывающий окно возможностей для частных инвестиций по выгодным ценам. Главное условие участия в щедром аукционе — наличие свободных денежных средств на брокерском счету. 😉

Шеф, так что же делать? 🧐

Я считаю, что лучше всего построить автоматическую торговую систему (АТС), которая торгует ценовые неэффективности. Очевидный плюс АТС — отсутствие эмоций робота на высоко-волатильном рынке, холодные математические расчеты и быстрые заявки купли-продажи. Сегодня публикую простой пример, воспользовавшись которым, вы тоже сможете выставить заявки на СПБ-бирже в автоматизированном режиме. 🤖

Исходный код написан на языке QLUA и предоставляется на условиях “как есть” для образовательных целей. Скрипт выставляет лимитированные заявки на покупку акций из разных секторов экономики: Apple (APPL_SPB), Qualcomm (QCOM_SPB), Biogen (BIIB_SPB), Bank of America (BAC_SPB), Simon Property Group (SPG_SPB). Акции доступны к торгам с 7-00 по Московскому времени. Далее можете корректировать, добавлять в скрипт свои заявки с интересными вам акциями и ценами. Список всех ценных бумаг можно посмотреть на сайте биржи здесь: https://spbexchange.ru/ru/listing/securities/ 

🚀 Исходный Код 🚀

--[[ Инициализиация торговой сессии - выставление лимитированных заявок по бумагам ]]

--/* НАСТРАИВАЕМЫЕ ПАРАМЕТРЫ */
ACCOUNT = 'VTBRM_CL';        -- Идентификатор счета
CL_CODE = '******'; -- код клиента

--/* РАБОЧИЕ ПЕРЕМЕННЫЕ */
CntBuys = 0;
ErrBuyNum = 0;

-- Функция первичной инициализации скрипта (ВЫЗЫВАЕТСЯ ТЕРМИНАЛОМ QUIK в самом начале)
function OnInit()
   -- Пытается открыть лог-файл в режиме "чтения/записи"
   Log = io.open(getScriptPath().."//START_SPB_EXCHANGE_LOG.txt","r+");
   -- Если файл не существует
   if Log == nil then 
      -- Создает файл в режиме "записи"
      Log = io.open(getScriptPath().."//START_SPB_EXCHANGE_LOG.txt","w"); 
      -- Закрывает файл
      Log:close();
      -- Открывает уже существующий файл в режиме "чтения/записи"
      Log = io.open(getScriptPath().."//START_SPB_EXCHANGE_LOG.txt","r+");
   end; 
   -- Встает в конец файла
   Log:seek("end",0);
   Log:flush();
   
   -- Инициализирует генератор
   math.randomseed(os.date("*t",os.time()).sec); -- Инициализирует генератор псевдослучайных чисел параметром, каждый параметр порождает соответствующую (но одну и ту же) последовательность псевдослучайных чисел.    
end;

function main()
	local ServTime = getInfoParam("SERVERTIME")
	
	sendLimitBUY("SPBXM", "AAPL_SPB", 101, 1, 103) -- покупка Apple
	sendLimitBUY("SPBXM", "QCOM_SPB", 101, 1, 105) -- покупка Qualcom
	sendLimitBUY("SPBXM", "BIIB_SPB", 150, 1, 152) -- покупка Biogen
	sendLimitBUY("SPBXM", "BAC_SPB", 41, 1, 42) -- покупка Bank of America
	sendLimitBUY("SPBXM", "SPG_SPB", 101, 1, 102) -- покупка Simon PG

	local ServTimeLast = getInfoParam("SERVERTIME")
	ToLog(" Buy nums: "..tostring(CntBuys).." Errors: "..tostring(ErrBuyNum).." Start ST: "..ServTime.." End ST: "..ServTimeLast)
	
end;

-- Функция ВЫЗЫВАЕТСЯ ТЕРМИНАЛОМ QUIK при остановке скрипта
function OnStop()
   -- Встает в конец файла
   Log:seek("end",0);
   -- Добавляет пустую строку-разрыв
   Log:write("\n");
   Log:flush();
   Log:close();
 
end;

--[[
Функция для отравки лимитированной заявки на покупку ценной бумаги 
class_code - класс бумаги согласно классификатору биржи
sec_code - код ценной бумаги
price - цена
volume - объем (количество) бумагам
maxbuyprice - максимально допустимая цена покупки (ценовой ограничитель)

Данная функция возвращает:
ID присвоенный транзакции либо nil если транзакция отвергнута на уровне сервера Квик
--]]
function sendLimitBUY(class_code, sec_code, price, volume, maxbuyprice)
	-- отправка лимитированной заявки
	-- все параметры кроме кода клиента и коментария должны быть не nil
	-- если код клиента nil - ошибка и возврат

	if (class_code == nil or sec_code == nil or maxbuyprice == nil or volume == nil or ACCOUNT == nil or price == nil) then		
		ToLog("Can`t send BUY order. Nil parameters for "..tostring(sec_code))
		ErrBuyNum = ErrBuyNum + 1
		return nil
	end
	
	if (maxbuyprice < price) then
		ToLog("ERROR!!! "..tostring(sec_code).."incorrect BUY price.")
		ErrBuyNum = ErrBuyNum + 1
		return nil
	end
	
    -- Получаем случайное уникальное число для id
    local trans_id = math.random(17001,999999)
	local prs = nil

	local scale = getParamEx(class_code, sec_code, "SEC_SCALE")
	SCALE = tonumber(scale.param_value) -- шаг цены
		
	if (SCALE == 1) then prs = string.format("%.1f",price)
	elseif (SCALE == 2) then prs = string.format("%.2f",price)
	elseif (SCALE == 3) then prs = string.format("%.3f",price)
	elseif (SCALE == 4) then prs = string.format("%.4f",price)
	elseif (SCALE == 5) then prs = string.format("%.5f",price)
	else prs = string.format("%.0f",price)
	end
	
	local vlmstr = string.format("%.0f",volume)
		
    -- Таблица параметров транзацкии
	local transaction={
		["ACCOUNT"] = ACCOUNT,
		["CLIENT_CODE"] = CL_CODE,
		["TYPE"] = "L",
		["TRANS_ID"] = tostring(trans_id),
		["CLASSCODE"] = class_code,
		["SECCODE"] = sec_code,
		["ACTION"] = "NEW_ORDER",
		["OPERATION"] = "B", -- покупка
		["PRICE"] = prs, -- Цена
		["QUANTITY"] = vlmstr, -- Объем
    }
	
    local res = sendTransaction(transaction)	-- Отправляем транзацкию

	if res ~= "" then	-- Если незультат не пустой
		ToLog("ERROR!!! "..tostring(sec_code).."send BUY order is failed")
		ErrBuyNum = ErrBuyNum + 1
		return nil
    else        
		ToLog(tostring(sec_code).." Order BUY is sended "..tostring(trans_id).." on price "..tostring(price))
		CntBuys = CntBuys + 1
		return trans_id
	end	
	sleep(10)	-- timeout = 10 ms
end;

-- Функция для записи в лог действий скрипта
function ToLog(str)
   local datetime = os.date("*t",os.time()); -- Текущие дата/время
   local sec_mcs_str = tostring(os.clock()); -- Секунды с микросекундами 
   local mcs_str = "000"
	if (sec_mcs_str ~= nil) then
		mcs_str = string.sub(sec_mcs_str, sec_mcs_str:find("%.") + 1);   -- Микросекунды
	end
   -- Записывает в лог-файл переданную строку, добавляя в ее начало время с точностью до микросекунд
   Log:write(tostring(datetime.day).."-"
            ..tostring(datetime.month).."-"
            ..tostring(datetime.year).." "
            ..tostring(datetime.hour)..":"
            ..tostring(datetime.min)..":"
            ..tostring(datetime.sec).."."
            ..mcs_str.." "
            ..str.."\n");  -- Записывает в лог-файл
   Log:flush();   -- Сохраняет изменения в лог-файле
end;

 

Как запустить скрипт ?

  1. Скопируйте текст кода в файл с расширением .lua

  2. В текстовом редакторе в файле вставьте номер своего брокерского счета CL_CODE

  3. Запустите торговый терминал QUIK с идентификацией пользователя. 

  4. Запустите диалоговое окно “Меню -> Сервисы -> Lua-скрипты…”

  5. Выберите файл скрипта и нажмите кнопку “Запустить”

  6. Теперь найдите свои заявки в диалоговом окне “Создать окно->Заявки”

🇺🇸🇷🇺 Spb Exchange - биржа больших возможностей 😎 Как заработать во время обвала?! $$$ 🤖 Автоматизация (QLUA-робот) 🤖
Таким образом, каждый день нажимая всего одну кнопку, вы можете выставлять сотни заявок на Санкт-Петербургской бирже. 

Домашнее задание: 

Код выполняет выставление заявок только на покупку, но вы можете добавить функцию на продажу самостоятельно путем редактирования lua файла. ✍ За направление операции отвечает параметр “”OPERATION” (“B” — покупка, “S” — продажа) в таблице параметров transaction. Удачи! 🙏

Если тема будет популярной (ваши лайки 💞 и сохранения⭐), то опубликую вторую часть с более сложным скриптом, содержащим:

  1. Таймер автозапуска (утренняя сессия, основная сессия)

  2. Определение лимитов по д.с. перед покупкой

  3. Определение лимитов по ценным бумагам перед продажей

  4. Установка цен купли-продажи в зависимости от цен закрытия предыдущего дня.

  5. Автоматизированное снятие всех заявок

Что ещё добавить в этот скрипт напишите в комментариях.


Удачи в инвестициях на Санкт-Петербургской бирже! 🙏

пост на сматлаб конкурс

45 Комментариев
  • Андрей К
    08 ноября 2021, 08:16
    я бы приз дал )
  • Igr
    08 ноября 2021, 08:31
    скрипт просто выставляет лимитные заявки, всё? 
  • Юрий
    08 ноября 2021, 15:15
    Возьму на заметку

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн