Избранное трейдера Алексей Сухомлинов

по

Как я выбираю акции.

Не думаю что этот пост пригодится активным трейдерам. Возможно будет полезно для начинающих.

Итак — задача набирать акции с минимальным риском:
  1. Если акция в индексе это плюс.
  2. Дивиденды должны быть, тогда не так грустно пересиживать просадку, лучше если дивиденды выше банковского депозита и платиться должны постоянно, а не через раз. 
  3. Смотрим (или считаем) P/E, должен быть ниже среднего по рынку и желательно ниже среднего по отрасли.
  4. Смотрим рост прибыли — должен быть стабильным.
  5. Смотрим долги. Долг должен хорошо покрываться прибылью. Если долгов нет, или мало по сравнению с прибылью, или долг сокращается лет пять уже — это плюс.
  6. Смотрим график. Если акция ведёт себя циклически, то желательно чтобы цена в данный момент была в нижней части цикла.
  7. Смотрим на каком уровне большой объем покупок, этот уровень вероятно важен для крупных покупателей, и проваливаться ниже они не дадут скорее всего.
  8. Если акция недавно падала, смотрим на чём. Если это вышел отчёт чуть хуже ожиданий, но в целом хороший — это плюс
  9. Смотрим новостной фон, прогнозы — если благоприятно — это хорошо, в России особенно негативно — ссора компании с государством.
Если есть за что — просьба покритиковать:)

Облигационный портфель программиста

Подвел итоги по своему специальному облигационному счету. Год назад я положил на отдельный брокерский счет 800 000 рублей, где решил торговать только облигациями.
Через год баланс счета стал ровно 1 000 000. Т.е. за год я заработал 25% годовых. Дополнительные средства на счет не вносил, но всю прибыль реинвестировал.
Основные факторы:
1. Заходил в первичных размещениях, продавал на вторичке выше номинала.
2. Несколько раз рисковал, покупая просевшие в цене бумаги (СилМаш лучший из всех)
3. Реинвестирование купонов (появилось много бумаг с ежемесячным купоном, и это очень круто, реально повышает доходность).

В 2018 году появилось реально большое количество малых облигационных займов и если вначале я еще пытался анализировать отчетность, выбирать стоит участвовать или нет, то сейчас у меня сложились другие правила, больше математического, технического характера.

Итак,

1. Участие в первичных размещениях.
Тут обязательно надо смотреть и отчетность эмитента и организаторов (их другие выпуски), т.е. проводить большую ручную работу.



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

скрипт для quik

скрипт для отслеживания бумаг по системе BWS:

--Массив с Тикерами, добавьте нужные тикеры
aTickerList = {"MSNG", "GAZP", "LKOH",
	    "SIBN", "GMKN","ROSN",
	    "SBER", "TATN", "NVTK",
	    "IRAO", "RSTI", "SBERP",
	    "PHOR", "SNGS", "TRNFP",
	    "VTBR", "FEES", "MVID",
	    "RASP", "MFON", "AFLT", 
	    "MAGN", "ALRS", "MTSS", "MOEX",
	    "RTKM", "MGNT", "NLMK", "SNGSP",
	    "CHMF", "MTLR", "HYDR", "MFON",
	    "RSTI", "PLZL", "BANEP", "POLY"
	    };

