воскресенье, 31 мая 2015 г.

Ищу торговую платформу.

Ищу торговую платформу с профилем объемов (Volume Profile) для российского рынка, которая поддерживала бы автоматические торги. Крайне желательно, что бы был пробный бесплатный период, для того что бы закодировать и отладить АТС.

Отпишитесь, кто знаком с чем-то подобным. Я посмотрел парочку, но в них нету Volume Profile. А мне для моей ТС он просто необходим. Заранее спасибо!

вторник, 4 декабря 2012 г.

Лейбл для комплексного скрипта по раскраске баров.

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



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

Теперь о боке лейблов. Вобщем не трудно догадаться, что если полоса не содержит черного и зеленого цветов - это к шорту, а если нету черного и красного - это к лонгу! =) Голубой цвет сигналит о моменте входа с минимальным риском. Собственно для этого и затевалась вся работа с лейблами... Идеальная ситуация: первый лейбл ярко желтый, второй и третий голубые, а оставшиеся три либо красные для шорта либо зеленые для лонга).

#by Egor Masalskiy
#last modify 03.12.2012
#------------------
input period = {default DAY, WEEK};
input lenght = 3;
input chanel_period = 20;
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);
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);

#-----------------------------Label---------------------------------------------------
AddLabel(yes, Concat("Base ", Round(Base, 2)), (if Base <= 0.05 then color.CYAN else Color.BLACK));

P.S. О том как и куда вставлять эти скрипты в терминале ThinkOrSwim написано здесь.

Triangular MA band и лейбл для него.


Вот это уже скрипт на основе индикатора. А именно - на основе Triangular MA. Для меня он служит фильтром точек входа, что бы не попадать в позиции, когда стак не достаточно отстоялся перед началом движения. Смысл в том что триангулярные вычисления определяют не простую среднюю, а точку от которой экстремумы чарта за определенный промежуток времени будут равноудалены. Это по сути та точка от которой и сверху и снизу прошло одинаковое кол-во сделок за определенный промежуток времени. Это конечно не буквальное значение, а статистическое, т.к. у нас нету информации о конкретных сделках. Я стараюсь брать только те точки входа, которые находятся в 10% диапазоне от TriangularMA. По идее чем ближе к основной линии - тем лучше. Этот скрипт видно на моих скринах как 3 скользящих кривых. (Параметры подобраны под минутный график, на другие таймфреймы выбирайте сами.)

Скрипт так же рисует лейбл, который сигналит о направлении предполагаемой точки входа и ее наличии вообще. Принцип основан на положении цены относительно Triangular MA и направлении последней.

#by Egor Masalskiy
#last modify 03.12.2012

input price = close;
input length = 89;
input displace = 0;
input period = {default DAY, WEEK};
input percent = 10;

def effectiveLength = Ceil((length + 1) / 2);
def dayrange1 = (high(period = period)[1] - low(period = period)[1]);
def dayrange2 = (high(period = period)[2] - low(period = period)[2]);
def dayrange3 = (high(period = period)[3] - low(period = period)[3]);
def dayrange4 = (high(period = period)[4] - low(period = period)[4]);
def dayrange5 = (high(period = period)[5] - low(period = period)[5]);
def dayrange = (dayrange1 + dayrange2 + dayrange3 + dayrange4 + dayrange5)/5;

plot AvgTri = Average(Average(price[-displace], effectiveLength), effectiveLength);
AvgTri.SetDefaultColor(GetColor(1));

plot AvgTri_up = AvgTri + (percent/100) * dayrange;
AvgTri.SetDefaultColor(GetColor(1));

plot AvgTri_down =  AvgTri - (percent/100) * dayrange;
AvgTri.SetDefaultColor(GetColor(1));

#-----------------------------Label---------------------------------------------------
AddLabel(yes, Concat("TMA ", Round(AvgTri, 2)), (if (Price < AvgTri_up and Price > AvgTri_down and AvgTri > AvgTri[1] and price > AvgTri) then color.GREEN else if (Price < AvgTri_up and Price > AvgTri_down and AvgTri < AvgTri[1] and price < AvgTri ) then Color.RED else Color.BLACK));

P.S. О том как и куда вставлять эти скрипты в терминале ThinkOrSwim написано здесь.

понедельник, 3 декабря 2012 г.

Часть блока лейблов для графика ThinkOrSwim.


