Избранное трейдера krit345

по

Мой аналог банковского вклада на бирже

Добрый день!

Хочу поделиться своей стратегией, думаю для большинства пользователей смарт лаба она будет очевидной, но для меня кажется странным, что я ее в советах для новичков не встречал.

Случилось так, что в январе вернулась хорошая сумма денег, которая лежала на банковских вкладах последний год под ставку депозита прошлого января — 4.5% годовых. Обнять и плакать.

Было решено переводить деньги на биржу. Но на момент принятия этого решения многие фонды находились на исторических максимумах и одномоментное размещение всех денег в фонд выглядит неразумным решением.

Вариант: разбить сумму на большое количество частей (24, 36) и раз в месяц покупать фонды.
И тут встал встала задача: есть ли возможность разместить деньги на бирже под ставку ЦБ, аналогичную актуальному депозиту. Дополнительные условия: деньги должны быть доступны в любой момент времени без потери накопленной доходности. С нулевыми рублевыми рисками (вообще нулевыми).

Какие есть варианты?

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

QLua: таблица крупных "склеенных" обезличенных сделок - 2

    • 25 января 2022, 09:43
    • |
    • _sk_
  • Еще
Недавно ко мне обратился один из смартлабовцев с просьбой доработать скрипт из поста https://smart-lab.ru/blog/610116.php, чтобы можно было более гибко подходить к раскраске выводимой там таблицы крупных «склеенных» сделок. Я решил проделать эту работу и выложить сюда модернизированный скрипт.

Настройки раскраски таблицы производятся в самом скрипте. Я сделал какие-то настройки для светлой темы терминала, может быть, весьма далёкие от ваших идеалов. Каждый пользователь пусть настраивает сам на свой вкус через палитру RGB (для каждого из трёх основных цветов нужно выбрать интенсивности от 0 до 255), редактируя строки в начале основного скрипта.

Для работы скрипта нужен собственно сам скрипт и один или несколько файлов настроек для ваших наборов инструментов. Границы крупных и очень крупных сделок, проскальзывания и «многосоставности» сделок также пользователи настраивают под себя. В терминале QUIK запускается файл с настройками, а он в свою очередь запускает основной скрипт.

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

На опционах можно зарабатывать такими стратегиями - 3

Внимайте, коллеги, ибо это мое последнее публичное выступление. Друзья настоятельно рекомендуют обуздать свое Эго и умерить активность в сетях. Но, коль скоро обещал, обещанное исполняю. Псевдо-арбитраж между опционами RTS и Si. Логика простая, сравниваю IM (implied mobility) RTS и IM Si*k. Прошу прощения, но из-за нефти все расчеты перевел в термины подвижности
На опционах можно зарабатывать такими стратегиями - 3
При разнице больше 200 открываю позиции, при нуле закрываю (точнее, пытаюсь закрыть, но не всегда успеваю)
Позиции перед дневным клирингом
На опционах можно зарабатывать такими стратегиями - 3

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

На миру и смерть красна. Эпилог

Вынужден извиниться перед почтенной публикой, обещанное шоу не состоялось. Перевозбудился от того, что обобщенная модель позволяет описывать опционы с отрицательными страйками и решил, что смогу на этом сыграть. Но нефть за 3 для выросла с 24 до 30. Отрицательных цен нет, ликвидности тоже. Кое как закрыл позиции в символическом плюсе. Вар.маржа +8554, чистыми +7281. Не окупает ни замороженные средства, ни потраченное время. Последние 10 контрактов закрывал больше 6 часов, в итоге продал ниже теор.цены, лишь бы уже развязаться с этой гадостью.
Была мысль поиграть в позиционную игру, но стало страшно, если не могу закрыть позиции на спокойном рынке, то тем более не смогу сделать это на быстром, когда бабахнет. Короче, не знаю, влезу ли в это болото еще раз. В любом случае, сделаю это только если смогу видеть исходный рынок Brent ICE, а не наш театр теней.
На миру и смерть красна. Эпилог



Еще раз о ценообразовании опционов с отрицательными страйками.

На сайте cmegroup.com появилась таблица со вчерашними ценами закрытия опционов на нефть CLM0 с отрицательными страйками.
Тупо подобрал к ним параметры обобщенной модели. Получилось вот что. На первый взгляд, почти идеально.
Автору респект!
Еще раз о ценообразовании опционов с отрицательными страйками.




На опционах можно зарабатывать такими стратегиями. В продолжение темы, затронутой коллегой FZF