--Функция поиска цены
function fGetPrice(sTickerName, sNum)
	--Подключаемся к источнику данных
	local ds=CreateDataSource("TQBR", sTickerName, INTERVAL_D1);
	while (Error=="" or Error == nil) and ds:Size() ==0 do sleep(10) end;
	if Error ~="" and Error ~=nil then message("Error: "..Error, 1) end;
	local sSize=ds:Size();
	local sCurrentPrice=ds:O(sSize);
	
	local sLastWeekPrice7=0;
	local sLastWeekPrice14=0;

	--Берем цену закрытия свечи неделю назад
	sLastWeekPrice7=ds:C(sSize-4);
	--Берем цену закрытия свечи 2 недели назад
	sLastWeekPrice14=ds:C(sSize-8);

		--Вычисляем проценты
		local sPrc7=math.floor((100-((sLastWeekPrice7*100)/sCurrentPrice))*100)/100;
		local sPrc14=math.floor((100-((sLastWeekPrice14*100)/sCurrentPrice))*100)/100;

		--Заполняем таблицу значениями
		SetCell(t_id, sNum, 0, tostring(sTickerName));
   		SetCell(t_id, sNum, 1, tostring(sCurrentPrice),sCurrentPrice);
   		SetCell(t_id, sNum, 2, tostring(sLastWeekPrice7),sLastWeekPrice7);
   		SetCell(t_id, sNum, 3, tostring(sLastWeekPrice14),sLastWeekPrice14);
   		SetCell(t_id, sNum, 4, tostring(sPrc7),sPrc7);
		SetCell(t_id, sNum, 5, tostring(sPrc14),sPrc14);

		--Текущая цена больше цены прошлой недели - раскрашиваем зеленым
		if sCurrentPrice>sLastWeekPrice7 then 
			fGreen(sNum);
		end;
		--Текущая цена меньше цены прошлой недели - раскрашиваем красным
		if sCurrentPrice<sLastWeekPrice7 then
			fRed(sNum);
	   	end;
		--Текущая цена больше цены прошлой недели и цена прошлой недели больше цены позапрошлой недели
		--раскрашиваем желтым
		if sCurrentPrice>sLastWeekPrice7 and sLastWeekPrice7>sLastWeekPrice14  then 
			fYellow(sNum);
	   	end;
end;

--- Функция создает таблицу
function CreateTable()
	-- Получает доступный id для создания
	t_id = AllocTable();	
	-- Добавляет 6 колонок
 	AddColumn(t_id, 0, "Тикер", true, QTABLE_INT_TYPE, 15);
 	AddColumn(t_id, 1, "Сегодня", true, QTABLE_INT_TYPE, 15);
 	AddColumn(t_id, 2, "Неделя", true, QTABLE_INT_TYPE, 15);
 	AddColumn(t_id, 3, "2 Недели", true, QTABLE_INT_TYPE, 15);
 	AddColumn(t_id, 4, "Неделя (%)", true, QTABLE_INT_TYPE, 15);
 	AddColumn(t_id, 5, "2 Недели (%)", true, QTABLE_INT_TYPE, 15);
	
	-- Создаем
	t = CreateWindow(t_id);
	-- Даем заголовок	
	SetWindowCaption(t_id, "7 Days");

   -- Добавляем строки
      for k,v in pairs(aTickerList) do
		InsertRow(t_id, k);
      end;
end;

--- Функции раскрашивают ячейки таблицы
function fRed(col)
	SetColor(t_id, col, -1, RGB(255,168,164), RGB(0,0,0), RGB(255,168,164), RGB(0,0,0));
end;
function fGreen(col)
	SetColor(t_id, col, -1, RGB(157,241,163), RGB(0,0,0), RGB(157,241,163), RGB(0,0,0));
end;
function fYellow(col)
	SetColor(t_id, col, -1, RGB(249,247,172), RGB(0,0,0), RGB(249,247,172), RGB(0,0,0));
end;

--Основная функция
function main()
	-- Создаем таблицу
 	CreateTable();

 	--Пробегаемся по массиву тикеров
	for k,v in pairs(aTickerList) do
	  fGetPrice(v, k);
	end;

end;
как выглядит в квике:

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

Список полезных сайтов для инвестора и аналитика

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

http://www.rusbonds.ru/ — удобный поиск облигаций

Список полезных сайтов для инвестора и аналитика

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

Про математически оптимальное плечо

    • 13 декабря 2018, 10:07
    • |
    • _sk_
  • Еще
