Приветствую всех!
Сам я не программист, но решил написать скрипт, который будет выводить табличку по доходности синтетических облигаций (покупка акций/продажа фьючерса). Идея в получении дохода от контанго. Скрипт работает и табличка выводится, но через некоторое время появляется ошибка о недостатке памяти.
Подскажите, что я сделал не так?
<code>-- ©2022 by Aleksey Manin -- Таблица расчета доходности синтетической облигации -- Какие инструменты(тикеры) отслеживаем. Таблица пар тикер - площадка tickers = {GAZP = {GAZP = "TQBR", GZZ2 = "SPBFUT"}, SBER = {SBER = "TQBR", SRZ2 = "SPBFUT"}, PLZL = {PLZL = "TQBR", PZZ2 = "SPBFUT"}, GMKN = {GMKN = "TQBR", GKZ2 = "SPBFUT"}, LKOH = {LKOH = "TQBR", LKZ2 = "SPBFUT"}, AFLT = {AFLT = "TQBR", AFZ2 = "SPBFUT"}, NVTK = {NVTK = "TQBR", NKZ2 = "SPBFUT"}, YNDX = {YNDX = "TQBR", YNZ2 = "SPBFUT"}, --MOEX = {MOEX = "TQBR", MXZ2 = "SPBFUT"}, ALRS = {ALRS = "TQBR", ALZ2 = "SPBFUT"}, VTBR = {VTBR = "TQBR", VBZ2 = "SPBFUT"}, SNGS = {SNGS = "TQBR", SNZ2 = "SPBFUT"}, MGNT = {MGNT = "TQBR", MNZ2 = "SPBFUT"}, NLMK = {NLMK = "TQBR", NMZ2 = "SPBFUT"}, MTSS = {MTSS = "TQBR", MTZ2 = "SPBFUT"}, ROSN = {ROSN = "TQBR", RNZ2 = "SPBFUT"}} rows = {} -- Список строк в таблице по количеству тикеров oblig_t = AllocTable() -- Указатель на саму таблицу stopped = false -- Остановка скрипта -- Функция вызывается перед вызовом main function OnInit(path) AddColumn(oblig_t, 0, "Ticker_BA", true, QTABLE_STRING_TYPE, 8) -- "Ticker"- название первого столбца в таблице AddColumn(oblig_t, 1, "Lot_BA", true, QTABLE_INT_TYPE, 8) -- AddColumn(oblig_t, 2, "Ask_BA", true, QTABLE_DOUBLE_TYPE, 10) -- AddColumn(oblig_t, 3, "Ticker_F", true, QTABLE_STRING_TYPE, 10) -- AddColumn(oblig_t, 4, "Lot_F", true, QTABLE_INT_TYPE, 8) -- AddColumn(oblig_t, 5, "Bid_F", true, QTABLE_DOUBLE_TYPE, 10) -- AddColumn(oblig_t, 6, "Day_EXP", true, QTABLE_INT_TYPE, 10) -- AddColumn(oblig_t, 7, "Date_EXP", true, QTABLE_DATE_TYPE, 15) -- AddColumn(oblig_t, 8, "Dohod%", true, QTABLE_DOUBLE_TYPE, 10) -- AddColumn(oblig_t, 9, "Dohod", true, QTABLE_DOUBLE_TYPE, 10) -- CreateWindow(oblig_t) -- Создание окна таблицы SetWindowCaption(oblig_t, "Синтетическая облигация") -- Даем название таблице for ticker, two in pairs(tickers) do -- Перебираем пары БА-Фьючерс rows[ticker] = InsertRow(oblig_t, -1) -- Заносим тикер в список строк end end function Run() for ticker, two in pairs(tickers) do -- Перебираем пары БА-Фьючерс ask_ba = 0.0 bid_f = 0.0 lot_f = 0 for ticker_two, board in pairs(two) do -- Перебираем Тикеры внутри пары БА-Фьючерс if ticker == ticker_two then -- Если Тикер БА SetCell(oblig_t, rows[ticker], 0, ticker_two) -- Заполняем ячейке Тикера БА SetCell(oblig_t, rows[ticker], 1, -- Заполняем лот БА string.format("%u", getParamEx (board, ticker_two, "LOTSIZE").param_value)) ask_ba = getParamEx (board, ticker_two, "OFFER").param_value SetCell(oblig_t, rows[ticker], 2, string.format("%.2f", ask_ba)) -- Аск БА else -- Если Тикер фьючерса SetCell(oblig_t, rows[ticker], 3, ticker_two) -- Заполняем ячейку Тикера фьючерса lot_f = getParamEx (board, ticker_two, "LOTSIZE").param_value SetCell(oblig_t, rows[ticker], 4, string.format("%u", lot_f)) bid_f = getParamEx (board, ticker_two, "BID").param_value SetCell(oblig_t, rows[ticker], 5, string.format("%u", bid_f)) day_exp = getParamEx (board, ticker_two, "DAYS_TO_MAT_DATE").param_value SetCell(oblig_t, rows[ticker], 6, string.format("%u", day_exp)) SetCell(oblig_t, rows[ticker], 7, string.format("%u", getParamEx (board, ticker_two, "MAT_DATE").param_value)) --message('Дата:'..getParamEx (board, ticker_two, "MAT_DATE").param_type) end end sum_ba = ask_ba * lot_f --message('Тикер:'..ticker..' lot_f:'..lot_f..' sum_ba:'..sum_ba) sum_year = (bid_f - sum_ba) / day_exp * 365 percent = sum_year * 100 / sum_ba SetCell(oblig_t, rows[ticker], 8, string.format("%.2f", percent)) SetCell(oblig_t, rows[ticker], 9, string.format("%.2f", bid_f - sum_ba)) end end -- Функция вызывается перед остановкой скрипта function OnStop(signal) stopped = true end -- Функция вызывается перед закрытием квика function OnClose() stopped = true end; -- Основная функция выполнения скрипта function main() while not stopped do Run() sleep(10) end end</code>
Почему арбитраж иногда называют статистическим? Иногда рыночно-нейтральным. А иногда просто Арбитраж.
Что за дела?
Рис. 1. На самом деле не всё так однозначно*
1 Введение
Отдельный пост с тем чтобы разъяснить некоторую путаницу с определениями. Ибо арбитражей десятки. Они имеют разные свойства. И про некоторые из этих свойств будем говорить сегодня.
Если Вы впервые с арбитражом столкнулись,
читайте всё по порядку:
1) https://smart-lab.ru/blog/845637.php
2) https://smart-lab.ru/blog/845962.php
3) https://smart-lab.ru/blog/846293.php
4) https://smart-lab.ru/blog/846417.php
5) https://smart-lab.ru/blog/847153.php
6) Вы здесь…
2 Рыночно нейтральный арбитраж
Группа стратегий, доходность которых не зависит от направления рынка.
Уметь торговать руками, для начала. И понимать, как работает рынок.
Об этом мало кто говорит, но очень небольшой поцент алготрейлеров, нормальных знаю, из тех, кто вырос из программиста или математика.
Для начала, если идете в алго-научитесь торговле руками! Иначе, разочаруетесь и решите, что алготрейлинг полная хрень
Друзья!
Продолжаю свою серию видео и статей про то как и зачем нужно идти в IT. Не только в алготрейдинг, но и в целом.
Большая часть в которой я рассказывал про техническую часть – закончена.
Далее – большая часть про то как найти в себе силы на то чтобы много лет учить программирование. Уголок психологической поддержки.
И первое про что нужно поговорить, это
ВЫУЧЕННАЯ БЕСПОМОЩЬНОСТЬ
Это ситуация, в которой ты начинаешь сомневаться в своих силах. И изначально, в любой ситуации относишься к себе как к человеку у которого ничего не получится. И даже не пытаешься изменить ситуацию вокруг себя. Так программистом не стать!
Что с этим делать, смотрим в видео:
Продолжаю тему про «Арбитражи» в своём блоге.
Сегодня разговариваем про то, почему арбитраж бывает одноногим.
Рис. 1. Одна для жизни, вторая для равновесия
Что такое одноногий арбитраж?
Одноногий арбитраж – торговля не всех сторон отношений инструментов участвующих в анализе рынка при арбитражной торговле.
Арбитражные позиции не обязательно и не всегда должны быть захеджированны другой сделкой. В большинстве случаев обе стороны арбитража приносят прибыль. И мы при этом может выбирать какую ногу нам торговать.
На этот момент мы уже плотно разговаривали про парный, межбиржевой и треугольный арбитраж. Из них, первые два (парный и межбиржевой) – могут быть одноногими. Довольно сложно объяснить с ходу почему, поэтому мы просто посмотрим примеры.
Пример 1 Парный одноногий арбитраж
Тренд:
Месяц к месяцу: — 7.2 %
Год к году: + 46 %
Всего: + 11 %
Арбитраж:
Месяц к месяцу: + 6.68 %
Всего: + 6.68 %
Что было:
Продолжается лютая пила:
Как я понимаю волатильность упала, т.к. большинство участников уже выключило своих трендовых роботов слив 50%+ депозита и идёт накопление каких-то позиций. Народ переходит массово на сеточных роботов. После чего – будет выход из консолидации. Либо в район 15 тысяч, либо на 25. И то и другое будет очень хорошо для нашей трендовой торговли и перекроет убытки.
Скорее всего на 15 пойдём, ибо у меня за этот месяц от 10 до 20 сообщений в личке с предложениями и вопросами по поводу сеточных алгоритмов. Они деньги трендовым алгоритмам и отольют.
Из интересного, за месяц:
Готовлюсь к конференции. Арбитраж запустили. Но то и другое и так активно обсуждается в моём блоге, поэтому без дополнительных комментариев. Завтра продолжу серию про Арбитраж.