Избранное трейдера dimaz07

по

Вероятность продолжения тренда на часах в 8 основных фьючах.

Сегодня, в рамках математических изысканий, посчитал, как часто после 2,3,4,5 часовых свечей одного цвета случается свеча того же цвета. Для лучшего понимания нарисовал картинки с белыми свечами:

Вероятность продолжения тренда на часах в 8 основных фьючах.
Расчет сделал за два года — с начала 2017 по конец 2018. Общее количество часовых свечей получилось чуть больше 7000. Результаты в таблице:

Вероятность продолжения тренда на часах в 8 основных фьючах.

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

Алгоподход в инвестициях


        Как отобрать акции по их реальному преимуществу? Ранее уже шла речь, чем дедуктивный подход лучше индуктивного smart-lab.ru/blog/528272.php То есть играть надо серии со статистическим преимуществам, а не «прогноз» и «видение рынка». Это как бы азбука трейдинга, но и пассивный портфель акций трейдер будет составлять как трейдер, без чужих советов, фантазий и прозрений.

         Сначала смотрим, чем одни бумаги в принципе отличаются от других. Допустим, есть параметр А, дискретно принимающий два значения: «да» или «нет». Делим все бумаги на две совокупности, исключительно по параметру А. Смотрим, как они вели себя десять лет. И если кучка, где ответ «да», дает на 3% больше годовых, чем та, где ответ «нет», вероятно, мы нашли какие-то основания отбора.

         Далее смотрим на параметр Б. Положим, это некая цифра, варьируемая в диапазоне. Делим по этому параметру акции на пять групп, от меньшего значения к большему. Понятно, что всего акций должно быть не десять, а порядка ста и более. Две акции –это не группа, а кусок случайности. Если доходность в верхней группе на 17% годовых больше, чем в нижней, мы опять, скорее всего, наткнулись на что-то интересное. Особенно если есть закономерность: в четвертой группе доходность выше, чем в пятой, в третьей еще выше, и т.д.



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

STATDIV3 доработанный индикатор для quik на языке lua

если индикатор больше 0, то покупаем, если ниже то продаем

скачать можно здесь:dropmefiles.com/09FCu
как устанавливать смотрите предыдущие статьи: https://smart-lab.ru/blog/528424.php
название STATDIV3 это доработанный STATDIV


поведение индикатора на графике:
STATDIV3 доработанный индикатор для quik на языке lua


сам код индикатора:
Settings={
Name="STATDIV3",
period=50,
  line=
  {
    {
      Name="curve",
      Color=RGB(0,0,255),
      Type=TYPE_LINE,
      Width=1
    },
    {
      Name="line",
      Color=RGB(255,0,0),
      Type=TYPE_LINE,
      Width=1
    },
    {
      Name="MA",
      Color=RGB(0,0,255),
      Type=TYPE_LINE,
      Width=1
    },
    {
      Name="MA2",
      Color=RGB(0,128,128),
      Type=TYPE_LINE,
      Width=1
    },
    {
      Name="line2",
      Color=RGB(0,0,255),
      Type=TYPE_LINE,
      Width=1
    },
    {
      Name="line3",
      Color=RGB(0,128,128),
      Type=TYPE_LINE,
      Width=1
    }
  } 
}

function Init()
  cache_ind={}
  cache_ind2={}
  cache_ind3={}
  return 2
end

function OnCalculate(index)
  if index < Settings.period then
    return nil
  else
    local sum1=0
    local sum2=0
    local sum0=0
    local sum02=0
    local sum03=0
    for i=index-Settings.period+1, index do  
    do
      if C(i) > O(i) then
        sum1 = sum1 + C(i) - O(i)
        sum2 = sum2 + C(i) - O(i)
      else
        sum2 = sum2 + O(i) - C(i)
      end  
    end 
    cache_ind[index] = sum1/sum2    
    if index > Settings.period+12 then 
--[[
      sum0 = 1*cache_ind[index]+
            (1)*cache_ind[index-1]+
            (1)*cache_ind[index-2]+
            (1)*cache_ind[index-3]+
            (1)*cache_ind[index-4]+
            (1)*cache_ind[index-5]+
            (1)*cache_ind[index-6]+
            (1)*cache_ind[index-7]+
            (1)*cache_ind[index-8]+
            (1/2)*cache_ind[index-9]+
            (1/3)*cache_ind[index-10]+
            (1/4)*cache_ind[index-11]+
            (1/5)*cache_ind[index-12]
--]]
      sum0 = 1*cache_ind[index]+
            (1/2)*cache_ind[index-1]+
            (1/3)*cache_ind[index-2]+
            (1/4)*cache_ind[index-3]+
            (1/5)*cache_ind[index-4]+
            (1/6)*cache_ind[index-5]+
            (1/7)*cache_ind[index-6]+
            (1/8)*cache_ind[index-7]+
            (1/9)*cache_ind[index-8]+
            (1/10)*cache_ind[index-9]+
            (1/11)*cache_ind[index-10]+
            (1/12)*cache_ind[index-11]+
            (1/13)*cache_ind[index-12]

    end
