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

по

Индикатор разности количества бай-заявок и сел-заявок

Приветствую, друзья и коллеги! Удачи в эти непростые времена!)
Может у кого есть для КВИКа индикатор разности количества бай-заявок и сел-заявок (лимиток), буду весьма признателен!
  • обсудить на форуме:
  • QUIK

Telagram+Quik+Lua: сам себе мессенджер

Самый простой способ, которым я пользовался долгое время.
Нужно установить две программы: Tor browser и curl.
Первая, чтобы блокировки телеграма обходить. Вторая, чтобы сетевую команду исполнять.

Разумеется, телеграм-бот уже должен быть создан, вы должны знать его идентификатор, а также айди своего телеграм-аккаунта,
чтобы подписаться на бота и видеть сообщения от бота.

В луа после этого всё предельно просто:
str='C:\\curl-7.63.0-win64-mingw\\bin\\curl.exe --socks5 127.0.0.1:9150 '
	str=str..'"https://api.telegram.org/botидентификаторвашегобота/sendMessage?chat_id=айдивашегоаккаунта&text='

str=str..переменная1..": "..переменная2
str=str..'"'
os.execute(str)
Приведенный код будет слать в телеграм значения двух переменных, разделенных двоеточием.
Всё просто, но есть два нюанса:
1. Каждая отправка сообщения сопровождается вызовом окна командной строки, которая всплывает поверх всех окон на одну-две секунды. Поэтому слать такие сообщения на машине, с которой вы работаете, чаще одного раза в минуту, не стоит.
2. Я таким способом пользовался больше года и считал, что он и легкий и надежный, но оказалось, что он легкий, но ненадежный. Один раз у меня случилась такая штука. Всплыло черное окошко командной строки, сообщение в телегу не ушло, окошко продолжило висеть. Видимо, какой-то сетевой сбой. И, как оказалось, квик-поток, вызвавший эту командную строку через os.execute, тоже завис и квик перестал коннектиться почему-то, потерял данные и тд. После того, как я это окошко закрыл крестиком, квик продолжил работу. Грубо говоря, из десятков тысяч запусков за год применения такого способа 1 вот такой глюк. Редко, но неприятно.

А какие вы знаете простые, легкие и надежные способы информирования без необходимости много кодить?


Интеграция 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




Покупка акций через продажу опционов пут-есть ли подводные камни?

    • 03 апреля 2020, 08:23
    • |
    • Gregori
  • Еще

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

основной плюс — дополнительный заработок на продаже опционов.  

я пока вижу 2 риска

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

Рецепт вижу такой- продавать только на те акции которые точно хочется.  

2. если всё упадет и придется кучу акций покупать. опять же -в алгозаявке я могу работать с суммой больше чем есть наличка исходя из того что акции не с единичной кореляцией падают- что то купить успею и упадет, а что то не упадет достаточно низко- выходит что для того что бы загрузить депозит надо  выставить заявки на сумму больше чем кол-во кэша свободного. 
Рецепт вижу такой: ограничиваться по объёму продаж. по крайней мере за N ный период.  что бы даже если все опционы  эксплицируются в акции- не появлялось плече. Ну или если решу заесть в плече (если прям рынок совсем на дне будет- то не исключено что буду готов и на это) -то что бы плече было в пределах заданного риска(условно при rts 600=уровень 2008 года +инфляция  загрузится в плечем 1.5- 2 исходя из того что риск упасть до 200/300 очень мало, да и если такое произойдет- важны ли будут акции (или важней патроны и тушонка будут)).

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

 


Зигзаг удачи - 1 апреля 2020

    • 02 апреля 2020, 00:32
    • |
    • ch5oh
  • Еще

Кризис приятен тем, что даёт возможность потренировать разные позиции. Никому не интересно читать однотипные под копирку посты «продал стреддл — зафиксировал прибыль». Даже одиночный возглас "будь прокляты хуситы и охрана завода саудитов!" общей картины не менял. Хоть новоявленный опционный псевдогуреныш Г… ая Г… нь и считает, что «торговать мосбиржу западло» и «торговать в кризис дважды западло», но кто он такой, чтобы нам указывать? Поэтому караван идет и на пути ему попался Зигзаг Удачи.