Day. Лейбл оповещает красным цветом ситуации, когда low текущего дня опустился ниже low прошлого, а зеленым оповещает ситуации, когда high текущего дня превысил high прошлого дня. Значение - разница между открытием и текущей ценой.


#by Egor Masalskiy
#last modify 03.12.2012
input period = {HOUR, default DAY, WEEK};
def DayH = High (period = period);
def DayL = Low (period = period);
AddLabel(yes, Concat("Day ", Round(close(period=period)-open(period=period), 2)), (if DayL < DayL[1] and dayH < DayH[1] then color.RED else if DayH > DayH[1] and DayL > DayL[1] then color.GREEN else Color.BLACK));


Range. Лейбл оповещает красным цветом ситуации, когда цена находится возле нижней границы своего сегодняшнего диапазона колебаний, а зеленым - когда находится возле верхней границы этого диапазона. Т.е. красный - цена близко к low текущего дня, а зеленый - цена близко к high текущего дня.

#by Egor Masalskiy
#last modify 03.12.2012
input period = {HOUR, default DAY, WEEK};
def DayH = High (period = period);
def DayL = Low (period = period);
AddLabel(yes, Concat("Range ", Round(DayH - DayL, 2)), (if close <= DayL + 0.05 then color.RED else if close >= DayH - 0.05 then color.GREEN else Color.BLACK));

P.S. О том как и куда вставлять эти скрипты в терминале ThinkOrSwim написано здесь.

Оптимизированный VolumeProfile с лейблом точки контроля.

Нажми на изображение для увеличения
Сегодня сделал модификацию стандартного VolumeProfile программы thinkorswim. Отключил по умолчанию все ненужные мне функции, вписал по умолчанию свои опции и добавил лейбл со значением точки контроля. (при желании в опциях индикатора все можно включить снова).

Для чего это? В основном для тех кто меня порой спрашивает, где взять VolumeProfile в thinkorswim и как его настроить, что бы выглядело как у меня.

Лейбл изменяет цвет в зависимости от того, где находится цена относительно точки контроля. Красный лейбл - цена ниже точки контроля, зеленый лейбл - цена выше точки контроля. Если цена находится в диапазоне +/- 3 цента от точки контроля, то лейбл станет голубым. Со временем я сделаю ко всем своим скриптам такие лейблы, что позволит оценивать качество сигнала на вход взглянув всего на одну строку.


#mod Egor Masalskiy
#last modify 03.12.2012

input pricePerRowHeightMode = {AUTOMATIC, default TICKSIZE, CUSTOM};
input customRowHeight = 1.0;
input timePerProfile = {CHART, MINUTE, HOUR, default DAY, WEEK, MONTH, "OPT EXP", BAR};
input multiplier = 1;
input onExpansion = no;
input profiles = 1000;
input showPointOfControl = yes;
input showValueArea = yes;
input valueAreaPercent = 70;
input opacity = 50;

def period;
def yyyymmdd = GetYYYYMMDD();
def seconds = SecondsFromTime(0);
def month = GetYear() * 12 + GetMonth();
def day_number = DaysFromDate(First(yyyymmdd)) + GetDayOfWeek(First(yyyymmdd));
def dom = GetDayOfMonth(yyyymmdd);
def dow = GetDayOfWeek(yyyymmdd - dom + 1);
def expthismonth = (if dow > 5 then 27 else 20) - dow;
def exp_opt = month + (dom > expthismonth);
switch (timePerProfile) {
case CHART:
    period = 0;
case MINUTE:
    period = Floor(seconds / 60 + day_number * 24 * 60);
case HOUR:
    period = Floor(seconds / 3600 + day_number * 24);
case DAY:
    period = CountTradingDays(Min(First(yyyymmdd), yyyymmdd), yyyymmdd) - 1;
case WEEK:
    period = Floor(day_number / 7);
case MONTH:
    period = Floor(month - First(month));
case "OPT EXP":
    period = exp_opt - First(exp_opt);
case BAR:
    period = BarNumber() - 1;
}

rec count = CompoundValue(1, if period != period[1] then (count[1] + period - period[1]) % multiplier else count[1], 0);
def cond = count < count[1] + period - period[1];
def height;
switch (pricePerRowHeightMode) {
case AUTOMATIC:
    height = PricePerRow.AUTOMATIC;
case TICKSIZE:
    height = PricePerRow.TICKSIZE;
case CUSTOM:
    height = customRowHeight;
}

