Избранное трейдера astray
Как все помнят, Московская биржа, не отменила сделки трейдеров по фьючерсу на нефть, когда провела экпирацию по отрицательным ценам. Эта история довольно остро была воспринята Алексеем(https://smart-lab.ru/profile/Tyam/). Каждый день одно и тоже. Конкуренции нет. Биржа зажралась. Комиссии поднимают. Сушат ликвидность. Ядро написано в 1993 году. Обороты падают. Торговать нечего. Народ скамят. Это не рыночная история.
Наш алгоритмический портфель данная история не затронула (мы за несколько дней до экспирации текущего контракта переходим на новый), но для диверсификации нашей торговли было принято совместное решение проработать дополнительные направления где также эффективно можно было бы применять наши знания в области алготрейдинга.
В итоге, решили сформировать тестовый алгоритмический портфель для криптовалютных бирж.
Примерно три недели назад я приступил к формированию тестового портфеля.
Что из этого вышло рассмотрим в данной статье.
Вместо тысячи слов
В этом году у меня своеобразный юбилей — 10 лет назад придумал и запустил первый портфель торговых роботов. Как вспомню те времена аж ностальгическая слеза наворачивается… Под роботов купил с рук отдельный компьютер, поставил в чулан, установил на него teamviewer для контроля с работы. Тогда в ЖЖ можно было почерпнуть много информации по алготрейдингу, тема была «на волне», много энтузиастов любителей писали интересные статьи с идеями и практически готовыми стратегиями. Что-то с тех времен даже до сих пор работает.. На моем веку с 2010 было как минимум 4 года, когда можно было удвоить депозит (2011, 2014, 2015, 2018) и это не считая текущего. Были и неудачные года с серьезной просадкой, сильно давившие на психику. Отключал торговлю я только раз на месяц в марте 2013, так сказать на пике своего эмоционального разочарования в алготрейдинге (хорошо потом переработав портфель и поразмыслив, перезапустил все обратно, следующий год «девальвации» и «Крыма» с лихвой отбил все предыдущие потери). Но не об этом. Решил я кратко и тезисно изложить проблемы, с которыми пришлось мне столкнуться за годы активного алготрейдинга.
В этот слаболиквидный день прослушал свежее видео с участием, одного из уважаемых мной трейдера — Алексея Мартьянова (My Trade). Видео заняло 2 ч. 33 м. моего драгоценного времени… самое главное зарядился позитивными эмоциями от смеха Май Трейда :DDD
Трейдеры Capital Market Diversification:
— Рынок создан, чтобы забирать деньги. Чтобы забирать с него деньги.
— Объемы это такая вещь… много вопросов, кто его нарисовал в этой платформе.
— Для входа нужно изучать не точку, а диапазон.
— Конечно объем, это как пенек под жопой, но меня интересует больше объем в скорости, в инициативе.
— Думать по паттернам — страшное зло. Нужно в моменте понимать что тут кого-то обманывают. И нужно входить с этими умными ребятами, именно там где страшно заходить.
Вчерашнее падение фьючерсов на американскую нефти до минусовых значений – событие, которое в том или ином виде однажды обязательно должно было произойти. Разгон экономик и компенсация их потерь масштабными монетарными стимулами приводит не только и не столько к экономическим успехам. В первую очередь оно создает финансовые пузыри. Пузырь последних лет оказался беспрецедентным и по величине, и по влиянию на ценообразование глобальных активов. Это пузырь – спекулятивный капитал.
Биржи окончательно превратились в площадки для сделок пари: один выиграл, один проиграл. Хеджирование стало наиболее рискованной разновидностью спекуляций. Само понятие хедж-фонд вполне извращенно предлагает заработать на использование инструментов финансовой страховки. Инвестиционная компания – это уже давно разновидность букмекерской конторы или интеллектуального казино.
Спекулятивная индустрия существовала и до 21 века, но с конца нулевых стала угрожающе увеличиваться. Как раз за счет монетарных вливаний. Которые, в большинстве, так и не дошли до реального потребителя, оставшись циркулировать в сделках спекулятивного толка.
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