вторник, 24 апреля 2012 г.

Выделение цветом утренней сессии на графике ThinkOrSwim

Для увеличения нажми на изображение
Этот скрипт выкрашивает бары утренней сессии оранжевым цветом. Скрипт позволяет задать время начала и окончания выделяемой сессии (так что вы можете выделить любой период времени). Зачем это нужно? Некоторые избегают торгов в определенные периоды дня, некоторые используют уровни сформированные в определенные периоды дня. Именно для этих целей и сделан этот скрипт. Т.к. у меня на графике идет раскраска базочек, то я просто дополнил скрипт раскраски базочек новой функцией - функцией окраски утренней сессии в отдельный цвет. Вот код скрипта:


#by Egor Masalskiy
#last modify 24.04.2012
#------------------
input period = {default DAY, WEEK};
input lenght = 3;
input periodRangeFor_base2cent =  0.3;
input periodRangeFor_base3cent = 0.5;
input periodRangeFor_base4cent = 0.8;
input periodRangeFor_base5cent = 1.2;
input Open_Inside_Time = 0930;
input Close_Inside_Time = 1030;
#------------------
def day = getDay();
def lastDay = getLastDay();
def isToday = if(day==lastDay,1,0);
def pastOpen = if((secondsTillTime(Open_Inside_Time) > 0), 0,1);
def pastClose = if((secondsTillTime(Close_Inside_Time) > 0), 0,1);
def Inside_Time = if(pastOpen and !pastClose, 1, 0);
def firstBar =if (day[1] != day, day-1, 0);
def BASE = Highest(high, lenght) - Lowest (low, lenght);
#------------------
AssignPriceColor( if 
(high(period = period)[1] - low(period = period)[1]) > periodRangeFor_base5cent and BASE <= 0.05 then Color.CYAN else if
(high(period = period)[1] - low(period = period)[1]) > periodRangeFor_base4cent and (high(period = period)[1] - low(period = period)[1]) <= periodRangeFor_base5cent and BASE <= 0.04 then Color.CYAN else if
(high(period = period)[1] - low(period = period)[1]) <= periodRangeFor_base4cent and (high(period = period)[1] - low(period = period)[1]) > periodRangeFor_base3cent and BASE <= 0.03 then Color.CYAN else if
(high(period = period)[1] - low(period = period)[1]) <= periodRangeFor_base3cent and (high(period = period)[1] - low(period = period)[1]) > periodRangeFor_base2cent and BASE <= 0.02 then Color.CYAN else if
(high(period = period)[1] - low(period = period)[1]) <= periodRangeFor_base2cent  and BASE <= 0.01 then Color.CYAN
else if (Inside_Time) then color.ORANGE
else Color.white);


P.S. Как вставить индикатор в ThinkOrSwim описано здесь.

среда, 29 февраля 2012 г.

Отображение запаса хода в ThinkOrSwim

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

Стоит понимать, что эти скрипты не показывают до куда именно дойдет цена. Акция может как не дойти до этого уровня (например если начинается консолидация) так и пройти намного дальше (например выход из консолидации, выход отчета по акции или в свете важных новостей). Скрипты показывают предполагаемое средне статистическое движение акции за последние 5 дней.
Так же уровень (цифра) может изменяться в течение дня в зависимости от положения high, low дня и текущей цены (скрипт определяет предполагаемое направление движения), но на цветовую градацию это не влияет.

Итак, первая формула вставляется в WatchList терминала (как это сделать описано в прошлом посте). У нас появляется столбец с цифрами, которые указывают цену уровня до которого запас хода считается приемлемым (это 100% от среднего движения за последние 5 дней). Если текущий день превышает порог запаса хода, то фон ячейки красится темным цветом. Так же скрипт выделяет цветом фона пороги до 33%, до 66% и до 100% от запаса хода. Получается что чем ярче цвет ячейки - тем менее рисковано входить в сделку на пробой.

#by Egor Masalskiy
#last modify 31.07.2012
def spread = high - low;
def storona = if close > (high + low) / 2 then 1 else -1;
def potencial = sum(high[1]-low[1],5) / 5;
plot LINE = if storona > 0 then round(low + potencial) else round(high - potencial);
AssignBackgroundColor( if spread < 0.33*potencial then createColor(255,255,0) else if spread < 0.66*potencial then createColor (222,222,0) else if  spread < potencial then CreateColor (200,200,0) else createColor(110,110,10));

Период Aggregation: D

Вторая формула рисует лейбл непосредственно на графике (под заголовком окна) в котором указана аналогичная информация по уровням запаса хода.

