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

среда, 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 центов. Стаки идущие в противофазе с рынокм торговать как при неподтвержденной фазе движения.

воскресенье, 3 июля 2011 г.

Упрощенный профиль объемов (Volume Profile)

Поизучал теорию профиля рынка (Market Profile). И как следствие этой теории заинтересовался профилем объемов (Volume Profile). Около месяца примерял полученные знания к своей торговле, после чего назрел материал для написания небольшой статьи.
Итак! Основы теории можно изучить погуглив в интернете на тему "Профиль рынка Питера Стидлмайера" (Peter Steidlmayer). Статей куча, как подробных, так и общих. Есть книга, см. главу 5. Я не буду останавливаться на этом. Расскажу как эту теорию можно частично применить к принципам моей текущей торговли (возможно кто-то так же решит применить эти знания в своей торговле). Профиль рынка на конкретном стаке очень похож на профиль объемов того же стака, что в принципе подтверждает сильную корреляцию тиковых и реальных объемов. Поэтому большинство положений профиля рынка применимы к профилю объемов.

Я оперирую такими понятиями как форма профиля объемов, размер (т.е. высота профиля) и мода профиля.
Профиль принимает всевозможные формы в зависимости от кол-ва проторгованных объемов по той или иной цене внутри заданного промежутка времени.
Выделяют несколько важных формаций:
   - баланс
   - дисбаланс
   - отклонение
   - тренд
Размер профиля - это его высота по ценовой шкале графика. Определяется сравнением с профилями предыдущих торговых дней. Размер профиля я для себя поделил на три условные группы:
   - маленький
   - средний
   - большой
Под модой я принимаю не математическое ее определение, а зону цен где было проторговано 70% объемов в заданном промежутке времени. Если сегодняшняя мода формируется выше вчерашней, то стак идет в лонг. Если сегодняшняя мода формируется ниже вчерашней, то стак идет в шорт. Границы моды часто являются уровнями поддержки и сопротивления.

Нажми на изображение для увеличения
Для себя на графике я установил профиль объемов на всеь день (темныйм цветом), и профиль на каждый час (зеленым цветом). Красным выделяется уровень с максимальным проторгованным объемом. Зона моды выделяется голубым фоном, ограниченным горизонтальными зелеными линиями. Голубые линии на графике - это хай и лоу сегодняшнего дня. Светлозеленая линия - это хай вчерашнего дня. Светлорозовая - лоу вчерашнего дня.

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

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

P.S. Когда будет время - подкорректирую страницу с описанием моей стратегии торговли.