воскресенье, 8 июля 2012 г.

Отображение дневного диапазона на графике в ThinkOrSwim


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

# (c) 2009 http://www.thinkscripter.com
# thinkscripter@gmail.com
# Last Update 14 Feb 2009
input showOnlyToday = YES;
input Market_Open_Time = 0930;
input Market_Close_Time = 1600;
def day = getDay();
def lastDay = getLastDay();
def isToday = if(day==lastDay,1,0);
def shouldPlot = if(showOnlyToday and isToday, 1,if(!showOnlyToday,1,0));
def pastOpen = if((secondsTillTime(Market_Open_Time) > 0), 0,1);
def pastClose = if((secondsTillTime(Market_Close_Time) > 0), 0,1);
def marketOpen = if(pastOpen and !pastClose, 1, 0);
def firstBar =if (day[1] != day, day-1, 0);
rec regHoursHigh = if(high > regHoursHigh[1] and marketOpen, high, if(marketOpen and !firstBar, regHoursHigh[1], high));
plot Regular_Hours_High = if(marketOpen and shouldPlot, regHoursHigh, Double.nan);
Regular_Hours_High.SetStyle(curve.points);
Regular_Hours_High.SetDefaultColor(color.green);
Regular_Hours_High.SetLineWeight(2);
rec regHoursLow = if(low < regHoursLow[1] and marketOpen, low, if(marketOpen and regHoursLow[1] > 0 and !firstBar, regHoursLow[1],low));
plot Regular_Hours_Low = if(marketOpen and shouldPlot, regHoursLow, double.nan);
Regular_Hours_Low.SetLineWeight(2);
Regular_Hours_Low.SetStyle(curve.points);
Regular_Hours_Low.SetDefaultColor(color.red);
plot Midpoint_Pivot = if(marketOpen and shouldPlot, (Regular_Hours_High + Regular_Hours_Low) / 2, double.nan);
Midpoint_Pivot.SetLineWeight(2);
Midpoint_Pivot.SetDefaultColor(color.white);
Midpoint_Pivot.SetPaintingStrategy(PaintingStrategy.POINTS);


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

вторник, 1 мая 2012 г.

Система сопровождения позиции (окраска баров осциллятором CCI в ThinkOrSwim)

Скрипт баз перерос во что-то комплексное. Добавлена функция (упоминается на странице с описанием стратегии) с помощью которой бары графика раскрашиваются осциллятором CCI. Меня давно просили написать этот код для ThinkOrSwim. Отдельно я его писать не стал, но встроил в скрипт по окраске баз. Теперь это уже тяжело назвать "скриптом по окраске баз".

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

В опциях период CCI указан как "chanel period". Выделение баз цветом (цвет cyan) идет поверх всех цветовых выделений, поэтому порой цвет базы может скрывать конкретные точки где сменился цвет в зависимости от значения CCI. Это критично только для очень тихоходных акций, которые ползут по 10-15 центов в час.
Итак код скрипта:

#by Egor Masalskiy
#last modify 01.05.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;
input chanel_period = 20;
#------------------
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);
def CCI = CCI(chanel_period);
#------------------
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 if
CCI < -25 then CreateColor(255,190,190)
else if
CCI < -50 then CreateColor(255,130,130)
else if
CCI > 25 then CreateColor(190,255,190)
else if
CCI > 50 then CreateColor(130,255,130)
else Color.white);


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

вторник, 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 описано здесь.