Избранное трейдера Олег

по

Кино 2019

1. Чернобыль (Chernobyl) (мини-сериал)
2. 1917
3. Джокер (Joker)
4. Платформа (El hoyo)
5. Кролик Джоджо (Jojo Rabbit)
6. Джентльмены (The Gentlemen)
7. Солнцестояние (Midsommar)
8. Мы (Us)
9. Достать ножи (Knives Out)
10. Ford против Ferrari (Ford v Ferrari)
11. Неогранённые драгоценности (Uncut Gems)
12. Прощание (Farewell)
13. Ирландец (The Irishman)
14. Прачечная (The Laundromat)
15. Скандал (Bombshell)
16. Маленькие женщины (Little Women) (фильм 2019 года!)
17. Доктор Сон (Doctor Sleep)
18. Клаус (Klaus) (мультфильм)
19. Паразиты (Gisaengchung)
20. Арахисовый сокол (The Peanut Butter Falcon)
21. Аладдин (Aladdin)


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

про шипы на инструментах

Мой опыт говорит о том, что на рынке может случиться все что угодно. 
Я давно сделал вывод: шипы случались в прошлом и будут случаться в будущем.
Что я давно уже сделал чтобы не попасть на шипы и не угореть на планках:

👉я не ставлю автоматические стоп-приказы если инструмент не входит в топ-3 ликвидных
👉я не ставлю стопы с исполнением по рыночной цене. Стопы я исполняю всегда по лимитной цене.
👉в остальных случаях я всегда снимаю все стоп-заявки на все клиринги, потому что я знаю, что никто не обязан вставать в стакан с плотными бидами и офферами после переоткрытия рынка
👉я никогда не покупаю с планки, в некоторых случаях я делаю это после расширения планки
👉даже когда я торговал фьючерс S&P500 против основного движения, главная моя задача была — успеть закрыть позу до планки. Я прекрасно сознавал, что если рынок упадет на планку, а я в лонге, убытки могут быть совершенно неконтролируемыми.
👉эти правила работают даже когда рынок спокойный. Когда на дворе кризис и волатильность, актуальность правил возрастает во сто крат.
👉если есть возможность торговать нефть на ICE, я торгую ее там, а не где-то еще, где цена привязана к ICE. Но иногда бывает проще открыть контракт на МБ, осознавая все нюансы.

Когда я торгую на срочном рынке Мосбиржи, я знаю, что все что может произойти, примерно бывало в прошлом. Зная, что было, я не не пускаю теплого по ноге, когда случился очередной спайк, и не бегу к маме схватившись за голову, крича на ходу: «Ну её на*й эту Московскую биржу, ухожу на америку». Если бы на америке было маслом намазано, все были бы уже там. Но я торгую там, где есть есть понятные мне преимущества.

100 секретов торговли на фьючерсном рынке - Ларри Уильямса

Привет коллеги трейдеры!

К вашему вниманию представляю обзор СЕКРЕТОВ торговли на фьючерсном рынке.

Я разделил главные мысли из книги Ларри Уильямса “Секреты торговли на фьючерсном рынке” на 3 ключевые группы: психология, тактика, управление финансами; + ЦИТАТЫ.

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

Так что не стесняйтесь, добавляйте в избранное и пользуйтесь на здоровье!

       1. Психология

 
  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

Взломан код рынка

    • 04 апреля 2020, 12:04
    • |
    • d_d
  • Еще
Секретный индикатор технического анализа перевернёт ваш взгляд на рынок.

В книжках по трейдингу говорилось, что движение цены должно подтверждаться объёмом, но как это вообще понимать ?  

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

На самом деле принцип здесь следующий.
Дно по любому популярному инструменту можно определить так:

Столбик объёма полностью перекрывает тело свечи вместе с верхней тенью за тот же день на сайте stockcharts.com на графике за последний месяц.

Вот эта так называемая 'донная свеча' и обозначает дно. Всё очень просто и буднично. Как и полагается,  для разных инструментов по этому правилу дно будет в разные дни.

ДНО ОПРЕДЕЛЯЕТСЯ С ТОЧНОСТЬЮ ДЕНЬ В ДЕНЬ!

например:

 RSX -  18 марта

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

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




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

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

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

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

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

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

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

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

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

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

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