--[[
    sum0 = sum0/(1+1+1+1+1+1+1+1+1+1/2+1/3+1/4+1/5)
--]]
    sum0 = sum0/(1+1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9+1/10+1/11+1/12+1/13)

       
    cache_ind2[index] = sum0
    if index > Settings.period+50 then   
      sum02 = 1*cache_ind2[index]+
            (1)*cache_ind2[index-1]+
            (1)*cache_ind2[index-2]+
            (1)*cache_ind2[index-3]+
            (1)*cache_ind2[index-4]+
            (1)*cache_ind2[index-5]+
            (1)*cache_ind2[index-6]+
            (1)*cache_ind2[index-7]+
            (1/2)*cache_ind2[index-8]+
            (1/3)*cache_ind2[index-9]+
            (1/4)*cache_ind2[index-10]+
            (1/5)*cache_ind2[index-11]+
            (1/6)*cache_ind2[index-12]
--[[
      sum02 = 1*cache_ind2[index]+
            (1/2)*cache_ind2[index-1]+
            (1/3)*cache_ind2[index-2]+
            (1/4)*cache_ind2[index-3]+
            (1/5)*cache_ind2[index-4]+
            (1/6)*cache_ind2[index-5]+
            (1/7)*cache_ind2[index-6]+
            (1/8)*cache_ind2[index-7]+
            (1/9)*cache_ind2[index-8]+
            (1/10)*cache_ind2[index-9]+
            (1/11)*cache_ind2[index-10]+
            (1/12)*cache_ind2[index-11]+
            (1/13)*cache_ind2[index-12]
--]]
    end
    sum02 = sum02/(1+1+1+1+1+1+1+1+1/2+1/3+1/4+1/5+1/6)
--[[
    sum02 = sum02/(1+1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9+1/10+1/11+1/12+1/13)
--]]
    cache_ind3[index] = sum0 - sum02
    if index > Settings.period+50 then   
      sum03 = 1*cache_ind3[index]+
            (1/2)*cache_ind3[index-1]+
            (1/3)*cache_ind3[index-2]+
            (1/4)*cache_ind3[index-3]+
            (1/5)*cache_ind3[index-4]+
            (1/6)*cache_ind3[index-5]+
            (1/7)*cache_ind3[index-6]+
            (1/8)*cache_ind3[index-7]+
            (1/9)*cache_ind3[index-8]+
            (1/10)*cache_ind3[index-9]+
            (1/11)*cache_ind3[index-10]+
            (1/12)*cache_ind3[index-11]+
            (1/13)*cache_ind3[index-12]
    end
    sum03 = sum03/(1+1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9+1/10+1/11+1/12+1/13)

  end  

  if sum1/sum2 > 0.5 and sum03 > 0 then
    sum1 = sum03
  else
    if sum1/sum2 < 0.5 and sum03 < 0 then
      sum1 = sum03 
    else 
      sum1 = 0
    end
  end

  return sum1, 0
end

end
 всем удачи!
  • обсудить на форуме:
  • Quik Lua

Доработал индикатор STATDIV на lua для quik

пользоваться можно так:
если касная кривая выше 0,5 и синяя выше зеленой то логуем
если красная ниже 0,5 и синяя ниже зеленой то шортим
принимаю пожелания по изменению кода индикатора
Доработал индикатор STATDIV на lua для quik


скачать можно здесь:
dropmefiles.com/y4kpv

как установить:
в папке quik создаете папку LuaIndicators туда кидаете текстовый файл с раcширением .lua и содержанием приведенного индикатора, потом запускаете quik и добавляете как обычный индикатор к графику с именем STATDIV

продолжение темы: smart-lab.ru/blog/528145.php

код:

