Избранное трейдера Turbo Pascal

по

QLua скринер. Обновление.

Всем привет!
В продолжение топика «QLua скринер в 10 строк кода. Или „за базар отвечаю“, можно качать обнулённый обновлённый скринер.
Выглядит так в статике:
QLua скринер. Обновление.
А так в динамике.
Если в прошлом скринере отображалось изменение текущей цены от цен закрытия за соответствующее количество торговых сессий (список „срезов“ задается пользователем), то в этом будет две таблицы. Первая таблица — изменение текущей цены от предыдущих хаев (чуть не оговорился...) за N-торговых сессий, вторая — от предыдущих лоёв.
В первой таблице от минимумов выделена строка с длинными ОФЗ. Видно, что минимум цены за 30 торговых сессий был на прошлой сессии.
А во второй таблице, мы видим, что Яндекс и Магнит обновили сегодня свои максимумы за последние 90 торговых сессий.
Таким образом, техзадание (ТЗ) участника тусовки Weddy практически выполнено, остается доделать, как он просил, тот же функционал, только относительно списка заданных дат.

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

КВИК-->Lua-->Python. Трансляция данных из КВИКа в Питон в реальном времени

Всех с пятницей — самоизолятницей!
Представляю общественности Python-сервер (в 9 строк кода) для получения данных из КВИКа в Питон через луа-скрипт в режиме реального времени.
Для примера приведу получение тиковых данных по SIM0.
Нам понадобятся следующие ингредиенты.
1. Понятное дело КВИК, версии ниже 8 или 8.5.2 и выше.
2. Питон Jupyter Notebook (Anaconda 3)
3. Луа-скрипт, взятый из Jatotrader (в нем буквально изменено пару строк)
Как работает сервер можно посмотреть в этом видео (1 мин. 38 сек.) Ну и по правилам хорошего тона, естественно сам текст ниже.


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

График выплат и погашений ОФЗ в наглядной форме

Недавно интересовались графиком выплат / погашений ОФЗ в наглядной форме. Например, это может понадобиться при построении облигационного портфеля с определенным графиком поступлений. Их есть у меня.

Для начала разберемся с погашениями:

График выплат и погашений ОФЗ в наглядной форме

Зеленым обозначены ОФЗ с фиксированным номиналом и купоном
Желтым — бумаги с переменным купоном
Оранжевым — облигации с индексируемым номиналом (ОФЗ-ИН)
Синим — с амортизируемым номиналом ОФЗ-АД

Небольшой нюанс, т.к., год заканчивается, то обновил таблицу уже сразу с расчетом будущее, т.е. трехлетки (по сроку погашения) это бумаги до конца 2022, а не до 2021 г. и т.д. 

Теперь определимся с купонами. Вот:

График выплат и погашений ОФЗ в наглядной форме

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

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




Мои 10 правил

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

1. Если торговля на сегодня окончена, открытых сделок нет и я в плюсе, можно поделиться этой радостью с близкими. Пока я в рынке — никто, кроме меня самого, не должен знать, что и зачем я делаю, сколько зарабатываю или теряю.
2. Нервы, психи, любая напряженность — торговать категорически нельзя. Необходимо отвлечься, чтобы расслабить фокус внимания.
3. Если я смотрю на график и не знаю наверняка, то не заключаю сделку. 50/50 не мой вариант. Я могу лучше.
4. Если знаю наверняка, то просто заключаю сделку и жду ее исхода. Терпение и бесстрашие — мои спутники.
5. Никуда не спешить. Спешка — недостаток уверенности. Я уверен, что на рынке для меня существует целая россыпь возможностей, каждая из которых реализуется в свое время. Пропустил одну сделку — будет следующая. Есть время подождать — есть деньги.
6. Чтобы зарабатывать, я использую голый график. Кроме цены, больше ничего не надо. Ни объемы, ни даже уровни. Никакие «точки входы» не работают. Есть только опыт определения верного шаблона поведения цены в моменте. Если это есть, то остается только «купить подешевле, продать подороже». Без заморочек.

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

Скрипт lua читающий таблицу обезличенных сделок.

Всем привет. Может кому пригодится. Скрипт читает ленту сделок и раз в минуту подсчитывает разницу между покупками и продажами. Часть кода нашел в интернете часть кода написал сам. Не знаю может уже есть что то подобное. Цель была не написать что то оригинальное, а наработать навыки программирования на lua.

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

Новичкам. Как бороться со страхом и жадностью при помощи опционов?

Всем привет.

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

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

Читая топики про полный слив депозитов за последние 2 недели у смартлабовцев я задумался над тем, а что же меня отличает от той слившейся толпы? В чем мое преимущество над ними?

Вспоминая сейчас, что сам сидел по уши в лонгах по 135 000 Ri и так неохотно хотелось расставаться с этой позой, но я все же избавился от нее по 128 000 Ri, да еще и в шорт перевернулся потом, а сейчас, когда видим рынок по 92 500 Ri, каждый лонгист может задать вопрос самому себе — а нужно ли было тогда держать позицию по 135 000 и дальше? Каждый знает, что «режь убытки и давай прибыли расти», но не каждый понимает как это можно осуществить на практике.

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

....все тэги
2010-2020
UPDONW