Неделю назад в  smart-lab.ru/blog/614244.php  я описывал плюсы и минусы стратегии <Опционы RTS против опционов Si> и пообещал проверить ее на недельных опционах. Исполнять обещание начал 21.04.20, то есть за три дня до экспирации. Правила были такие:
— Открывать позиции при отклонении текущей волатильности опциона RTS от расчетной на 20%, закрывать при нулевом отклонении
— Открывать обе ноги как можно ближе к деньгам
— ГО по портфелю не должно превышать 2 млн руб
Все недостатки стратегии, о которых я упоминал, проявились в полной мере
— открытые позиции ушли глубоко в деньги
— расхождения волатильностей увеличивалось до 80% от расчетных
С учетом того, что у меня были свободные средства и того, что все само-собой прикроется в 18:45 четверга, я не стал париться с закрытием старых позиций и по мере расхождения волатильностей просто открывал новые <на деньгах>.
Как следствие — задействованное ГО возросло до 5 млн., максимальная просадка счета достигала 64 тыс руб. Вариационка по дням:

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

Система BWS: с вероятностью 75% через неделю будем ниже

    • 15 апреля 2020, 21:16
    • |
    • AlexChi
  • Еще

Система BWS: с вероятностью 75% через неделю будем ниже


В данной небольшой заметке я хочу поделиться с вами тем, как я определяю для себя то, что вероятность снижения рынка превышает вероятность его роста.

В таблице 1 приведены 32 наиболее ликвидные акции нашего рынка, упорядоченные по убыванию доходности за неделю с 08.04.2020 по 15.04.2020.

Система BWS: с вероятностью 75% через неделю будем ниже

                                                   Таблица 1.

Как легко заметить, только 2 из 32 бумаг закрыли неделю в плюсе. Это очень плохой результат. Если менее 25% акций из списка наиболее ликвидных закрывают неделю ростом, то по статистике вероятность того, что и следующая неделя закроется падением выше вероятности того, что будет рост.



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

Интеграция Lua и С++ (2)


Обмен данными между Lua и Сpp осуществляется через Lua-стэк, то есть через специальным образом структурированное (по принципу Last In — First Out) пространство. 


Интеграция Lua и С++ (2)

Иллюстрация процесса добавления переменных в Cтэк (Push) и извлечения переменных из Стэка (Pop).

Иными словами, Lua стэк — это одномерный массив переменных (список, строка) с прямой (от 1 до n) индексацией.



Заполняется стэк командами lua_push (С-side) :

void lua_pushnumber (lua_State *L, lua_Number n);
const char *lua_pushstring (lua_State *L,  const char *s);

и другими. 


Новой переменной в стэке Луа длинной n автоматически присваивается индекс [n+1] или [-1], где n+1 — абсолютный индекс переменной, а -1 — индекс новой переменной относительно конца (!) стэка. 




Доступ, к переменным, соответственно осуществляется функциями lua_to (C-side) :

lua_Number lua_tonumber (lua_State *L, int index);
const char *lua_tostring (lua_State *L, int index);
где L — указатель Lua-стэка, а index — абсолютный или относительный индекс переменной в стэке.

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

QLua: таблица крупных "склеенных" обезличенных сделок

    • 03 апреля 2020, 15:06
    • |
    • _sk_
  • Еще
Иногда хочется наблюдать за ситуациями, когда участники торгов исполняют по рынку крупные заявки. Конечно, можно смотреть на обычную ленту обезличенных сделок с настроенными фильтрами на размер сделки, но ведь можно написать специальный QLua-скрипт, который будет отбирать сделки, являющиеся результатом исполнения.

В терминале QUIK ордерлог недоступен, поэтому надо как-то эвристическим образом определить, что набор обезличенных сделок относится к одной и той же рыночной заявке. Например, можно проверять, что инструмент в текущей сделке совпадает с инструментом в предыдущей сделке, направление сделки то же самое, время сделки совпадает с точностью до миллисекунд, и цена при покупке растёт, а при продаже — падает.

Если суммарный объём не менее какой-то границы, которую можно задать для каждого инструмента индивидуально, такие «склеенные» сделки выводятся в таблице. В ней указаны:
— суммарный объём;
— количество обезличенных сделок, которые были склеены;
— начальная цена и конечная цена;

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

Скрипт lua Баланс покупок/продаж

Всем привет. Переделал первоначальную версию скрипта. Исправил некоторые ошибки и немного расширил функционал. Теперь скрипт может сохранять данные в текстовый файл, который потом можно анализировать в другой программе (например exсel). Также, в отличии от первого варианта, скрипт показывает в таблице усредненную цену, по которой прошли сделки. В первом варианте отображалась цена последней сделки. И в скрипте добавлен показ накопленной дельты за все время пока скрипт работает.

TICER = "SBER";
CLASS_CODE = "TQBR";
FilePath = getScriptPath() .. "\\export.txt";--путь к файлу
save = false;--сохранять данные в файл если false нет, true да

f = nil;
stopped = false;
t_id = nil
H = -1;
M = -1;
VSELL = 0;
VBUY  = 0;
CDelta = 0;
CountTrans = 0;
PriceTrans = 0.0; 
t = "";
function OnInit()
    CountTrans = 0;
        if save then f = io.open(FilePath,"w"); end
        CreateTable();
end 

function main() 
        while not stopped do 
          if IsWindowClosed(t_id) then
         stopped = true;
      end       
          sleep(10);
        end
end