#by Egor Masalskiy
#last modify 31.07.2012
input period = {default DAY};
def spread = high(period = period) - low(period = period);
def storona = if close(period = period) > (high(period = period) + low(period = period)) / 2 then 1 else -1;
def potencial = sum(high(period = period)[1] - low(period = period)[1],5) / 5;
DEF LINE = if storona > 0 then low(period = period) + potencial else high(period = period) - potencial;
AddChartLabel(yes, concat("Запас хода до: ",round(LINE, 2)), (if spread < 0.33*potencial then createcolor(225,225,0) else if spread < 0.66*potencial then createcolor(222,222,0) else if  spread < potencial then createcolor(200,200,0) else createcolor(110,110,10)));

четверг, 23 февраля 2012 г.

Блок фильтров для ThinkOrSwim

Потихонечку делаю блок фильтров для ThinkOrSwim. Для того что бы ввести формулы в Watch List программы ThinkOrSwim нужно кликнуть правой кнопкой по серому заголовку любого столбца, после чего откроется меню как показано на рисунке. В этом меню выбираем пункт Customize - откроется окно под названием Customize Quotes. Здесь ищем в левой группе строку с названием Custom (номер). Выбираем любую из них двойным кликом - откроется окно Customize Quotes Formula. Вот сюда-то и вставляем формулу фильтра. В верхней части окна можно переименовать фильтр, а так же там задается интервал рассчетов (Aggregation).

Формула для поиска баз:


def BASE = Highest(high, 5) - Lowest (low, 5);
plot R = round(close);
AssignBackgroundColor( if BASE <= 0.05 then Color.CYAN  else Color.white);


Период Aggregation: 1m (или 5m)
На вашем Watch List появится столбец отображающий цену Last. В случае, если последние 7 баров будут находиться в диапазоне 5 центов, фон значения подсветится голубым.

Формула High\Low текущего дня:


plot Change = round(close - close[1]);
AssignBackgroundColor( if (high - close) < 0.05 then Color.GREEN else if (low - close) > -0.05 then Color.RED else Color.WHITE);


Период Aggregation: D
На вашем Watch List появится столбец отображающий расстояние пройденное ценой от вчерашнего закрытия до текущей цены. В случае, если акция будет торговаться возле сегодняшнего хая, то фон значения подсветится зеленым. Если же акция будет торговаться возле сегодняшнего лоу, то фон значения подсветится красным.

понедельник, 17 октября 2011 г.

Гистограмма VIX под графиком в ThinkOrSwim

Для увеличения нажми на изображение
VIX это индекс настроения рынка. VIX основан на волатильности опциона на индекс S&P 500. Кому интересны методы его расчета - гуглите. Вот формула которая помогает расположить индекс в виде гистограммы под графиком в ThinkOrSwim:

plot VIX = high ("VIX");
VIX.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
plot line1 = 20;
plot line2 = 30;
plot line3 = 40;

Нормальным считается значение от 20 до 30 - рынок спокойный. Значение от 30 до 40 является признаком агрессивного рынка (как правило выражается в частом сносе стопов). Значение выше 40 сигналит о своеобразной неадекватности рынка (плохо держатся уровни). Значение ниже 20 говорит о слабости рынка, в это время обычно увеличиваются спреды.

В большинстве случаев достаточно просто знать текущее значение VIX. Поэтому написал следующий скрипт, который отображает под заголовком графика лейбл со значением VIX.

def VIX = close ("VIX");
AddChartLabel(yes, concat(round(VIX, 2), ” VIX”), (if VIX > 40 then color.red else if VIX < 20 then color.CYAN else color.green));

Если VIX выше 40 - лейбл красный, если VIX между 20 и 40 - лейбл зеленый, если ниже 20 - лейбл голубой.

P.S. Как вставить индикатор в ThinkOrSwim описано здесь.

четверг, 8 сентября 2011 г.

Блок фильтров для StrategyDesk

Мой блок фильтров для StrategyDesk. Воркспейс с блоком фильтров можно скачать кликнув по ссылке.
Первая колонка - сигналит потенциал движения акции исходя из среднего движения за день, чем ярче цвет - тем больше потенциала.
Вторая колонка - тикер акции.
Третья колонка - светит ярко-зеленым, если в течение дня акция преодолела вчерашний хай, или темно-зеленым, если акция подошла к вчерашнему хаю.
Четвертая колонка - светит ярко-красным, если в течение дня акция преодолела вчерашний лоу, или темно-красным, если акция подошла к вчерашнему лоу.
Пятая колонка - сигналит базы за промежуток в 8 минут в историю. Чем тоньше база - тем ярче цвет. (подробно описано в прошлом посте).
Шестая колонка - сигналит всплеск объема за промежуток в 8 минут в историю.

