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

по

Скрипт 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




Утвержден Перечень из 646, которых будут спасать.

    • 02 апреля 2020, 01:57
    • |
    • nevil
  • Еще

Утвержден Перечень из 646 системообразующих организаций, которых будут спасать.

Из того, что опубликовано, в него вошли:

12  ПАО «НОВАТЭК»
16  ПАО «Газпром нефть»
17  ПАО «Газпром»
18  ПАО «ЛУКОЙЛ»
19  ПАО «Нефтяная компания „Роснефть“
20  ПАО „Сургутнефтегаз“
21  ПАО „Татнефть“ имени В.Д.Шашина
38  ПАО „Мечел“
45  АО „Московская областная энергосетевая компания“
62  ПАО „Интер Рао“
63  ПАО „Квадра-генерирующая компания“
64  ПАО „Россети“
65  ПАО „Русгидро“
67  ПАО „ТГК-14“
68  ПАО „Территориальная генерирующая компания №2“
69  ПАО „Энел Россия“
70  ПАО „Юнипро“
72  ПАО „Транснефть“
94  ПАО „Трансконтейнер“
100  ПАО „Авиакомпания “ЮТэйр»
102  ПАО «Аэрофлот»
130  ПАО «Новороссийский морской торговый порт»                                                                             

 PS
Банки и страховые спасает ЦБ


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

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

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

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

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

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

Волатильность: подходы к подсчётам, ответы на вопросы, заданные в личку

    • 30 марта 2020, 10:09
    • |
    • tashik
  • Еще
В связи с тем, что в личку приходит много вопросов о том, с чем же едят все эти разные волатильности, про которые упоминал Старый Бес в наших разговорах, решила немножко пояснить в меру своего понимания и применения. Товарищи мэтры и мастера, Ваши комментарии и поправки будут для меня очень ценны. Я новичок-практик, граблями учиться больно. Товарищи новички, читайте не только пост, но и обязательно комментарии, там может оказаться самый сок.

Приступим.

Когда говорят о волатильности рынка, обычно имеют в виду размах колебательных движений цены актива, выражаемый через процент СКО распределения плотности вероятностей (см. рисунок)

Волатильность: подходы к подсчётам, ответы на вопросы, заданные в личку


Подсчет волатильности — это дело довольно примерное. Правильнее было бы назвать его оценка. В чем разница? В том, что при оценке мы получаем некий уровень, некий «highly-likely» диапазон, и можем на основании его строить предположения и сравнивать, а при подсчёте мы думаем, что показатель вычислим с какой-то точностью.

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

Бэнкинг по-русски: Питерский пылесос - до 8% годовых..


Если вы позабыли про вклады  со «сладкими процентами» и соскучились по встречам с АСВ, велкам:
Бэнкинг по-русски: Питерский пылесос - до 8% годовых..

Самое забавное в этом, на дворе 2020 год, что банк делает с Вашими вкладами ???
Раздает ими необеспеченные кредиты юрлицам резидентам и нерезидентам...
Бэнкинг по-русски: Питерский пылесос - до 8% годовых..

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

Уроки кризиса 2020

Это мой первый кризис в рынке, так что не судите строго, если рассуждения покажутся наивными. А лучше подскажите по-существу в чем ошибаюсь или что можно дополнить.
1. Золото не защитный актив.
Оно падало с рынком в 2018, 2020. Как пишут знающие люди золото является товаром, падает вместе с рынком, но быстрее восстанавливается. Кроме того, неправильный заход в золото как в 2011-2012 может заморозить ваш капитал на десятилетие!
2. Облигации РФ (в тч евро) не защитный актив.
Было неприятно узнать на своем счете, что такие облигации тоже падают. Интересно какой срок восстановления еврооблигаций к цене 110% от номинала? Выходит облигации могут заморозить капитал взамен на небольшую доходность. Увидел и плюс: имеется задержка в падении облигаций после рынка и есть время для выхода, порезав прибыль.
3. Дивидендные акции не защитный актив.
Оказывается идея «пересидеть в дивидендах» может закончится тем, что акция сложится еще в 2 раза, а дивиденды отменят. Вообще дивидендные акции выглядят как-то слабовато в сравнении с акциями роста. Рассчитываем получить ~10% годовых против >30% роста на бычьем рынке. А можем получить падение больше акций роста на медвежьем рынке.
4. Казначейские облигации США похожи на защитный актив.
Но видимо как и с золотом надо определять макроэкономическую точку входа, чтобы не попасть на циклическое снижение. Кроме того, доходность на графиках облигаций США не впечатляет.
5. Рынок РФ как хвост мировой экономики виляет вслед за собакой. А рубль — талон на нефть.
Вообщем я знал, что экономика РФ сырьевая. Просто кризис 2020 это наглядно опять показал. Курс рубля с 2016 по 2019 создавал иллюзию стабильности, т.к. рубль впервые укрепился и ходил в боковике. На самом деле, думаю курс рубля изначально не рыночный, поэтому у ЦБ есть зазор, чтобы двигать курс по определенному диапазону в чьих-то интересах.
6. Долгосрочный инвестор отличается от внутридневного спекулянта лишь временем удержания позиции. 
Действительно, какой смысл не продавать акции при окончании бычьего рынка? Тогда прибыль останется бумажной, кроме того её можно потерять в кризис. Лучшие биржевики продают наверху, а покупают на дне. Среднесрочные и краткосрочные биржевики, по-сути, делают тоже самое только внутри своих диапазонов (месяцы, дни и т.п.). Заниматься вероятно надо тем, что у вас лучше получается. Кроме того, не уверен, что дневная торговля руками актуальна, в наше время торговых роботов. Наиболее комфортна вероятно долгосрочная торговля, т.к. занимает меньше времени.
7. Психологию рынка нужно учитывать.
Видел как плохие по фундаменталу акции высоко отскакивали, просто потому, что были слишком перепроданы по мнению «толпы». Также как и хорошие акции чрезмерно падали на плохих новостях.
8.Совет всех времён не играть против тренда и ставить стопы — 100% работает. Проверено на себе. НО этот совет, по-сути, помогает ограничить убытки и НЕ помогает забрать деньги! Ведь окончание тренда — это подбор крох с барского стола!
9. Наторговать большие деньги можно против тренда (вернее при признаках разворота, когда новый тренд еще не известен, а ситуация неочевидна). 
Я своими глазами видел по отрывкам информации на телеграмм-каналах, ютуб каналах и т.п. (осознавал это потом) как лучшие биржевики продавали акции наверху роста, как присоединялись к шортам в начале падения, как покупали акции на локальном дне. Как они это делали я не знаю.
10. Непрофессионалам на биржевом рынке делать нечего.
Из пунктов 8-9 вытекает, что добиться настоящего успеха можно будучи профессионалом. Т.е. человеком, профессия которого — торговля на бирже. Во всяком случае на моём уровне, вероятно эффективнее покупать услуги проффессиональных управляющих, чем заниматься этим самому. Есть также мнение, что личные финансы нельзя доверять никому. Что думаете?