Settings={
Name=«STATDIV»,
period=25,
  line=
  {
    {
      Name=«curve»,
      Color=RGB(255,0,0),
      Type=TYPE_LINE,
      Width=1
    },
    {
      Name=«line»,
      Color=RGB(255,0,0),
      Type=TYPE_LINE,
      Width=1
    },
    {
      Name=«MA»,
      Color=RGB(0,0,255),

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

Тестим свечные паттерны от Татарина30

Эти системки мне неизвестны от слова «совсем». Так что потираю потные ладошки в ожиданиях расширения кругозора и будущего профита.
Тут формализовать чуть сложней, так как свечки сами понимаете...
В моей формализации системка выглядит так:
1. Дневная свеча позавчера <-2% (от клоза до открытия)
2. Дневная свеча вчера >2%
3. Взял случаи когда две свечи сильно друг от друга не отличаются: одна свеча не может быть по модулю больше другой более чем в 1,5 раза.
4. Так как котирки только 15 минутные, убираю первый бар из торговли.
5. Пробоем вчерашнего дня считаю закрытие клоуза выше вчерашнего хая
6. Открытие ниже хая вчерашнего дня
7. Время в позиции 30 минут. 
Берем только первые фишки дня которые выполнили условие. Получаем:
/> /> />
Названия строк Колич    Profit %
2010 22 -0,23


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

Разбор системы "Контртренд"

Еще одна до боли знакомая мне система здесь значится как «Контртренд». У меня опять же немножко по другому, но логику мы пытаемся реализовать одну. У меня так сказать чуть подольше и покрупней, ибо оптимизирую я прибыль на сделку, у Татарин30 все поуже и сшибает он пипсы, максимизируя число профитных сделок. Ну, так сказать каждому свое. 
В моей формализации система выглядит так:
1. Первые 2 часа шортим фишки которые сильно выросли: 2,5% от закрытия основной сессии вчера.
2. Даем им 30 минут и смотрим по MAE и MFE в WL. Таким образом я пытаюсь хоть как то релизовать предложенные стопы (сложность в том что на 15 минутных котировках совершенно непонятно, первым тебя вынесет по стопу в 0,5% или даст зафиксировать профит по 0,5/1%) . 
Оке. Берем данные с 2010 по 2018 годы. Акции с обьемом от 300 лямов.
Оцениваем. Вот если просто закрыть через полчасика:
/> /> /> />
Названия строк


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

Вторая система Татарина30.

Еще более знакома мне система которая у Татарина30 называется "Лидеры роста от 4,5%". Эту систему я нашел где то лет 8 назад, тестируя данные с 2006 года. У меня она выглядит несколько иначе, но логика та же. 
Давайте попробуем потестить некоторые моменты и утверждения.
Формализуем ее так:
1. Вход по клозу в 18.40 
2. Закрытие в 10.30.
3. Тест на фишках с обьемом от 300 лямов в день.
4. Все остальное как описано в системе
Утверждается что лучше когда закрытие сессии произошло на максимумах дня, даже указывается длина тени: 0,3%. Если больше то типа не надо.
В формализации которой я привел с точностью до наоборот, чем ближе закрытие дня к экстремумам, тем… хуже:

/> /> /> />
Названия строк Колич    Profit %    ±
>0.3 359 0,95 0,61
<0,3


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

Тестирование системы Татарина30.

Попались на глаза системы приписываемые Татарину30. Незнаю насколько это соответствует действительности, но по стилю изложения и грамматическим ошибкам, да, похоже Татарин приложил там руку и голову и все остальное к этому тексту.
Подход озвученный Татарином30 близок мне, я также предпочитаю строгую формализацию и тесты на историю и также юзаю WL. Из 11 систем озвученных здесь 2 мне показались так сказать «до боли знакомыми».
При этом я работаю на гораздо больших таймфреймов, и оптимизирую я средний профит на сделку, а не процент выигрышных сделок. И плечо 1:5 для меня невозможен. И нет стопов, вообще. Однако некоторые зависимости мы юзаем одинаковые, только то что у Татарина30 называется "Лидеры роста от 4,5%", у меня называется «Таймс», а "Фьючерсы" у меня проходят по ником «Фальстарт».


В чем прелесть системы «Фьючерсы»-она легко формализуется, за одним «но»-стопов. Это надо тестировать на тиках чтобы корректно оценить что первым сработает тейкпрофит или стоплосс, ведь разница между ними всего 0,7%. Однако если система работающая, то она должна показывать профит и без этих тонких настроек. 

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

скрипт для 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

Как не зависнуть в падающей бумаге?

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

         И вот, зажав в потном кулачке заветную денежку, замирая от ужаса и надежды, мы наконец-то решаем, что настал долгожданный момент, который сделает нас богатыми! Мы покупаем падающую бумагу, но она, как правило, продолжает снижаться! Но ведь она так перепродана, дальше ведь уже точно не упадет – думаем мы. И покупаем еще и еще, усредняя свою убыточную позицию. Но чем больше убыток, тем сложнее его зафиксировать. Убыток в 2%, зафиксировать просто и легко, убыток в 20% уже очень тяжело, а в 50% почти невозможно. Если же вы усредняетесь, то раньше или позже попадете в ситуацию, когда ваш убыток достигнет 20% или выше и выйти из сделки будет психологически очень сложно.



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

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