Серый - цвет фона. Если появляются белые поля как на изображении справа, то это говорит о том что данные на StrategyDesk поступают с перебоями или просто в течение минуты не было сделок в акции (отрисовка восстанавливается в течение 8 минут, если не было новых сбоев в поставке квот)

Формула для поиска баз через скринер StrategyDesk

Формула для скринера StrategyDesk, которая сигналит базы.
PriceRangeChannels[Upper,4,0,1] - PriceRangeChannels[Lower,4,0,1]
Цифра 4 - здесь цифрой отмечается минимальное кол-во баров для базы.
Цифра 1 - здесь цифрой отмечается тайм фрейм (1-минутка, 5-пятишка).
Раскрашивать и опции выставлять как указано на изображении снизу, там цифровое значение - это кол-во центов толщины базы.


Отрисовка уровней HIGH, LOW и CLOSE прошлого дня в ThinkOrSwim

Скрипт отрисовывает на текущем дне уровни прошлого  дня, недели и т.п. в зависимости от опций. Ценность линии CLOSE я не понимаю, а вот HIGH и LOW могут быть весьма полезны при пробойной стратегии торговли.

input offset = 1;
input offset2 = 1;
input offset3 = 1;
input period = {default DAY, "2 DAYS", "3 DAYS", "4 DAYS", WEEK, MONTH, "OPT EXP"};
input period2 = {default DAY, "2 DAYS", "3 DAYS", "4 DAYS", WEEK, MONTH, "OPT EXP"};
input period3 = {default DAY, "2 DAYS", "3 DAYS", "4 DAYS", WEEK, MONTH, "OPT EXP"};
plot Data = high(period = period)[offset];
Data.SetPaintingStrategy(PaintingStrategy.DASHES);
Data.SetDefaultColor(GetColor(1));
plot Data2 = low(period = period)[offset2];
Data2.SetPaintingStrategy(PaintingStrategy.DASHES);
Data2.SetDefaultColor(GetColor(5));
plot Data3 = close(period = period)[offset3];
Data3.SetPaintingStrategy(PaintingStrategy.DASHES);
Data3.SetDefaultColor(GetColor(4));


P.S. Как вставить индикатор в ThinkOrSwim описано здесь.

понедельник, 5 сентября 2011 г.

Автоматическая окраска баз на графике ThinkOrSwim

Нажми на изображение для увеличения

Написал скрипт, который выкрашивает на графике бары базы в зеленый цвет. Мне он помогает делать домашку, т.к. позволяет быстро определять дает ли акция моменты для входа с маленьким риском. Базы более 5 центов скрипт не ищет. Вот код:



#by Egor Masalskiy
#last modify 08.09.2011
input period = {default DAY, WEEK};
input lenght = 3;
input periodRangeFor_base2cent =  0.3;
input periodRangeFor_base3cent = 0.5;
input periodRangeFor_base4cent = 0.8;
input periodRangeFor_base5cent = 1.2;
def BASE = Highest(high, lenght) - Lowest (low, lenght);
AssignPriceColor( if 
(high(period = period)[1] - low(period = period)[1]) > periodRangeFor_base5cent and BASE <= 0.05 then Color.CYAN else if
(high(period = period)[1] - low(period = period)[1]) > periodRangeFor_base4cent and (high(period = period)[1] - low(period = period)[1]) <= periodRangeFor_base5cent and BASE <= 0.04 then Color.CYAN else if
(high(period = period)[1] - low(period = period)[1]) <= periodRangeFor_base4cent and (high(period = period)[1] - low(period = period)[1]) > periodRangeFor_base3cent and BASE <= 0.03 then Color.CYAN else if
(high(period = period)[1] - low(period = period)[1]) <= periodRangeFor_base3cent and (high(period = period)[1] - low(period = period)[1]) > periodRangeFor_base2cent and BASE <= 0.02 then Color.CYAN else if
(high(period = period)[1] - low(period = period)[1]) <= periodRangeFor_base2cent  and BASE <= 0.01 then Color.CYAN
else Color.white);