profile vol = VolumeProfile("startNewProfile" = cond, "onExpansion" = onExpansion, "numberOfProfiles" = profiles, "pricePerRow" = height, "value area percent" = valueAreaPercent);
def con = CompoundValue(1, onExpansion, no);
rec pc = if IsNaN(vol.GetPointOfControl()) and con then pc[1] else vol.GetPointOfControl();
rec hVA = if IsNaN(vol.GetHighestValueArea()) and con then hVA[1] else vol.GetHighestValueArea();
rec lVA = if IsNaN(vol.GetLowestValueArea()) and con then lVA[1] else vol.GetLowestValueArea();

rec hProfile = if IsNaN(vol.GetHighest()) and con then hProfile[1] else vol.GetHighest();
rec lProfile = if IsNaN(vol.GetLowest()) and con then lProfile[1] else vol.GetLowest();
def plotsDomain = IsNaN(close) == onExpansion;

plot POC = if plotsDomain then pc else Double.NaN;
plot ProfileHigh = if plotsDomain then hProfile else Double.NaN;
plot ProfileLow = if plotsDomain then lProfile else Double.NaN;
plot VAHigh = if plotsDomain then hVA else Double.NaN;
plot VALow = if plotsDomain then lVA else Double.NaN;

DefineGlobalColor("Profile", GetColor(6));
DefineGlobalColor("Point Of Control", GetColor(5));
DefineGlobalColor("Value Area", GetColor(3));

vol.Show(GlobalColor("Profile"), if showPointOfControl then GlobalColor("Point Of Control") else Color.CURRENT, if showValueArea then GlobalColor("Value Area") else Color.CURRENT, opacity);
POC.SetDefaultColor(GlobalColor("Point Of Control"));
POC.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
VAHigh.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
VALow.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
VAHigh.SetDefaultColor(GlobalColor("Value Area"));
VALow.SetDefaultColor(GlobalColor("Value Area"));
ProfileHigh.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ProfileLow.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ProfileHigh.SetDefaultColor(GetColor(3));
ProfileLow.SetDefaultColor(GetColor(3));
ProfileHigh.Hide();
ProfileLow.Hide();

#-----------------------------Label---------------------------------------------------
def Price = close;
AddLabel(yes, Concat("PoC ", Round(pc, 2)), (if (Price < pc + 0.03 and Price > pc - 0.03) then color.CYAN else if pc > price then Color.RED else Color.GREEN));



P.S. О том как и куда вставлять эти скрипты в терминале ThinkOrSwim написано здесь.

среда, 1 августа 2012 г.

Акции-друзья (скрипты для скринера ThinkOrSwim)

Акции-друзья - это те акции на которых вы чаще всего зарабатываете. Лично я добавляю в этот список акции на которых заработал в результате последнего рабочего дня или на которые есть стратегические идеи, а удаляю из списка те акции на которых потерял в результате последнего рабочего дня (таким образом список ежедневно изменяется). Я сделал несколько скриптов для списка с акциями-друзьями.

Повышенный объем:
Первый скрипт находит акции с повышенным объемом за прошлый день, причем этот объем должен быть выше чем днем раньше, т.е. возросшим. Цифровое значение - это текущая стоимость акции. Оранжевым цветом выделяются отобранные акции.
Период Aggregation: D

#by Egor Masalskiy
#last modify 31.07.2012
def VOL = sum(volume[1], 21)/21;
plot R = close;
AssignBackgroundColor( if volume[1] > VOL and volume[1] > volume[2] then Color.ORANGE  else Color.white);

Закрытие под high или low:
Второй и третий скрипты являются одним логическим целым, но ставятся в разные колонки, поэтому опишу их вместе. Эти скрипты ищут стаки кторые находятся на хай (зеленый сигнал) или лоу (красный сигнал) за прошлый день и за текущий день соответственно. Что бы не перепутать: единицей обозначены сигналы прошлого дня, а нулем - текущего.
Итак первый (прошлый день):
Период Aggregation: D

#by Egor Masalskiy
#last modify 31.07.2012
plot Change = 1;
AssignBackgroundColor( if (high[1] - close[1]) < 0.118 * sum(high[1]-low[1], 5) / 5 then Color.GREEN else if (close[1] - low[1]) < 0.118  * sum(high[1]-low[1], 5) / 5 then Color.RED else Color.WHITE);

Второй (текущий день):
Период Aggregation: D