Решил написать пост для тех, кто хотел бы разобраться с математикой управления капиталом и расчётом оптимального плеча. Для лучшего понимания начнём с простого примера, потом обобщим его и выведем некоторую формулу. При этом понадобятся математические знания конца средней школы.


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

Книга Technical Analysis на русском

    • 16 октября 2018, 14:04
    • |
    • p1x3
  • Еще
Представляю вам супер ЭКСКЛЮЗИВ. На русском до сих пор не было! Наш трейдер Дмитрий перевел книгу про тех. анализ одного крутого американца, который торгует аж с 1991 года. Многие могли видеть эту книгу, но на русском её не было все это время.

Минимум воды, максимум рабочих ситуаций. Рекомендую к чтению! Реальная практика.

Cкачать в PDF тут Tekhnicheskiy_analiz_shenon.pdf
Книга Technical Analysis на русском




Робот Помогатор

Это не торговый робот, а аналитический. Первую его версию я уже выкладывал здесь
Робот Помогатор
Робот предназначен для долгосрочных фундаментальных инвесторов. Это попытка подружить Уоррена Баффета с техническим анализом.
Робот анализирует отраслевые индексы и все входящие в них акции. В обойме робота 91 инструмент, в том числе Индекс ММВБ, РТС и три валюты: доллар-рубль, евро-рубль, евро-доллар.
---
В основе робота две скользящие средние:
1. Мувинг с долгим периодом 52 недели (год)
2. Мувинг с коротким периодом 13 недель (квартал)
Робот Помогатор

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

Деньги любят счет или почему меня не волнуют ставки брокеров по марже

    • 29 сентября 2017, 16:33
    • |
    • А. Г.
      Проверенный аккаунт
  • Еще

В своем недавнем топике  я объяснял, почему шорты лучше торговать на фьючерсе, а лонги на споте. Там же был и предложен метод, как можно, получая безрисковую ставку, торговать шорты по данным спота. Понятно, что все эти рассуждения не учитывали комиссии брокеров. И я в том топике предложил посчитать все За и Против, исходя из реальных условий. Вот и давайте проведем такие расчеты на примере моего личного счета. Что он из себя представляет?

RI – 50%

SBER, GAZP, GMKN, ROSN – по 12.5%

Si – 33%

OФЗ – 33%

Что из себя представляют приведенные %%? Это соотношение между полным лонгом по моим системам в соответствующем эмитенте по номиналу, рассчитанному по цене закрытия предыдущего дня к размеру счета, рассчитанному по тем же ценам. Так как в RI, SBER, GAZP, GMKN, ROSN торгуются по три трендовых торговых идеи, две из которых разбиваются на 2-3 торговых алгоритма с разными параметрами (у одной идеи оптимизируемый параметр один  и на нем особо с портфелями не разбежишься) плюс еще в RI торгуется одна контртрендовая система с реальным таймфреймом пара часов. Поэтому в этой части портфеля полный лонг, как и полный шорт, дело нечастое (примерно по 30% времени в году). В Si торгуется одна идея с одним набором параметров, так как при среднем времени в позиции 12 с небольшим дней заморачиваться с портфелями тоже смысла большого не имеет, поэтому тут и полный лонг и полный шорт занимают примерно по 45% времени. Ну и в ОФЗ у меня банальный  B&H.



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

Робот по скользяшкам

Написал для всех желающих робота-советника. Он автоматически анализирует множество акций по следующим индикаторам:
Мувинг с долгим периодом.
Мувинг с коротким периодом.
Робот по скользяшкам
Робот не торгует, только анализирует рынок.
В КВИКе он выглядит так:
Робот по скользяшкам

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

Таблица "Портфель" в QUIKе


    Представляю таблицу для портфельных инвестиций. В квике до сих пор такого нет. Цвет строки меняется если Прибыль%<>5%. Обновление каждые 5 сек.
Таблица "Портфель" в QUIKе

