В ОБ я квал и большинство рублёвых облигаций там, но всё же в ВТБ тоже что-то иногда покупаю, так что квал не помешает. Пришёл в ВТБ, сказали, что нужна выписка из депозитария, не старее, чем 3 дня. Ок, сделал в ОБ, привёз. Говорят надо, чтобы дата была либо сегодня, либо вчера, про 3 дня неправильно. И ещё, в выписке только Фио и № счёта, паспортных данных нет, пусть добавят.
Попытка №2. Получаю ещё 1 выписку. Вообще в ОБ не так просто получить свежую выписку, в лучшем случае это будет сегодня вечером за вчера. Так что остаётся только вечер, успеть сложно, но можно. Ок, мне в ОБ даже подсказали подъехать в их специальный офис на Курской, там я взял выписку, а через речку ВТБ, так что я успел за 15 минут до 19 часов : ).
Поговорили, оказалось, что это не подходит, т.к. в выписке слишком много позиций, сложно всё посчитать. С этим спорить сложно, надо было мне сделать не все позиции, а только 4 главные. Зато выяснилось, что бумажку можно не получать, достаточно скана – а ОБ скан тоже присылает. Сотрудница (Эльвира, чей-то отзыв) очень доброжелательная, дала свою визитку.
//WhiteHosts='moex.com cbr.ru banki.ru youtube.com vk.com facebook.com'; function FixLinksMD(e){ var o=e.srcElement; if (o.tagName!='A' || o.pathname!='/r.php') return; var pos1, pos2, s=o.search, href, M, dmn; pos1=s.indexOf('u='); if (pos1==-1) return; pos1+=2; pos2=s.lastIndexOf('&s='); if (pos2==-1) pos2=s.length; href=decodeURIComponent(s.substring(pos1, pos2)); if (window.WhiteHosts){ M=href.match('https?://([^/]+)'); if (M){ dmn=M[1]; if (dmn.substr(0, 4)=='www.') dmn=dmn.substr(4); if (!WhiteHosts.match("\\b"+dmn+"\\b")) return; } } o.href=decodeURIComponent(href); } document.body.addEventListener('mousedown', FixLinksMD, false);
Надоело логиниться в квик каждый день по 10 раз, всё время за логином-паролем лазить в файл и копипастить. Сделал скрипт, к-й это автоматизирует. Работает на javascript, так что от версии Windows зависеть не должно.
Сам скрипт кладётся в файл типа C:\Util\Js\Q.js или куда угодно, только не у всех на виду. На этот скрипт делается ярлык, он кладётся на рабочий стол куда-то в угол, и ему прописывается горячая клавиша типа Ctrl-Alt-X или любая другая буква. После этого вы запускаете квик, появляется окно логина, нажимаете Ctrl-Alt-X и через полсекунды оно срабатывает. Важно, что ярлык должен быть на рабочем столе, иначе горячая клавиша не работает.
Вообще вводить данные в другую программу можно двумя способами: copy&paste и эмуляция клавиш. Я в данном случае пошёл по второму пути, хотя и первый тоже реализуем и даже чем-то лучше, т.к. там не надо парится с языком. Из-за этого, если вы хотите использовать этот скрипт, нужно проверить ряд моментов и при необходимости внести исправления.
⦁ В варианте, к-й я выкладываю, логин/пароль должны быть прописаны прямо в скрипте, но можно и читать из файла. У меня дома рабочий вариант вообще ищет их в rtf-файле где много всяких данных. Если логин/пароль положить во внешний файл, то их можно конечно и закодировать.
⦁ Чтобы отработало правильно, надо чтобы текущий язык ввода (по сути язык ввода по умолчанию в системе) в квике был русский. Если это не так, то вначале надо поменять bEngSystem=true
⦁ У меня логин русский, а пароль английский, так что между ними производится переключение клавиатуры. Если у вас что угодно из этого не так, надо в нужных местах убрать или добавить переменную LangSwitch, к-я содержит клавиши «Alt-Shift». Если у вас опять же язык переключается по-другому, там надо прописать другие клавиши.
⦁ У меня вводится и логин и пароль. Если у вас вводится только пароль, то поменять тоже нужно и не сложно.
В общем, можно было бы написать более универсальную версию, чтобы определяеть, когда надо переключать языки автоматом, но мне не нужно, а кому надо разберутся. Или же можно переписать через copy&paste. Делать полностью автоматизированный логин, когда вообще ничего нажимать не нужно я не хочу, потому что тогда любой, кто получит доступ к вашему компьютеру сможет получить доступ и к вашим деньгам, просто кликнув на квике. Так хоть комбинацию клавиш знать надо.
bEngSystem=false; //язык системы по умолчанию LangSwitch="%+!"; WshShell=WScript.CreateObject("WScript.Shell"); InitKeys(); KeysSeq=GetData(); if (KeysSeq) EnterData(KeysSeq); //------------------------------------------------------------------------ function GetData(){ //(Возможно) читаем данные из файла и преобразуем в последовательность клавиш //"!" означает паузу для специальных клавиш, к-е требуют время обработки var DataFN, oStream, Data, Pos1, Pos2, Line; if (0){ //данные в файле DataFN='C:/...'; FSO=new ActiveXObject("Scripting.FileSystemObject"); oStream=FSO.OpenTextFile(DataFN, 1); Line=oStream.ReadAll(); oStream.Close(); } else Line='имя:password'; //Tab должен быть и вначале, потому что при фокусировке квика текущее поле - список серверов Line="{Tab}!"+Line.replace(/:/g, "{Tab}!"+LangSwitch); //Переключение языка в самом начале если логин русский if (bEngSystem) Line=LangSwitch+Line; //конвертация русских символов Line=Line.replace(/[А-Яа-я]/g, RusCB); return Line; } function EnterData(KeysSeq){ var ret; WScript.Sleep(300); //Пауза позволяет убрать руки от клавиатуры до того, как скрипт начал работать ret=WshShell.AppActivate("Идентификация пользователя"); if (ret==0) return; WScript.Sleep(100); aSeq=KeysSeq.split('!'); for(var i=0; i<aSeq.length; i++){ Seq=aSeq[i]; if (Seq!=''){ WshShell.SendKeys(Seq); WScript.Sleep(100); } } WshShell.SendKeys("{Enter}"); //WshShell.SendKeys("%+"); WScript.Sleep(100); //switch to Russian //WshShell.SendKeys("{Tab}"); WScript.Sleep(100); //WshShell.SendKeys("^V"); WScript.Sleep(100); //paste } function RusCB(s){ var n, ch, i; if (s.length==1){ ch=s; } else{ //rtf //код символа в Ansi s=s.substr(2); n=parseInt(s, 16); ch=String.fromCharCode(n); } //Преобразовать в Utf и найти в русских клавишах i=RusKeys.indexOf(Ansi2Utf(ch)); //Найти соотв. латинскую клавишу return LatKeys.charAt(i); } //------------------------------------------------------------------------ function Ansi2UtfN(Code){ if (Code>=192 && Code<=255) Code+=848; else if (Code==168) Code=1025; else if (Code==184) Code=1105; return String.fromCharCode(Code); } function Utf2AnsiN(Code){ if (Code>=1040 && Code<=1103) Code-=848; else if (Code==1025) Code=168; else if (Code==1105) Code=184; return String.fromCharCode(Code); } function Ansi2Utf(Str, bRev){ var Buf='', Ch, Res='', c=0, L, n, f; L=Str.length; f=(!bRev ? Ansi2UtfN : Utf2AnsiN); for(n=0; n<L; n++){ Ch=Str.charCodeAt(n); Buf+=f(Ch); c++; if (c>=100){Res+=Buf; Buf=''; c=0;} } return Res+Buf; } //------------------------------------------------------------------------ function alert(S){WScript.Echo(S);} function InitKeys(){ //Проблема в том, что влияет текущий язык в той программе! //Можно нажимать только английские клавиши. Если надо нажимать русские, надо вычислить какие им соответствуют английские RusKeys="йцукенгшщзхъфывапролджэячсмитьбю"; LatKeys="qwertyuiop[]asdfghjkl;'zxcvbnm,."; RusKeys=RusKeys+RusKeys.toUpperCase(); LatKeys=LatKeys+LatKeys.toUpperCase(); }
Есть неочевидный аспект, вызванный валютной переоценкой. Не знаю, как у других, но у меня было ложное впечатление, что если ты держишь бумаги 3 года, ЛДВ спасает и от прибыли от разницы цен погашения и покупки, и от валютной переоценки. И тогда доходность к погашению с учётом налога можно грубо посчитать как TaxYtm=Ytm*0,87 (Ytm — просто доходность к погашению). Это так потому, что налогом облагаются купоны, и это работает для рублёвых облигаций, а также для государственных еврооблигаций.
Но если цена облигации выше 100%, а таких большинство, то при погашении возникает убыток, к-й может сальдироваться с другой прибылью и тем самым косвенно повышать доходность. Этот убыток при погашении является важной частью итоговой доходности. Из-за того, что он вступает в силу позже, итоговая доходность всё же несколько снижается, но не существенно. Однако, в зависимости от цены/срока до погашения конкретной бумаги, валютная переоценка за счёт увеличения финреза в рублях может частично или полностью отменять его эффект, т.о., негативно влияя на доходность с учётом налога. Важно, что это увеличение финреза не контролируется ЛДВ, т.к. общий финрез остается отрицательным, а ЛДВ применимо только к положительному.
Да не обидится на меня брокер, ведь в конце концов мне всё выплатили и даже немного компенсировали их косяки, но мне хочется поделиться опытом.
Итак, с 15.08.2018 у них появилась возможность покупать сабж. Косяки начались сразу: со всех, у кого были Rus-28 (и кажется Единый брокерский счёт) начали брать комиссию «Предоставление информации по риск-поддержке открытой позиции», с меня лично около 2200р в день. Эта комиссия относится к СР, на к-м я ничего не делал и, если посчитать через 20%, то получалось, что у меня была нехватка ГО в районе 6 лимонов. Глюк начался с четверга 16.08, в пятницу я про него сообщил, а в Пн 20.08 его исправили и все деньги вернули, но за те выходные я изучил тарифы и регламент намного лучше, чем до этого, а ночью мне плохо спалось. Казалось, что они так и будут списывать у меня эту комиссию и так все деньги и спишут. 2-й раз этот глюк вылез уже в конце октября, предположительно при обновлении системы из-за исправления другого глюка, но исправили в тот же день.
Давно хотел понять, что такое доходность к погашению, но всё никак руки не доходили. Одно дело, когда тебе квик/сайт ММВБ показывает какое-то число, типа 5.25%, и вроде оно и должно быть правильным, но что за этим стоит? И что это означает на практике? В инете есть сложные формулы доходности, и (если сможешь разобраться) они вроде считают приблизительно то же самое, но, опять же, почему они именно такие, как они получены? Хочется, чтобы этот процент, какой бы он ни был, можно было напрямую сравнивать со ставками банковских вкладов, потому что это просто и понятно.
Зачем нужно уметь считать доходность самому?
Сразу скажу, что самый простой способ посчитать доходность – это использовать функцию ДОХОД в Excel. Для примера я буду использовать еврооблигацию GAZPR-34 на 10.01.18 с ценой 137.5 и НКД 17,7292. В данном случае ф-я ДОХОД получает 4,284% (тут учитывается налог), но при этом она требует очень мало параметров: