Избранное трейдера dusheska
Надоело логиниться в квик каждый день по 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();
}
Указание Банка России от 29.04.2015 N 3629-У «О признании лиц квалифицированными инвесторами и порядке ведения реестра лиц, признанных квалифицированными инвесторами» (Зарегистрировано в Минюсте России 28.05.2015 N 37415)
Глава 2. Требования, которым должно соответствовать лицо для признания его квалифицированным инвестором
2.1. Физическое лицо может быть признано квалифицированным инвестором, если оно отвечает любому из следующих требований.
2.1.1. Общая стоимость ценных бумаг, которыми владеет это лицо, и (или) общий размер обязательств из договоров, являющихся производными финансовыми инструментами и заключенных за счет этого лица, рассчитанные в порядке, предусмотренном пунктом 2.4 настоящего Указания, должны составлять не менее 6 миллионов рублей. При расчете указанной общей стоимости (общего размера обязательств) учитываются финансовые инструменты, предусмотренные



Пришло время отчитаться о полученных дивидендах по акциям иностранных компаний и ГДР. Необходимо заплатить налог и сдать налоговую декларацию физических лиц (3-НДФЛ). Сделать это просто. Займет 10-20 минут. Проследуем вместе шаг за шагом.
Поехали:
1. Нам нужен «Отчет о выплате доходов по ценным бумагам иностранных эмитентов». Заказываем у брокера или сразу скачиваем. Например, тинькофф предоставляет данную справку автоматически.
2. Открываем личный кабинет налогоплательщика вот ссылка
from websocket import create_connection
import json
import random
import string
import re
import pandas as pd
import csv
from datetime import datetime
from time import sleep
def filter_raw_message(text):
try:
found = re.search('"m":"(.+?)",', text).group(1)
found2 = re.search('"p":(.+?"}"])}', text).group(1)
print(found)
print(found2)
return found1, found2
except AttributeError:
print("error")
def generateSession():
stringLength=12
letters = string.ascii_lowercase
random_string= ''.join(random.choice(letters) for i in range(stringLength))
return "qs_" +random_string
def generateChartSession():
stringLength=12
letters = string.ascii_lowercase
random_string= ''.join(random.choice(letters) for i in range(stringLength))
return "cs_" +random_string
def prependHeader(st):
return "~m~" + str(len(st)) + "~m~" + st
def constructMessage(func, paramList):
#json_mylist = json.dumps(mylist, separators=(',', ':'))
return json.dumps({
"m":func,
"p":paramList
}, separators=(',', ':'))
def createMessage(func, paramList):
return prependHeader(constructMessage(func, paramList))
def sendRawMessage(ws, message):
ws.send(prependHeader(message))
def sendMessage(ws, func, args):
ws.send(createMessage(func, args))
def generate_csv(a):
out= re.search('"s":\[(.+?)\}\]', a).group(1)
x=out.split(',{\"')
with open('data_file.csv', mode='w', newline='') as data_file:
employee_writer = csv.writer(data_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
employee_writer.writerow(['index', 'date', 'open', 'high', 'low', 'close', 'volume'])
for xi in x:
xi= re.split('\[|:|,|\]', xi)
print(xi)
ind= int(xi[1])
ts= datetime.fromtimestamp(float(xi[4])).strftime("%Y/%m/%d, %H:%M:%S")
employee_writer.writerow([ind, ts, float(xi[5]), float(xi[6]), float(xi[7]), float(xi[8]), float(xi[9])])
# Initialize the headers needed for the websocket connection
headers = json.dumps({
# 'Connection': 'upgrade',
# 'Host': 'data.tradingview.com',
'Origin': 'https://data.tradingview.com'
# 'Cache-Control': 'no-cache',
# 'Upgrade': 'websocket',
# 'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits',
# 'Sec-WebSocket-Key': '2C08Ri6FwFQw2p4198F/TA==',
# 'Sec-WebSocket-Version': '13',
# 'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Edg/83.0.478.56',
# 'Pragma': 'no-cache',
# 'Upgrade': 'websocket'
})
# Then create a connection to the tunnel
ws = create_connection(
'wss://data.tradingview.com/socket.io/websocket',headers=headers)
session= generateSession()
print("session generated {}".format(session))
chart_session= generateChartSession()
print("chart_session generated {}".format(chart_session))
# Then send a message through the tunnel
sendMessage(ws, "set_auth_token", ["unauthorized_user_token"])
sendMessage(ws, "chart_create_session", [chart_session, ""])
sendMessage(ws, "quote_create_session", [session])
sendMessage(ws,"quote_set_fields", [session,"ch","chp","current_session","description","local_description","language","exchange","fractional","is_tradable","lp","lp_time","minmov","minmove2","original_name","pricescale","pro_name","short_name","type","update_mode","volume","currency_code","rchp","rtc"])
sendMessage(ws, "quote_add_symbols",[session, "BINANCE:BTCUSDT", {"flags":['force_permission']}])
sendMessage(ws, "resolve_symbol", [chart_session, "symbol_1","={\"symbol\":\"BINANCE:BTCUSDT\",\"adjustment\":\"splits\"}"])
sendMessage(ws, "create_series", [chart_session,"s1","s1","symbol_1","1",300])
sendMessage(ws, "quote_fast_symbols", [session,"BINANCE:BTCUSDT"])
sendMessage(ws, "create_study", [chart_session,"st1","st1","s1","Volume@tv-basicstudies-118",{"length":20,"col_prev_close":"false"}])
sendMessage(ws, "quote_hibernate_all", [session])
#st='~m~140~m~{"m":"resolve_symbol","p":}'
#p1, p2 = filter_raw_message(st)
#sendMessage(ws, "resolve_symbol", [chart_session,"symbol_1","={\"symbol\":\"BINANCE:BTCUSDT\",\"adjustment\":\"splits\",\"session\":\"extended\"}"])
#sendMessage(ws, "create_series", [chart_session, "s1", "s1", "symbol_1", "1", 2])
#sendMessage(ws, "create_study", [chart_session,"st4","st1","s1","ESD@tv-scripting-101!",{"text":"BNEhyMp2zcJFvntl+CdKjA==_DkJH8pNTUOoUT2BnMT6NHSuLIuKni9D9SDMm1UOm/vLtzAhPVypsvWlzDDenSfeyoFHLhX7G61HDlNHwqt/czTEwncKBDNi1b3fj26V54CkMKtrI21tXW7OQD/OSYxxd6SzPtFwiCVAoPbF2Y1lBIg/YE9nGDkr6jeDdPwF0d2bC+yN8lhBm03WYMOyrr6wFST+P/38BoSeZvMXI1Xfw84rnntV9+MDVxV8L19OE/0K/NBRvYpxgWMGCqH79/sHMrCsF6uOpIIgF8bEVQFGBKDSxbNa0nc+npqK5vPdHwvQuy5XuMnGIqsjR4sIMml2lJGi/XqzfU/L9Wj9xfuNNB2ty5PhxgzWiJU1Z1JTzsDsth2PyP29q8a91MQrmpZ9GwHnJdLjbzUv3vbOm9R4/u9K2lwhcBrqrLsj/VfVWMSBP","pineId":"TV_SPLITS","pineVersion":"8.0"}])
# Printing all the result
a=""
while True:
try:
sleep(1)
result = ws.recv()
pattern = re.compile("~m~\d+~m~~h~\d+$")
if pattern.match(result):
ws.recv()
ws.send(result)
print("\n\n\n hhhhhhhhhhhhhhhhhhhhhh "+ str(result) + "\n\n")
print(result)
a=a+result+"\n"
except Exception as e:
print(e)
break
generate_csv(a)'https://github.com/rushic24/tradingview-scraper'Налоги — штука полезная для общества, но коварная для несведущего инвестора.
Случаются такие парадоксальные ситуации. Инвестору вдруг понадобились деньги. Решил их вывести с брокерского счета, благо торгует успешно, есть прибыль. Но ожидая вывести одну сумму, получает намного меньшую. Вплоть до того, что она будет стремиться к нулю. Инвестору кажется, что налог съел всю прибыль. Как же так?
Все дело в расчетах налога при выводе денежных средств с брокерского счета.
Когда вы снимаете деньги со своего брокерского счета, брокер рассчитывает ваш финансовый результат и удерживает налог, который потом перечисляет в бюджет.
Если сумма налога от финансового результата по сравнению с суммой вывода:
Не понятно? Давайте на примерах.
1️⃣ Допустим, инвестору приспичило вывести 100 000 рублей с брокерского счета. Весь год он успешно торговал. Прибыль по сумме всех операций составила 700 000 рублей. Тогда при выводе средств будет начислен налог (13%) — 91 000 рублей. В итоге инвестору капнет на счет всего 9 000 рублей 😳.