Для её создания необходимо:
1. Создать файл «tablePortfolio.txt» в папке «C:\QUIK\Scripts». Если папки нет, создать её.
2. Скопировать туда код скрипта
3. Сохранить, выбрав кодировку «ANSI», иначе вместо русских букв могут быть кракозябры.
4. Сменить расширение файла с ".txt" на ".lua"
5. Запустить скрипт командой Сервисы->Lua  скрипты->Добавить (выбрать файл tablePortfolio.lua) ->Запустить

Код скрипта:
IsRun = true
class_code="TQBR"

function main()
   -- Получает доступный id для создания
   t_id = AllocTable()   
   
   -- добавить столбцы
   AddColumn(t_id, 1, "Бумага",       true, QTABLE_STRING_TYPE, 20)
   AddColumn(t_id, 2, "Кол-во",       true, QTABLE_INT_TYPE,     7)
   AddColumn(t_id, 3, "Цена покупки", true, QTABLE_DOUBLE_TYPE, 14)
   AddColumn(t_id, 4, "Цена текущая", true, QTABLE_DOUBLE_TYPE,   14)
   AddColumn(t_id, 5, "Прибыль, р",   true, QTABLE_DOUBLE_TYPE,   14)
   AddColumn(t_id, 6, "Прибыль, %",   true, QTABLE_DOUBLE_TYPE, 14)
   t = CreateWindow(t_id)

   for iRow=1, getNumberOf("depo_limits")-1, 1 do
      rowInPortfolioTable = getItem("depo_limits", iRow) -- получить текущую строку из таблицы "Лимиты по бумагам"            
      qtyBoughtLots  = tonumber(rowInPortfolioTable.currentbal)         
      limitKind = rowInPortfolioTable.limit_kind          
      if qtyBoughtLots>0 and limitKind<1 then      
         InsertRow(t_id, iRow)-- добавить новую строку вниз таблицы   
      end
   end
   local rows, columns = GetTableSize (t_id)
   InsertRow(t_id, rows+1) -- добавить новую строку вниз таблицы для "Итого"
   
   SetWindowCaption(t_id, "Портфель: прибыли и убытки    © [email protected]") 

   -- исполнять цикл, пока пользователь не остановит скрипт или не закроет окно таблицы
   while IsRun do 
      if IsWindowClosed(t_id)==true then
         IsRun=false
      end

      local currentPrice=0
      local qtyBoughtLots=0
      local profitAbs = 0
      local profitPerc = 0
      local currentSecCode= ""
      local fullNameOfInstrument = ""
      local limitKind = 0
      local rowInPortfolioTable = {}    -- строка из таблицы "Лимиты по бумагам"
      local tableInstrument = {}    -- данные "Таблицы текущих торгов"
      local iRowInOutTable = 1
	  local totalInvest = 0
	  local totalPortfolio = 0
	  local totalProfit = 0
	  local totalPercent = 0

      for iRow=0, getNumberOf("depo_limits")-1, 1 do
         rowInPortfolioTable = getItem("depo_limits", iRow) -- получить текущую строку из таблицы "Лимиты по бумагам"         
         
         qtyBoughtLots  = tonumber(rowInPortfolioTable.currentbal)
         
         limitKind = rowInPortfolioTable.limit_kind 
         
         if qtyBoughtLots>0 and limitKind<1    then      -- если кол-во лотов >0 и тип лимита T0
            currentSecCode = rowInPortfolioTable.sec_code
            fullNameOfInstrument =  tostring(getParamEx(class_code, currentSecCode, "SHORTNAME").param_image or "0") --"LONGNAME"
            avgPrice       = tonumber(rowInPortfolioTable.awg_position_price)                  
            currentPrice = GetAskPrice(currentSecCode)   
            profitAbs = (currentPrice-avgPrice)*qtyBoughtLots      
            profitPerc    = 100*currentPrice/avgPrice   - 100
			
			totalInvest = totalInvest + avgPrice*qtyBoughtLots  
			totalPortfolio = totalPortfolio + currentPrice*qtyBoughtLots   
            
            SetCell(t_id, iRowInOutTable, 1, fullNameOfInstrument) -- "Бумага"
            SetCell(t_id, iRowInOutTable, 2, tostring(qtyBoughtLots)) -- "Кол-во"RemoveZero(tostring(qtyBoughtLots)))
            SetCell(t_id, iRowInOutTable, 3, tostring( math_round(avgPrice, 3) ))  -- tostring(avgPrice))   -- "Цена покупки"
            SetCell(t_id, iRowInOutTable, 4, RemoveZero(tostring(currentPrice)))   -- "Цена текущая"
            SetCell(t_id, iRowInOutTable, 5, tostring( math_round( profitAbs, 0)) ) -- "Прибыль, р"
            SetCell(t_id, iRowInOutTable, 6, tostring(math_round(profitPerc, 1)) .."%") -- "Прибыль, %"
            
            if profitPerc >5 then       -- окрашиваем
               ColourRowInGreen(iRowInOutTable)
            elseif profitPerc<-5 then 
               ColourRowInRed(iRowInOutTable)
            else 
               ColourRowInYellow(iRowInOutTable)
            end   
            iRowInOutTable = iRowInOutTable+1
         end
      end
      totalProfit = totalPortfolio - totalInvest 
      totalPercent   = 100*totalProfit/totalInvest  
	  SetCell(t_id, iRowInOutTable, 1, "Итого") 
      SetCell(t_id, iRowInOutTable, 3, tostring( math_round(totalInvest, 0) ))  
      SetCell(t_id, iRowInOutTable, 4, tostring( math_round(totalPortfolio, 0)))  
      SetCell(t_id, iRowInOutTable, 5, tostring( math_round( totalProfit, 0)) ) 
      SetCell(t_id, iRowInOutTable, 6, tostring(math_round(totalPercent, 1)) .."%") 
	  
	  if profitPerc >5 then       -- окрашиваем
               ColourRowInGreen(iRowInOutTable)
            elseif profitPerc<-5 then 
               ColourRowInRed(iRowInOutTable)
            else 
               ColourRowInYellow(iRowInOutTable)
            end   
            iRowInOutTable = iRowInOutTable+1
      sleep(5000) -- пауза 5 сек.
      end
   --message("script table portfolio finished")