5 индикаторов, которые помогут определить максимумы и минимумы рынка

Рассказываю о полезных инструментах, которые используют долгосрочные инвесторы. Эти инструменты дают дополнительную информацию и помогают прогнозировать рынок.

5 индикаторов, которые помогут определить максимумы и минимумы рынка

Purchasing Managers' Index (PMI)

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

Затем формируется «индекс оптимизма». Если большинство менеджеров считают, что все хорошо, и экономика улучшается, то индекс растет. Если они говорят, что все плохо, то индекс падает. При этом обычно формируются два индекса — один для сферы промышленности (основной), а другой — для сферы услуг (дополнительный).

Нейтральное значение индекса составляет 50 пунктов. Значения выше говорят о росте деловой активности. Значения ниже предупреждают о падении. Если индекс опускается ниже 40 пунктов, то наступает рецессия.

5 индикаторов, которые помогут определить максимумы и минимумы рынка

PMI опережает максимумы и минимумы деловой активности на 2-6 месяцев. Рыночные экстремумы он опережает не всегда, но тоже часто. В целом, PMI хорошо подходит, чтобы прогнозировать окончания крупных кризисов и рецессий.

Индикатор удобно смотреть на площадке TradingView. Для этого нужно:



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

Интеграция MatLab Engine и С++ (1)

В сложных вычислительных задачах (или просто при нежелании программировать на Lua, Cpp и т.д., а пользоваться более высокоуровневыми инструментами разработки), незаменимым оказывается API интерфейс Матлаба реализованный в качестве Active-X COM Automation Server.  Для его реализации на языке Си существует специальная библиотека libeng.lib, позволяющая языкам Си, С++, Фортран обмениваться данными и пользоваться всеми ресурсами Матлаба (обычно это обработка видео, автопилоты, ИИ, нейронные сети и т.п.).


Поэтому, в качестве изучения возможностей, попробуем реализовать простейший проект обмена данными и вызова функций Матлаб со стороны Си++ при использовании CodeBlocks и MinGW64.



  • Запуск интерфейса Матлаб

Чтобы адресовать все внешние процессы к единому процессу Матлаб, а не запускать Engine для каждого процесса в отдельности, 
запустим «двигатель» матлаба внутренней командой :

server=actxserver('matlab.application.single'); server.Execute(' enableservice (''AutomationServer'', true)');


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

Алготрейдинг, Quik и Visual Studio 2017.

    • 24 марта 2020, 14:04
    • |
    • 3Qu
  • Еще
Делаю новую алгоритмическую торговую систему (АТС) под Quik. Базовой в системе является достаточно сложная многопоточная C++ DLL, связывающаяся с Quik через Lua. Для разработки с самого начала использовалась VS 2015. Т.к. в настоящее время перешел на х64 Quik занялся перекомпиляций всего своего х86 софта под Quik на платформу х64.
Все бы ничего, но при больших рыночных потоках данных Quik начинал подтормаживать, а при подключении DDL, Quik подтормаживал еще сильнее и через некоторое время падал вместе с DLL. Переход на х64 существенно улучшил ситуацию, Однако эпизодические падения, значительно реже, но продолжались.
Надо сказать, что все эти многопоточности и были ранее введены в DLL для снижения нагрузки на Quik, чтобы не грузить поток событий терминала. Вся обработка событий заключалась лишь в том, чтобы преобразовать данные получаемые из Lua и отдать их соответствующему потоку для дальнейшей обработки.
В общем, о стабильной АТС приходилось только мечтать, и думать что дальше с этим делать.
У меня на компе давно без дела пылилась Visual Studio 2017. Требований к железу она предъявляет больше чем VS 2015, и я ее использовал считанные разы, скорее, чтобы посмотреть что в ней нового и отличия от VS 2015. Существенных отличий не заметил, и продолжал работать на старой VS 2015.

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

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