function CreateTable()
   t_id = AllocTable(); 
   AddColumn(t_id, 0, "Время", true, QTABLE_STRING_TYPE, 10);
   AddColumn(t_id, 1, "BUY", true, QTABLE_INT_TYPE, 10);
   AddColumn(t_id, 2, "SELL", true, QTABLE_INT_TYPE, 10);
   AddColumn(t_id, 3, "Дельта V", true, QTABLE_INT_TYPE, 10);   
   AddColumn(t_id, 4, "AVG Цена", true, QTABLE_DOUBLE_TYPE, 15);
   AddColumn(t_id, 5, "Накопленная Дельта", true, QTABLE_INT_TYPE, 15);
   AddColumn(t_id, 6, "Кол-во сделок", true, QTABLE_DOUBLE_TYPE, 12);   
   tab = CreateWindow(t_id);
   local NAME = tostring(getParamEx(CLASS_CODE,TICER,"LONGNAME").param_image);
   SetWindowCaption(t_id, TICER.." ("..NAME..") Баланс покупок/продаж");
   SetTableNotificationCallback(t_id, EventCallBack);
end

function Calc(alltrade)
        if bit.test(alltrade.flags, 0) then VSELL = VSELL+alltrade.qty;  --Продажа
        else VBUY  = VBUY+alltrade.qty;  end                            
        CountTrans = CountTrans+1;
        PriceTrans = PriceTrans+alltrade.price;                 
end

function OnAllTrade(alltrade)    
        if alltrade.sec_code == TICER then      
                local Rows, Col = GetTableSize(t_id);
                
                if H==-1 or H~= alltrade.datetime.hour then 
                        H = alltrade.datetime.hour;
                        M = alltrade.datetime.min;
                        t = tostring(alltrade.datetime.hour)..":"..tostring(alltrade.datetime.min);
                end
                if M==alltrade.datetime.min then
                        Calc(alltrade);
                else                                    
                M=alltrade.datetime.min;        
                        InsertRow(t_id, -1);                                               
                        local Delta = VBUY-VSELL;
                        Price = PriceTrans/CountTrans;
                        SetCell(t_id, Rows, 6, tostring(CountTrans));                   
                        SetCell(t_id, Rows, 0, t);
                        SetCell(t_id, Rows, 1, tostring(VBUY));
                        SetCell(t_id, Rows, 2, tostring(VSELL));                           
                        SetCell(t_id, Rows, 3, tostring(Delta));
                        local SEC_SCALE = tostring(getParamEx(CLASS_CODE,TICER,"SEC_SCALE").param_value);
                        SEC_SCALE = string.format("%.0f",SEC_SCALE);                    
                        SetCell(t_id, Rows, 4, string.format("%."..SEC_SCALE.."f", tostring(Price)));
                   if Rows>=2 then
                           local OldPrice = tonumber(GetCell(t_id,Rows-1,4).image);
                           if OldPrice>Price then 
                                        Red(Rows,4); 
                           else 
                                        Green(Rows,4);
                           end
                           CDelta = tonumber(GetCell(t_id,Rows-1,5).image);
                           CDelta = CDelta + Delta;                        
                        else 
                          CDelta = Delta;
                        end
                        SetCell(t_id, Rows, 5, tostring(CDelta));
                    if Delta<0 then Red(Rows,3); end
                    if Delta>0 then Green(Rows,3); end
                    if CDelta<0 then Red(Rows,5); end
                    if CDelta>0 then Green(Rows,5); end                                                   
                   if save then
                                local Str = tostring(H)..";"..tostring(M)..";"..tostring(VBUY)..";"..tostring(VSELL)..";"
                                                ..tostring(Delta)..";"..tostring(Price)..";"..tostring(CDelta);
                           Str=Str.."\n";
                           SaveFile(Str);
                        end
                t = tostring(alltrade.datetime.hour)..":"..tostring(alltrade.datetime.min);                        
                    VBUY = 0;VSELL = 0;
                        PriceTrans = 0;
                        CountTrans = 0;
                        Calc(alltrade);
                end
        end --if alltrade.sec_code == TICER then        
end

function SaveFile(Str)
        if f ~= nil then 
                f:write(Str);           
                f:flush();                               
        end
end

function Red(row,col)
        SetColor(t_id, row, col, RGB(255,0,0), RGB(0,0,0), RGB(255,0,0), RGB(0,0,0));
end
function Yellow(row,col)
        SetColor(t_id, row, col, RGB(240,240,0), RGB(0,0,0), RGB(240,240,0), RGB(0,0,0));
end
function Green(row,col)
        SetColor(t_id, row, col, RGB(0,200,0), RGB(0,0,0), RGB(0,200,0), RGB(0,0,0));
end


function EventCallBack(t_id, msg, par1, par2)
   if msg==QTABLE_CLOSE then
     OnStop();
   end;
end

function OnStop(s)
  if f ~= nil then f:close(); end
  if t_id ~= nil then
    DestroyTable (t_id);
  end;
  stopped = true;
end




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