Избранное трейдера Holod_Dmitry
Приветствуем.
Работая с программой TSLab, иногда, а иногда часто), возникают пожелания, в виде необходимости новых блоков, которые в составе софта отсутствуют. Многие сложности, на самом деле решаемы имеющимся функционалом, хотя иногда конечно не обойтись без программирования.
В комментариях к предыдущей статье, попросили добавить блок — месяц года. Просто взять и добавить блок — чаще всего это цикл через 6 рук пройдет от тикета с требованием к реализации, далее принятие решение о срочности и тд и тп. не суть важна в бюрократии, а в том что сделать можно все своими руками!
Итак начнем. В тслаб имеется блок — дата, который транслирует дату в формате ггммдд, его и будем использовать чтобы получить месяцы.
Первый и самый важный шаг — вывести блок дата на график, чтобы узнать о формате, так как в разных блоках могут быть разные вариации написания.
Следующий шаг — построить логику в голове, каким образом достать месяц из данного варианта формата. Прежде всего не воспринимаем это как дату, а принимаем ее за обычную цифру. 161122. Чтобы добраться до месяцев — мне нужно прежде всего исключить год.
Открытие позиции на откате в рамках текущего тренда потенциально может повысить эффективность торговой системы. На прошедшей неделе ТС «Прокон» на «Полигоне для новичка» несколько раз открывала такую позицию и каждый раз неудачно. Ошибался ли алгоритм этой ТС или все было сделано верно?
В данном видео я разбираю эти случаи, высказываю свои «За» и «Против» подобного открытия позиций на откате.
Про то, что такое «Полигон для новичка», можно узнать здесь smart-lab.ru/blog/360646.php
П.С. На всякий случай, моя книга «Восемь правил выживания на рынке акций», см. здесь author.today/work/104250
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'
Построен практический пример на акциях Apple (AAPL)slingshot [ˈslɪŋʃɒt] — (сущ.) рогатка
Если большинство на рынке ведет себя иррационально, то рациональная стратегия – принимать это как данность, не спорить, использовать в своих интересах. Например, если считаешь, что участие в некоем пузыре имеет для тебя положительное ожидание (например, есть основания полагать, что ты выйдешь из него правильно) – надо участвовать. Нет таких оснований – не участвовать. А не априорное правило, что «пузыри зло». Важно не это, а можно ли использовать сие зло во благо?
Между тем куча людей предпочитает сначала в своем уме довести это большинство до ума, и подстраиваться под это. Но это не рациональность, это упоротость и упрямство. Но это какие-то глубинные штуки, лежащие в природе людей. Меня всегда поражали, например, шортисты «Теслы». Терять деньги и продолжать считать себя умнее всех.
Отсюда, кстати, следует, почему моментум-стратегии и алго мне симпатичнее, чем «портфели по мультипликаторам». Портфели по мульти-пульти подразумевают, что все игроки вокруг рациональные. Точнее, что сейчас они почему-то временно иррациональные, но через год почему-то поумнеют. И правильные активы вырастут, неправильные – упадут, крипта вообще исчезнет с лица земли, и те, кто поумнел на год раньше, получат свои плюшки за прозорливость.
Но как говорится, рынки могут оставаться иррациональными дольше, чем вы платежеспособными. И алго вообще (и моментум-портфели в частности как их медленный и скучный вариант) отражают эту особенность. Эти штуки как бы заранее закладываются на любую человеческую глупость. Она нас не опрокинет. Зарабатывать мы, вероятно, будем как на массовом опьянении, так и на массовом отрезвлении, важно, чтобы рынок куда-то двигался.
А ставка на «все станут как умные» — отчаянное дело. Не станут ведь.
Ну что ж, на наших глазах зарождается легенда в цифровом пространстве — место, где нет околорыночников и трейдеры могут обсудить насущные проблемы.
Там собрались лучшие специалисты по хеджированию, у них самый широкий кругозор и, общаясь в этом чате, на выходе получаем уникальную информацию о том, как устроен этот мир.
Сейчас идёт громадный наплыв новичков, от которых толку мало, поэтому пока мы открыты для всех, но в будущем так будет не всегда.
С ребятами и девчатами создали даже свой собственный бренд на этих выходных:
Также на выходных обсудили очень интересный вопрос, который хотелось бы вылить в статью и подвести финальную черту.
Сначала несколько вводных:
1. Мы знаем, что на Америке торгуются акции и опционы на акции;
2. Мы знаем, что на Мосбирже торгуются акции на фондовой секции, фьючерсы на акции и опционы на фьючерсы на акции.
Как хеджируются американцы?
--[[ MA volumn up down --]] Settings= { Name = "MAV2", -- indicator name per=10, -- period line= { { Name = "MA", Type =TYPE_LINE, Width = 1, Color = RGB(0,0,255) }, { Name = "MA2", Type =TYPE_LINE, Width = 1, Color = RGB(255,0,0) } } } function Init() mav1 = {} mav2 = {} return 2 end function OnCalculate(index) per = Settings.per if index > 1 then curv = C(index) prevv = C(index-1) else curv = C(index) prevv = C(index) end if curv - prevv > 0 then if index > 1 then mav1[index] = mav1[index-1] + V(index) mav2[index] = mav2[index-1] else mav1[index] = V(index) mav2[index] = 0 end else if index > 1 then mav1[index] = mav1[index-1] mav2[index] = mav2[index-1] + V(index) else mav1[index] = 0 mav2[index] = V(index) end end if index > per then vv1 = mav1[index] - mav1[index-per] vv2 = mav2[index] - mav2[index-per] else vv1 = 0 vv2 = 0 end return vv1, vv2 end