Описание опций скрипта:
     period - выбор интервала для определения диапазона изменения цен в акци (день или неделя)
     lenght - выбор длины базы (кол-во баров), уменьшение параметра увеличивает чувствительность, увеличение параметра повышает качество определения баз
     periodRangeFor_base2cent - выбор размера диапазона изменения цен для окрашивания базы размером в 2 цента
     periodRangeFor_base3cent - выбор размера диапазона изменения цен для окрашивания базы размером в 3 цента
     periodRangeFor_base4cent - выбор размера диапазона изменения цен для окрашивания базы размером в 4 цента
     periodRangeFor_base5cent - выбор размера диапазона изменения цен для окрашивания базы размером в 5 центов
Последние четыре опции нужны для того что бы скрипт красил более узкие бары на акциях, которые ходят меньше, и красил более широкие базы на акциях, которые ходят больше. Если вам не важно соотношение размера базы и размера дневного движения акции, то просто поставьте значение periodRangeFor_base5cent минимальным.

P.S. Как вставить индикатор в ThinkOrSwim описано здесь.

вторник, 23 августа 2011 г.

Отбор акций для торгов по профилю объемов

     Существуют профили 4х основных типов, описанные мной ранее. Для отбора нам понадобятся профили баланс и дисбаланс. Профиль баланса отдаленно напоминает латинскую букву "D", профиль дисбаланса в пользу продавцов похож на латинскую букву "b", а профиль дисбаланса в пользу покупателей на латинскую букуву "p". Эти обозначения нужны для простоты запоминания логики отбора акций по графику из двух последних дней. Итак если день имеет код "b" то, объемы внутри него сосредоточены возле нижней границы дня, если день имеет код "p" то объемы в нем сосредоточены возле верхней границы, а если день имеет код "D" то основные объемы расположены посередине дня. (см. изображение справа)

Отбор акций для торгов по профилю объемов происходит следующим образом:
     Для торговли в лонг отбираяются акции с кодом двух дней pp и Dp, где максимальный объем последнего дня выше максимального объема предыдущего дня или же близок к этому. (данные формулы являются примером отрицательного развития, см. оригинальную теорию Стидлмайера). Желательно, что бы последний профиль был меньше предыдущего. Так же нужно помнить, что чем меньше расстояние между максимальными объемами дней - тем больше потенциальное движение. Пример pp дня можно увидеть на изображении в посте от 3 июля на этом блоге.
     Для торговли в шорт отбираются акции с кодом двух последних дней bb и Db, где максимальный объем последнего дня ниже максимального объема предыдущего дня или же близок к этому. (эти формулы так же являются примером отрицательного развития, см. оригинальную теорию Стидлмайера). Желательно, что бы последний профиль был меньше предыдущего. Не стоит забывать, что чем меньше расстояние между максимальными объемами дней - тем больше потенциальное движение.
     Разворотные формации профиля - это связки двух дней с кодами bp (на лонг) и pb (на шорт). Но для таких формаций важно их положение относительно уровней поддержки и сопротивления, а так же направления и динамики рынка в целом на день торгов. Торговать их опасно.
     Так же стоит помнить, что позиции в лонг стоит открывать выше вчерашнего максимального объема, а позиции в шорт - ниже вчерашнего максимального объема. Однако варианты возможны, например открытие нового дня с большим гэпом в обратную сторону. Такой день будет торговаться к максимальному объему предыдущего дня на пробой своего утреннего профиля. Или при явном перевесе продавцов рынок может помочь покупателям - в итоге движение, если и состоится, будет в противоположную сторону.

     Наличие потенциала для движения так же обязательно, т.е. не должно быть на пути движения сильных уровней, скользящих средних 200 и 50. Плавность хода должна быть подходящей для вашего стиля торговли. Профиль просто показывает расстановку сил.

вторник, 9 августа 2011 г.

Фазы рынка по SnP 500

SnP дневной график
Рынок имеет фазу аккумуляции и фазу движения (рост или падение). Фаза аккумуляции происходит на уровне или между двумя уровнями (мувинги как вариант уровней). Фаза движения идет от уровня аккумуляции до нового уровня паритета цен, где снова начинается аккумуляция. На зону нового паритета цен могут влиять фундаментальные данные и технические уровни. Фаза движения начинается из середины фазы аккумуляции, но идентифицировать ее в этот момент практически не реально.

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

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

На фазе аккумуляции и во время неподтвержденных дней фазы движения выставлять безубыток при достижении профита в 10 центов, что бы ограничить кол-во убыточных сделок. Откаты не пересиживать более чем на 20% от имеющегося профита.

Во время фазы движения высиживать откаты по раскраске баров осциллятором CCI (см. описание стратегии торговли). Безубыток выставлять при достижении профита в 20 центов. Стаки идущие в противофазе с рынокм торговать как при неподтвержденной фазе движения.