Эта позиция считается базовой уважаемым Каленкович Алексей (enki) .
Низкий ему поклон за науку и за время, которые он мне уделил.


Давным-давно в уже далеком 2017 году эта позиция так и торговалась из месяца в месяц методично и довольно скучно (до февраля 2018 года примерно =) ) на боевом тестовом счете (размером около 100 тыр). Учитывая, что это были месячные опционы на РИ сейчас сам себе удивляюсь, насколько хватало смелости переносить это всё хозяйство через ночь и выходные. =) Nobless oblige



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

QLua: формирование свечных данных для робота

    • 31 марта 2020, 13:37
    • |
    • _sk_
  • Еще
Поделюсь своим опытом, который может быть полезен начинающим алготрейдерам, пишущим своего робота на QLua.

Внутри QLua есть стандартный способ, которым можно заказать свечные данные. Это делается через функцию CreateDataSource. При этом терминал возвращает все свечи, которые у него есть на момент вызова этой функции, но это может быть не совсем удобно. Вот несколько примеров.

Пример 1. Мы торгуем акции на 30-минутках и при этом не хотим учитывать свечу, которая получается в 9:30 из-за аукциона открытия, и не хотим, чтобы аукцион закрытия портил последнюю свечу дня в 18:30. Хотим только нужные свечи в одном массиве.

Пример 2. Мы торгуем фьючерсы только в дневную сессию, а вечернюю сессию выбрасываем, поскольку наша стратегия в этом случае даёт более приличный график эквити. Хочется иметь «отфильтрованный» свечной ряд.

Пример 3. Мы торгуем американские акции на Санкт-Петербургской бирже и хотим, чтобы время свечей было как в Америке, а не как на бирже, и хотим оставить только основные торги с 9:30 до 16:00 по буржуйскому времени.

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

Расчет рисков опционного портфеля

    • 31 марта 2020, 12:43
    • |
    • tashik
  • Еще
В публикациях коллег я часто сталкиваюсь с тем, что позиция оценивается по тому профиту, который она может принести, но для эффективного управления рисками, которое поддерживает депозит на плаву, нужно иметь в виду такую непозитивную на первый взгляд сторону, как риски, то есть потенциальные убытки. То есть сколько обеспечения взять на лот из собственных денег. Известный размер риска даст нам возможность адекватно рассчитывать размер позиции перед входом в сделку. Статья не призвана кого-то чему-то научить. Её цель — вызвать обсуждение темы в комментариях, возможно, найти ошибки в расчётах.

Пытаясь разобраться в теме, я нашла для себя такую базу для расчета рисков.

Наш Центробанк, не к ночи будь он помянут, выделяет следующие виды риска:

— Фондовый: будем применять его для расчета рисков опционного портфеля с базовым активом фьючерс на индекс РТС (RI) — имеет заложенный коэффициент величины изменений базового актива 8%
— Валютный: будем применять его для расчета рисков опционного портфеля с базовым активом фьючерс на пару доллар-рубль (Si) — имеет заложенный коэффициент величины изменений базового актива 8%

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

Про греки и сбор теты. Опять по новой :)

    • 31 марта 2020, 11:35
    • |
    • doctor
  • Еще

Про греки.
Сразу предупреждаю. Следующие три ссылки — ссылки на мой сайт (никаких регистраций не нужно). 
Все, что я хотел сказать в открытом доступе, я сказал здесь. Даже сделал чек-лист по грекам (здесь). И еще написал алгоритм действий при создании опционной позиции (здесь).

По-моему, уже здесь выкладывал, но выложу еще раз: 

Про греки и сбор теты. Опять по новой :)
















Идея создания опционов – это попытка оценить будущий диапазон движения БА. Отсюда и идет то, что профессионалы при торговле опционами смотрят на историческую волатильность (HV), подразумеваемую волатильность (IV) и пытаются спрогнозировать будущую реализованную волатильность. Затем, участники рынка пытаются спрогнозировать, какой будет волатильность БА, если его цена вырастет/упадет на 1,2,3 и т.д. процента. Так появляется кривая волатильности. Затем начинают прогнозировать движение БА за различный временной интервал, что приводит нас к временной структуре.



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

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