end


function ColourRowInRed(num_row)
   SetColor(t_id, num_row, QTABLE_NO_INDEX, RGB(255,150,150), RGB(0,0,0), RGB(255,150,150), RGB(0,0,0))
end
function ColourRowInYellow(num_row)
   SetColor(t_id, num_row, QTABLE_NO_INDEX, RGB(255,255,200), RGB(0,0,0), RGB(255,255,200), RGB(0,0,0))
end
function ColourRowInGreen(num_row)
   SetColor(t_id, num_row, QTABLE_NO_INDEX, RGB(150,255,150), RGB(0,0,0), RGB(150,255,150), RGB(0,0,0))
end
function GetAskPrice(inp_Sec_Code )
   local ask = tostring(getParamEx(class_code, inp_Sec_Code, "OFFER").param_value or 0)
   return ask
end
-- Округляет число до указанной точности
function math_round (num, idp)
   local mult = 10^(idp or 0)
   return math.floor(num * mult + 0.5) / mult
end
-- удаление точки и нулей после нее
function RemoveZero(str)
   while (string.sub(str,-1) == "0" and str ~= "0") do
      str = string.sub(str,1,-2)
   end
   if (string.sub(str,-1) == ".") then 
      str = string.sub(str,1,-2)
   end   
   return str
end
function OnStop()
   DestroyTable(t_id)
   IsRun = false   
end
  • обсудить на форуме:
  • QUIK

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