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