#by Egor Masalskiy
#last modify 31.07.2012
plot Change = 0;
AssignBackgroundColor( if (high - close) < 0.118 * sum(high-low, 5) / 5 then Color.GREEN else if (close - low) < 0.118  * sum(high-low, 5) / 5 then Color.RED else Color.WHITE);

New high или new low за 10 дней:
Еще один скрипт находит на листе акции, которые в течение дня обновили свой 10-дневный хай или лоу. Цифрой обозначена разница между текущей ценой и вчерашним закрытием.
Период Aggregation: D

#by Egor Masalskiy
#last modify 01.08.2012
plot Change = round(close - close[1]);
AssignBackgroundColor( if highest(high[1], 10) < high then Color.GREEN else if lowest(low[1], 10) > low then Color.RED else Color.WHITE);

P.S. О том как и куда вставлять эти скрипты в терминале ThinkOrSwim написано в этом посте.

понедельник, 16 июля 2012 г.

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

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

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

1. Раскрашивает фон чарта в зависимости от цвета тела последней свечи указанной в опции period в настройках этого скрипта. При этом он может делать расчет по дневке, а красить пятиминутный график.

input period = {default HOUR, DAY, WEEK, MONTH, "OPT EXP"};
def POSITION = close(period = period) - open(period = period);
def spread = 0.1 * (high(period = period) - low(period = period));
#AssignBackgroundColor( if POSITION > spread then CreateColor(88,128,88) else if POSITION < -spread then CreateColor(128,88,88) else Color.GRAY);
AssignBackgroundColor( if POSITION > spread then CreateColor(0,88,0) else if POSITION < -spread then CreateColor(88,0,0) else Color.BLACK);


2. Раскрашивает фон чарта в зависимости от того какой экстремум прошлого периода был преодолен текущим. Период указывается в настройках этого скрипта. У меня он висит на дневке и расчет делает из дневного периода.

input period = {default HOUR, DAY, "2 DAYS", "3 DAYS", "4 DAYS", WEEK, MONTH, "OPT EXP"};
def HIGH = if ((high(period = period) - high(period = period)[1]) > 0) then 1 else -1 ;
def LOW = if ((low(period = period) - low(period = period)[1]) < 0) then -1 else 1 ;
#AssignBackgroundColor( if (HIGH + LOW) > 0 then CreateColor(88,128,88) else if (HIGH + LOW) < 0 then CreateColor(128,88,88) else Color.GRAY);
AssignBackgroundColor( if (HIGH + LOW) > 0 then CreateColor(0,88,0) else if (HIGH + LOW) < 0 then CreateColor(88,0,0) else Color.BLACK);


3. Раскрашивает фон чарта в зависимости от положения high, low  и close последнего периода. Период указывается в настройках скрипта. У меня он висел на минутном графике, а расчет делал исходя из дневного периода.

input period = {default HOUR, DAY, WEEK, MONTH, "OPT EXP"};
def spread = high(period = period) - low(period = period);
def position1 = if (close(period = period) - low(period = period)) < spread/3 then -1 else 1;
def position2 = if (high(period = period) - close(period = period)) < spread/3 then 1 else -1;
#AssignBackgroundColor( if (position1 + position2) > 1 then CreateColor(88,128,88) else if (position1 + position2) < -1 then CreateColor(128,88,88) else Color.GRAY);
AssignBackgroundColor( if (position1 + position2) > 1 then CreateColor(0,88,0) else if (position1 + position2) < -1 then CreateColor(88,0,0) else Color.BLACK);


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

input price = close;
input Triangular_length = 89;
input displace = 0;
def effectiveLength = Ceil((Triangular_length + 1) / 2);
def AvgTri = Average(Average(price[-displace], effectiveLength), effectiveLength);
#AssignBackgroundColor( if (AvgTri > AvgTri[1] and close > AvgTri) then CreateColor(88, 128, 88) else if (AvgTri < AvgTri[1] and close < AvgTri) then CreateColor(128, 88, 88) else Color.GRAY);
AssignBackgroundColor( if (AvgTri > AvgTri[1] and close > AvgTri) then CreateColor(0,88,0) else if (AvgTri < AvgTri[1] and close < AvgTri) then CreateColor(88,0,0) else Color.BLACK);


Цвета подобраны под черную и серую гаммы программы (по умолчанию черная). Что бы переключить на серую в коде скрипта нужно раскоментировать (удалить символ #) перед одной строкой начинающейся с AssignBackgroundColor и закоментировать (поставить символ #) перед другой строкой начинающейся с AssignBackgroundColor.

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

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